From 0d00b8cb722c204b20d8351ed7cb4400f2a5b29b Mon Sep 17 00:00:00 2001 From: Ryan Eberhard Date: Fri, 17 Jul 2020 16:57:19 -0400 Subject: [PATCH] Operator version 3.0.0 (#1819) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * OWLS-80451 - Enhance logHome to override HTTP access log location (#1532) * introduce httpAccessLogInLogHome to DomainSpec * comment fix * httpAccessLogInLogHome comment fix * junit tests for httpAccessLogInLogHome * fix minor indentation bug in web-server sit config * fix httpAccessLogInLogHome description * fix httpAccessLogInLogHome description * add httpAccessLogInLogHome to various create domain samples * update with built index.html * add httpAccessLogInLogHome to documentation for create domain samples * update comments for logHome and httpAccessLogInLogHome * remove extra lines added by IDE * OWLS-80826, OWLS-80942 (#1538) * added support for helm 3.0 * added check for repo * moved from monitoring ns * added the test * fixed style * added missed file * added condition for ver * rework to avoid interm failures * fixed docs * updated version of MonExp * added some timing * style * redesigned shutdowntest, fix some issues in MonEx * fixed java docs * Resolve docs and testing review comments from PRs 1531, 1532, and 1536 (#1545) * add assert messages * clarify javadoc * DomainSpec docs fixes * getServers() and getClusters() javadoc fix * more DomainStatus unit tests * Model in image support (#1478) * minor README update * hugo FAQ link fix * refactor save wallet script 1. * Model in image scripts fixes to work on MacOS (#1465) * Make scripts run on MacOS * Remove unnintentional adds * rename key for secrets * MII Sample: remove vestigal nginx * Fix template and script error * Edit due to key changes * placeholders for MII * sample fodder for rosemary * Add for debugging merged model * first pass on MII sample content * name reconciliation * update from model-in-image * revert accidental changes * mii sample doc edits * second round edits * Update script * Add validation, volume and volume mount for runtime encryption secret Signed-off-by: doxiao * Fix an issue after merge with model-in-image-security Signed-off-by: doxiao * Add part of the changes for runtime secret validation and mount Signed-off-by: doxiao * Second part of the change Signed-off-by: doxiao * Change the sample Signed-off-by: doxiao * Modify the sample to use the right secret Signed-off-by: doxiao * Fix a typo Signed-off-by: doxiao * Minor fix Signed-off-by: doxiao * Fix generated files Signed-off-by: doxiao * pickup changes from model-in-image-security * Fixing error message * Fix TBD * remove comments * mark README.md as outdated (will remove later) * final round edits on sample doc * Add validation checks for OPSS secret Signed-off-by: doxiao * Minor javadoc fix Signed-off-by: doxiao * refacto startServer.sh * update script and doc * More javadoc changes Signed-off-by: doxiao * MII sample doc update * Fix a merge issue that caused duplicate configuration Signed-off-by: doxiao * MII sample script update * MII sample script update * update doc for saving wallet and remote docker registry instructions * update doc for script name changes * Add unit test cases Signed-off-by: doxiao * Shorten suffix names * Fix merge issues Signed-off-by: doxiao * Fix duplicate lines Signed-off-by: doxiao * Fix generated files Signed-off-by: doxiao * refactor and remove prepending the domain name to configmap/secrets volumes * add back the mounting for existing introspect configmap source for life-cycle update * minor edit * additional edits * add traefix instructions for console * Update doc for introspectorJobActiveDeadlineSeconds Signed-off-by: doxiao * update doc * QA infra change to support new secret (#1474) Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * update doc * Fix a typo Signed-off-by: doxiao * Use 12.2.1.4 everywhere possible (#1475) * Use 12.2.1.4 everywhere possible * Back to soasuite:12.2.1.3 * Correct some 12.2.1.3 vs. 12.2.1.4 confusion * Correct word choice * fix to use different separator, '.' is a valid key name * Refactor getModelInImageSpecHash and fix logic; correct minor script error in encryption_util * check in for now waiting for WDT * Make the runtime encryption secret volume source "optional" Signed-off-by: doxiao * Minor doc changes for introspectorJobActiveDeadlineSeconds Signed-off-by: doxiao * Add extra line between merging properties file * add real blank lines between appending variable files * change wdt secret key to password * Model in image main hugo doc - first check-in. * Remove rcu_admin_password - not required at this point * MII sample updates * MII sample updates * Update copyright Signed-off-by: doxiao * Add introspectorJobActiveDeadlineSeconds in toString(), hashCode() and equals() calculation Signed-off-by: doxiao * MII Sample README update. * MII Sample - remove mention of rcu admin password in sample doc. * first pass edits * Remove wdtEncryptionSecret from the schema and code * fix two broken links * Clean up after WDT encryption secret related code is removed Signed-off-by: doxiao * Fix doc Signed-off-by: doxiao * Fix doc links Signed-off-by: doxiao * remove wdt encryption passphrase logic from introspector job scripts since it no longer supported in the schema * update MII doc to mention wdt encryption isn't supported * update error message in modelInImage.sh * Enable updateRCUSchemaPassword and add special env variables for macro expansion in modelInImage.sh script * Add @@SECRET and @@ENV support to MII sample/doc. * Add utility methods for model in image tests (#1481) * adding mii utility methods * adding mii utility methods * adding wdtDomainType and use of properties for weblogic base image * minor doc update * doc update * doc update * doc update * doc update * doc update * add script comment * Add introspectorJobActiveDeadlinSeconds to the samples Signed-off-by: doxiao * first draft update of 'choosing a model' doc * first draft update of 'choosing a model' doc * Remove updateDomainResult - dynamic update code * doc updated * Doc update. * doc edits from Ryan * clean up sample descriptor * Remove mii section from samples domain-template.yaml (#1491) * undo changes in domain-template.yaml * adding mii config file * resolve comment merge * Move introspectVersion to spec level only * Update _index.md * Fix inadvertent change * Update sample doc for introspectorJobActiveDeadlineSeconds and runtimeEncryptionSecret Signed-off-by: doxiao * More sample doc update Signed-off-by: doxiao * doc update * clean up sample descriptor * Update Operator.properties * doc update * Removed unused field * edit new choose a model doc * Minor doc fix - address review comment Signed-off-by: doxiao * Fix copyrights * Add support for defaulting the MII sample's WORKDIR. Default is '/tmp/tbarnes/model-in-image-sample-work-dir'. * doc update * sample update * doc update * doc update * fix for MII sample script opss_wallet_util.sh * remove mention of helm 2.x syntax from MII sample * doc update * doc update * doc update * doc update * doc update * doc update * Update the wallet in the primordial domain if the rcu schema password changed * doc update * doc update * add error checking * doc update * doc update * doc update * Checkstyle * Update restarting.md * Update usage.md * Code review * remove unnecessary comment * minor edit * minor edit * Minor doc changes Signed-off-by: doxiao * Revert one doc change Signed-off-by: doxiao * Javadoc * Adding weblogic credentials change test (#1493) * Adding testCredentialsChange * fix import * Add utility method to replace runtimeEncryptionSecret * modify the secret * fix formatting * fix formatting * remove unwanted code * cleanup * cleanup * cleanup * fix indendation * doc updates * doc update * doc update * Minor doc fix Signed-off-by: doxiao * doc update * doc update * add usage and friendlier syntax error reporting to MII sample create_secret.sh + create_configmap.sh, correct the usage text in opss_wallet_util.sh * doc update * doc update * fix to handle image names with '/' in them in create_domain.sh sample script * remove mention of unused var from build_image_model.sh sample script * Fix help text in create_configmap.sh helper script. * Put the domain name back if present * remove printing the model * Correct configmap data is not inserted into the flow after it's read. * Minor change to Operator.properties Signed-off-by: doxiao * remove debug code * minor help text correction for create_configmap.sh sample script * doc update (#1509) * doc update * doc update * doc update * MII: avoid deploying/referencing JRF secrets for non-JRF domain types, it's too confusing (#1507) * doc update (#1510) * doc update * doc update * doc update * update ci/cd doc for mii (#1502) * update ci/cd doc for mii * first pass edits * doc update * doc update Co-authored-by: Rosemary Marano * cherry pick 1517 from develop * two automated test case for Wdt Config Update w single Model File jenkins-ignore (#1495) * The first test case for OWLS-80444 Automate Wdt Config Override with single Model File jenkins-ignore * Modified TestUtils.java jenkins-ignore * Added python file to verify JDBC DS prop in server pod jenkins-ignore * Changes b ased on the comments jenkins-ignore * Added the 2nd test case jenkins-ignore * Used patch domain to restart domain jenkins-ignore * Changed test case names jenkins-ignore * adding config delete and app delete tests using mode file (#1521) * adding config update tests * add config and app delete tests * Model in image namefixes (#1515) * Fix for PR1478 * add more traces and minor update Co-authored-by: Johnny Shum * Missing secret dir fix (#1525) * Add temporary work around for WDT return non-zero rc if secret directory doesn't exist. * Change per WDT fix for no more default for custom secrets mount Co-authored-by: Johnny Shum * Update rest_domainqualtrue.yml * Update OperatorUtils.java * Update OperatorUtils.java * removing commented/incomplete test code (#1533) * Merge from develop to model-in-image with conflict resolution (#1531) * OWLS-80522 Domain status ordering, OWLS-80144 Ordered rolling upgrade (#1503) * Domain.getServers() should return servers in order * ordered rolling upgrade * minor test fix * new RollingHelperTest * update getSortingString to handle up to 20 digits * rolling upgrade clusters sorted by cluster names * add isAdminServer to ServerStatus * ServerStatus isAdminServer excluded from json schema * ClusterStatus sorted by sorting name * getClusters returning sorted clusters * add unit tests * handle null map * Enhance Helm chart deletion Logic in cleanup.sh Script (#1517) * Enhance the clean up Script to support Helm 2/3 * Addressed the review comment Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * Added test for domainQualifier=true, added cleanup for intermittent failures (#1513) * added support for helm 3.0 * added check for repo * moved from monitoring ns * added the test * fixed style * added missed file * added condition for ver * rework to avoid interm failures * fixed docs * updated version of MonExp * Stub the ApiClient in tests that get connections but where this was not already done. (#1519) * Enhance the cleanup script to include deletion of few namesapce(s) created by Integration Tests (#1523) Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * overall doc edits (#1518) * overall doc edits * fix a mistake I created * update Kubernetes prereqs * incorporate edits from Ryan and Mark * fix typo * fix my mistake * minor fixes * Disable preserveUnknownFields * Update rest_domainqualtrue.yml * Update OperatorUtils.java * Update OperatorUtils.java Co-authored-by: Anthony Lai Co-authored-by: Antaryami Panigrahi <31135902+anpanigr@users.noreply.github.com> Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM Co-authored-by: Marina Kogan Co-authored-by: Rosemary Marano * Fix javadoc * fix broken anchor links (#1540) * Updated model files to user @@SECRET macro; added sparce jms/wldf mod… (#1529) * Updated model files to user @@SECRET macro; added sparce jms/wldf model files * Added Copyright Statements * Missing CopyRight * Resync the branch and removed work-around * Addressed review comment Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * Correct merge of cleanup.sh * entire site doc edits (#1551) * entire site doc edits * sentence perfection * Added two more tests to cover config update by creating an image w a new tag (#1528) * Added two more tests to cover config update by creating an image with a new tag jenkins-ignore * Changes for the comments jenkins-ignore * Changed logs jenkins-ignore * Mii introspect test (#1530) * for mii * MII updates * add wdt configmap mount * remove image and wdt configmap first * correct script error * update model values * update properties value * template the mii mount and make it optional * Making override cm optional * revert * update the models * remove introspectMIITest.sh * update secret key * clean up * clean up workdir * Fix missing secret and cleanup * Incorporate Tom's changes * refresh from model-in-image * various changes for the PR * fix zip output * fix script error * correct archive location * push no-effect change * move WDT_DOMAIN_TYPE to yamlt * update for PR * fix test for MII * Remove custom overrides and adjust overrides test. * Update script and readme * minor fixes * hide k8s output * Fix copyright * Fix copyright * Fix copyright * Fix copyright * updated copyrights * Add copyrights * update from model-in-image Co-authored-by: Johnny Shum Co-authored-by: Ryan Eberhard * fix log format (#1553) Co-authored-by: doxiao Co-authored-by: Tom Barnes Co-authored-by: Johnny Shum Co-authored-by: Rosemary Marano Co-authored-by: Antaryami Panigrahi <31135902+anpanigr@users.noreply.github.com> Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM Co-authored-by: Vanajakshi Mukkara <35709372+vanajamukkara@users.noreply.github.com> Co-authored-by: Sankar Periyathambi Neelakandan <45743425+sankarpn@users.noreply.github.com> Co-authored-by: Mark Nelson Co-authored-by: Huiling Zhao <41090416+hzhao-github@users.noreply.github.com> Co-authored-by: Johnny Shum Co-authored-by: Anthony Lai Co-authored-by: Marina Kogan * delete image only for domain in image tests (#1552) * delete image only for domain in image tests * moving the code to actual test class for delete domain * adding check not to delete container-registry images * Fix checkstyle in recent change (#1554) * delete image only for domain in image tests * moving the code to actual test class for delete domain * adding check not to delete container-registry images * fix checkstyle * New integration tests (#1560) * Fix TBD * remove comments * mark README.md as outdated (will remove later) * final round edits on sample doc * Add validation checks for OPSS secret Signed-off-by: doxiao * starting to experiment * some more experimenting and thinking * some more experimenting and thinking * some more experimenting and thinking * some more experimenting and thinking * some more experimenting and thinking * some more experimenting and thinking * some more experimenting and thinking * more thinking and experimenting * tidy up a bit * Minor javadoc fix Signed-off-by: doxiao * refacto startServer.sh * update script and doc * More javadoc changes Signed-off-by: doxiao * MII sample doc update * Fix a merge issue that caused duplicate configuration Signed-off-by: doxiao * MII sample script update * small updates * MII sample script update * update doc for saving wallet and remote docker registry instructions * update doc for script name changes * Add unit test cases Signed-off-by: doxiao * Shorten suffix names * Fix merge issues Signed-off-by: doxiao * Fix duplicate lines Signed-off-by: doxiao * Fix generated files Signed-off-by: doxiao * refactor and remove prepending the domain name to configmap/secrets volumes * add back the mounting for existing introspect configmap source for life-cycle update * minor edit * additional edits * add traefix instructions for console * Update doc for introspectorJobActiveDeadlineSeconds Signed-off-by: doxiao * update doc * QA infra change to support new secret (#1474) Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * update doc * Fix a typo Signed-off-by: doxiao * Use 12.2.1.4 everywhere possible (#1475) * Use 12.2.1.4 everywhere possible * Back to soasuite:12.2.1.3 * Correct some 12.2.1.3 vs. 12.2.1.4 confusion * Correct word choice * fix to use different separator, '.' is a valid key name * Refactor getModelInImageSpecHash and fix logic; correct minor script error in encryption_util * check in for now waiting for WDT * Make the runtime encryption secret volume source "optional" Signed-off-by: doxiao * Minor doc changes for introspectorJobActiveDeadlineSeconds Signed-off-by: doxiao * Add extra line between merging properties file * add real blank lines between appending variable files * change wdt secret key to password * Model in image main hugo doc - first check-in. * Remove rcu_admin_password - not required at this point * MII sample updates * MII sample updates * Update copyright Signed-off-by: doxiao * Add introspectorJobActiveDeadlineSeconds in toString(), hashCode() and equals() calculation Signed-off-by: doxiao * MII Sample README update. * MII Sample - remove mention of rcu admin password in sample doc. * first pass edits * Remove wdtEncryptionSecret from the schema and code * fix two broken links * Clean up after WDT encryption secret related code is removed Signed-off-by: doxiao * Fix doc Signed-off-by: doxiao * Fix doc links Signed-off-by: doxiao * remove wdt encryption passphrase logic from introspector job scripts since it no longer supported in the schema * update MII doc to mention wdt encryption isn't supported * update error message in modelInImage.sh * Enable updateRCUSchemaPassword and add special env variables for macro expansion in modelInImage.sh script * Add @@SECRET and @@ENV support to MII sample/doc. * Add utility methods for model in image tests (#1481) * adding mii utility methods * adding mii utility methods * adding wdtDomainType and use of properties for weblogic base image * minor doc update * doc update * doc update * doc update * doc update * doc update * add script comment * Add introspectorJobActiveDeadlinSeconds to the samples Signed-off-by: doxiao * first draft update of 'choosing a model' doc * first draft update of 'choosing a model' doc * Remove updateDomainResult - dynamic update code * doc updated * Doc update. * doc edits from Ryan * clean up sample descriptor * Remove mii section from samples domain-template.yaml (#1491) * undo changes in domain-template.yaml * adding mii config file * resolve comment merge * Move introspectVersion to spec level only * Update _index.md * Fix inadvertent change * Update sample doc for introspectorJobActiveDeadlineSeconds and runtimeEncryptionSecret Signed-off-by: doxiao * More sample doc update Signed-off-by: doxiao * doc update * clean up sample descriptor * Update Operator.properties * doc update * Removed unused field * edit new choose a model doc * Minor doc fix - address review comment Signed-off-by: doxiao * Fix copyrights * Add support for defaulting the MII sample's WORKDIR. Default is '/tmp/tbarnes/model-in-image-sample-work-dir'. * doc update * sample update * doc update * doc update * fix for MII sample script opss_wallet_util.sh * remove mention of helm 2.x syntax from MII sample * doc update * doc update * doc update * doc update * doc update * doc update * Update the wallet in the primordial domain if the rcu schema password changed * doc update * doc update * add error checking * doc update * doc update * doc update * Checkstyle * Update restarting.md * Update usage.md * Code review * remove unnecessary comment * minor edit * minor edit * Minor doc changes Signed-off-by: doxiao * Revert one doc change Signed-off-by: doxiao * Javadoc * Adding weblogic credentials change test (#1493) * Adding testCredentialsChange * fix import * Add utility method to replace runtimeEncryptionSecret * modify the secret * fix formatting * fix formatting * remove unwanted code * cleanup * cleanup * cleanup * fix indendation * doc updates * doc update * doc update * Minor doc fix Signed-off-by: doxiao * doc update * doc update * add usage and friendlier syntax error reporting to MII sample create_secret.sh + create_configmap.sh, correct the usage text in opss_wallet_util.sh * doc update * doc update * fix to handle image names with '/' in them in create_domain.sh sample script * remove mention of unused var from build_image_model.sh sample script * Fix help text in create_configmap.sh helper script. * Put the domain name back if present * remove printing the model * Correct configmap data is not inserted into the flow after it's read. * Minor change to Operator.properties Signed-off-by: doxiao * remove debug code * minor help text correction for create_configmap.sh sample script * doc update (#1509) * doc update * doc update * doc update * MII: avoid deploying/referencing JRF secrets for non-JRF domain types, it's too confusing (#1507) * doc update (#1510) * doc update * doc update * doc update * update ci/cd doc for mii (#1502) * update ci/cd doc for mii * first pass edits * doc update * doc update Co-authored-by: Rosemary Marano * added IntegrationTest annotation * corrected copyright statements * cleanup warnings in LoggedTest * Adding more actions (#1511) * adding new actions * adding more actions * typo * using fluent api for Helm * using fluent api for operatorparams instead of hashmap * fixing javadoc * Install wit actions interface (#1512) * Add actions for download and WIT * Minor fix of the formating * Address review comment Signed-off-by: doxiao * added checkstyle checks from master, and reformatted code to match * cherry pick 1517 from develop * K8s client api initial impl for feedback on usage (#1514) * K8s client api initial impl for feedback on usage * Changes based on initial feedback * implement delete PV/PVC, secrets, and config maps * create/delete domain custom resource * Updated javadoc * Use Assertions.assertDoesNotThrow() instead of try-catch * Use Assertions.assertDoesNotThrow() * Adding test assertions to new integration tests (#1516) * Adding test assertions to new integration tests * two automated test case for Wdt Config Update w single Model File jenkins-ignore (#1495) * The first test case for OWLS-80444 Automate Wdt Config Override with single Model File jenkins-ignore * Modified TestUtils.java jenkins-ignore * Added python file to verify JDBC DS prop in server pod jenkins-ignore * Changes b ased on the comments jenkins-ignore * Added the 2nd test case jenkins-ignore * Used patch domain to restart domain jenkins-ignore * Changed test case names jenkins-ignore * adding config delete and app delete tests using mode file (#1521) * adding config update tests * add config and app delete tests * Additional mii integration test support for K8s resources (#1524) * create/delete service accounts and update deleteNamespace() to use GenericKubernetesApi * Added javadoc and comments * Adding impl in Operator (#1522) * adding traefik params * adding more implementation for operator * addressing review comments, using assertj * adding helm commands * Wit action impl (#1520) * Add actions for download and WIT * Minor fix of the formating * Address review comment * WIT impl * Add execcommand * Use tmpDir as the root of the work dir * Support unzip WIT * Rename a class * Add ProcessBuilder code commented out * Setup WIT list parameters * Address review comments * More review comments * Minor style fix * Move download WIT/WDT code into the impl Signed-off-by: doxiao * Fix an issue Signed-off-by: doxiao * Model in image namefixes (#1515) * Fix for PR1478 * add more traces and minor update Co-authored-by: Johnny Shum * Missing secret dir fix (#1525) * Add temporary work around for WDT return non-zero rc if secret directory doesn't exist. * Change per WDT fix for no more default for custom secrets mount Co-authored-by: Johnny Shum * Update rest_domainqualtrue.yml * Update OperatorUtils.java * Update OperatorUtils.java * Implemented the pod and service check assertions (#1527) * working on the pod status * implement * add serviceCreated * implemented service level assertions * adding domain related assertions * add domain related assertions * reverting * Added javadoc * addressed the PR comments * fixed more javadoc comments * Create Domain types for use by tests (#1526) * Work in progress * Typo * Work in progress * Work in progress * Work in progress * Remove set methods and correct some typos * Correct pom * More fluent * removing commented/incomplete test code (#1533) * Merge from develop to model-in-image with conflict resolution (#1531) * OWLS-80522 Domain status ordering, OWLS-80144 Ordered rolling upgrade (#1503) * Domain.getServers() should return servers in order * ordered rolling upgrade * minor test fix * new RollingHelperTest * update getSortingString to handle up to 20 digits * rolling upgrade clusters sorted by cluster names * add isAdminServer to ServerStatus * ServerStatus isAdminServer excluded from json schema * ClusterStatus sorted by sorting name * getClusters returning sorted clusters * add unit tests * handle null map * Enhance Helm chart deletion Logic in cleanup.sh Script (#1517) * Enhance the clean up Script to support Helm 2/3 * Addressed the review comment Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * Added test for domainQualifier=true, added cleanup for intermittent failures (#1513) * added support for helm 3.0 * added check for repo * moved from monitoring ns * added the test * fixed style * added missed file * added condition for ver * rework to avoid interm failures * fixed docs * updated version of MonExp * Stub the ApiClient in tests that get connections but where this was not already done. (#1519) * Enhance the cleanup script to include deletion of few namesapce(s) created by Integration Tests (#1523) Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * overall doc edits (#1518) * overall doc edits * fix a mistake I created * update Kubernetes prereqs * incorporate edits from Ryan and Mark * fix typo * fix my mistake * minor fixes * Disable preserveUnknownFields * Update rest_domainqualtrue.yml * Update OperatorUtils.java * Update OperatorUtils.java Co-authored-by: Anthony Lai Co-authored-by: Antaryami Panigrahi <31135902+anpanigr@users.noreply.github.com> Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM Co-authored-by: Marina Kogan Co-authored-by: Rosemary Marano * Fix javadoc * fix broken anchor links (#1540) * Assert improvements (#1541) * check for NPEs * fix Domaina assertions * Added assert message * Updated model files to user @@SECRET macro; added sparce jms/wldf mod… (#1529) * Updated model files to user @@SECRET macro; added sparce jms/wldf model files * Added Copyright Statements * Missing CopyRight * Resync the branch and removed work-around * Addressed review comment Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * adding helm implementation (#1535) * moving common props to helmprops and common methods to helm class * adding helm install, upgrade, delete implementation * fix namespace and helm delete command * change delete to uninstall * addressing review comments * addressing review comments * change method name * fix exception class * Add more contents into MII image plus cleanup (#1534) * Add model to wit test Signed-off-by: doxiao * More impl Signed-off-by: doxiao * Restruct the code and move constants into ActionConstants Signed-off-by: doxiao * Revert an unintended change Signed-off-by: doxiao * Minor cleanup Signed-off-by: doxiao * Address review comments Signed-off-by: doxiao * Get rid of inheritance - move command methods to Command action/params and FileUtils Signed-off-by: doxiao * Minor java doc change Signed-off-by: doxiao * Remove unused code Signed-off-by: doxiao * Minor style changes Signed-off-by: doxiao * Remove imports and code that have been commented out Signed-off-by: doxiao * Rename assertion method name and fix javadoc Signed-off-by: doxiao * Address review comment Signed-off-by: doxiao * Change with() to params() Signed-off-by: doxiao * Add assertions Signed-off-by: doxiao * Avoid type checks Signed-off-by: doxiao * move WIT/WDT versions to pom.xml Signed-off-by: doxiao * Remove a class that is no longer needed Signed-off-by: doxiao * Minor cleanup Signed-off-by: doxiao * Additional support for K8s resources for actions in test mii framework (#1543) * Refactoring, services, pods * Some refactoring and added additional Kubernetes primitives * Use oracle.weblogic.domain.Domain class for getDomainCustomResource() method * Address PR feedback * Correct merge of cleanup.sh * Add additional env to WIT execution (#1548) Signed-off-by: doxiao * Propogate env to other image tool commands Signed-off-by: doxiao * Replace java.util.Logger with logging facade (#1555) * brought LoggingFacade over from main code to replace java.util.Logger * fixed a couple typos * Javadoc cleanup per review comments Co-authored-by: Johnny Shum Co-authored-by: Tom Barnes Co-authored-by: Rosemary Marano Co-authored-by: doxiao Co-authored-by: Mark Nelson Co-authored-by: Antaryami Panigrahi <31135902+anpanigr@users.noreply.github.com> Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM Co-authored-by: Vanajakshi Mukkara <35709372+vanajamukkara@users.noreply.github.com> Co-authored-by: Sankar Periyathambi Neelakandan <45743425+sankarpn@users.noreply.github.com> Co-authored-by: Derek Sharpe Co-authored-by: Lenny Phan <33355669+lennyphan@users.noreply.github.com> Co-authored-by: Huiling Zhao <41090416+hzhao-github@users.noreply.github.com> Co-authored-by: Johnny Shum Co-authored-by: Anthony Lai Co-authored-by: Marina Kogan Co-authored-by: Derek Sharpe <36005286+ddsharpe@users.noreply.github.com> * Remove check for base image (#1559) * delete image only for domain in image tests * moving the code to actual test class for delete domain * adding check not to delete container-registry images * fix checkstyle * base image is not required as image tool pulls the image * remove check for base image * Add app archive to MII image (#1550) * More javadoc changes Signed-off-by: doxiao * MII sample doc update * Fix a merge issue that caused duplicate configuration Signed-off-by: doxiao * MII sample script update * small updates * MII sample script update * update doc for saving wallet and remote docker registry instructions * update doc for script name changes * Add unit test cases Signed-off-by: doxiao * Shorten suffix names * Fix merge issues Signed-off-by: doxiao * Fix duplicate lines Signed-off-by: doxiao * Fix generated files Signed-off-by: doxiao * refactor and remove prepending the domain name to configmap/secrets volumes * add back the mounting for existing introspect configmap source for life-cycle update * minor edit * additional edits * add traefix instructions for console * Update doc for introspectorJobActiveDeadlineSeconds Signed-off-by: doxiao * update doc * QA infra change to support new secret (#1474) Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * update doc * Fix a typo Signed-off-by: doxiao * Use 12.2.1.4 everywhere possible (#1475) * Use 12.2.1.4 everywhere possible * Back to soasuite:12.2.1.3 * Correct some 12.2.1.3 vs. 12.2.1.4 confusion * Correct word choice * fix to use different separator, '.' is a valid key name * Refactor getModelInImageSpecHash and fix logic; correct minor script error in encryption_util * check in for now waiting for WDT * Make the runtime encryption secret volume source "optional" Signed-off-by: doxiao * Minor doc changes for introspectorJobActiveDeadlineSeconds Signed-off-by: doxiao * Add extra line between merging properties file * add real blank lines between appending variable files * change wdt secret key to password * Model in image main hugo doc - first check-in. * Remove rcu_admin_password - not required at this point * MII sample updates * MII sample updates * Update copyright Signed-off-by: doxiao * Add introspectorJobActiveDeadlineSeconds in toString(), hashCode() and equals() calculation Signed-off-by: doxiao * MII Sample README update. * MII Sample - remove mention of rcu admin password in sample doc. * first pass edits * Remove wdtEncryptionSecret from the schema and code * fix two broken links * Clean up after WDT encryption secret related code is removed Signed-off-by: doxiao * Fix doc Signed-off-by: doxiao * Fix doc links Signed-off-by: doxiao * remove wdt encryption passphrase logic from introspector job scripts since it no longer supported in the schema * update MII doc to mention wdt encryption isn't supported * update error message in modelInImage.sh * Enable updateRCUSchemaPassword and add special env variables for macro expansion in modelInImage.sh script * Add @@SECRET and @@ENV support to MII sample/doc. * Add utility methods for model in image tests (#1481) * adding mii utility methods * adding mii utility methods * adding wdtDomainType and use of properties for weblogic base image * minor doc update * doc update * doc update * doc update * doc update * doc update * add script comment * Add introspectorJobActiveDeadlinSeconds to the samples Signed-off-by: doxiao * first draft update of 'choosing a model' doc * first draft update of 'choosing a model' doc * Remove updateDomainResult - dynamic update code * doc updated * Doc update. * doc edits from Ryan * clean up sample descriptor * Remove mii section from samples domain-template.yaml (#1491) * undo changes in domain-template.yaml * adding mii config file * resolve comment merge * Move introspectVersion to spec level only * Update _index.md * Fix inadvertent change * Update sample doc for introspectorJobActiveDeadlineSeconds and runtimeEncryptionSecret Signed-off-by: doxiao * More sample doc update Signed-off-by: doxiao * doc update * clean up sample descriptor * Update Operator.properties * doc update * Removed unused field * edit new choose a model doc * Minor doc fix - address review comment Signed-off-by: doxiao * Fix copyrights * Add support for defaulting the MII sample's WORKDIR. Default is '/tmp/tbarnes/model-in-image-sample-work-dir'. * doc update * sample update * doc update * doc update * fix for MII sample script opss_wallet_util.sh * remove mention of helm 2.x syntax from MII sample * doc update * doc update * doc update * doc update * doc update * doc update * Update the wallet in the primordial domain if the rcu schema password changed * doc update * doc update * add error checking * doc update * doc update * doc update * Checkstyle * Update restarting.md * Update usage.md * Code review * remove unnecessary comment * minor edit * minor edit * Minor doc changes Signed-off-by: doxiao * Revert one doc change Signed-off-by: doxiao * Javadoc * Adding weblogic credentials change test (#1493) * Adding testCredentialsChange * fix import * Add utility method to replace runtimeEncryptionSecret * modify the secret * fix formatting * fix formatting * remove unwanted code * cleanup * cleanup * cleanup * fix indendation * doc updates * doc update * doc update * Minor doc fix Signed-off-by: doxiao * doc update * doc update * add usage and friendlier syntax error reporting to MII sample create_secret.sh + create_configmap.sh, correct the usage text in opss_wallet_util.sh * doc update * doc update * fix to handle image names with '/' in them in create_domain.sh sample script * remove mention of unused var from build_image_model.sh sample script * Fix help text in create_configmap.sh helper script. * Put the domain name back if present * remove printing the model * Correct configmap data is not inserted into the flow after it's read. * Minor change to Operator.properties Signed-off-by: doxiao * remove debug code * minor help text correction for create_configmap.sh sample script * doc update (#1509) * doc update * doc update * doc update * MII: avoid deploying/referencing JRF secrets for non-JRF domain types, it's too confusing (#1507) * doc update (#1510) * doc update * doc update * doc update * update ci/cd doc for mii (#1502) * update ci/cd doc for mii * first pass edits * doc update * doc update Co-authored-by: Rosemary Marano * added IntegrationTest annotation * corrected copyright statements * cleanup warnings in LoggedTest * Adding more actions (#1511) * adding new actions * adding more actions * typo * using fluent api for Helm * using fluent api for operatorparams instead of hashmap * fixing javadoc * Install wit actions interface (#1512) * Add actions for download and WIT * Minor fix of the formating * Address review comment Signed-off-by: doxiao * added checkstyle checks from master, and reformatted code to match * cherry pick 1517 from develop * K8s client api initial impl for feedback on usage (#1514) * K8s client api initial impl for feedback on usage * Changes based on initial feedback * implement delete PV/PVC, secrets, and config maps * create/delete domain custom resource * Updated javadoc * Use Assertions.assertDoesNotThrow() instead of try-catch * Use Assertions.assertDoesNotThrow() * Adding test assertions to new integration tests (#1516) * Adding test assertions to new integration tests * two automated test case for Wdt Config Update w single Model File jenkins-ignore (#1495) * The first test case for OWLS-80444 Automate Wdt Config Override with single Model File jenkins-ignore * Modified TestUtils.java jenkins-ignore * Added python file to verify JDBC DS prop in server pod jenkins-ignore * Changes b ased on the comments jenkins-ignore * Added the 2nd test case jenkins-ignore * Used patch domain to restart domain jenkins-ignore * Changed test case names jenkins-ignore * adding config delete and app delete tests using mode file (#1521) * adding config update tests * add config and app delete tests * Additional mii integration test support for K8s resources (#1524) * create/delete service accounts and update deleteNamespace() to use GenericKubernetesApi * Added javadoc and comments * Adding impl in Operator (#1522) * adding traefik params * adding more implementation for operator * addressing review comments, using assertj * adding helm commands * Wit action impl (#1520) * Add actions for download and WIT * Minor fix of the formating * Address review comment * WIT impl * Add execcommand * Use tmpDir as the root of the work dir * Support unzip WIT * Rename a class * Add ProcessBuilder code commented out * Setup WIT list parameters * Address review comments * More review comments * Minor style fix * Move download WIT/WDT code into the impl Signed-off-by: doxiao * Fix an issue Signed-off-by: doxiao * Model in image namefixes (#1515) * Fix for PR1478 * add more traces and minor update Co-authored-by: Johnny Shum * Missing secret dir fix (#1525) * Add temporary work around for WDT return non-zero rc if secret directory doesn't exist. * Change per WDT fix for no more default for custom secrets mount Co-authored-by: Johnny Shum * Update rest_domainqualtrue.yml * Update OperatorUtils.java * Update OperatorUtils.java * Implemented the pod and service check assertions (#1527) * working on the pod status * implement * add serviceCreated * implemented service level assertions * adding domain related assertions * add domain related assertions * reverting * Added javadoc * addressed the PR comments * fixed more javadoc comments * Create Domain types for use by tests (#1526) * Work in progress * Typo * Work in progress * Work in progress * Work in progress * Remove set methods and correct some typos * Correct pom * More fluent * removing commented/incomplete test code (#1533) * Merge from develop to model-in-image with conflict resolution (#1531) * OWLS-80522 Domain status ordering, OWLS-80144 Ordered rolling upgrade (#1503) * Domain.getServers() should return servers in order * ordered rolling upgrade * minor test fix * new RollingHelperTest * update getSortingString to handle up to 20 digits * rolling upgrade clusters sorted by cluster names * add isAdminServer to ServerStatus * ServerStatus isAdminServer excluded from json schema * ClusterStatus sorted by sorting name * getClusters returning sorted clusters * add unit tests * handle null map * Enhance Helm chart deletion Logic in cleanup.sh Script (#1517) * Enhance the clean up Script to support Helm 2/3 * Addressed the review comment Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * Added test for domainQualifier=true, added cleanup for intermittent failures (#1513) * added support for helm 3.0 * added check for repo * moved from monitoring ns * added the test * fixed style * added missed file * added condition for ver * rework to avoid interm failures * fixed docs * updated version of MonExp * Stub the ApiClient in tests that get connections but where this was not already done. (#1519) * Enhance the cleanup script to include deletion of few namesapce(s) created by Integration Tests (#1523) Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * overall doc edits (#1518) * overall doc edits * fix a mistake I created * update Kubernetes prereqs * incorporate edits from Ryan and Mark * fix typo * fix my mistake * minor fixes * Disable preserveUnknownFields * Update rest_domainqualtrue.yml * Update OperatorUtils.java * Update OperatorUtils.java Co-authored-by: Anthony Lai Co-authored-by: Antaryami Panigrahi <31135902+anpanigr@users.noreply.github.com> Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM Co-authored-by: Marina Kogan Co-authored-by: Rosemary Marano * Fix javadoc * fix broken anchor links (#1540) * Assert improvements (#1541) * check for NPEs * fix Domaina assertions * Added assert message * Updated model files to user @@SECRET macro; added sparce jms/wldf mod… (#1529) * Updated model files to user @@SECRET macro; added sparce jms/wldf model files * Added Copyright Statements * Missing CopyRight * Resync the branch and removed work-around * Addressed review comment Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * adding helm implementation (#1535) * moving common props to helmprops and common methods to helm class * adding helm install, upgrade, delete implementation * fix namespace and helm delete command * change delete to uninstall * addressing review comments * addressing review comments * change method name * fix exception class * Add more contents into MII image plus cleanup (#1534) * Add model to wit test Signed-off-by: doxiao * More impl Signed-off-by: doxiao * Restruct the code and move constants into ActionConstants Signed-off-by: doxiao * Revert an unintended change Signed-off-by: doxiao * Minor cleanup Signed-off-by: doxiao * Address review comments Signed-off-by: doxiao * Get rid of inheritance - move command methods to Command action/params and FileUtils Signed-off-by: doxiao * Minor java doc change Signed-off-by: doxiao * Remove unused code Signed-off-by: doxiao * Minor style changes Signed-off-by: doxiao * Remove imports and code that have been commented out Signed-off-by: doxiao * Rename assertion method name and fix javadoc Signed-off-by: doxiao * Address review comment * Change with() to params() * Add assertions * Avoid type checks Signed-off-by: doxiao * move WIT/WDT versions to pom.xml * Remove a class that is no longer needed * Additional support for K8s resources for actions in test mii framework (#1543) * Refactoring, services, pods * Some refactoring and added additional Kubernetes primitives * Use oracle.weblogic.domain.Domain class for getDomainCustomResource() method * Address PR feedback * Correct merge of cleanup.sh * Add application archive to mii * Add additional env to WIT execution (#1548) * Propogate env to other image tool commands * Change Command.executeAndVerify to Command.execute. * Remove unintended files * Javadoc update * Address review comments * Download and use apache commons-io to clean up a directory Signed-off-by: doxiao * Improve error handling in AppBuilder * Fix an error message * Replace java.util.Logger with logging facade (#1555) * brought LoggingFacade over from main code to replace java.util.Logger * fixed a couple typos * Javadoc cleanup per review comments * Remove one unnecessary assertion * Address review comments * Remove another section of comments about WDT * Add copyright to sample_app and rename sample_app to sample-app Signed-off-by: doxiao * Support SSL in the domain-home-in-image sample (#1542) * update the common utility & domain-home-in-image to support ssl * update the docs * add ssl tests for 12213-domain-home-in-image * Separate the SSL test * updated param comments * Update the test's javadoc comments * Update domain-home-in-image sample's doc * wording, spelling updates * added test assertions Co-authored-by: Ryan Eberhard * cleanup.sh: add fast WL pod exit, --force phase, backgrounding, and --timeout (#1557) * add --force delete phase to cleanup.sh * set timeout in cleanup.sh * fix typo in --timeout parameter for kubectl delete in cleanup.sh * add 'diefast' support to wl pods and to QA cleanup.sh script * cleanup.sh: run deletes in background and kill bg jobs if they take more than 15 seconds * use same image name but different tags for a it class (#1565) * Log level review and change status from using patch to using endpoint (#1558) * Review log message levels and include details about request when an async call fails * Use status endpoint rather than patch * Record work for other PR's * Continue adjusting log levels * Fix exception display and retry on domain status * Update FailureStatusSourceException.java * Update OtherUnrecoverableErrorBuilder.java * Reconcile logger change * Review comments * Changes to push new image to Docker repo jenkins-ignore (#1568) * Use OpenJDK 11.0.7 JRE (#1569) * Use 11.0.7 JRE * Adjust whitespace * Created a new PR for PV and PVC addition because of merge conflict (#1564) * Created a new PR for PV and PVC addition because of merge conflict * Changes messages to be little bit more clear * Adding test for mii end to end use case (#1563) * adding mii end to end use case * same image name, different tag * addressing review comments * modified exception handling and creating docker registry secret * Add getters and setters for Domain classes (#1576) * Add getters and setters for Domain classes * Missing bean method * pull in 1575 changes from master * Cannot add skipWLSModuleScanning here, once the WLSDEPLOY_PROPERTIES is set in the pod, wlst.sh fails to start (#1579) * Patch Domain Support (#1580) * Add log for introspector job creation time (#1577) Co-authored-by: doxiao * Errormsg 81217 (#1578) * OWLS-81217 Enhance error message for decrypting wdt model * Fix import and correct report bash lineno * change error handling and wordings * change wordings * Remove extra space Co-authored-by: Johnny Shum Co-authored-by: Ryan Eberhard * Always use the latest release of WDT and Image Tool (#1574) * Initial changes for getting the latest version * Get the version number of the latest release of the tools * Minor updates * Minor change in error handling * Remove additional checks of the stderr on command execution result and add javadoc to the new method * Change return null to throw runtime exception * Cleanup * Modified test infra to run integration test in helm3 (#1572) * Skipping tiller installation for Helm 3.x * Added debug flag to setup.sh * Add provision to describe the lb pod when fails to start * More dubug on setup.sh * Added more debug for setup.sh * Modified the helm3 logic in LoadBalancer.java * modified ItUsabilityOperatorHelmChart.java * Modified load balance setup.sh script * Added debug option to helm upgrade * Remove support for Helm 2 based on review comments * remove helm v2 support from setupenv.sh * sync up develop branch, few changes to ItUsabilityOperatorHelmChart class * Update product names * Fix a few more Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM Co-authored-by: Ryan Eberhard * POM updates for new integration tests and other clean-ups. (#1581) * Connect new integration tests, remove build-tools module, remove unnecessary files * Add missing property * Resolve Checkstyle issues * Create profile for new integration tests * Remove properties interferring with coverage * Add javadoc * Correct Checkstyle * Find parent pom directory using maven magic (#1585) * Adding diagnostic log collection feature to integration tests (#1562) * Adding diagnostic features to integration test * wip * wip * wip * wip * initial implementation of diagnostic logging * wip * changed the implementation to use LifecycleMethodExecutionExceptionHandler * Added javadoc * fix newline * fixed javadocs in Kubernetes.java * debuggging * fix javadocs * changed the implmentation for namespace collectioin * added test status overrides * Fix javadocs * Fix for the empty namespace list * remove debug code * Get domain object lists using CustomObjectsApi * Catch the exception * Remove double message logging * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * fix javadoc * fixed pvc list * use RESULT_ROOT in Jenkins or tmp dir for local runs * fix comment * changes as per Ryan's comments * fix pv location * Changes as per Ryan's comments * remove getting logs for all domains * Address Mark comments * address mark's review comments * correct the typos * Fix command stdout (#1587) * Fix ExecCommand to allow both redirect and saveResults enabled the same time * minor cleanup * Remove duplicate failsafe and leftover sample test * Adding extension class to build and push Operator image and more (#1589) * script to build and push operator image to ocir for jenkins to work * Revert "script to build and push operator image to ocir for jenkins to work" This reverts commit a83f7000fb00384fdcfb6e5bb496a25cbce3e1b4. * script to build and push operator image to ocir for jenkins to work * Synchronization for one-time initialization logic * Add try finally * moving constants to a interface * Adding imagebuilder * adding imagebuilder class * build and push operator image in extension * fix command run * use BRANCH env var for JENKINS * fix image name for Jenkins * remove double REPO_NAME * remove double REPO_NAME * fix domain image name * fix domain image name * fix domain image name * checking operator helm release status * workaround for image check * adding assertions for checking docker image and helm release status * address review comments Co-authored-by: Ryan Eberhard * Break the code in to BeforeAll, Test and AfterAll blocks (#1590) * Break the code in to BeforeAll, Test and AfterAll blocks * remove comments * add javadoc * do not fail the whole test if the curl command returns a non-zero status (#1595) * do not fail the whole test if the curl command returns a non-zero status we expect if to fail, and want to retry it until it is successful. it can fail because the web app has not had time to start up yet. the current code throws a runtime exception on a non-zero return code, which causes this test to fail too fast and incorrectly. * use vanaja's simpler solution * Fix exec command (#1593) * Fix exec command * Fix an intermittent issue - join the thread earlier * tests - create domain from existing image and same domainUID in different ns (#1586) * test to add a second domain using the image as the first one * refactoring and also adding test for same domainUID in different ns * refactoring the test * removing the readSecret calls and refactoring the test * remove empty lines * fixing after review comments * more updates after review comments Co-authored-by: BHAVANI.RAVICHANDRAN@ORACLE.COM * It resilience (#1600) * do not fail the whole test if the curl command returns a non-zero status we expect if to fail, and want to retry it until it is successful. it can fail because the web app has not had time to start up yet. the current code throws a runtime exception on a non-zero return code, which causes this test to fail too fast and incorrectly. * use vanaja's simpler solution * fix code so it retries and does not die on RuntimeException on first iteration. Observed a failure in this run: https://build.weblogick8s.org:8443/job/weblogic-kubernetes-operator-quicktest/1375/testReport/oracle.kubernetes.operator/ItElasticLogging/testWebLogicLogSearch/ testWebLogicLogSearch fails arund line 1114 of the log (out file). The first fall to execSearchQuery is getting rc=6 from the curl command and then throws an RE and prematurely aborts the test. This PR changes it to use ExecCommand.exec() instead of TestUtils.exec() so that the result is just returned to the called without killing the test run. * WIP: Add some debugging for ITElasticLogging test (#1601) * add some debugging * fix checkstyle errors * fix logging test * Rethrow the exception caught in the BeforeAll, BeforeEach and AfterEach (#1599) * Rethrow the exception caught in the BeforeAll, BeforeEach and AfterEach methods * Get the LOGS_DIR from TestConstants * Fix the volume Name in PVC * Attempt to clean up use of bad exec() (#1605) * add some debugging * fix checkstyle errors * fix logging test * Attempt to clean up use of bad exec() This commit attempts to resolve a number of test failures that occur due to the bad use of the TestUtils.exec() method. This method throws a RuntimeException if the return code of the executed command is non-zero. This method is being used in many places (over 40). Many of those do not appear to need or want that behavior, and should instead be using the ExecCommand.exec() method which executes a command and then returns the result, without throwing an exception if the command fails. In this commit, I have done a visual inspection of each use of TestUtils.exec() and changed them to ExecCommand.exec() where it appeared to make sense. This includes every case where the call was using the return value from the method, and those where it appears clear from the subsequent logic that a failed command was not expected to terminate the process. There were some calls that I left because I could not be sure of the intent, and these will require more study. In order to make the code clearer, and make people think twice about using TestUtils.exec(), which has caused so many failures, I renamed that method to TestUtils.execOrAbortProcess(). Hopefully that will make it clearer that that method has a dangerous and unexpected side effect. Co-authored-by: Ryan Eberhard * Support for Kubernetes exec command (#1604) * Add support for Kubernetes exec API * Update processing input stream and adding ExecResult return type * clean up reading output thread join * add test to call exec * First code review changes * Remove set/get methods in KubernetesExec * Cleanup artifacts in Kubernetes cluster (#1603) * Adding cleanup methods to cleanup all the Kubernetyes artifacts left behind by the test class. * Leave the cluster artifacts untouched * correct the typo * cleanup javadoc * add logs for pods * Addressing review comments * Refactor the methods * javadoc fix * Fix javadoc * Check fileext wdt (#1592) * add check for wdt version and file extensions in model directories * fix script errors * fix script error * update error wordings * fix wordings * update check extension for wdt configmap * PR fixes * add bypass option for wdt version check * update script for checkDirectoryExtension * update wordings * update wordings * Correct spelling * add bypsss wdt version check wordings * Add support in diagnostic logging to archive PV (#1609) * Added methods to copy persistent volume contents to the client machine by the use of a temporary pod. Creating a temporary pod to mount to same volume used by the tests. Also few more fixes in the logging of files * Enable the cleanup method * Add javadocs * Correct typo * Addressing review comments * Addressing the review comments * Removed the persistent volume related assertions since it is no loner needed * Change the pod container image to use oraclelinux instead of nginx and wait for temp pod to be deleted * javadoc fix * fic formatting * Managed server not starting with FINER logging level (#1615) * do not chain duplicate step * createRetry should not chain duplicate steps * OWLS-81272 - Fix domain status for 'desired state' (#1613) * maintain ordering in servers and clusters in setters * update ServerStatus desiredState description * desiredStatus value also depends on ServerStartupInfos. Add update status call to ManagedServerUpIteratorStep. * remove local variable from getDesiredState * minor cleanup * server status for configured cluster * fix bug where health of configured servers in cluster is not read * add ReadHealthStep tests for dynamic servers and configured servers * remove getServerConfig(String) that is no longer used * Fix for issue 1610 in create-rcu-schema scripts (#1612) * Fix for issue 1610 in develop branch * Incorporated review comments * Incorporated latest comments from Ryan. * Incorporated changes to make imagePullPolicy customizable. * Added wrongly removed $ in README.md * Updated README.md based on latest review comments from maggiehe00 * change helm list command (#1617) * Correct command * Fix assertion and add events log to the logs list (#1619) * Add namespaced events in the collected logs list Fix the persistent volume claim log file name Fix the isPodReady test assertion to check for pod readyness instead of Running status Change the wait time from 5 minutes to 10 minutes * Fix the operator pod ready assertion * Adding roles, rolebindings, clusterroles and clusterrolebindings to the diagnostics * Increasing the introspector pod timeout to 5 minutes * change the namespaced roles and rolebindings file names * Updated versions of Grafana, Prometheus, added extra debugging (#1623) * added more debug info * added more debug info1 * added debug to deploy app * changed version prom * added debug * fixstyle * added sed * fixed typo * fixed logic * added debug for grafana * fixed bash * fixed order * separated scripts * updated grafana ver * updated grafana ver1 * fixed redeploy * corrected scripts * added extra check * added extra class just for Promdebug * added more debug * added more debug1 * fixed typo * TEMP cleanup * removed TEMP * fixed typo * delete debug * more debug * added view logs * deleted testfile * added log collection * added more debug info * deleted commented out blocks * fixed typo * reverted deploywebapp.py to dev version, needed only for extra debugging * replaced exec * Consolidate happy path sample tests (#1620) * Consolidate the ItSimpleDomainValidation.java ItSimpleOperatorValidation.java and ItWitValidation.java into a single file * order the tests * fix operator ready assertion * Revert "fix operator ready assertion" This reverts commit a28cc6d9f832b95e696325029acd38d712d01963. * use the new operatorReady api * Address review comments * fix comment * Remove ItWitValidation test * Adding the domainNamespace1 to the list of domains under operator * added secret name in op params * Nginx mii new it (#1614) * init commit * use kubernetes API call to create ingress * add more debug info for Jenkins run * add more debug info for Jenkins run * add more debug info for Jenkins run * remove debug info for Jenkins run * remove unused imports * uninstall nginx release for now * cleanup * more cleanup * cleanup * change DynamicClusterSize in sample wdt model file * resolve merge conflicts * fix with Mark's comments Co-authored-by: Ryan Eberhard * update helm ls (#1624) * update helm ls * correction * OWLS-80960 - Allow replicas count to drop below min dynamic cluster size (#1627) * introduce new Cluster element allowReplicasBelowMinDynClusterSize * description fix * unit test * update description for allowReplicasBelowMinDynClusterSize * minor edits to description * Model in image sample v2 merge (#1588) * MII Sample README update. * MII Sample - remove mention of rcu admin password in sample doc. * first pass edits * Remove wdtEncryptionSecret from the schema and code * fix two broken links * Clean up after WDT encryption secret related code is removed Signed-off-by: doxiao * Fix doc Signed-off-by: doxiao * Fix doc links Signed-off-by: doxiao * remove wdt encryption passphrase logic from introspector job scripts since it no longer supported in the schema * update MII doc to mention wdt encryption isn't supported * update error message in modelInImage.sh * Enable updateRCUSchemaPassword and add special env variables for macro expansion in modelInImage.sh script * Add @@SECRET and @@ENV support to MII sample/doc. * Add utility methods for model in image tests (#1481) * adding mii utility methods * adding mii utility methods * adding wdtDomainType and use of properties for weblogic base image * minor doc update * doc update * doc update * doc update * doc update * doc update * add script comment * Add introspectorJobActiveDeadlinSeconds to the samples Signed-off-by: doxiao * first draft update of 'choosing a model' doc * first draft update of 'choosing a model' doc * Remove updateDomainResult - dynamic update code * doc updated * Doc update. * doc edits from Ryan * clean up sample descriptor * Remove mii section from samples domain-template.yaml (#1491) * undo changes in domain-template.yaml * adding mii config file * resolve comment merge * Move introspectVersion to spec level only * Update _index.md * Fix inadvertent change * Update sample doc for introspectorJobActiveDeadlineSeconds and runtimeEncryptionSecret Signed-off-by: doxiao * More sample doc update Signed-off-by: doxiao * doc update * clean up sample descriptor * Update Operator.properties * doc update * Removed unused field * edit new choose a model doc * Minor doc fix - address review comment Signed-off-by: doxiao * Fix copyrights * Add support for defaulting the MII sample's WORKDIR. Default is '/tmp/tbarnes/model-in-image-sample-work-dir'. * doc update * sample update * doc update * doc update * fix for MII sample script opss_wallet_util.sh * remove mention of helm 2.x syntax from MII sample * doc update * doc update * doc update * doc update * doc update * doc update * Update the wallet in the primordial domain if the rcu schema password changed * doc update * doc update * add error checking * doc update * doc update * doc update * Checkstyle * Update restarting.md * Update usage.md * Code review * remove unnecessary comment * minor edit * minor edit * Minor doc changes Signed-off-by: doxiao * Revert one doc change Signed-off-by: doxiao * Javadoc * Adding weblogic credentials change test (#1493) * Adding testCredentialsChange * fix import * Add utility method to replace runtimeEncryptionSecret * modify the secret * fix formatting * fix formatting * remove unwanted code * cleanup * cleanup * cleanup * fix indendation * doc updates * doc update * doc update * Minor doc fix Signed-off-by: doxiao * doc update * doc update * add usage and friendlier syntax error reporting to MII sample create_secret.sh + create_configmap.sh, correct the usage text in opss_wallet_util.sh * doc update * doc update * fix to handle image names with '/' in them in create_domain.sh sample script * remove mention of unused var from build_image_model.sh sample script * Fix help text in create_configmap.sh helper script. * Put the domain name back if present * remove printing the model * Correct configmap data is not inserted into the flow after it's read. * Minor change to Operator.properties Signed-off-by: doxiao * remove debug code * minor help text correction for create_configmap.sh sample script * doc update (#1509) * doc update * doc update * doc update * MII: avoid deploying/referencing JRF secrets for non-JRF domain types, it's too confusing (#1507) * doc update (#1510) * doc update * doc update * doc update * update ci/cd doc for mii (#1502) * update ci/cd doc for mii * first pass edits * doc update * doc update Co-authored-by: Rosemary Marano * cherry pick 1517 from develop * two automated test case for Wdt Config Update w single Model File jenkins-ignore (#1495) * The first test case for OWLS-80444 Automate Wdt Config Override with single Model File jenkins-ignore * Modified TestUtils.java jenkins-ignore * Added python file to verify JDBC DS prop in server pod jenkins-ignore * Changes b ased on the comments jenkins-ignore * Added the 2nd test case jenkins-ignore * Used patch domain to restart domain jenkins-ignore * Changed test case names jenkins-ignore * adding config delete and app delete tests using mode file (#1521) * adding config update tests * add config and app delete tests * Model in image namefixes (#1515) * Fix for PR1478 * add more traces and minor update Co-authored-by: Johnny Shum * Missing secret dir fix (#1525) * Add temporary work around for WDT return non-zero rc if secret directory doesn't exist. * Change per WDT fix for no more default for custom secrets mount Co-authored-by: Johnny Shum * Update rest_domainqualtrue.yml * Update OperatorUtils.java * Update OperatorUtils.java * removing commented/incomplete test code (#1533) * Merge from develop to model-in-image with conflict resolution (#1531) * OWLS-80522 Domain status ordering, OWLS-80144 Ordered rolling upgrade (#1503) * Domain.getServers() should return servers in order * ordered rolling upgrade * minor test fix * new RollingHelperTest * update getSortingString to handle up to 20 digits * rolling upgrade clusters sorted by cluster names * add isAdminServer to ServerStatus * ServerStatus isAdminServer excluded from json schema * ClusterStatus sorted by sorting name * getClusters returning sorted clusters * add unit tests * handle null map * Enhance Helm chart deletion Logic in cleanup.sh Script (#1517) * Enhance the clean up Script to support Helm 2/3 * Addressed the review comment Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * Added test for domainQualifier=true, added cleanup for intermittent failures (#1513) * added support for helm 3.0 * added check for repo * moved from monitoring ns * added the test * fixed style * added missed file * added condition for ver * rework to avoid interm failures * fixed docs * updated version of MonExp * Stub the ApiClient in tests that get connections but where this was not already done. (#1519) * Enhance the cleanup script to include deletion of few namesapce(s) created by Integration Tests (#1523) Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * overall doc edits (#1518) * overall doc edits * fix a mistake I created * update Kubernetes prereqs * incorporate edits from Ryan and Mark * fix typo * fix my mistake * minor fixes * Disable preserveUnknownFields * Update rest_domainqualtrue.yml * Update OperatorUtils.java * Update OperatorUtils.java Co-authored-by: Anthony Lai Co-authored-by: Antaryami Panigrahi <31135902+anpanigr@users.noreply.github.com> Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM Co-authored-by: Marina Kogan Co-authored-by: Rosemary Marano * Fix javadoc * fix broken anchor links (#1540) * Updated model files to user @@SECRET macro; added sparce jms/wldf mod… (#1529) * Updated model files to user @@SECRET macro; added sparce jms/wldf model files * Added Copyright Statements * Missing CopyRight * Resync the branch and removed work-around * Addressed review comment Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * Model in Image sample updates * mii sample updates * add --force delete phase to cleanup.sh * mii sample updates * mii sample updates * increase dots timeout * Enhance operator to treat restart version of null, unset, or '' all the same (always create the wl pod label and set it to the empty string). Enhance mii sample 'wait for pods' script to check if pods are at the domain's current restart version. * MII sample updates * rename sample test directory * MII sample test updates, etc * mii sample update: update comments, centralize defaults * MII sample updates * mii sample update * minor update * mii sample updates * mii sample update * sample update * mii sample: use exploded app, change sample-app to sample-archive for clarity, ... * mii sample: update waiter script to also wait for proper image to be reached * mii sample: file, directory, and variable renames * MII Sample: Update app to show DS (if there). Update test to test app too. * MII sample: Add traefik ingress helper script, add verbose 'watch like' mode to util-wl-pod-wait.sh, and refine logging/comments throughout. * MII Sample: minor updates. * MII Sample and MII Sample Test updates: - Decorate target image/archive stage dirs with image name (eg. WORKDIR/image/IMAGE_NAME/yadayadayayda, and ditto for WORKDIR/archive). - Decorate target staged domain resource with DOMAIN_UID (eg. WORKDIR/mii-DOMAIN_UID.yaml). - Put traefik yaml in WORKDIR/ingresses instead of directly in WORKDIR. - Save old traefik ingress yaml if staging replaces them (to WORKDIR/ingresses/old). - Set 'host' on all traefik ingresses to 'DOMAIN_UID.mii-sample.org'. - Modify sample curl commands to use the above host. - Limit/remove mentions of using console with traefik (it's not clear how to make it work when host is set). - Change default namespace from DOMAIN_UID-ns to sample-domain1-ns. - Add help at and of 'create-domain-resource.sh' to detail exact useful commands to run next (monitor domain/pods, run curl, etc.). - Fix minor bug in 'util-wl-pod-wait.sh', and enhance the output of same. - Add README to the sample test. * MII Sample: Minor change to output in the 'util-patch-restart-version.sh' script. * MII Sample: Minor update (change 10g to 10GB throughout). * MII Sample: Update sample test's README. Make util-wl-pod-wait.sh output friendlier. * use theirs * remove additional files that re-appeared after merge with develop * MII Sample: Begin process of moving some of the sample scripts into the test directory. * MII Sample: Complete the move of sample stage/create/build scripts to the test directory. * minor change * minor change * minor change * minor fix * MII Sample: minor updates * MII sample: Hard code defaults for all util scripts. * MII Sample: restructure directory in prep for revised doc approach * MII Sample: Updates * MII Sample: include sample ingresses * MII sample updates. * MII Sample Update * MII Sample: User doc with two use cases. * MII Sample: File rename - windows doesn't like colons in file names. * MII Sample: Use __ instead : in testing and sample generation. * edits up to initial use case summary * MII Sample: Minor edits. * complete first pass edits * MII Sample: Minor doc updates. * MII: user doc update (runtime update section) * some edits * MII sample: remove extra text file. * MII User Doc: Dummy edits to 'choosing a model' so it shows up in the pull review. * MII Sample: Minor doc edit. * last round edits * MII: Minor doc update: fewer expands in sample, fewer copyrights, etc. * MII minor user doc update * MII minor sample doc update * MII minor sample doc update * MII minor sample doc update * MII Sample: Minor doc edit. * MII Sample: Minor doc edit. * MII Sample: Minor sample doc edit. * MII Sample: Minor sample doc edit. * Update _index.md * Update _index.md * Update _index.md * fix incorrect spelling of ConfigMap * Update _index.md * link back to mii sample from quickstart * Update _index.md * fix indent of notice: * Update _index.md * anchor * Update _index.md * Update _index.md * Update _index.md * fix notice * tidy up * sample page done done * Update debugging.md * Update _index.md * Update model-files.md * Update overview.md * Update _index.md * Update debugging.md * Update model-files.md * Update overview.md * Update model-files.md * Delete reusing-rcu.md * Update _index.md * remove rcu db stuff * Update runtime-updates.md * Update usage.md * Delete README * remove unwanted changes from pr * remove unwanted changes from pr Co-authored-by: doxiao Co-authored-by: Rosemary Marano Co-authored-by: Johnny Shum Co-authored-by: Vanajakshi Mukkara <35709372+vanajamukkara@users.noreply.github.com> Co-authored-by: Ryan Eberhard Co-authored-by: Sankar Periyathambi Neelakandan <45743425+sankarpn@users.noreply.github.com> Co-authored-by: Mark Nelson Co-authored-by: Huiling Zhao <41090416+hzhao-github@users.noreply.github.com> Co-authored-by: Johnny Shum Co-authored-by: Anthony Lai Co-authored-by: Antaryami Panigrahi <31135902+anpanigr@users.noreply.github.com> Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM Co-authored-by: Marina Kogan * Fix missing (#1628) Co-authored-by: Johnny Shum * Rebuild json file * cleanup MII docs (#1629) * cleanup MII docs * fix typo * handle null cluster in isAllowReplicasBelowDynClusterSizeFor (#1630) * Script to run new integration tests against a "kind" cluster (#1626) * Run new integration tests with Kind * Mark as executable * Fix typos * Work in progress * Improved Docker registry * Restory worker * Set JAVA_HOME variable if missing * Support WIT specific JAVA_HOME * Support different versions and review comments * Update other file * Fix grep * Review comments * Show how to install * Use kubeconfig option * Clarify how to access cluster * Use kubeconfig option for delete * Fix up NGINX test * Add test filter option * Remove unnecessary directories * fix issue 1457 (and sundry) (#1631) * fix issue 1457 (update introspector to work around off-line WLST bug for SSL bean), fix 'introspector' test's MII path (depended on missing scripts), add option to old integration tests to bypass its greedy need for a docker login when running locally * update comments in test util scripts * Rebuilt index * Synced up with develop branch jenkins-ignore (#1625) * Synced up with develop b ranch jenkins-ignore * Remove ItMiiConfigUpdateMulti.java and ItMiiConfigUpdateSecret.java jenkins-ignore * Endless status updates (#1635) * Add status update debug log * preserve prior server state if new is unknown * avoid NPE * include isAdminServer field in patch comparison * remove isAdminServer field from patch comparison AND equals() * Scaledomain mii new it (#1632) * init commit * use kubernetes API call to create ingress * add more debug info for Jenkins run * add more debug info for Jenkins run * add more debug info for Jenkins run * remove debug info for Jenkins run * remove unused imports * uninstall nginx release for now * cleanup * more cleanup * cleanup * change DynamicClusterSize in sample wdt model file * resolve merge conflicts * get the latest from develop and nginx-mii-new-it, add scale domain method * fix with Mark's comments * scale domain with multiple clusters * cleanup * change number of clusters in domain to 2 * cleanup * fix with Tom's comments * clean javadoc * javadoc cleanup * fix after Mark and Sankar's comments * fix with Vanaja's comments * fix with Sankar's comments * add assertion for pod state during scale * Create image with basic domain model in extension class (#1636) * creating mii basic image in extension class * adding javadoc * delete images in close() * move few constants from ItMiiDomain to TestConstants.java and renamed model yaml filename * fix image name for kind cluster * fix image name * adding log message * update doc for K8s resource names (#1641) * update doc for K8s resource names * fix typo * MII ConfigMap Override Usecase in Junit5 ( Ready for Review ) (#1591) * Initial cut for ConfigMap test * Sync up develop branch * e2e usease with DataSource verification * addressed review comments. added new api to check the pod creation time stamp * Modify the logic to check the pod creation time * Resolved more PR review comments * Resolution to more review comments * Added support to get K8s Service Object * Modified the getService() logic * Added support for getAdminNodePort and K8S_NODEPORT_HOST * Code format using intelij * Syncup develop branch * Uddate to javadoc * Resolution to review comments * Separate the AddCluster UseCase * Add new AddClusters usecase * Modified the test method name * Added assetion to compare the PodCreationStartTime and add new usecases for adding new cluster with default replica count * Modified @DisplayName annotation * Resolved more review comments * Remove the AddCluster usecase to another PR Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * added option to configure operator pod resource requests and limit (#1608) * added option to configure resource req and limit * change default CPU to "250m" * retry for app deployment and other fixes (#1637) * adding check to resolve service name from admin pod, fixing tests to verify the servers/services are created * try with precreate service * increasing timeout * fix cluster size properties based on model yaml * adding retry for app deployment * get events for ns * fix events * add break to loop if app depolyed * fix multi cluster test * adding retry parameter * fix typo * clarify istio requirement in docs * add link to istio * fix: cleanup.sh was leaving files behind in /tmp (#1652) * Improve introspector 'mixed cluster' error messages... (#1653) * Improve introspector 'mixed cluster' error messsages. Other minor changes to introspector. * introspectDomain.py log messages: editor recommended edits * mixed cluster note in user guide's managing domains section * Mii app patching test (#1616) * Initial changes to test application update * Add app assertions * Save the current change * Update ItMiiDomain test * More changes * verify an app from a server pod * add code to patch the domain with a new image and verify * Revert unintended changes * Fix merge issues * more cleanup * Initial change for test number 6 * Fix ExecCommand to allow both redirect and saveResults enabled the same time * Initial change for adding another app * More impl for the second test case * Add model file for the second app * Minor cleanup * Clean up comments * Minor fix * Move delete images to the end of AfterAll * Update command to check response * Fix a merge error * Fix exec command * Add code for remote repo stuff for the new tests * Minor fixes * Cleanup * Fix image name * Add an app file * Make sure the thread joins before we save the stdout * Remove ItWitValidation class becuase the test in it has been copied to ItMiiDomain class * Revert "Remove ItWitValidation class becuase the test in it has been copied to ItMiiDomain class" This reverts commit 5497953103882ff647c179eee1288f24497e3378. * Debugging * Fix pushed image name * Turn off debugging * Testing * Change single check of expected condition to quick retry * Check app on all managed servers * Check each pod to verify if the image has been patched * Fine tuning * clean up * More cleanup * Continue work in progress * Add app continuous availability check and enable it with a system property * Clean up * More javadoc * javadoc and cleanup * Adjust timeout values * Fine tuning * Minor fix * Use kubectl exec command for checking app continuous availability * clean up javadoc * Cleanup * Minor update * Minor update of log messages * More cleanup of log messages and comments * Address review comments * Address one more comment * Minor fix * More logging * Minor comment update * Make log messages more informative * Address a new review comment * Fix a minor merge error * Address more review comments * Update javadoc * Fix merge issues * Update the push image code to check REPO_NAME * remove double adding REMO_NAME * Change baseImageName to image Name * Fix a typo * convert ItUsabilityOperatorHelmChart to JUnit5 (#1655) * convert ItUsabilityOperatorHelmChart to JUnit5 * fix with Mark's comments Co-authored-by: Ryan Eberhard * Added more checks for LB pods status (#1642) * added debug logs * style * style1 * added sync to update method * added check for terminated state * added check for terminated state1 * corrected ingress check * added timestamp check * style * added check LB to domain * added extra info * fixed style * removed chek creationtime * removed chek creationtime1 * cleaned commented out code * added get values * added log collection * style * fixed typo * added more status collection * typo * typo1 * fixed logic for lb * fixed style * corrected var and method naming * modified getpodname to return last created pod based on searchexp * Revert "convert ItUsabilityOperatorHelmChart to JUnit5 (#1655)" This reverts commit 1316f97afc1746a755eb19992b1be4ef0e5e1d9e. * convert ItUsabilityOperatorHelmChart to JUnit5 * fix with Mark's comments * Checkstyle corrections * Create domain on persistent volume using WLST (#1648) * Adding domain on persistent volume test * Adding the create domain py script * Fix the test name printed when the test method throws an exception * Adding console login tests * Added console login test * Addressing Ryan's comments * Change the repo name * Creating a docker config json for repo secret * Adding OCR related credentials * use a local object * Addressed Xian's review comments * order the imports * Addressed Vanaja's review comments * changing image pull policy * removed docker login * change assertion description. * Fix build * Addressing Mark's review comments Co-authored-by: Ryan Eberhard * fix hard coded ns in MII sample wl-pod-wait.sh helper script (#1658) * added sort by timestamp for get lb pods (#1661) * added debug logs * style * style1 * added sync to update method * added check for terminated state * added check for terminated state1 * corrected ingress check * added timestamp check * style * added check LB to domain * added extra info * fixed style * removed chek creationtime * removed chek creationtime1 * cleaned commented out code * added get values * added log collection * style * fixed typo * added more status collection * typo * typo1 * fixed logic for lb * fixed style * corrected var and method naming * modified getpodname to return last created pod based on searchexp * added sorting by creationtimestamp * Make ItDomainOnPV work on kind clusters (#1666) * Adding domain on persistent volume test * Adding the create domain py script * Fix the test name printed when the test method throws an exception * Adding console login tests * Added console login test * Addressing Ryan's comments * Change the repo name * Creating a docker config json for repo secret * Adding OCR related credentials * use a local object * Addressed Xian's review comments * order the imports * Addressed Vanaja's review comments * changing image pull policy * removed docker login * Work around kind limitation * Use correct credentials * change assertion description. * Use image for job * Fix build * Only add image pull secrets, if necessary Co-authored-by: sankar * Use --noproxy '*' for node port * Add check for unzip (#1659) * Add check for unzip * update wordings * minor fix * Update introspectDomain.sh Co-authored-by: Johnny Shum Co-authored-by: Ryan Eberhard * Mii sample vnext (#1649) * MII Sample: Cleanup (delete unneeded files, consolidate test/generator doc, etc) * MII Sample: First draft of update2 use case. * MII Sample: First draft of update3 use case. * MII Sample: Second draft of update3 use case. * MII Sample: preliminary testing for use cases update2 and update3. * MII Sample: edit pass edits * MII Sample: edit pass edits * MII Sample: edit pass edits * mii sample editorial fixes for update2 and update3 use cases * mii sample editorial fixes for update2 and update3 use cases * doc fix * MII Sample: Refactor and simplify sample test/generator scripts. * OWLS-80135 - Fix NPE in ManagedServersUpStep.apply() (#1667) * add check for null config. Some refactoring * cleanup * cleanup * Retry DB startup and RCU creation as well as support custom namespace for RCU/DB (#1639) * first cut of retry-rcu * address the review comment * Fix Rolling Upgrade (#1663) * Initial changes to test application update * Add app assertions * Save the current change * Update ItMiiDomain test * More changes * verify an app from a server pod * add code to patch the domain with a new image and verify * Revert unintended changes * Fix merge issues * more cleanup * Initial change for test number 6 * Fix ExecCommand to allow both redirect and saveResults enabled the same time * Initial change for adding another app * More impl for the second test case * Add model file for the second app * Minor cleanup * Clean up comments * Minor fix * Move delete images to the end of AfterAll * Update command to check response * Fix a merge error * Fix exec command * Add code for remote repo stuff for the new tests * Minor fixes * Cleanup * Fix image name * Add an app file * Make sure the thread joins before we save the stdout * Remove ItWitValidation class becuase the test in it has been copied to ItMiiDomain class * Revert "Remove ItWitValidation class becuase the test in it has been copied to ItMiiDomain class" This reverts commit 5497953103882ff647c179eee1288f24497e3378. * Debugging * Fix pushed image name * Turn off debugging * Testing * Change single check of expected condition to quick retry * Check app on all managed servers * Check each pod to verify if the image has been patched * Fine tuning * clean up * More cleanup * Continue work in progress * Add app continuous availability check and enable it with a system property * Clean up * More javadoc * javadoc and cleanup * Adjust timeout values * Fine tuning * Minor fix * Use kubectl exec command for checking app continuous availability * clean up javadoc * Cleanup * Minor update * Minor update of log messages * More cleanup of log messages and comments * Address review comments * Address one more comment * Minor fix * More logging * Minor comment update * Make log messages more informative * Address a new review comment * Fix a minor merge error * Address more review comments * Update javadoc * Fix merge issues * Update the push image code to check REPO_NAME * remove double adding REMO_NAME * Change baseImageName to image Name * Fix a typo * Rolling upgrade fix * Remove newline from file * Functional programming changes to make code be much easier to read based on code review * Correct DomainSpec.equals() to use the effective values of 'image' and 'imagePullPolicy' and remove DomainPresenceControl class * Moved if statement based on review comment Co-authored-by: doxiao * Async http client change (#1643) * changes for using JDK11 http client and async invocation * Add constant for timeout seconds * minor change * added new files * added initial tests * Review changes * delete unit testing related WIP files * changes based on PR review comments * Create steps for async http calls * Use steps to execute asynchronous http request * remove obsolete Result classes * Skip response processing on timeout and continue the fiber. * revert to starting values of generated files * Changes based on PR review comments. * Reduce log serverity level from warning to fine * changed statusUpdateInitialShortDelay from 3 to 5 Co-authored-by: Russell Gold * initial commit * Null check the KIND_REPO (#1669) * Push to kind repo when REPO_NAME is set * Set a default value in non kind environment * doing a null check * Add config/dynamic cluster to MiiDomain (#1662) * Added test to add clusters to mii domain * Added JMS/WLDF configuration * add security env parameter to model file * Resolved the PR review commemts * Resolved more review comments, add JMS/WLDF resources into ItMiiConfigMapOverride usecases * Resolved more review comments * Modified curl command to get JDBCRunime Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * Implement assertion that only maxUnavailable pods are replaced at a time (#1651) * adding assertion to check pods in a given namespace are rolling restarted * Fix the parameter orders * Fix the pod terminating method * wip * wip * wip * wip * wip * wip * Fix the javadocs * wip * wip * changed the logic * p# Please enter the commit message for your changes. Lines starting * wip * wip * wip * refactor * wip * Address review comments * Addressing review comments * wip * wip * wip * wip * wip * null check * wip * Test change domain credentials secret (#1665) * Add test case for changing WebLogic admin credentials secret * Refactor the code to use new common test util methods * Javadoc * Minor fix in a log message * Test javadoc * Javadoc and comments * More log messages * Fix javadoc * Address review comments * Improve credential verification * Address review comments * Move credentials verification to Domain assertion class * Adding parameterized test for mii end-to-end use case in JUnit 5 (#1668) * adding dependency for param tests * use utils class and remove duplicated code * adding operator upgrade util method * assert for operator upgrade * changing parameter value * adding methodsource and taking values from env var * typo * addressing review comments * moving parameterized test before @after methods * fixing order Co-authored-by: Ryan Eberhard * reformat the code * minor fix * Create basic domain in image using wdt (#1660) * first cut of ItDomainInImage * ItDomainInImage.java -> ItDomainInImageWdt.java to better reflect the usecase * fix the class name * refactor the code * remove comment out code * correct checkstyple * add missing wdtModelOnly setup * refactor the basic image build * minor javadoc change * removed the debugging code * address review comments * minor cleanup * fix javadoc * fix with Sankar's comments * Add new rolling re-start assertion to ItClasses (#1670) * Add new rolling re-start assertion to ItClass * Fixed few INFO statements * Added common utility methods into CommonTestUtils class, refactored the test classes * Resolved PR review comments * Moved patchDomainResourceWithNewRestartVersion to TestAction classs Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * Test multiple model files in domain's configmap (#1674) * Add first test case for multiple model file use case * Minor javadoc change * Fix a log message * Address review comments * Add doc link to the comments * Fix introspectVersion to force introspection and not roll pods (#1679) * Fix introspectVersion to force introspection and not roll pods * fix spelling error * change t3channelport * Delete images pushed to OCIR at the end of testing (#1676) * OCIR token generation script * Delete images from OCIR * Fix typo * Correct path * Sync with latest changes * Remove images from other tests * fix with Pani and Vanaja's comments * rename methods to more generic names * convert ItPodsRestart#testServerPodsRestartByChangingResource to JUnit5 (#1664) * create CommonUtils for commonly used methods * retrun Nginx HELM install parameter in installAndVerifyNginx * convert ItUsabilityOperatorHelmChart to JUnit5 * adapt MII basic image created in IntegrationTestWatcher * make test methods not depend on each other * add --show-error in curl command * test jenkins * fix with Pani's comments * test Jenkins * convert ItPodsRestart testServerPodsRestartByChangingResource to JUnit5 * cleanup * fix javadoc * use rolling restart verification for managed servers * fix with Sankar's comments * second pass edit (#1684) * Add test - Domain in persistent volume using WDT tool (#1678) * Adding Domain in PV using WDT test * Adding test for domain in pv using wdt tool. Renamed file ItDomainOnPV to ItDomainInPV * Move the checkServiceExists after checkPodReady * Addressing Vanaja's review comments * Fix checkstyle violations * Change the WDT default version to 1.8.1 * use latest if WDT_VERSION is not provided * Addressing review comments * Fix the WDT URL * wip * retry the logic for WDT url * Improvements found while diagnosing problems with fibers under load (#1683) * Add debugging for suspended fibers * Improve diagnostics * Change fiber numbering * Client 8.0.2 * Additional diagnostics * Refactor test code * Remove unused code * Review comments and trigger full recheck * Changing the podCreationTimestamp data type to String (#1685) and using isAfter method for comparison * Convert ItOperatorTwoDomains#testTwoDomainsManagedByTwoOperators to JUnit5 (#1675) * initial commit * reformat the code * minor fix * fix javadoc * fix with Sankar's comments * change t3channelport * fix with Pani and Vanaja's comments * rename methods to more generic names Co-authored-by: Ryan Eberhard * Revert "Convert ItOperatorTwoDomains#testTwoDomainsManagedByTwoOperators to JUnit5 (#1675)" This reverts commit 07272f8ec9b3649fe06c25b1b0629d3ca3207276. * resolve merge conflicts * fix getNextFreePort * Add more test cases for multiple WDT model file ordering (#1687) * Add first test case for multiple model file use case * Minor javadoc change * Fix a log message * Partial work for the second multi-model case * Work in progress * work in progress * javadoc and refactor * Move createConfigMapAndVerify method to CommonTestUtils * Change ItMiiConfigMap and ItMiiConfigMapOverride to use the common test utils * Minor changes in javadoc * Minor changes * javadoc * Address review comment * Add --noproxy '*' to the curl commands * Correct rules for pods/exec and timing of reading output (#1690) * PR: add adminNodePortAccessible into ItDomainInImage test class (#1691) * add adminNodePortAccessible to ItDomainInImageWdt * remove unused variable * remove extra space between lines * Converted ItSessionMigration.java to use JUnit5 jenkins-ignore (#1672) * Converted ItSessionMigration.java to use JUnit5 jenkins-ignore * Added use case to the javadoc jenkins-ignore * Removed factory method for ParameterizedTest and use util method instead jenkins-ignore * MII Sample: Fix managed server names in JRF model. (#1688) * Support for building appplications (#1696) * Adding infra support to build J2EE applications * Add targets and system properties support * Remove comment * Fix parameters * Adding deployment util and Java HttpClient (#1693) * Adding deployment util to deploy applications to domain Adding a Java based HttpClient Fixed the Cleanup util to delete persistent volume claims before persistent volumes * Uninstall Nginx * Fix the logic to set image repo * Handle the case where the OCR_SECRET already exists * Change the method name from deployApplication to deployUsingWlst * Fix javadoc (#1695) * fix javadoc errors and warnings * Remove unnecessary throws clause * Remove workarounds in the integration test code (#1700) * remove workaround * Remove null check * Intermittent status issue fix (#1701) * Fix for intermittent issue with server status after domains are scaled up and down * package access for getHealth instead of public * Text fix * Correct affinity merging logic (#1702) * Correct affinity merging logic * Address review comments * MII Documentation Updates (#1692) * MII Documentation Updates * MII minor doc updates. * MII Doc & Sample: editorial revisions * MII Sample Doc: Minor editorial fix. * MII User doc: Minor updates. * User doc FAN info update for WDT. * fix exception in WatchBuilderTest.tearDown() caused by NamespaceTest (#1698) * scale a cluster using REST API (#1705) * initial commit * make tests indepence to the orders * cleanup * fix with Vanaja's comments * check K8S_NODEPORT_PORT is IP address * Fix image name (#1710) * Fix image name * More update to the image name * Adding introspectVersion tests (#1706) * Adding test for introspectVersion property addition * Add introspect watch domain to operator namespace * Add the config change file * Use admin host and port * Remove t3url * Add cluster_name in properties * change value type * Debug * Modify the introspectVersion field to be a string * uncomment cleanuputil * Add a sleep after patching * Add a check for introspect pod * Adding a case for rolling * Add a check for rolling restart * Call the WLST script with new properties to change the admin server port * Assign a unique name for every WLST execute job * Fix wlst script * Add assert conditions * Split the rolling into a separate test * Fix admin server port * Fix domain space in while gettiong admin port * Use T3Channel for WLST * use static imports * Remove debug statements * change admin server and ms names * Added assertion to verify updated admin port * Added a deployment test * Refactored the code. Moved the introspectVersion tests to a separate file * Adding additional action methods to add labels to a existing namespace * convert max_cluster_size to int * Print job log of WLST even for success case * Patch the domain to increase the replicas size * Correct the replicas path * Patch the domain with new replicas count and introspectVersion in one go * Add patch domain with introspect version after online WLST changes * Use node port for accessing application * Fix comments and javadoc * Add new line * wip * Change the method name to patchDomainResourceWithNewIntrospectVersion * fix javadoc * Fix typo * Node heating FAQ (#1703) * Node heating FAQ * Add content to templates * Review comments * WIP: Mii sample it (#1686) * MII sample test: update to have finer grained steps. * MII Sample Test Script: Update help. * second pass edit * adding itmiisample draft vesion * MII Sample Test: Change default for MODEL_DIR. * MII Sample Wrapper: support customized image pull secret * MII Sample Test: Change heuristic for determining k8s cluster public address. * adding tests for all use cases * MII Sample Test: (1) Parameterize JRF RCU command. (2) Fix JRF managed server names. * MII Sample Test: Minor fix. * use custom ns for traefik, uninstall traefik, create repo secret * add image pull secret env var * MII Sample Test: Use different RCU schemas for different JRF domains. * setting JAVA_HOME * adding new env var * adding new env var * MII Sample Test: Configurable timeouts. Updated README. Tooling download tracing. * MII Testing: Change defaults for internal 'show_merged_model.sh' test script. * MII Sample: Minor change to output of wl-pod-wait.sh script * MII Sample Test: Add retries to tooling download curl commands, plus increase their timeouts. * MII Sample Test: Double tooling download timeout (again). * JRF tests and adding proxy in env var for scripts * adding JRF tets and run tests conditionally * adding pod wait secs env var * undo setting proxy in env var * fix pod wait sec env var name and db cleanup * increasing pod wait secs and tests skip if the previous test fails for JRF * use diff ns for jrf domain and push jrf base images to kind repo * pass WDT_DOMAIN_TYPE env var and delete images from local repo in extension class instead of test class * display actual error in assert * use common code * MII Sample Test: increase dots timeout * MII Sample It refactoring * MII Sample Test: Add retries to application curl invoke. * code refactoring, print error message in assert * run JRF use cases irrespective of WLS use cases fail/pass * MII Sample Test: Additional retries for kubectl exec curl. Improved error reporting for same. * MII Sample Test: Add 'manual' retry loop around curl calls to jsp app. * MII Sample Test: More changes to curl output checks. * make image names unique and run checksamplesource always * use failsafe 3.0.0-M3 because to make the build fail when @beforeAll fails, make testCheckSamplSource first test * pass dbimage as env var * fix db image typo * MII Sample Test: More curl rework for kind. * MII Sample Test: More curl rework for kind. * RCU Sample: Print error output when dbping fails. * adding BASE_IMAGE_NAME env var for JRF * fix image name var value * fix image name var value * sleep after test failure based on env var * log messages in afterall * RCU Sample: Fix debug output for db ping errors. * RCU Sample: Fix debug output for db ping errors. * Increase db sample's db pod disk space reservation. * RCU Sample: Fix debug output for db ping errors. * cleanup.sh: add oracle-db, rcu, and type deployment * revert change to image pull secrect in oracle.db.yaml * javadoc changes * ItMiiSample: javadoc update * Oracle DB Sample: (1) Add option to skip deploying node-port. (2) Add verification k8s service deploy succeeded. * using none for DB nodeport, Tom's latest changes in samples script * Mii Sample Testing: Parameterize and increase introspector deadline seconds for JRF runs. * Mii Sample Testing: Parameterize and increase introspector deadline seconds for JRF runs. * Oracle DB Sample: (1) Add option to skip deploying node-port. (2) Add verification k8s service deploy succeeded. * merge fix * merge fix * using RESULT_ROOT for MII work dir, pretty true for pod logs, collect logs on success using env. var * fix checkstyle * adding introspector deadline seconds and moving JRF parameters to JRF test method * use test method name while generating logs on success Co-authored-by: Rosemary Marano Co-authored-by: Vanajakshi Mukkara * Fix for OWLS-81419 (#1711) * Fix for OWLS-81419: Domain status does not reflect status when the MII introspect job fails * set default failure reason if job failure reason is null * Fix a customer issue when SSL is enabled (#1714) * Implement distribution strategy for config override changes (#1682) * When configured, tell server pod to copy changed overrides * Rename copySitCfg functions in livenessProbe.sh and startServer.sh * make copy conditional * Generate trace only on actual copy * Don't roll pods when distribution strategy changes * Use agreed-upon names * Change introspect stand-alone test to use new name 'weblogic-script-cm' instead of 'weblogic-domain-cm'. * Rename script CM, improve docs * ignore introspectVersion setting for model-in-image domains * Update description of 'introspectVersion' to indicate when it is ignored. * update descriptions * update description further * Add misses space before period * and build the generate docs * update index * Add 'see also' Co-authored-by: Tom Barnes * fix domain secret mismatch: ignore any whitespace diff (#1717) * edit scaling doc as per OWLS-82641 * Added infra support for monitoring exporter (#1704) * added prom support * added support for coord, webhook * fixed typos * added support to deploy archived file * fixed monexp app check * fixed style * fixed style1 * fixed push image * fixed style * fixed deployment delete * cleanup * cleanup * cleanup * addressed comments from review * checkstyle * fixed logic * modified isPodReady * moved replaceString to testutils * fixed comments, changed map processing * deleted unused vars, split methods * replaced with descriptive var name, fixed processing of multiple webapps files * style * typo * Adjust api version to v6 * Revert "Adjust api version to v6" This reverts commit 545c9cdd74f11dae8a9778f9a5ae7f13b07956f3. * Switch to KubernetesTestSupport (#1715) * give the lowest named servers in a configured cluster precedence when… (#1727) * give the lowest named servers in a configured cluster precedence when choosing which ones to start (fixes OWLS-82374) * respond to minor review comment * Add test to verify interserver communication (#1725) * Adding cluster member communication application * Fix the build application to copy application folder recursively * Add checks for pv and pvc delete * Fix checkstyle errors * Build the application in a separate directory so that pv can be cleaned up * Remove pv delete check * Create secret only if it doesn't exist * Create unique names for all artifacts * Fix param name * Fix persistent volume claim deletion when there is no label * wip * Add new check for bound status * Fix * Remove the configmap * change the reclaim policy to recycle * Fix copyright * Fix the clusterview app to bind and unbind in lifecycle methods * Add a label * Use servlet * fix url * Add label in pvc * Address review comments from Tom B * Fix url * Change ti NamingException instead of namenotfoundexception * cleanup comments and docs * Change error message * wip * change error message * remove comment * wip * Correct introspect version (#1730) * use label on introspector config map to track previous introspectVersion value * Add REST functionality for introspectDomain and restartDomain * Undo Javadoc editting error * rename POST actions * fix cpu request comparison issue in ItPodRestart (#1729) * fix cpuRequest comparison * use compareTo in BigDecimal to compare two values * use BigDecimal for cpuLimits and cpuRequests * start sending wls stdout to pod log earlier (#1734) * cleanup.sh speedup: disable pvc finalizers before deleting them (#1733) * Correct for git branch names used as Docker tags and delete repos when deleting the last tag * Add operator upgrade instructions * changes for OWLS-82320 - Recieve API error and operator restarts when namespaces is removed (#1723) * changes for OWLS-82320 - Recieve API error and operator restarts when namespaces is removed * change to execute start namespaces step in async call failure case * changes for dedicated mode * Handle empty list for namespaces to start * changes to log a warning when namespace is target namespace and doesn't exist and a minor fix. Co-authored-by: Ryan Eberhard * Add namespace to operator log messages (#1735) * Add namespace to log messages * Add a new file * Handle namespace watch event * Remove the thread local in ServerStatusReader * Use Closeable and more * add unit test for LoggingFormatter * Add unit test cases for namespace * Add missing file * fix * some cleanup and unit testing Co-authored-by: Russell Gold * Adding liveness probe test (#1721) * adding test for liveness probe * uncomment code * fix log messages * code refactoring to move some of the code to separate test methods * code refactoring to move some of the code to separate test methods * change env var name * reverting to java client api 8.0.0 * copy file to /u01 * adding debug msgs * push operator image when SKIP_BASIC_IMAGE_BUILD is set or not set * add ns- to cleanup.sh to delete namespace * revert adding ns- to cleanup.sh * Update new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Kubernetes.java Co-authored-by: Sankar Periyathambi Neelakandan <45743425+sankarpn@users.noreply.github.com> * dont run dependent tests if previous test fails, revert to 8.0.2 * increasing timeout for conditionfactory * checking servers are ready after accessing the web using LB * checking servers are ready after accessing the web using LB * add more debug for webapp request * move nginx installation to @beforeall as workaround * add app deployment to original test and leave other use cases as individual tests with dependencies * Update new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItDomainInPV.java Co-authored-by: Sankar Periyathambi Neelakandan <45743425+sankarpn@users.noreply.github.com> * revert refactoring changes * added check to access app after container restart Co-authored-by: Sankar Periyathambi Neelakandan <45743425+sankarpn@users.noreply.github.com> * Istio productization Owls 81599 (#1689) * add istio support * update script * update sample for istio * restore deleted token * formatting * add envoyPort to Istio and change nap override logic * update add/replace action * fix override logic * Fix add and replace logic * Update doc for Istio * minor refactoring * update doc * doc update * correct spelling * remove 'experimental' * doc update * fix typo * add simple test for istio network channels * correct side effect of cd * add protocol check * remove working file * restore istio fix python but remove all standard istio protocols leaving user external channel * update test data * doc changes * Restore Experimental and other updates * refactor and add ports to pod * some refactoring * fix script to append istio- for generated channel names * make sure the istio-* overrides channel ports are also created by the pod * update sample for external channel port * undo the changes * replace token when istioEnabled = false * correct external channel name when istio is enabled for sample * disable expose channel as service when in istio, let the mesh handle it. * fix merge * Change naming convention I. * add admin port support * added comments for TODO * update doc * update doc and add additional protocols ports for default * Add support for channel name search when creating ports * add domain validation against exposing default channel when istio is enabled * minor fix * refactoring * doc update * fix introspectorTest * doc update * doc update * doc update * update sample * doc update * PR responses * Correct error message text * update error message for domain validation * remove Experimental from the domain crd. * remove experimental phrase in comment * update doc * Change weight of experimental index and istio md doc * Fixed NPE * refactor code * doc update * restore readinessPort removed by accident * add istio options lines in template * correct sample script because naming convention changed * fix protocol * Rebuild schemas * remove ISTIO_ENVOY_PORT * update doc * doc updates * doc update * final review/edits * Rebuild domain documentation Co-authored-by: Johnny Shum Co-authored-by: Ryan Eberhard Co-authored-by: Rosemary Marano * Use GraalVM CE 19.3.2. (#1744) * Add owner references to resources associated with a specific domain (#1743) * Upgrade 3.0.0 schema version to v8 (#1749) * Move to schema v8 * Simplify CRD schema versions * Bring forward simplified v7 CRDs * OWLS-79995 - Introduce maxConcurrentStartup cluster configuration (#1741) * shorten DELAY_IN_SECONDS from 10s to 1s * add allowConcurrentScaleUp Cluster configuration, and allowConcurrentScaleUp and allowReplicasBelowDynClusterSize Domain configuration * update description for allowConcurrentScaleUp * replace allowConcurrentScaleUp with maxClusterServerConcurrentStartup * code cleanup * add unit tests for ManagedServerUpIteratorStep * more unit tests * update equals with new fields * rename maxClusterServerConcurrentStartup to maxConcurrentStartup in cluster and maxClusterConcurrentStartup in domain * code cleanup * update description * description update * doc edits from review comments * minor fix to address review comment * test names Co-authored-by: Ryan Eberhard * Scale a cluster using WLDF Policy (#1724) * initial commit * scale cluster with WLDF * refactor the code * add more logging information * add copyright * resolve merge conflicts * get the latest develop * add readiness check after ingress is created (#1740) * add readiness check for ingress * fix with Vanaja's comments * JUnit5 JRF tests infra: DB startup and RCU schema creation (#1737) * first cut for junit5 JRF * first working version * add the missing files * fix SSL connection closed issue and Kind image pull issue * increase retry time * ignore SSLProtocolException * minor change * cleanup the code * minor cleanup * address the review comments * addressed more review comments Co-authored-by: Ryan Eberhard * OWLS-80884: Removing a Domain namespace from Operator TargetNamespace should not shutdown the domain (#1748) * Verify all namespaces listed in 'isNameSpaceStopping' map to see if they're running * modify behavior so that Operator does not shudown domain resource when namespace removed from targetNamespace list * Rename isNamespaceStopping field in Main to isNamespaceStoppingMap * Dropped the 'is.' from the 'isNamespaceStoppingMap' field in Main and rename to 'namespaceStoppingMap' * Added Voyager to Junit5 framework (#1732) * Added Voyager to Junit5 framework jenkins-ignore * Changed DisplayName jenkins-ignore * Changes b ased on comments jenkins-ignore * Changes based on comments jenkins-ignore * Fixed ingressHost jenkins-ignore * Fix build application utility (#1752) * Fixed the build application utility The fix involves Removing the persistent volumes for mounting application source directory to the pod , since PV_ROOT is shared only between the Kubernetes nodes and Jenkins client doesn't have access to the PV_ROOT Instead of a Kubernetes job the utility will create a WebLogic pod and copies the source application folder to the pod and builds the application. Once built the archives directory is copied back to the local file system for use by the test code. * Fix javadoc and cleanup comments * Handle the javax.net.ssl.SSLProtocolException: Connection or outbound has been closed exception when copying files from/to pod. * Return the entire path instead of a partial path to the build directory * Fix the archive location of clusterview.war * Istio fix (#1750) * Fix istio overridden user specified public address and add unit test * fix public ip problem Co-authored-by: Johnny Shum * Junit5 stickysess tests (#1754) * Added Voyager to Junit5 framework jenkins-ignore * Changed DisplayName jenkins-ignore * Changes b ased on comments jenkins-ignore * Changes based on comments jenkins-ignore * Fixed ingressHost jenkins-ignore * Converted ItStickySession to use JUnit5 jenkins-ignore * Crossdomxaction (#1738) * cross domain transaction test * updating cross domain transaction test * updates to cross domain transaction test * add curl command to the test * update crossd domaintransaction to use new app * adding some debug statements * fix following Alex's review comments * fix merge * add debugs * add repo name to the image * reverting previous commit * fix checkstyle * fixes based on review comments * fix teh app distribution dir in the test Co-authored-by: BHAVANI.RAVICHANDRAN@ORACLE.COM * second pass review (#1719) * second pass review * move References section * MII minor documentation and timeout updates. (#1758) * Update initial.md * Update update2.md Co-authored-by: Tom Barnes Co-authored-by: Ryan Eberhard * Changes to fix retry logic and recover gracefully from lack of RBAC for CRD (#1745) * Changes to fix retry logic and recover gracefully from lack of RBAC for CRD * Changes based on review comment and further testing * added unit tests for changed functionality * Added new unit tests for StreamResetException check in onFailureNoRetry of replace CRD in CrdHelper * remove unused dependency * added unit tests * Support scheduled item adding to schedule * Added unit tests for status code 504 (server timeout) and test exceeding retry count * fix test name Co-authored-by: Russell Gold * Tests for Istio Configuration (#1753) * Addded istio test into develop branch * Updated Istio tests with new utility methods * Modify the istio template to incude domain uid * Addressed the review comments * Moved the uninstallIstio() to CleanupUtil * Resolution to more review comments Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * Test operator restart when server pods roll (#1759) * Initial changes for owls-81935 * Add checks for operator pod restart * Add check for operator pod creation time * Refactor * Minor change * Fix a merge issue * Minor fix * Javadoc * Update new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonPatchTestUtils.java Co-authored-by: Sankar Periyathambi Neelakandan <45743425+sankarpn@users.noreply.github.com> * Update new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Kubernetes.java Co-authored-by: Sankar Periyathambi Neelakandan <45743425+sankarpn@users.noreply.github.com> * Update new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonMiiTestUtils.java Co-authored-by: Sankar Periyathambi Neelakandan <45743425+sankarpn@users.noreply.github.com> * Address review comments * Add imageName as a parameter in createDomainResource method * Add imageName as a parameter to createMiiDomainAndVerify util method Co-authored-by: Sankar Periyathambi Neelakandan <45743425+sankarpn@users.noreply.github.com> * Version CRD's by apiVersion and then product version and remove use of weblogic.resourceVersion label (#1762) * Remove resourceVersion label * Update CRD based on product version * Improve unit test * Correct version label check * Correct test * Changes to log messages into individual log file for each It class (#1765) * adding junit-platform.properties to run IT classes in parallel * run classes in parallel * use ThreadLocal to save the local logger * use separate logger for each It class * echo mvn command * using ThreadSafeLogger * fix nginx clusterrole and node port conflicts in parallel * use local var for logger * sync to latest develop and modify new classes for logger * fix ItDomainInPV * using inheritablethreadlocal * fix checkstyle issue * commenting debug msgs * make parallel run false by default * fix merge issues * remove commented code, fix NPE in voyager * fix merge issues * addressing review comments by Xian Co-authored-by: xiancao * Fix licenses * converted ItMonitorintExporter tests to junit5 (#1757) * added prom support * added support for coord, webhook * fixed typos * added support to deploy archived file * fixed monexp app check * fixed style * fixed style1 * fixed push image * fixed style * fixed deployment delete * cleanup * cleanup * cleanup * addressed comments from review * checkstyle * fixed logic * modified isPodReady * moved replaceString to testutils * fixed comments, changed map processing * deleted unused vars, split methods * replaced with descriptive var name, fixed processing of multiple webapps files * style * typo * added endtoend * merged bhavani impl * fixed scaling * added func tests * fixed logic * fix * added fix * fix logic * fixed test * addressed comments from review * fixed logic for checkpod and service * addressed review comments * fixed typo * merge * style * Standardize behavior of introspectVersion and restartVersion (#1746) * Standardize behavior of introspectVersion and restartVersion * Fix MII md5 checks so that they ignore whitespace * Force introspection to happen before updating or creating server pods * Update introspectVersion label even when introspect fails to produce any topology * Add unit test for case of repeated introspect after pod-change-induced introspect * Rename introspectLabel, use null for force * Use null for force * Don't run introspection when scaling up if no other changes * Owls 82147 (#1764) * Detect env var change during MII re-instrospect (MD5 check). * minor changes: change env var name, add comment * minor change: change method name * minor changes: unit test helper renames, etc Co-authored-by: Tom Barnes Co-authored-by: Ryan Eberhard * Review and update descriptions for schema (#1772) * Review and update descriptions for schema * Correct typos * Review comments * More comments * A couple more, minor changes * A couple more missing periods * Even more review * Adding JRF domain into ItJrfDomainInPV (#1767) * first cut for junit5 JRF * first working version * add the missing files * fix SSL connection closed issue and Kind image pull issue * increase retry time * ignore SSLProtocolException * minor change * cleanup the code * minor cleanup * address the review comments * addressed more review comments * first cut of ItJrfDomainInPV * minor change * increase RCU pooling time * move DB/RCU to initAll * cleanup the code * move verify managed server service before checkcheckPodReady * minor change * Log introspector job info on failure (#1773) * Initial change * Complete the first unit test case * work in progress * Work in progress * Work in progress * Minor changes * Fine tune log message * Fine tune the info message * update docs for 3.0.0 (#1751) * update docs for 3.0.0 * incorporate Monica's edits Co-authored-by: Ryan Eberhard * Parse all resource versions using BigInteger (#1774) * Parse all resource versions using BigInteger * Clarify behavior when failing to parse resource version * Watcher use resource version directly * Add image version from default latest to 7 (#1779) * Fix spelling errors * Two Domain with Single Istio Ingress Controller (#1778) * Added unique host info to istion VS/Gateway * Modify checkAppUsingHostHeader() * Checking for server readiness with quick retry * Removed hard-coded sleep beore checking Console * Fixed the javadoc comments * addressed review comments * Added support for parallel run; one istio install/unistall per run * Updated utility to make the http hostHeader optional, add new parameter for app name during rest deploy * Minot javadoc change * Addressed more review comments Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM Co-authored-by: sankar * Remove old situation configuration entries from the introspector map (#1780) * Remove old situation configuration entries from the introspector map * simplify implementation * Don't remove transient entries on introspector short-circuit * Istiocdxaction (#1771) * istio cross domain transaction test * fix the image name for jenkins runs * Fix failure when copying the app out of pod * commenting admin console access * updates after sankar's review comments * one more change requested by Sankar * retry console login due to failure in Kind clsuter * add debug * adding username/pwd to curl command * removing commented code * revisiting change to run in Kind cluster * removing commented code * update after review comments Co-authored-by: BHAVANI.RAVICHANDRAN@ORACLE.COM * Improve test verification (#1777) * Improve test verification * Fail application availability check early * Address a review comment * Add tests for overrideDistributionStrategy (#1768) * Adding config distribution strategy tests * Adding distribution stratgey test * Adding configmap in patch string * fix configmap name * wip * wip * wip * patch the domain after config change * adding test with distributionstrategy as DYNAMIC * increment the introspect version * Added more test scenarios * Add configuration property reader servlet * Deploy the application right after creating domain * Formatting * change the attribute value * wip * add a restart method * Fix formatting * Add the patching * Fix pod check * Get the pod creation timestamp after restart * move the podready after startdomain * wip * wip * Adding data source related tests * wip * wip * wip * wip * wip * wip * override datasource with new url and user/password * remove open option * add secrets in the configuration * correct the path for secrets * Print jdbc data source attributes * add checks for jdbc ds params * move verify overrides to separate method * Refactor and cleanup code * fix t3channelport for domain * lookup jdbc resource mbean from runtimeservicembean * Fix the attribute values * fix url * Refactor the code * use static imports * Fix shutdown domain * Remove overrides and secrets when restoring domain * Add a flag for debug printing * Move the iintrospector check and pod state checks to separate methods * javadoc cleanup * Use static imports * Fix typo * Move the copy operations in its own try/catch block to prevent build failure * Remove the override verifications since patching fails with invalid values for overridestrategy * don't assert the patching in afterEach * Introduced a dynamic wait until config is updated. Introduced introspector run check during cold restart. * Correct param index * Addressed Bhavani's review comments * Addressing Marina's review comments * liveness probe script 'copy new sit cfg' fix * minor IT test fix - Always --> IfNotPresent * revert minor IT test fix - IfNotPresent goes back to Always, fix missing import * Adding a new cluster as part of override * add a test method for resource restart * Restart datasource * Split the patching into multiple parts * Corrected the patch string, replicas should be a number not a string * Correct debug params * Correct typo * Refactor for new cluster * Create second data source * Fix listServers * Refactor the code to create new cluster through onliine WLST and bring up cluster using introspection * add namespace for NGINX * Fix typo * correct typo * correct syntax error * Fix string concat * Uninstall NGINX * Move the confgi update check after new cluster startup verification * Add ingress controller * Fix nginx * fix * Add all targets for application clusterview * rename vars * Separate adding the new cluster and config overrides into separate usecases * Add a check for new servers * fix imports * Revert changes to ingress creation * javadoc fix * move the for out of try catch * put domainRuntime lookup inside try catch since it is only available in admin server * deploy app to admin server as well * Provide a empty string to delete overridesconfigmap * Remove everything under configuration * move delete secrets to on_restart test * cleanup comments * change the secret name * Disable the failing tests until bug https://jira.oraclecorp.com/jira/browse/OWLS-82977 is fixed * Checking for the default token in default service account to fix the test failures in kind cluster runs * Using a utlity method to increment the introspectVersion * Added a new test scenario where configmap is recreated with new override content and applying the override through introspection * Test fixes made based on the bug fix https://jira.oraclecorp.com/jira/browse/OWLS-82977 * Fix secret name Co-authored-by: Tom Barnes * Default resources java options (#1775) * Changes for OWLS-80384 - Verify that operator deployment and WebLogic pods have good default cpu/memory resources * changes for OWLS-80384 - Verify that operator deployment and WebLogic pods have good default cpu/memory resources * resource settings FAQ updates * removed extra space * Changes for review comments * changes for addressing PR review comments * second pass review Co-authored-by: Tom Barnes Co-authored-by: Rosemary Marano * Version updates (#1785) * Move the KIND_REPO check before calling the DbUtils.setupDBandRCUschema (#1786) to set the image repos for dbimage and fmwimage * Log introspect pod on failure (#1787) * Log introspector pod on failure * Minor change * cleanup * Fix a merge issue * Unit tests * add headings to FAQ index page (#1783) * Make Calico CNI an option when running tests with Kind (#1784) * Install Calico * Add CNI option * Fixes for Calico support * Use latest or 1.9.1 WIT and WDT versions (#1790) * Istio Configuration in MII Model and DomainHomeOnPV model (#1788) * Added missing files * Renamed the test class and methods * Addressed review comments. modified the istio installation script * Refactored the code to use utility methods from CommonTestUtils Class Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM * Use fixed number of threads to run the tests in parallel and other fixes (#1791) * using 7 threads because of resource issues * making pv name unique, catch conditiontimeoutexception in Loggingutil, increase retry attempts for mii sample * disable voyager sample for parallel testing * make ingress hostname unique (#1781) * adding number of threads as var * add number of threads env var * adding option for number of threads * fix conflict * fix echo mvn command * set threads to 3 * change default threads back to 2 * undo disable voyager sample test * address review comments for option * fix options Co-authored-by: Xian Cao * Converted ItCoherenceTest to use Junit5 jenkins-ignore (#1782) * Converted ItCoherenceTest to use Junit5 jenkins-ignore * Added copyright Junit5 jenkins-ignore * Changes based on comments Junit5 jenkins-ignore * Seveal changes on comments jenkins-ignore * use 0 for DB nodeport (#1793) * Write pod logs as string to the file (#1798) * use kubectl for pod logs * write pod logs as string * use k8s java api * remove commented code * Update new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/LoggingUtil.java Co-authored-by: Sankar Periyathambi Neelakandan <45743425+sankarpn@users.noreply.github.com> Co-authored-by: Sankar Periyathambi Neelakandan <45743425+sankarpn@users.noreply.github.com> * Remove direct reference to joda-time (#1795) * Switch to using Jakarta JSON (#1796) * Switch to using Jakarta JSON * Use 1.1.6 * Documentation for introspection and significant rewrites around the Domain (#1789) * Updates to domain resource doc. * Further edits * Continued updates * Finished introspection doc * A few more changes * Review comments * Additional updates in progress * Update implementation details * Work in progress * More review comment work * OPSS field updates * Update descrition of Istio readinessProbe * Adjust config overrides for PV restarting language * Clarify dynamic * Update domain in PV restarting section * Typo * Work with Tom * Fix typo * Break long sentence * MII Sample Testing: Add MII sample stand-alone test option to dynamically allocate Traefik nodeports, and change MII sample integration test to use this option. (#1803) * Create an unique Voyager release name for each test suite jenkins-ignore (#1794) * Correct apiVersion for Domain status updates (#1806) * Correct apiVersion for Domain status updates * Update Java files * Revert "Update Java files" This reverts commit 6b43a2960f3dcd8ff75d4f4967fe8b55ccd16792. * correct host-name in health check REST url when Pod IP is null (#1807) * correct host-name in health check REST url when Pod IP is null * added unit test * Update Deployment and Ingress apiVersions (#1805) * Update Deployment and Ingress apiVersions * Update Java files * Replace apps/v1beta1 * un-hide demo video * Use OpenJDK 14.0.2 (#1808) * Backstop wait for ready with periodic rechecks (#1811) * Backstop wait for ready with periodic rechecks * Unit-test and fix version checks * removed -t flag for create and drop scripts (#1810) * Don't use a TTY for execs (#1813) * Refactor integration tests creating domain in PV to use methods from CommonTestUtils (#1800) * Using different ports instead of starting at default 30000, at times when there is a delay in getting an unused port and using it. * wip * Refactored the ItDomainInPV, ItIntrospectVersion and ItConfigDistributionStrategy test classes * Use static imports * cleanup comments * Doing a lookup for every request instead of onetime lookup in init method * Using 0 for mysql nodeport * wip * Fix get db nodeport method * Fix typo * Use static imports * using a smaller max message size * Adding debug statements * load servlets on startup * List servers after restart Check service existance after restart * Move the DB creation after operator installation * Add more checks for service existance * Move the default token check to CommonTestUtils.java * Add javadoc * Make it easier to parameterize WDT/WIT download url (#1812) * make download location more flaxible * minor fix * Minor change * minor change * Add env var for download file name * Take care of sample testing as well * Set up necessary env vars in ItMiiSample * Fixes necessary for 2.6.0 to 3.0.0 upgrade (#1815) * Show failure status on 500 and other errors * Report errors in CRD replace and create * Several updates to CRD and CRD generation * Ignore null status following replace * adding operator upgrade test for 2.6.0 to develop * delete crd at the beginning of the test * fix checkstyle * remove domain not restarted check and changes for 2.5.0 upgrade test Co-authored-by: Vanajakshi Mukkara * update Traefik version to 2.2.1. (#1816) * update Traefik version to 2.2.1. * fix note according to Anil * update WDT version used by domain-in-image samples and make it configurable (#1817) * Add Javadoc * Clarify 2.6.0 upgrade instructions (#1818) * Clarify 2.6.0 upgrade instructions * Review comments * Update Javadoc * Update README.md * Fix link * Fix links * fix some links Co-authored-by: Anthony Lai Co-authored-by: Marina Kogan Co-authored-by: doxiao Co-authored-by: Tom Barnes Co-authored-by: Johnny Shum Co-authored-by: Rosemary Marano Co-authored-by: Antaryami Panigrahi <31135902+anpanigr@users.noreply.github.com> Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM Co-authored-by: Vanajakshi Mukkara <35709372+vanajamukkara@users.noreply.github.com> Co-authored-by: Sankar Periyathambi Neelakandan <45743425+sankarpn@users.noreply.github.com> Co-authored-by: Mark Nelson Co-authored-by: Huiling Zhao <41090416+hzhao-github@users.noreply.github.com> Co-authored-by: Johnny Shum Co-authored-by: Derek Sharpe Co-authored-by: Lenny Phan <33355669+lennyphan@users.noreply.github.com> Co-authored-by: Derek Sharpe <36005286+ddsharpe@users.noreply.github.com> Co-authored-by: Quang Dang <37304399+qvdang@users.noreply.github.com> Co-authored-by: Anil Kedia <37935279+ankedia@users.noreply.github.com> Co-authored-by: Bhavani Ravichandran <31928633+bhavaniravichandran@users.noreply.github.com> Co-authored-by: BHAVANI.RAVICHANDRAN@ORACLE.COM Co-authored-by: Ashageetha Rao Co-authored-by: Xian Cao Co-authored-by: Russell Gold Co-authored-by: ANTARYAMI.PANIGRAHI@ORACLE.COM Co-authored-by: sankar Co-authored-by: Maggie He Co-authored-by: Vanajakshi Mukkara Co-authored-by: Russell Gold Co-authored-by: Sambasiva Battagiri <52483425+sbattagi@users.noreply.github.com> --- Dockerfile | 18 +- LICENSE.txt | 2 +- README.md | 4 +- .../checkstyle/customized_google_checks.xml | 2 +- build/kube.config | 19 - buildDockerImage.sh | 2 +- buildtime-reports/pom.xml | 2 +- deploy.sh | 11 - docs-source/content/_index.md | 37 +- .../developerguide/backwards-compatibility.md | 2 +- .../content/developerguide/code-structure.md | 11 +- .../developerguide/domain-processing.md | 6 +- docs-source/content/faq/_index.md | 20 +- .../content/faq/boot-identity-not-valid.md | 3 +- docs-source/content/faq/cannot-pull-image.md | 38 +- .../content/faq/coherence-requirements.md | 7 +- docs-source/content/faq/configmaps.md | 5 +- .../content/faq/domain-secret-mismatch.md | 5 +- docs-source/content/faq/external-clients.md | 5 +- docs-source/content/faq/fan.md | 9 +- .../content/faq/namespace-management.md | 19 +- docs-source/content/faq/node-heating.md | 7 +- docs-source/content/faq/oci-fss-pv.md | 10 +- docs-source/content/faq/oci-lb.md | 9 +- docs-source/content/faq/resource-settings.md | 177 + docs-source/content/faq/volumes.md | 5 +- docs-source/content/quickstart/cleanup.md | 4 +- .../content/quickstart/create-domain.md | 2 +- docs-source/content/quickstart/get-images.md | 9 +- docs-source/content/quickstart/install.md | 2 +- docs-source/content/quickstart/prepare.md | 2 +- .../content/reference/domain-resource.md | 4 +- docs-source/content/release-notes.md | 4 +- .../samples/simple/credentials/_index.md | 2 +- .../simple/domains/delete-domain/_index.md | 14 +- .../domains/domain-home-in-image/_index.md | 16 +- .../domains/domain-home-on-pv/_index.md | 14 +- .../simple/domains/fmw-domain/_index.md | 12 +- .../simple/domains/model-in-image/_index.md | 1761 +- .../simple/domains/model-in-image/cleanup.md | 50 + .../simple/domains/model-in-image/initial.md | 842 + .../domains/model-in-image/prerequisites.md | 325 + .../simple/domains/model-in-image/update1.md | 468 + .../simple/domains/model-in-image/update2.md | 471 + .../simple/domains/model-in-image/update3.md | 421 + .../simple/domains/soa-domain/_index.md | 14 +- .../elastic-stack/weblogic-domain/_index.md | 8 +- .../content/samples/simple/storage/_index.md | 19 +- .../domain-security/image-protection.md | 3 +- docs-source/content/security/secrets.md | 2 +- .../userguide/introduction/architecture.md | 10 +- .../content/userguide/introduction/design.md | 6 +- .../userguide/introduction/introduction.md | 5 +- docs-source/content/userguide/istio/istio.md | 13 +- .../userguide/managing-domains/_index.md | 28 +- .../choosing-a-model/_index.md | 21 +- .../configoverrides/_index.md | 181 +- .../domain-lifecycle/_index.md | 2 +- .../domain-lifecycle/introspection.md | 105 + .../domain-lifecycle/restarting.md | 146 +- .../domain-lifecycle/scaling.md | 41 +- .../domain-lifecycle/startup.md | 108 +- .../managing-domains/domain-resource.md | 402 +- .../managing-domains/ingress/_index.md | 2 +- .../model-in-image/debugging.md | 36 +- .../model-in-image/model-files.md | 30 +- .../model-in-image/overview.md | 39 +- .../model-in-image/runtime-updates.md | 63 +- .../managing-domains/model-in-image/usage.md | 123 +- .../persistent-storage/_index.md | 2 +- .../managing-fmw-domains/fmw-infra/_index.md | 11 +- .../managing-operators/installation/_index.md | 28 +- .../using-the-operator/using-helm.md | 14 +- .../content/userguide/overview/database.md | 4 +- docs/apidocs/allclasses-index.html | 517 +- docs/apidocs/allpackages-index.html | 25 +- docs/apidocs/constant-values.html | 716 +- docs/apidocs/deprecated-list.html | 25 +- docs/apidocs/help-doc.html | 33 +- docs/apidocs/index-all.html | 881 +- docs/apidocs/index.html | 27 +- docs/apidocs/member-search-index.js | 2 +- docs/apidocs/member-search-index.zip | Bin 27272 -> 29670 bytes .../oracle/kubernetes/json/Description.html | 29 +- .../oracle/kubernetes/json/EnumClass.html | 29 +- .../json/KubernetesSchemaReference.html | 29 +- .../oracle/kubernetes/json/Pattern.html | 29 +- .../apidocs/oracle/kubernetes/json/Range.html | 29 +- .../kubernetes/json/SchemaGenerator.html | 59 +- .../kubernetes/json/YamlDocGenerator.html | 29 +- .../json/class-use/Description.html | 59 +- .../kubernetes/json/class-use/EnumClass.html | 25 +- .../class-use/KubernetesSchemaReference.html | 25 +- .../kubernetes/json/class-use/Pattern.html | 25 +- .../kubernetes/json/class-use/Range.html | 25 +- .../json/class-use/SchemaGenerator.html | 25 +- .../json/class-use/YamlDocGenerator.html | 25 +- .../kubernetes/json/mojo/JsonSchemaMojo.html | 29 +- .../oracle/kubernetes/json/mojo/Main.html | 29 +- .../oracle/kubernetes/json/mojo/MainImpl.html | 29 +- .../json/mojo/class-use/JsonSchemaMojo.html | 25 +- .../kubernetes/json/mojo/class-use/Main.html | 25 +- .../json/mojo/class-use/MainImpl.html | 25 +- .../kubernetes/json/mojo/package-summary.html | 25 +- .../kubernetes/json/mojo/package-tree.html | 25 +- .../kubernetes/json/mojo/package-use.html | 25 +- .../kubernetes/json/package-summary.html | 25 +- .../oracle/kubernetes/json/package-tree.html | 25 +- .../oracle/kubernetes/json/package-use.html | 25 +- .../kubernetes/operator/ConfigMapWatcher.html | 53 +- .../kubernetes/operator/DomainPresence.html | 29 +- .../kubernetes/operator/DomainProcessor.html | 70 +- .../operator/DomainProcessorDelegate.html | 57 +- .../operator/DomainProcessorImpl.html | 88 +- .../kubernetes/operator/DomainSourceType.html | 71 +- .../operator/DomainStatusUpdater.html | 78 +- .../kubernetes/operator/DomainWatcher.html | 53 +- .../kubernetes/operator/EventWatcher.html | 53 +- .../kubernetes/operator/ImagePullPolicy.html | 29 +- ...ts.html => IntrospectorConfigMapKeys.html} | 124 +- .../kubernetes/operator/JobWatcher.html | 61 +- .../operator/KubernetesConstants.html | 105 +- .../kubernetes/operator/LabelConstants.html | 86 +- .../oracle/kubernetes/operator/Main.html | 80 +- .../operator/MakeRightDomainOperation.html | 317 + .../operator/ModelInImageDomainType.html | 328 + .../kubernetes/operator/NamespaceStatus.html | 29 +- .../kubernetes/operator/NamespaceWatcher.html | 53 +- .../kubernetes/operator/OperatorLiveness.html | 29 +- .../kubernetes/operator/OperatorReady.html | 29 +- .../OverrideDistributionStrategy.html | 361 + .../oracle/kubernetes/operator/Pair.html | 29 +- .../operator/PodAwaiterStepFactory.html | 29 +- .../kubernetes/operator/PodWatcher.html | 59 +- .../operator/ProcessingConstants.html | 134 +- .../operator/ServerStartPolicy.html | 29 +- .../kubernetes/operator/ServerStartState.html | 29 +- .../operator/ServerStatusReader.html | 29 +- .../kubernetes/operator/ServiceWatcher.html | 53 +- .../kubernetes/operator/ShutdownType.html | 29 +- .../operator/SwaggerBuildHelper.html | 29 +- .../TuningParameters.CallBuilderTuning.html | 29 +- .../operator/TuningParameters.MainTuning.html | 29 +- .../operator/TuningParameters.PodTuning.html | 29 +- .../TuningParameters.WatchTuning.html | 63 +- .../kubernetes/operator/TuningParameters.html | 29 +- .../operator/TuningParametersImpl.html | 29 +- .../operator/WebLogicConstants.html | 29 +- .../authentication/Authenticator.html | 29 +- .../operator/authentication/Helpers.html | 29 +- .../class-use/Authenticator.html | 25 +- .../authentication/class-use/Helpers.html | 25 +- .../authentication/package-summary.html | 25 +- .../operator/authentication/package-tree.html | 25 +- .../operator/authentication/package-use.html | 25 +- .../operator/builders/CallParams.html | 29 +- .../builders/WatchBuilder.WatchFactory.html | 29 +- .../operator/builders/WatchBuilder.html | 29 +- .../kubernetes/operator/builders/WatchI.html | 29 +- .../operator/builders/WatchImpl.html | 29 +- .../builders/class-use/CallParams.html | 25 +- .../class-use/WatchBuilder.WatchFactory.html | 25 +- .../builders/class-use/WatchBuilder.html | 25 +- .../operator/builders/class-use/WatchI.html | 25 +- .../builders/class-use/WatchImpl.html | 25 +- .../operator/builders/package-summary.html | 25 +- .../operator/builders/package-tree.html | 25 +- .../operator/builders/package-use.html | 25 +- .../operator/calls/AsyncRequestStep.html | 29 +- .../operator/calls/CallFactory.html | 29 +- .../operator/calls/CallResponse.html | 29 +- .../operator/calls/CallWrapper.html | 29 +- .../operator/calls/CancellableCall.html | 29 +- .../operator/calls/FailureStatusSource.html | 31 +- .../calls/FailureStatusSourceException.html | 37 +- .../calls/OtherUnrecoverableErrorBuilder.html | 267 - .../operator/calls/RequestParams.html | 29 +- .../operator/calls/RetryStrategy.html | 29 +- .../operator/calls/RetryStrategyListener.html | 29 +- .../calls/SynchronousCallDispatcher.html | 29 +- .../calls/SynchronousCallFactory.html | 29 +- .../calls/UnrecoverableErrorBuilder.html | 33 +- .../calls/class-use/AsyncRequestStep.html | 25 +- .../operator/calls/class-use/CallFactory.html | 25 +- .../calls/class-use/CallResponse.html | 42 +- .../operator/calls/class-use/CallWrapper.html | 25 +- .../calls/class-use/CancellableCall.html | 25 +- .../calls/class-use/FailureStatusSource.html | 73 +- .../FailureStatusSourceException.html | 25 +- .../OtherUnrecoverableErrorBuilder.html | 153 - .../calls/class-use/RequestParams.html | 25 +- .../calls/class-use/RetryStrategy.html | 25 +- .../class-use/RetryStrategyListener.html | 25 +- .../class-use/SynchronousCallDispatcher.html | 25 +- .../class-use/SynchronousCallFactory.html | 25 +- .../class-use/UnrecoverableErrorBuilder.html | 25 +- .../operator/calls/package-summary.html | 33 +- .../operator/calls/package-tree.html | 26 +- .../operator/calls/package-use.html | 35 +- .../operator/calls/unprocessable/Cause.html | 29 +- .../calls/unprocessable/ErrorBody.html | 29 +- ...tml => UnrecoverableErrorBuilderImpl.html} | 76 +- .../calls/unprocessable/class-use/Cause.html | 25 +- .../unprocessable/class-use/ErrorBody.html | 25 +- ...tml => UnrecoverableErrorBuilderImpl.html} | 56 +- .../calls/unprocessable/package-summary.html | 27 +- .../calls/unprocessable/package-tree.html | 27 +- .../calls/unprocessable/package-use.html | 27 +- .../operator/class-use/ConfigMapWatcher.html | 25 +- .../operator/class-use/DomainPresence.html | 25 +- .../operator/class-use/DomainProcessor.html | 25 +- .../class-use/DomainProcessorDelegate.html | 25 +- .../class-use/DomainProcessorImpl.html | 25 +- .../operator/class-use/DomainSourceType.html | 140 +- .../class-use/DomainStatusUpdater.html | 25 +- .../operator/class-use/DomainWatcher.html | 25 +- .../operator/class-use/EventWatcher.html | 25 +- .../operator/class-use/ImagePullPolicy.html | 25 +- ...ts.html => IntrospectorConfigMapKeys.html} | 35 +- .../operator/class-use/JobWatcher.html | 25 +- .../class-use/KubernetesConstants.html | 25 +- .../operator/class-use/LabelConstants.html | 25 +- .../kubernetes/operator/class-use/Main.html | 25 +- .../class-use/MakeRightDomainOperation.html | 182 + .../class-use/ModelInImageDomainType.html | 160 + .../operator/class-use/NamespaceStatus.html | 25 +- .../operator/class-use/NamespaceWatcher.html | 25 +- .../operator/class-use/OperatorLiveness.html | 25 +- .../operator/class-use/OperatorReady.html | 25 +- .../OverrideDistributionStrategy.html | 279 + .../kubernetes/operator/class-use/Pair.html | 25 +- .../class-use/PodAwaiterStepFactory.html | 25 +- .../operator/class-use/PodWatcher.html | 25 +- .../class-use/ProcessingConstants.html | 25 +- .../operator/class-use/ServerStartPolicy.html | 25 +- .../operator/class-use/ServerStartState.html | 25 +- .../class-use/ServerStatusReader.html | 25 +- .../operator/class-use/ServiceWatcher.html | 25 +- .../operator/class-use/ShutdownType.html | 25 +- .../class-use/SwaggerBuildHelper.html | 25 +- .../TuningParameters.CallBuilderTuning.html | 25 +- .../TuningParameters.MainTuning.html | 25 +- .../class-use/TuningParameters.PodTuning.html | 25 +- .../TuningParameters.WatchTuning.html | 25 +- .../operator/class-use/TuningParameters.html | 35 +- .../class-use/TuningParametersImpl.html | 25 +- .../operator/class-use/WebLogicConstants.html | 25 +- .../operator/helpers/AnnotationHelper.html | 29 +- .../helpers/AsyncRequestStepFactory.html | 29 +- .../operator/helpers/AuthenticationProxy.html | 29 +- .../helpers/AuthorizationProxy.Operation.html | 29 +- .../helpers/AuthorizationProxy.Resource.html | 29 +- .../helpers/AuthorizationProxy.Scope.html | 29 +- .../operator/helpers/AuthorizationProxy.html | 29 +- .../operator/helpers/BasePodStepContext.html | 219 +- .../operator/helpers/CallBuilder.html | 108 +- .../operator/helpers/CallBuilderFactory.html | 29 +- .../operator/helpers/ClientFactory.html | 29 +- .../operator/helpers/ClientPool.html | 29 +- .../operator/helpers/ClusterConfig.html | 29 +- .../helpers/ClusteredServerConfig.html | 29 +- .../operator/helpers/ConfigMapConsumer.html | 29 +- ...pHelper.IntrospectorConfigMapContext.html} | 166 +- .../operator/helpers/ConfigMapHelper.html | 179 +- .../operator/helpers/ConflictRetry.html | 29 +- .../operator/helpers/CrdHelper.html | 36 +- .../operator/helpers/DomainConfig.html | 29 +- .../DomainPresenceInfo.ServerStartupInfo.html | 53 +- .../operator/helpers/DomainPresenceInfo.html | 100 +- .../operator/helpers/DomainStatusPatch.html | 29 +- ...omainTopology.html => DomainTopology.html} | 122 +- .../helpers/DomainValidationSteps.html | 29 +- .../operator/helpers/HealthCheckHelper.html | 29 +- .../operator/helpers/JobHelper.html | 36 +- .../operator/helpers/JobStepContext.html | 98 +- .../operator/helpers/KubernetesUtils.html | 85 +- .../operator/helpers/KubernetesVersion.html | 63 +- .../operator/helpers/LastKnownStatus.html | 29 +- .../operator/helpers/LegalNames.html | 44 +- .../helpers/NonClusteredServerConfig.html | 29 +- .../operator/helpers/OperatorServiceType.html | 29 +- .../operator/helpers/PodHelper.html | 92 +- .../operator/helpers/PodStepContext.html | 42 +- .../kubernetes/operator/helpers/Pool.html | 29 +- .../operator/helpers/ResourceVersion.html | 29 +- .../operator/helpers/ResponseStep.html | 29 +- .../operator/helpers/RollingHelper.html | 29 +- .../operator/helpers/SecretHelper.html | 29 +- .../operator/helpers/SecretType.html | 59 +- .../operator/helpers/SemanticVersion.html | 423 + .../operator/helpers/ServerConfig.html | 29 +- .../operator/helpers/ServiceHelper.html | 29 +- .../operator/helpers/StepContextBase.html | 197 +- .../helpers/StepContextConstants.html | 196 +- .../helpers/class-use/AnnotationHelper.html | 25 +- .../class-use/AsyncRequestStepFactory.html | 25 +- .../class-use/AuthenticationProxy.html | 25 +- .../AuthorizationProxy.Operation.html | 25 +- .../AuthorizationProxy.Resource.html | 25 +- .../class-use/AuthorizationProxy.Scope.html | 25 +- .../helpers/class-use/AuthorizationProxy.html | 25 +- .../helpers/class-use/BasePodStepContext.html | 25 +- .../helpers/class-use/CallBuilder.html | 25 +- .../helpers/class-use/CallBuilderFactory.html | 25 +- .../helpers/class-use/ClientFactory.html | 25 +- .../helpers/class-use/ClientPool.html | 25 +- .../helpers/class-use/ClusterConfig.html | 25 +- .../class-use/ClusteredServerConfig.html | 25 +- .../helpers/class-use/ConfigMapConsumer.html | 25 +- ...pHelper.IntrospectorConfigMapContext.html} | 35 +- .../helpers/class-use/ConfigMapHelper.html | 25 +- .../helpers/class-use/ConflictRetry.html | 25 +- .../operator/helpers/class-use/CrdHelper.html | 25 +- .../helpers/class-use/DomainConfig.html | 25 +- .../DomainPresenceInfo.ServerStartupInfo.html | 27 +- .../helpers/class-use/DomainPresenceInfo.html | 81 +- .../helpers/class-use/DomainStatusPatch.html | 25 +- ...omainTopology.html => DomainTopology.html} | 51 +- .../class-use/DomainValidationSteps.html | 25 +- .../helpers/class-use/HealthCheckHelper.html | 25 +- .../operator/helpers/class-use/JobHelper.html | 25 +- .../helpers/class-use/JobStepContext.html | 25 +- .../helpers/class-use/KubernetesUtils.html | 25 +- .../helpers/class-use/KubernetesVersion.html | 28 +- .../helpers/class-use/LastKnownStatus.html | 25 +- .../helpers/class-use/LegalNames.html | 25 +- .../class-use/NonClusteredServerConfig.html | 25 +- .../class-use/OperatorServiceType.html | 25 +- .../operator/helpers/class-use/PodHelper.html | 25 +- .../helpers/class-use/PodStepContext.html | 25 +- .../operator/helpers/class-use/Pool.html | 25 +- .../helpers/class-use/ResourceVersion.html | 25 +- .../helpers/class-use/ResponseStep.html | 65 +- .../helpers/class-use/RollingHelper.html | 25 +- .../helpers/class-use/SecretHelper.html | 25 +- .../helpers/class-use/SecretType.html | 25 +- .../helpers/class-use/SemanticVersion.html | 214 + .../helpers/class-use/ServerConfig.html | 25 +- .../helpers/class-use/ServiceHelper.html | 25 +- .../helpers/class-use/StepContextBase.html | 32 +- .../class-use/StepContextConstants.html | 34 +- .../helpers/class-use/VersionHelper.html | 103 - .../operator/helpers/package-summary.html | 65 +- .../operator/helpers/package-tree.html | 36 +- .../operator/helpers/package-use.html | 57 +- .../operator/http/HttpAsyncRequestStep.html | 29 +- .../operator/http/HttpResponseStep.html | 29 +- .../http/class-use/HttpAsyncRequestStep.html | 25 +- .../http/class-use/HttpResponseStep.html | 25 +- .../operator/http/package-summary.html | 25 +- .../operator/http/package-tree.html | 25 +- .../kubernetes/operator/http/package-use.html | 25 +- .../operator/logging/LoggingContext.html | 387 + .../operator/logging/LoggingFacade.html | 29 +- .../operator/logging/LoggingFactory.html | 29 +- .../operator/logging/LoggingFilter.html | 29 +- .../operator/logging/LoggingFormatter.html | 29 +- .../operator/logging/MessageKeys.html | 304 +- .../logging/OncePerMessageLoggingFilter.html | 29 +- .../class-use/LoggingContext.html} | 90 +- .../logging/class-use/LoggingFacade.html | 25 +- .../logging/class-use/LoggingFactory.html | 25 +- .../logging/class-use/LoggingFilter.html | 25 +- .../logging/class-use/LoggingFormatter.html | 25 +- .../logging/class-use/MessageKeys.html | 25 +- .../OncePerMessageLoggingFilter.html | 25 +- .../operator/logging/package-summary.html | 39 +- .../operator/logging/package-tree.html | 26 +- .../operator/logging/package-use.html | 35 +- .../kubernetes/operator/package-summary.html | 51 +- .../kubernetes/operator/package-tree.html | 30 +- .../kubernetes/operator/package-use.html | 127 +- .../operator/rest/AuthenticationFilter.html | 29 +- .../operator/rest/BaseDebugLoggingFilter.html | 29 +- .../kubernetes/operator/rest/ErrorFilter.html | 29 +- .../operator/rest/ExceptionMapper.html | 29 +- .../operator/rest/FilterPriorities.html | 29 +- .../rest/RequestDebugLoggingFilter.html | 29 +- .../rest/ResponseDebugLoggingFilter.html | 29 +- .../operator/rest/RestBackendImpl.html | 110 +- .../kubernetes/operator/rest/RestConfig.html | 29 +- .../operator/rest/RestConfigImpl.html | 29 +- .../kubernetes/operator/rest/RestServer.html | 29 +- .../oracle/kubernetes/operator/rest/Scan.html | 29 +- .../kubernetes/operator/rest/ScanCache.html | 29 +- .../operator/rest/backend/RestBackend.html | 52 +- .../operator/rest/backend/VersionUtils.html | 29 +- .../rest/backend/class-use/RestBackend.html | 25 +- .../rest/backend/class-use/VersionUtils.html | 25 +- .../rest/backend/package-summary.html | 25 +- .../operator/rest/backend/package-tree.html | 25 +- .../operator/rest/backend/package-use.html | 25 +- .../rest/class-use/AuthenticationFilter.html | 25 +- .../class-use/BaseDebugLoggingFilter.html | 25 +- .../operator/rest/class-use/ErrorFilter.html | 25 +- .../rest/class-use/ExceptionMapper.html | 25 +- .../rest/class-use/FilterPriorities.html | 25 +- .../class-use/RequestDebugLoggingFilter.html | 25 +- .../class-use/ResponseDebugLoggingFilter.html | 25 +- .../rest/class-use/RestBackendImpl.html | 25 +- .../operator/rest/class-use/RestConfig.html | 25 +- .../rest/class-use/RestConfigImpl.html | 25 +- .../operator/rest/class-use/RestServer.html | 25 +- .../operator/rest/class-use/Scan.html | 25 +- .../operator/rest/class-use/ScanCache.html | 25 +- .../operator/rest/model/BaseModel.html | 29 +- .../operator/rest/model/ClusterModel.html | 29 +- .../operator/rest/model/CollectionModel.html | 29 +- .../model/DomainAction.html} | 113 +- .../operator/rest/model/DomainActionType.html | 328 + .../operator/rest/model/DomainModel.html | 29 +- .../operator/rest/model/ErrorModel.html | 29 +- .../operator/rest/model/ItemModel.html | 29 +- .../rest/model/LinkContainerModel.html | 29 +- .../operator/rest/model/LinkModel.html | 29 +- .../rest/model/ScaleClusterParamsModel.html | 29 +- .../operator/rest/model/VersionModel.html | 29 +- .../rest/model/class-use/BaseModel.html | 25 +- .../rest/model/class-use/ClusterModel.html | 25 +- .../rest/model/class-use/CollectionModel.html | 25 +- .../rest/model/class-use/DomainAction.html | 220 + .../model/class-use/DomainActionType.html | 182 + .../rest/model/class-use/DomainModel.html | 25 +- .../rest/model/class-use/ErrorModel.html | 25 +- .../rest/model/class-use/ItemModel.html | 25 +- .../model/class-use/LinkContainerModel.html | 25 +- .../rest/model/class-use/LinkModel.html | 25 +- .../class-use/ScaleClusterParamsModel.html | 25 +- .../rest/model/class-use/VersionModel.html | 25 +- .../operator/rest/model/package-summary.html | 62 +- .../operator/rest/model/package-tree.html | 40 +- .../operator/rest/model/package-use.html | 107 +- .../operator/rest/package-summary.html | 25 +- .../operator/rest/package-tree.html | 25 +- .../kubernetes/operator/rest/package-use.html | 25 +- .../operator/rest/resource/BaseResource.html | 29 +- .../rest/resource/ClusterResource.html | 29 +- .../rest/resource/ClustersResource.html | 29 +- .../rest/resource/DomainResource.html | 51 +- .../rest/resource/DomainsResource.html | 29 +- .../rest/resource/ScaleClusterResource.html | 29 +- .../rest/resource/SwaggerResource.html | 29 +- .../rest/resource/VersionResource.html | 29 +- .../rest/resource/VersionsResource.html | 29 +- .../rest/resource/class-use/BaseResource.html | 25 +- .../resource/class-use/ClusterResource.html | 25 +- .../resource/class-use/ClustersResource.html | 25 +- .../resource/class-use/DomainResource.html | 25 +- .../resource/class-use/DomainsResource.html | 25 +- .../class-use/ScaleClusterResource.html | 25 +- .../resource/class-use/SwaggerResource.html | 25 +- .../resource/class-use/VersionResource.html | 25 +- .../resource/class-use/VersionsResource.html | 25 +- .../rest/resource/package-summary.html | 25 +- .../operator/rest/resource/package-tree.html | 25 +- .../operator/rest/resource/package-use.html | 25 +- .../operator/steps/AbstractListStep.html | 29 +- .../steps/BeforeAdminServiceStep.html | 29 +- .../operator/steps/ClusterServicesStep.html | 29 +- .../operator/steps/ConfigMapAfterStep.html | 29 +- .../operator/steps/DefaultResponseStep.html | 29 +- .../operator/steps/DeleteDomainStep.html | 29 +- .../operator/steps/DeleteServiceListStep.html | 29 +- .../operator/steps/DomainPresenceStep.html | 33 +- .../steps/ManagedServerUpAfterStep.html | 29 +- .../steps/ManagedServerUpIteratorStep.html | 41 +- .../operator/steps/ManagedServersUpStep.html | 29 +- .../operator/steps/ReadHealthStep.html | 29 +- .../steps/ServerDownIteratorStep.html | 29 +- .../operator/steps/ServerDownStep.html | 29 +- .../WatchDomainIntrospectorJobReadyStep.html | 29 +- .../steps/WatchPodReadyAdminStep.html | 29 +- .../steps/class-use/AbstractListStep.html | 25 +- .../class-use/BeforeAdminServiceStep.html | 25 +- .../steps/class-use/ClusterServicesStep.html | 25 +- .../steps/class-use/ConfigMapAfterStep.html | 25 +- .../steps/class-use/DefaultResponseStep.html | 25 +- .../steps/class-use/DeleteDomainStep.html | 25 +- .../class-use/DeleteServiceListStep.html | 25 +- .../steps/class-use/DomainPresenceStep.html | 27 +- .../class-use/ManagedServerUpAfterStep.html | 25 +- .../ManagedServerUpIteratorStep.html | 25 +- .../steps/class-use/ManagedServersUpStep.html | 25 +- .../steps/class-use/ReadHealthStep.html | 25 +- .../class-use/ServerDownIteratorStep.html | 25 +- .../steps/class-use/ServerDownStep.html | 25 +- .../WatchDomainIntrospectorJobReadyStep.html | 25 +- .../class-use/WatchPodReadyAdminStep.html | 25 +- .../operator/steps/package-summary.html | 29 +- .../operator/steps/package-tree.html | 25 +- .../operator/steps/package-use.html | 25 +- .../operator/utils/Certificates.html | 29 +- .../operator/utils/KubernetesExec.html | 29 +- .../operator/utils/KubernetesExecFactory.html | 29 +- ...tesExecFactoryImpl.KubernetesExecImpl.html | 29 +- .../utils/KubernetesExecFactoryImpl.html | 29 +- .../kubernetes/operator/utils/PatchUtils.html | 29 +- .../utils/WlsDomainConfigSupport.html | 468 - .../utils/class-use/Certificates.html | 25 +- .../utils/class-use/KubernetesExec.html | 25 +- .../class-use/KubernetesExecFactory.html | 25 +- ...tesExecFactoryImpl.KubernetesExecImpl.html | 25 +- .../class-use/KubernetesExecFactoryImpl.html | 25 +- .../operator/utils/class-use/PatchUtils.html | 25 +- .../operator/utils/package-summary.html | 29 +- .../operator/utils/package-tree.html | 26 +- .../operator/utils/package-use.html | 29 +- .../operator/watcher/WatchListener.html | 29 +- .../watcher/class-use/WatchListener.html | 25 +- .../operator/watcher/package-summary.html | 25 +- .../operator/watcher/package-tree.html | 25 +- .../operator/watcher/package-use.html | 25 +- .../operator/wlsconfig/MacroSubstitutor.html | 29 +- .../wlsconfig/NetworkAccessPoint.html | 29 +- .../operator/wlsconfig/WlsClusterConfig.html | 29 +- .../operator/wlsconfig/WlsDomainConfig.html | 29 +- .../wlsconfig/WlsDynamicServerConfig.html | 29 +- .../wlsconfig/WlsDynamicServersConfig.html | 29 +- .../operator/wlsconfig/WlsMachineConfig.html | 29 +- .../operator/wlsconfig/WlsServerConfig.html | 29 +- .../wlsconfig/class-use/MacroSubstitutor.html | 25 +- .../class-use/NetworkAccessPoint.html | 25 +- .../wlsconfig/class-use/WlsClusterConfig.html | 57 +- .../wlsconfig/class-use/WlsDomainConfig.html | 78 +- .../class-use/WlsDynamicServerConfig.html | 25 +- .../class-use/WlsDynamicServersConfig.html | 25 +- .../wlsconfig/class-use/WlsMachineConfig.html | 25 +- .../wlsconfig/class-use/WlsServerConfig.html | 73 +- .../operator/wlsconfig/package-summary.html | 25 +- .../operator/wlsconfig/package-tree.html | 25 +- .../operator/wlsconfig/package-use.html | 66 +- .../kubernetes/operator/work/AsyncFiber.html | 29 +- .../kubernetes/operator/work/Component.html | 29 +- .../kubernetes/operator/work/ComponentEx.html | 29 +- .../operator/work/ComponentRegistry.html | 29 +- .../kubernetes/operator/work/Container.html | 29 +- .../operator/work/ContainerResolver.html | 29 +- .../kubernetes/operator/work/Engine.html | 29 +- .../work/Fiber.CompletionCallback.html | 29 +- .../operator/work/Fiber.ExitCallback.html | 29 +- .../kubernetes/operator/work/Fiber.html | 29 +- .../kubernetes/operator/work/FiberGate.html | 29 +- .../operator/work/FiberGateFactory.html | 29 +- .../operator/work/NextAction.Kind.html | 29 +- .../kubernetes/operator/work/NextAction.html | 29 +- .../kubernetes/operator/work/Packet.html | 29 +- .../operator/work/Step.MultiThrowable.html | 29 +- .../operator/work/Step.StepAndPacket.html | 29 +- .../oracle/kubernetes/operator/work/Step.html | 29 +- .../operator/work/ThreadFactorySingleton.html | 29 +- .../work/ThreadLocalContainerResolver.html | 29 +- .../operator/work/class-use/AsyncFiber.html | 25 +- .../operator/work/class-use/Component.html | 25 +- .../operator/work/class-use/ComponentEx.html | 25 +- .../work/class-use/ComponentRegistry.html | 25 +- .../operator/work/class-use/Container.html | 25 +- .../work/class-use/ContainerResolver.html | 25 +- .../operator/work/class-use/Engine.html | 25 +- .../class-use/Fiber.CompletionCallback.html | 25 +- .../work/class-use/Fiber.ExitCallback.html | 25 +- .../operator/work/class-use/Fiber.html | 25 +- .../operator/work/class-use/FiberGate.html | 25 +- .../work/class-use/FiberGateFactory.html | 25 +- .../work/class-use/NextAction.Kind.html | 25 +- .../operator/work/class-use/NextAction.html | 25 +- .../operator/work/class-use/Packet.html | 100 +- .../work/class-use/Step.MultiThrowable.html | 25 +- .../work/class-use/Step.StepAndPacket.html | 25 +- .../operator/work/class-use/Step.html | 170 +- .../class-use/ThreadFactorySingleton.html | 25 +- .../ThreadLocalContainerResolver.html | 25 +- .../operator/work/package-summary.html | 25 +- .../operator/work/package-tree.html | 25 +- .../kubernetes/operator/work/package-use.html | 31 +- .../kubernetes/utils/OperatorUtils.html | 33 +- .../oracle/kubernetes/utils/SystemClock.html | 29 +- .../utils/class-use/OperatorUtils.html | 25 +- .../utils/class-use/SystemClock.html | 25 +- .../kubernetes/utils/package-summary.html | 25 +- .../oracle/kubernetes/utils/package-tree.html | 25 +- .../oracle/kubernetes/utils/package-use.html | 25 +- .../domain/AdminServerConfigurator.html | 29 +- .../weblogic/domain/ClusterConfigurator.html | 105 +- .../ConfigurationNotSupportedException.html | 29 +- .../weblogic/domain/DomainConfigurator.html | 327 +- .../domain/DomainConfiguratorFactory.html | 29 +- .../domain/EffectiveConfigurationFactory.html | 52 +- .../NetworkAccessPointConfigurator.html | 29 +- .../weblogic/domain/ServerConfigurator.html | 29 +- .../weblogic/domain/ServiceConfigurator.html | 29 +- .../weblogic/domain/api/WeblogicApi.html | 29 +- .../domain/api/class-use/WeblogicApi.html | 25 +- .../weblogic/domain/api/package-summary.html | 25 +- .../weblogic/domain/api/package-tree.html | 25 +- .../weblogic/domain/api/package-use.html | 25 +- .../class-use/AdminServerConfigurator.html | 25 +- .../domain/class-use/ClusterConfigurator.html | 47 +- .../ConfigurationNotSupportedException.html | 25 +- .../domain/class-use/DomainConfigurator.html | 192 +- .../class-use/DomainConfiguratorFactory.html | 25 +- .../EffectiveConfigurationFactory.html | 25 +- .../NetworkAccessPointConfigurator.html | 25 +- .../domain/class-use/ServerConfigurator.html | 25 +- .../domain/class-use/ServiceConfigurator.html | 25 +- .../weblogic/domain/model/AdminServer.html | 29 +- .../domain/model/AdminServerSpec.html | 29 +- .../model/AdminServerSpecCommonImpl.html | 29 +- .../weblogic/domain/model/AdminService.html | 29 +- .../domain/model/BaseConfiguration.html | 29 +- .../weblogic/domain/model/Channel.html | 29 +- .../weblogic/domain/model/Cluster.html | 84 +- .../weblogic/domain/model/ClusterSpec.html | 29 +- .../domain/model/ClusterSpecCommonImpl.html | 29 +- .../weblogic/domain/model/ClusterStatus.html | 29 +- .../weblogic/domain/model/Configuration.html | 171 +- .../domain/model/ConfigurationConstants.html | 29 +- .../weblogic/domain/model/Domain.html | 303 +- .../model/DomainCommonConfigurator.html | 290 +- .../domain/model/DomainCondition.html | 37 +- .../domain/model/DomainConditionType.html | 29 +- .../weblogic/domain/model/DomainList.html | 29 +- .../weblogic/domain/model/DomainSpec.html | 291 +- .../weblogic/domain/model/DomainStatus.html | 43 +- .../domain/model/DomainValidationFailure.html | 29 +- .../domain/model/IntrospectorJobEnvVars.html | 139 +- .../weblogic/domain/model/Istio.html | 29 +- .../model/KubernetesResourceLookup.html | 29 +- .../weblogic/domain/model/ManagedServer.html | 29 +- .../model/ManagedServerSpecCommonImpl.html | 29 +- .../weblogic/domain/model/Model.html | 342 + .../weblogic/domain/model/Opss.html | 349 + .../domain/model/PatchableComponent.html | 29 +- .../weblogic/domain/model/ProbeTuning.html | 29 +- .../weblogic/domain/model/Server.html | 29 +- .../weblogic/domain/model/ServerEnvVars.html | 74 +- .../weblogic/domain/model/ServerHealth.html | 29 +- .../weblogic/domain/model/ServerService.html | 29 +- .../weblogic/domain/model/ServerSpec.html | 29 +- .../weblogic/domain/model/ServerSpecBase.html | 29 +- .../domain/model/ServerSpecCommonImpl.html | 29 +- .../weblogic/domain/model/ServerStatus.html | 29 +- .../weblogic/domain/model/Shutdown.html | 29 +- .../domain/model/SubsystemHealth.html | 29 +- .../weblogic/domain/model/WlsDomain.html | 29 +- .../domain/model/class-use/AdminServer.html | 25 +- .../model/class-use/AdminServerSpec.html | 25 +- .../class-use/AdminServerSpecCommonImpl.html | 25 +- .../domain/model/class-use/AdminService.html | 25 +- .../model/class-use/BaseConfiguration.html | 25 +- .../domain/model/class-use/Channel.html | 25 +- .../domain/model/class-use/Cluster.html | 28 +- .../domain/model/class-use/ClusterSpec.html | 25 +- .../class-use/ClusterSpecCommonImpl.html | 25 +- .../domain/model/class-use/ClusterStatus.html | 25 +- .../domain/model/class-use/Configuration.html | 34 +- .../class-use/ConfigurationConstants.html | 25 +- .../domain/model/class-use/Domain.html | 37 +- .../class-use/DomainCommonConfigurator.html | 25 +- .../model/class-use/DomainCondition.html | 27 +- .../model/class-use/DomainConditionType.html | 25 +- .../domain/model/class-use/DomainList.html | 25 +- .../domain/model/class-use/DomainSpec.html | 48 +- .../domain/model/class-use/DomainStatus.html | 27 +- .../class-use/DomainValidationFailure.html | 25 +- .../class-use/IntrospectorJobEnvVars.html | 25 +- .../domain/model/class-use/Istio.html | 25 +- .../class-use/KubernetesResourceLookup.html | 25 +- .../domain/model/class-use/ManagedServer.html | 25 +- .../ManagedServerSpecCommonImpl.html | 25 +- .../domain/model/class-use/Model.html | 189 + .../weblogic/domain/model/class-use/Opss.html | 179 + .../model/class-use/PatchableComponent.html | 25 +- .../domain/model/class-use/ProbeTuning.html | 25 +- .../domain/model/class-use/Server.html | 25 +- .../domain/model/class-use/ServerEnvVars.html | 25 +- .../domain/model/class-use/ServerHealth.html | 25 +- .../domain/model/class-use/ServerService.html | 25 +- .../domain/model/class-use/ServerSpec.html | 25 +- .../model/class-use/ServerSpecBase.html | 25 +- .../model/class-use/ServerSpecCommonImpl.html | 25 +- .../domain/model/class-use/ServerStatus.html | 31 +- .../domain/model/class-use/Shutdown.html | 25 +- .../model/class-use/SubsystemHealth.html | 25 +- .../domain/model/class-use/WlsDomain.html | 25 +- .../domain/model/package-summary.html | 33 +- .../weblogic/domain/model/package-tree.html | 27 +- .../weblogic/domain/model/package-use.html | 33 +- .../weblogic/domain/package-summary.html | 25 +- .../weblogic/domain/package-tree.html | 25 +- .../weblogic/domain/package-use.html | 25 +- docs/apidocs/overview-summary.html | 6 +- docs/apidocs/overview-tree.html | 50 +- docs/apidocs/package-search-index.zip | Bin 388 -> 388 bytes docs/apidocs/script-dir/jszip/dist/jszip.js | 386 +- .../script-dir/jszip/dist/jszip.min.js | 8 +- docs/apidocs/script.js | 3 - docs/apidocs/serialized-form.html | 25 +- docs/apidocs/stylesheet.css | 207 +- docs/apidocs/system-properties.html | 108 + docs/apidocs/type-search-index.js | 2 +- docs/apidocs/type-search-index.zip | Bin 2370 -> 2416 bytes docs/charts/index.yaml | 30 +- docs/charts/weblogic-operator-3.0.0.tgz | Bin 0 -> 8122 bytes docs/domains/Domain.json | 403 +- docs/domains/Domain.md | 262 +- docs/domains/index.html | 402 +- docs/v2.4.0/apidocs/allclasses.html | 3 +- .../apidocs/jquery/external/jquery/jquery.js | 598 +- .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 335 -> 335 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 262 -> 262 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 262 -> 262 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 332 -> 332 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 280 -> 280 bytes .../jquery/images/ui-icons_222222_256x240.png | Bin 6922 -> 6922 bytes .../jquery/images/ui-icons_2e83ff_256x240.png | Bin 4549 -> 4549 bytes .../jquery/images/ui-icons_454545_256x240.png | Bin 6992 -> 6992 bytes .../jquery/images/ui-icons_888888_256x240.png | Bin 6999 -> 6999 bytes .../jquery/images/ui-icons_cd0a0a_256x240.png | Bin 4549 -> 4549 bytes docs/v2.4.0/apidocs/jquery/jquery-ui.css | 132 +- docs/v2.4.0/apidocs/jquery/jquery-ui.js | 1541 +- docs/v2.4.0/apidocs/jquery/jquery-ui.min.css | 8 +- docs/v2.4.0/apidocs/jquery/jquery-ui.min.js | 9 +- .../apidocs/jquery/jquery-ui.structure.css | 30 +- .../jquery/jquery-ui.structure.min.css | 6 +- .../kubernetes/operator/Workarounds.html | 3 +- .../operator/class-use/Workarounds.html | 3 +- .../helpers/DomainValidationStep.html | 3 +- .../helpers/SecretHelper.SecretType.html | 3 +- .../class-use/DomainValidationStep.html | 3 +- .../class-use/SecretHelper.SecretType.html | 3 +- integration-tests/pom.xml | 14 +- .../kubernetes/operator/ItJrfPvWlst.java | 54 +- .../operator/ItMiiConfigUpdateCm.java | 366 + .../operator/ItMiiConfigUpdateImage.java | 235 + .../kubernetes/operator/ItModelInImage.java | 243 + .../operator/ItMonitoringExporter.java | 2 +- .../operator/ItOperatorUpgrade.java | 59 +- .../kubernetes/operator/MiiBaseTest.java | 220 + .../operator/MiiConfigUpdateBaseTest.java | 660 + .../kubernetes/operator/utils/DbUtils.java | 124 +- .../operator/utils/K8sTestUtils.java | 14 +- .../kubernetes/operator/utils/Operator.java | 32 +- .../src/test/resources/OperatorIT.properties | 4 +- .../templates/traefik-ingress.yaml | 4 +- .../templates/voyager-ingress.yaml | 4 - .../charts/traefik/host-routing.yaml | 2 +- .../resources/exporter/coordinator_test5.yaml | 2 +- .../src/test/resources/exporter/domain1.yaml | 3 +- .../src/test/resources/exporter/server.yaml | 2 +- .../resources/imagetool/build_download.sh | 6 +- .../resources/model-in-image/add_os_utils | 5 + .../resources/model-in-image/build-app.sh | 46 + .../resources/model-in-image/cm.jdbc.yaml | 52 + .../model-in-image/create-domain-inputs.yaml | 167 + .../resources/model-in-image/create-domain.sh | 287 + .../applications/META-INF/MANIFEST.MF | 3 + .../applications/META-INF/application.xml | 13 + .../META-INF/weblogic-application.xml | 5 + .../applications/ds_war/WEB-INF/web.xml | 5 + .../applications/ds_war/WEB-INF/weblogic.xml | 13 + .../wlsdeploy/applications/ds_war/index.jsp | 44 + .../wlsdeploy/config/amimemappings.properties | 0 .../resources/model-in-image/jdbc.20.yaml | 52 + .../miisection-toaddin-domain-template.yaml | 31 + .../model-in-image/model.cluster.yaml | 21 + .../model-in-image/model.cm.properties | 4 + .../model-in-image/model.config.wls.yaml | 28 + .../model-in-image/model.empty.properties | 0 .../model.jdbc.image.properties | 9 + .../model-in-image/model.jdbc.image.yaml | 52 + .../model-in-image/model.jdbc.properties | 9 + .../resources/model-in-image/model.jdbc.yaml | 52 + .../resources/model-in-image/model.jms.yaml | 56 + .../resources/model-in-image/model.jrf.yaml | 36 + .../resources/model-in-image/model.mysql.yaml | 56 + .../resources/model-in-image/model.properties | 4 + .../resources/model-in-image/model.wldf.yaml | 8 + .../resources/model-in-image/model.wls.yaml | 32 + .../resources/model-in-image/new.jdbc.10.yaml | 52 + .../resources/model-in-image/now.jdbc.10.yaml | 52 + .../properties-template.properties | 18 + .../applications/META-INF/MANIFEST.MF | 3 + .../applications/META-INF/application.xml | 11 + .../META-INF/weblogic-application.xml | 3 + .../applications/sample_war/WEB-INF/web.xml | 3 + .../sample_war/WEB-INF/weblogic.xml | 12 + .../applications/sample_war/index.jsp | 3 + .../wlsdeploy/config/amimemappings.properties | 0 .../scripts/verify-ds-secret.py | 22 + .../scripts/verify-jdbc-resource.py | 38 + .../resources/webhook/webhook-deployment.yaml | 2 +- json-schema-maven-plugin/pom.xml | 4 +- json-schema/pom.xml | 2 +- .../kubernetes/json/SchemaGenerator.java | 17 + kindtest.sh | 44 +- .../charts/weblogic-operator/Chart.yaml | 2 +- .../_operator-clusterrole-domain-admin.tpl | 1 - .../_operator-clusterrole-general.tpl | 1 - .../_operator-clusterrole-namespace.tpl | 1 - .../_operator-clusterrole-nonresource.tpl | 1 - .../_operator-clusterrole-operator-admin.tpl | 1 - ...ator-clusterrolebinding-auth-delegator.tpl | 1 - ..._operator-clusterrolebinding-discovery.tpl | 1 - .../_operator-clusterrolebinding-general.tpl | 1 - ...perator-clusterrolebinding-nonresource.tpl | 1 - .../templates/_operator-cm.tpl | 1 - .../templates/_operator-dep.tpl | 3 - .../templates/_operator-external-svc.tpl | 1 - .../templates/_operator-internal-svc.tpl | 1 - .../templates/_operator-role.tpl | 1 - .../_operator-rolebinding-namespace.tpl | 1 - .../templates/_operator-rolebinding.tpl | 1 - .../templates/_operator-secret.tpl | 1 - .../charts/weblogic-operator/values.yaml | 12 +- kubernetes/crd/domain-crd.yaml | 20947 ++------ kubernetes/crd/domain-crdv7-260.yaml | 42506 ++++++++++++++++ kubernetes/crd/domain-v1beta1-crd.yaml | 19980 ++------ ...240.yaml => domain-v1beta1-crdv7-260.yaml} | 1603 +- kubernetes/hands-on-lab/domain.yaml | 15 +- .../deploy.weblogic_short.ocishell.md | 2 +- .../node.selector.license.ocishell.md | 2 +- .../tutorials/node.selector.ocishell.md | 8 +- kubernetes/pom.xml | 2 +- kubernetes/samples/README.md | 5 +- .../apache-samples/custom-sample/README.md | 7 +- .../apache-samples/custom-sample/certgen.sh | 6 +- .../custom-sample/custom_mod_wl_apache.conf | 4 +- .../apache-samples/custom-sample/input.yaml | 3 +- .../templates/cluster-role-binding.yaml | 2 - .../templates/cluster-role.yaml | 2 - .../apache-webtier/templates/deployment.yaml | 5 +- .../apache-webtier/templates/secret.yaml | 2 - .../templates/service-account.yaml | 2 - .../apache-webtier/templates/service.yaml | 3 - .../templates/traefik-ingress.yaml | 6 +- .../templates/voyager-ingress.yaml | 6 +- .../charts/traefik/samples/host-routing.yaml | 4 +- .../charts/traefik/samples/path-routing.yaml | 4 +- .../samples/charts/traefik/samples/tls.yaml | 4 +- kubernetes/samples/charts/util/setup.sh | 130 +- .../scripts/common/domain-template.yaml | 15 +- .../scripts/common/jrf-domain-template.yaml | 123 + kubernetes/samples/scripts/common/utility.sh | 62 +- kubernetes/samples/scripts/common/validate.sh | 54 + .../domain-home-in-image/common/Dockerfile | 8 +- .../common/createFMWDomain.py | 7 +- .../common/createFMWDomain.sh | 8 +- .../create-domain-inputs.yaml | 42 +- .../domain-home-in-image/create-domain.sh | 7 +- .../create-domain-inputs.yaml | 39 +- .../create-domain-job-template.yaml | 1 - .../domain-home-on-pv/create-domain.sh | 4 +- .../delete-domain-job-template.yaml | 2 - .../wdt/create-domain-script.sh | 6 +- .../common/oracle.db.yaml | 2 +- .../start-db-service.sh | 4 +- .../create-rcu-schema/create-rcu-schema.sh | 2 +- .../create-rcu-schema/drop-rcu-schema.sh | 2 +- .../create-database/db-with-pv.yaml | 2 +- .../create-domain-inputs.yaml | 11 +- .../create-domain-job-template.yaml | 1 - .../domain-home-on-pv/create-domain.sh | 2 +- .../delete-domain-job-template.yaml | 2 - .../create-weblogic-domain-pv-pvc/README.md | 11 +- .../pv-template.yaml | 1 - .../pvc-template.yaml | 1 - .../create-domain-inputs.yaml | 52 +- .../domain-home-in-image/create-domain.sh | 24 +- .../properties-template.properties | 3 + .../create-domain-inputs.yaml | 34 +- .../create-domain-job-template.yaml | 1 - .../domain-home-on-pv/create-domain.sh | 2 +- .../delete-domain-job-template.yaml | 2 - .../wdt/create-domain-script.sh | 6 +- .../wlst/istio-fix-domain.py | 1 + .../manually-create-domain/domain.yaml | 16 +- .../model-in-image/README.md | 15 + .../myapp-v1/META-INF/MANIFEST.MF | 3 + .../myapp-v1/META-INF/application.xml | 11 + .../META-INF/weblogic-application.xml | 3 + .../myapp-v1/myapp_war/WEB-INF/web.xml | 3 + .../myapp-v1/myapp_war/WEB-INF/weblogic.xml | 12 + .../applications/myapp-v1/myapp_war/index.jsp | 56 + .../wlsdeploy/config/amimemappings.properties | 0 .../myapp-v1/META-INF/MANIFEST.MF | 3 + .../myapp-v1/META-INF/application.xml | 11 + .../META-INF/weblogic-application.xml | 3 + .../myapp-v1/myapp_war/WEB-INF/web.xml | 3 + .../myapp-v1/myapp_war/WEB-INF/weblogic.xml | 12 + .../applications/myapp-v1/myapp_war/index.jsp | 56 + .../myapp-v2/META-INF/MANIFEST.MF | 3 + .../myapp-v2/META-INF/application.xml | 11 + .../META-INF/weblogic-application.xml | 3 + .../myapp-v2/myapp_war/WEB-INF/web.xml | 3 + .../myapp-v2/myapp_war/WEB-INF/weblogic.xml | 12 + .../applications/myapp-v2/myapp_war/index.jsp | 56 + .../wlsdeploy/config/amimemappings.properties | 0 .../JRF/mii-initial-d1-JRF-v1.yaml | 153 + .../JRF/mii-update1-d1-JRF-v1-ds.yaml | 153 + .../JRF/mii-update2-d2-JRF-v1-ds.yaml | 153 + .../JRF/mii-update3-d1-JRF-v2-ds.yaml | 153 + .../WLS/mii-initial-d1-WLS-v1.yaml | 136 + .../WLS/mii-update1-d1-WLS-v1-ds.yaml | 136 + .../WLS/mii-update2-d2-WLS-v1-ds.yaml | 136 + .../WLS/mii-update3-d1-WLS-v2-ds.yaml | 136 + ...k-ingress-sample-domain1-admin-server.yaml | 21 + ...ress-sample-domain1-cluster-cluster-1.yaml | 44 + ...ress-sample-domain2-cluster-cluster-1.yaml | 44 + .../datasource/model.20.datasource.yaml | 30 + .../model.10.properties | 4 + .../model-in-image__JRF-v1/model.10.yaml | 39 + .../model.10.properties | 4 + .../model-in-image__JRF-v2/model.10.yaml | 39 + .../model.10.properties | 4 + .../model-in-image__WLS-v1/model.10.yaml | 34 + .../model.10.properties | 4 + .../model-in-image__WLS-v2/model.10.yaml | 34 + .../model-in-image/utils/create-configmap.sh | 120 + .../model-in-image/utils/create-secret.sh | 138 + .../model-in-image/utils/opss-wallet.sh | 153 + .../utils/patch-restart-version.sh | 83 + .../model-in-image/utils/wl-pod-wait.sh | 374 + .../delete-weblogic-domain-resources.sh | 2 +- .../elasticsearch_and_kibana.yaml | 4 +- ...torGeneratedFilesDebugEnabledTestBase.java | 6 +- ...FilesOptionalFeaturesDisabledTestBase.java | 6 +- ...dFilesOptionalFeaturesEnabledTestBase.java | 6 +- .../CreateOperatorGeneratedFilesTestBase.java | 28 +- .../utils/GeneratedOperatorObjects.java | 4 +- .../utils/KubernetesArtifactUtils.java | 12 +- .../operator/utils/ParsedApacheYaml.java | 4 +- .../operator/utils/ParsedKubernetesYaml.java | 12 +- .../operator/utils/ParsedTraefikYaml.java | 4 +- .../utils/ParsedVoyagerOperatorYaml.java | 4 +- .../utils/ParsedWeblogicOperatorYaml.java | 4 +- new-integration-tests/pom.xml | 8 +- .../oracle/weblogic/domain/Configuration.java | 160 +- .../oracle/weblogic/domain/DomainSpec.java | 101 +- .../oracle/weblogic/domain/Experimental.java | 61 + .../java/oracle/weblogic/domain/Istio.java | 1 - .../java/oracle/weblogic/domain/Model.java | 113 + .../java/oracle/weblogic/domain/Opss.java | 88 + .../weblogic/kubernetes/ItCoherenceTests.java | 395 + .../ItConfigDistributionStrategy.java | 1066 + .../kubernetes/ItCrossDomainTransaction.java | 386 + .../kubernetes/ItDomainInImageWdt.java | 17 +- .../weblogic/kubernetes/ItDomainInPV.java | 316 +- .../kubernetes/ItIntrospectVersion.java | 815 + .../ItIstioCrossDomainTransaction.java | 404 + .../kubernetes/ItIstioDomainInImage.java | 288 + .../kubernetes/ItIstioDomainInPV.java | 503 + .../weblogic/kubernetes/ItIstioMiiDomain.java | 295 + .../kubernetes/ItIstioTwoDomainsInImage.java | 366 + .../weblogic/kubernetes/ItJrfDomainInPV.java | 348 + .../weblogic/kubernetes/ItMiiAddCluster.java | 688 + .../ItMiiChangeAdminCredentials.java | 208 + .../weblogic/kubernetes/ItMiiConfigMap.java | 509 + .../kubernetes/ItMiiConfigMapOverride.java | 549 + .../weblogic/kubernetes/ItMiiDomain.java | 1099 + .../weblogic/kubernetes/ItMiiMultiModel.java | 548 + .../weblogic/kubernetes/ItMiiSample.java | 431 + .../kubernetes/ItMonitoringExporter.java | 1842 + .../ItOperatorRestartWhenPodRoll.java | 247 + .../kubernetes/ItOperatorTwoDomains.java | 28 +- .../weblogic/kubernetes/ItPodsRestart.java | 38 +- .../kubernetes/ItScaleMiiDomainNginx.java | 479 + .../kubernetes/ItSessionMigration.java | 465 + .../kubernetes/ItSimpleValidation.java | 15 +- .../weblogic/kubernetes/ItStickySession.java | 484 + .../ItUsabilityOperatorHelmChart.java | 51 +- .../weblogic/kubernetes/ItVoyagerSample.java | 300 + .../weblogic/kubernetes/TestConstants.java | 25 +- .../kubernetes/actions/ActionConstants.java | 34 +- .../kubernetes/actions/TestActions.java | 269 +- .../kubernetes/actions/impl/AppBuilder.java | 79 +- .../kubernetes/actions/impl/ClusterRole.java | 34 + .../actions/impl/ClusterRoleBinding.java | 5 +- .../kubernetes/actions/impl/Domain.java | 328 +- .../kubernetes/actions/impl/Ingress.java | 184 + .../kubernetes/actions/impl/Namespace.java | 4 +- .../kubernetes/actions/impl/Nginx.java | 92 +- .../kubernetes/actions/impl/Operator.java | 3 - .../weblogic/kubernetes/actions/impl/Pod.java | 52 +- .../kubernetes/actions/impl/Service.java | 11 + .../kubernetes/actions/impl/Voyager.java | 43 + .../actions/impl/VoyagerParams.java | 62 + .../actions/impl/primitive/Command.java | 27 +- .../actions/impl/primitive/Helm.java | 20 +- .../actions/impl/primitive/InstallParams.java | 31 +- .../actions/impl/primitive/Installer.java | 89 +- .../actions/impl/primitive/Kubernetes.java | 353 +- .../impl/primitive/KubernetesExec.java | 15 +- .../impl/primitive/WebLogicImageTool.java | 6 +- .../actions/impl/primitive/WitParams.java | 30 +- .../annotations/IntegrationTest.java | 4 + .../kubernetes/assertions/TestAssertions.java | 67 +- .../assertions/impl/Application.java | 12 +- .../assertions/impl/ClusterRole.java | 37 + .../assertions/impl/ClusterRoleBinding.java | 36 + .../assertions/impl/Deployment.java | 21 + .../kubernetes/assertions/impl/Domain.java | 44 +- .../assertions/impl/Kubernetes.java | 149 +- .../kubernetes/assertions/impl/Pod.java | 16 +- .../assertions/impl/RoleBinding.java | 39 + .../kubernetes/assertions/impl/Voyager.java | 36 + .../assertions/impl/WitAssertion.java | 4 +- .../kubernetes/extensions/ImageBuilders.java | 58 +- .../extensions/IntegrationTestWatcher.java | 28 +- .../kubernetes/extensions/LoggedTest.java | 13 - .../extensions/LoggingExtension.java | 24 + .../kubernetes/logging/LoggingFactory.java | 27 +- .../kubernetes/utils/BuildApplication.java | 363 +- .../kubernetes/utils/CleanupUtil.java | 15 +- .../kubernetes/utils/CommonMiiTestUtils.java | 168 + .../utils/CommonPatchTestUtils.java | 183 + .../kubernetes/utils/CommonTestUtils.java | 1117 +- .../weblogic/kubernetes/utils/DbUtils.java | 457 + .../weblogic/kubernetes/utils/DeployUtil.java | 64 +- .../weblogic/kubernetes/utils/FileUtils.java | 153 +- .../weblogic/kubernetes/utils/IstioUtils.java | 204 + .../kubernetes/utils/LoggingUtil.java | 88 +- .../kubernetes/utils/MySQLDBUtils.java | 135 + .../kubernetes/utils/OracleHttpClient.java | 6 +- .../weblogic/kubernetes/utils/TestUtils.java | 67 +- .../kubernetes/utils/ThreadSafeLogger.java | 55 + .../weblogic/kubernetes/utils/WLSTUtils.java | 16 +- .../clusterview/ClusterViewServlet.java | 94 +- .../clusterview/ConfigServlet.java | 284 + .../apps/clusterview/web/WEB-INF/web.xml | 10 + .../apps/coherence-proxy-client/build.xml | 104 + .../buildRunProxyClient.sh | 51 + .../src/main/java/cohapp/CacheClient.java | 401 + .../src/main/java/cohapp/Main.java | 38 + .../main/resources/client-cache-config.xml | 39 + .../META-INF/coherence-application.xml | 8 + .../META-INF/server-cache-config.xml | 53 + .../apps/opensessionapp/META-INF/MANIFEST.MF | 4 + .../opensessionapp/META-INF/application.xml | 15 + .../META-INF/weblogic-application.xml | 7 + .../opensession/WEB-INF/web.xml | 12 + .../opensession/WEB-INF/weblogic.xml | 13 + .../apps/opensessionapp/opensession/index.jsp | 20 + .../apps/sessmigr-app/sessmigr-war/index.jsp | 68 +- .../apps/stickysess-app/META-INF/MANIFEST.MF | 3 + .../stickysess-app/META-INF/application.xml | 15 + .../META-INF/weblogic-application.xml | 7 + .../stickysess-war/WEB-INF/web.xml | 7 + .../stickysess-war/WEB-INF/weblogic.xml | 15 + .../stickysess-app/stickysess-war/index.jsp | 53 + .../TxForward/WebContent/META-INF/MANIFEST.MF | 3 + .../WebContent/META-INF/application.xml | 14 + .../META-INF/weblogic-application.xml | 11 + .../TxForward/src/example/TxForward.java | 74 + .../test/resources/apps/txforward/build.xml | 102 + .../remotesync/src/META-INF/MANIFEST.MF | 2 + .../src/example/LifecycleListenerImpl.java | 21 + .../remotesync/src/example/RemoteSync.java | 13 + .../src/example/RemoteSyncImpl.java | 109 + .../remotesync/src/example/Utils.java | 32 + .../bash-scripts/build_application.sh | 17 +- .../resources/bash-scripts/callpyscript.sh | 12 + .../bash-scripts/createRepository.sh | 69 + .../resources/bash-scripts/install-istio.sh | 69 + .../resources/bash-scripts/uninstall-istio.sh | 49 + .../bash-scripts/wdt-create-domain-onpv.sh | 4 +- .../configoverridesset1/config.xml | 11 + .../configoverridesset1/config1.xml | 11 + .../jdbc-JdbcTestDataSource-0.xml | 18 + .../jdbc-JdbcTestDataSource-1.xml | 29 + .../configoverridesset1/version.txt | 1 + .../resources/exporter/exporter-config.yaml | 61 + ...st_webapp.yml => rest_domainqualtrue.yaml} | 6 +- .../exporter/rest_dublicatedval.yaml | 21 + .../test/resources/exporter/rest_empty.yaml | 2 + .../src/test/resources/exporter/rest_jvm.yaml | 12 + .../test/resources/exporter/rest_notyaml.yaml | 20 + .../exporter/rest_notyamlformat.yaml | 4 + .../resources/exporter/rest_oneattribval.yaml | 17 + .../exporter/rest_snakecasefalse.yaml | 20 + .../exporter/rest_snakecasetrue.yaml | 21 + .../resources/exporter/rest_twoattribs.yaml | 17 + .../test/resources/exporter/rest_webapp.yaml | 21 + .../resources/exporter/rest_workmanagers.yaml | 15 + .../resources/exporter/rest_wseeclient.yaml | 25 + .../src/test/resources/helper-files/pwd.txt | 2 + .../istio-cdt-http-template-service.yaml | 50 + .../resources/istio/istio-dr-template.yaml | 17 + .../resources/istio/istio-http-template.yaml | 51 + .../resources/istio/istio-tcp-template.yaml | 37 + .../test/resources/junit-platform.properties | 5 + .../python-scripts/create-jdbc-resource.py | 51 + .../introspect_version_script.py | 35 + .../jrf-wlst-create-domain-onpv.py | 236 + .../src/test/resources/python-scripts/wldf.py | 122 + .../wlst-create-istio-domain-onpv.py | 114 + .../coherence-wdt-config.properties | 6 + .../wdt-models/coherence-wdt-config.yaml | 56 + ...-crossdomaintransaction-domain1.properties | 7 + .../model-crossdomaintransaction-domain1.yaml | 35 + ...-crossdomaintransaction-domain2.properties | 6 + .../model-crossdomaintransaction-domain2.yaml | 35 + ...odel-multiclusterdomain-sampleapp-wls.yaml | 5 + .../resources/wdt-models/model.monexp.yaml | 2 +- .../wdt-models/model.stickysess.yaml | 33 + operator/pom.xml | 12 +- .../kubernetes/operator/ConfigMapWatcher.java | 5 + .../kubernetes/operator/DomainProcessor.java | 8 +- .../operator/DomainProcessorDelegate.java | 8 + .../operator/DomainProcessorImpl.java | 441 +- .../kubernetes/operator/DomainSourceType.java | 33 +- .../operator/DomainStatusUpdater.java | 89 +- .../kubernetes/operator/DomainWatcher.java | 5 + .../kubernetes/operator/EventWatcher.java | 5 + .../operator/IntrospectorConfigMapKeys.java | 31 + .../kubernetes/operator/JobWatcher.java | 5 + .../operator/KubernetesConstants.java | 7 +- .../kubernetes/operator/LabelConstants.java | 5 +- .../java/oracle/kubernetes/operator/Main.java | 127 +- .../operator/MakeRightDomainOperation.java | 72 + .../operator/ModelInImageDomainType.java | 10 + .../kubernetes/operator/NamespaceWatcher.java | 5 + .../OverrideDistributionStrategy.java | 10 + .../kubernetes/operator/PodWatcher.java | 65 +- .../operator/ProcessingConstants.java | 48 +- .../operator/ServerStatusReader.java | 77 +- .../kubernetes/operator/ServiceWatcher.java | 5 + .../kubernetes/operator/TuningParameters.java | 15 +- .../operator/TuningParametersImpl.java | 3 +- .../kubernetes/operator/VersionConstants.java | 12 - .../kubernetes/operator/WaitForReadyStep.java | 20 +- .../oracle/kubernetes/operator/Watcher.java | 72 +- .../operator/calls/AsyncRequestStep.java | 66 +- .../calls/FailureStatusSourceException.java | 3 +- .../calls/OtherUnrecoverableErrorBuilder.java | 59 - .../calls/UnrecoverableErrorBuilder.java | 13 +- .../UnprocessableEntityBuilder.java | 82 - .../UnrecoverableErrorBuilderImpl.java | 110 + .../operator/helpers/AuthenticationProxy.java | 10 +- .../operator/helpers/BasePodStepContext.java | 151 +- .../operator/helpers/CallBuilder.java | 35 +- .../operator/helpers/ConfigMapHelper.java | 869 +- .../operator/helpers/CrdHelper.java | 187 +- .../operator/helpers/DomainPresenceInfo.java | 19 +- .../operator/helpers/DomainStatusPatch.java | 2 - .../operator/helpers/DomainTopology.java | 137 + .../helpers/DomainValidationSteps.java | 6 +- .../operator/helpers/FileGroupReader.java | 13 +- .../operator/helpers/JobHelper.java | 146 +- .../operator/helpers/JobStepContext.java | 181 +- .../operator/helpers/KubernetesUtils.java | 41 +- .../operator/helpers/KubernetesVersion.java | 82 +- .../operator/helpers/LegalNames.java | 3 +- .../operator/helpers/PodCompatibility.java | 52 +- .../operator/helpers/PodDefaults.java | 20 +- .../operator/helpers/PodHelper.java | 74 +- .../operator/helpers/PodStepContext.java | 242 +- .../operator/helpers/ResponseStep.java | 7 +- .../operator/helpers/RollingHelper.java | 4 +- .../operator/helpers/SecretType.java | 5 +- .../operator/helpers/SemanticVersion.java | 133 + .../operator/helpers/ServiceHelper.java | 20 +- .../operator/helpers/StepContextBase.java | 148 +- .../helpers/StepContextConstants.java | 13 +- .../operator/helpers/VersionHelper.java | 34 - .../operator/http/HttpAsyncRequestStep.java | 4 +- .../operator/http/HttpResponseStep.java | 2 +- .../operator/logging/LoggingContext.java | 58 + .../operator/logging/LoggingFormatter.java | 52 +- .../operator/logging/MessageKeys.java | 11 +- .../operator/rest/RestBackendImpl.java | 160 +- .../operator/rest/backend/RestBackend.java | 9 + .../operator/rest/model/DomainAction.java | 23 + .../operator/rest/model/DomainActionType.java | 8 + .../rest/resource/DomainResource.java | 14 + .../operator/steps/DeleteDomainStep.java | 2 +- .../operator/steps/DomainPresenceStep.java | 8 +- .../steps/ManagedServerUpAfterStep.java | 51 +- .../steps/ManagedServerUpIteratorStep.java | 192 +- .../operator/steps/ManagedServersUpStep.java | 2 +- .../operator/steps/ReadHealthStep.java | 25 +- .../operator/wlsconfig/WlsClusterConfig.java | 2 +- .../operator/wlsconfig/WlsServerConfig.java | 3 + .../kubernetes/operator/work/AsyncFiber.java | 2 +- .../kubernetes/operator/work/Fiber.java | 1 + .../kubernetes/utils/OperatorUtils.java | 4 +- .../weblogic/domain/ClusterConfigurator.java | 4 + .../weblogic/domain/DomainConfigurator.java | 105 +- .../domain/EffectiveConfigurationFactory.java | 2 + .../weblogic/domain/model/AdminServer.java | 6 +- .../weblogic/domain/model/AdminService.java | 8 +- .../domain/model/BaseConfiguration.java | 11 +- .../weblogic/domain/model/Channel.java | 21 +- .../weblogic/domain/model/Cluster.java | 67 +- .../weblogic/domain/model/ClusterStatus.java | 12 +- .../weblogic/domain/model/Configuration.java | 103 +- .../weblogic/domain/model/Domain.java | 180 +- .../model/DomainCommonConfigurator.java | 128 +- .../domain/model/DomainCondition.java | 8 +- .../weblogic/domain/model/DomainSpec.java | 365 +- .../weblogic/domain/model/DomainStatus.java | 21 +- .../model/DomainValidationMessages.java | 17 + .../domain/model/IntrospectorJobEnvVars.java | 32 + .../weblogic/domain/model/Istio.java | 6 +- .../domain/model/KubernetesResource.java | 6 +- .../weblogic/domain/model/ManagedServer.java | 5 +- .../weblogic/domain/model/Model.java | 110 + .../weblogic/domain/model/Opss.java | 88 + .../weblogic/domain/model/Server.java | 7 +- .../weblogic/domain/model/ServerEnvVars.java | 9 + .../weblogic/domain/model/ServerHealth.java | 4 +- .../weblogic/domain/model/ServerPod.java | 73 +- .../weblogic/domain/model/ServerService.java | 2 +- .../weblogic/domain/model/ServerStatus.java | 12 +- .../weblogic/domain/model/Shutdown.java | 7 +- .../domain/model/SubsystemHealth.java | 4 +- .../src/main/resources/Operator.properties | 28 +- ...-240.yaml => domain-crd-schemav7-260.yaml} | 16789 +++--- .../main/resources/scripts/encryption_util.py | 67 + .../resources/scripts/introspectDomain.py | 353 +- .../resources/scripts/introspectDomain.sh | 81 +- .../main/resources/scripts/livenessProbe.sh | 49 + .../main/resources/scripts/modelInImage.sh | 869 + .../src/main/resources/scripts/model_diff.py | 515 + .../main/resources/scripts/model_filters.json | 11 + .../src/main/resources/scripts/startServer.sh | 122 +- .../src/main/resources/scripts/stopServer.sh | 4 + .../src/main/resources/scripts/tailLog.sh | 3 +- operator/src/main/resources/scripts/utils.sh | 13 +- .../resources/scripts/wdt_create_filter.py | 34 + .../operator/ConfigMapWatcherTest.java | 9 +- .../operator/DomainPresenceTest.java | 57 +- .../operator/DomainProcessorTest.java | 390 +- .../operator/DomainProcessorTestSetup.java | 19 +- .../operator/DomainStatusUpdaterTest.java | 3 + .../kubernetes/operator/DomainUpPlanTest.java | 46 +- .../operator/DomainWatcherTest.java | 9 +- .../kubernetes/operator/JobWatcherTest.java | 11 +- .../kubernetes/operator/NamespaceTest.java | 7 +- .../operator/NamespaceWatcherTest.java | 9 +- .../kubernetes/operator/PodWatcherTest.java | 124 +- .../operator/ServiceWatcherTest.java | 9 +- .../kubernetes/operator/WatcherTestBase.java | 27 +- .../operator/builders/WatchEvent.java | 5 +- .../operator/calls/AsyncRequestStepTest.java | 44 +- .../UnprocessableEntityTest.java | 27 +- .../operator/helpers/AdminPodHelperTest.java | 47 +- .../helpers/AsyncCallTestSupport.java | 184 - .../operator/helpers/ConfigMapHelperTest.java | 515 +- .../operator/helpers/CrdHelperTest.java | 231 +- .../helpers/DomainIntrospectorJobTest.java | 64 +- .../operator/helpers/DomainTopologyTest.java | 332 + .../helpers/IntrospectorConfigMapTest.java | 403 + .../operator/helpers/JobHelperTest.java | 194 +- .../helpers/KubernetesTestSupport.java | 37 + .../operator/helpers/KubernetesUtilsTest.java | 53 +- .../helpers/ManagedPodHelperTest.java | 99 +- .../kubernetes/operator/helpers/Matchers.java | 85 +- .../operator/helpers/PodHelperTestBase.java | 157 +- .../operator/helpers/SemanticVersionTest.java | 78 + .../operator/helpers/ServiceHelperTest.java | 22 +- .../helpers/ServiceHelperTestBase.java | 6 +- .../helpers/TuningParametersStub.java | 5 + .../operator/helpers/VersionCheckTest.java | 6 +- .../operator/helpers/VersionHelperTest.java | 52 - .../http/HttpAsyncRequestStepTest.java | 7 +- .../operator/http/HttpAsyncTestSupport.java | 6 +- .../http/HttpAsyncTestSupportTest.java | 4 +- .../operator/http/HttpResponseStepImpl.java | 2 +- .../operator/http/HttpResponseStepTest.java | 10 +- .../operator/http/HttpResponseStub.java | 2 +- .../logging/LoggingFormatterTest.java | 166 + .../operator/rest/RestBackendImplTest.java | 165 +- .../ManagedServerUpIteratorStepTest.java | 255 + .../steps/ManagedServersUpStepTest.java | 30 + .../operator/steps/ReadHealthStepTest.java | 81 +- .../operator/utils/InMemoryFileSystem.java | 29 +- .../utils/WlsDomainConfigSupport.java | 0 .../operator/work/FiberTestSupport.java | 70 +- .../operator/work/InMemoryDatabaseTest.java | 34 +- .../weblogic/domain/DomainTestBase.java | 67 + .../weblogic/domain/model/DomainSpecTest.java | 44 +- .../domain/model/DomainStatusTest.java | 2 +- .../weblogic/domain/model/DomainV2Test.java | 67 +- .../domain/model/DomainValidationTest.java | 196 +- .../domain/model/domain-sample-2.yaml | 2 +- .../domain/model/domain-sample-4.yaml | 12 +- .../domain/model/domain-sample-5.yaml | 9 +- .../weblogic/domain/model/domain-sample.yaml | 9 +- pom.xml | 39 +- src/integration-tests/bash/cleanup.sh | 8 +- src/integration-tests/bash/decrypt_model.sh | 42 + src/integration-tests/bash/encryption_util.py | 57 + .../bash/show_merged_model.sh | 105 + src/integration-tests/introspector/README | 6 +- .../introspector/checkBeans.py | 1 + .../introspector/checkBeansIstio.inputt | 2 +- .../introspector/checkMIIBeans.inputt | 30 + .../introspector/introspectTest.sh | 116 +- .../introspector/mii/models/domain1.yaml | 108 + .../introspector/mii/models/model1.properties | 9 + .../mii/wdtconfigmap/domain1.10.yaml | 33 + .../introspector/util_build_mii_image.sh | 122 + .../introspector/util_download_mii_tools.sh | 85 + .../introspector/wl-create-domain-pod.yamlt | 6 +- .../introspector/wl-introspect-pod.yamlt | 25 +- .../introspector/wl-nodeport-svc.yamlt | 1 - .../introspector/wl-pod.yamlt | 17 +- .../introspector/wl-pv.yamlt | 1 - .../introspector/wl-pvc.yamlt | 1 - .../kubernetes/elasticsearch.yaml | 2 +- src/integration-tests/kubernetes/flannel.yml | 2 +- src/integration-tests/kubernetes/kibana.yaml | 2 +- .../kubernetes/logstash.yaml | 2 +- src/integration-tests/model-in-image/README | 70 + .../model-in-image/build-operator.sh | 71 + .../model-in-image/deploy-operator.sh | 74 + .../model-in-image/deploy-traefik.sh | 112 + .../model-in-image/mii-sample-wrapper/README | 123 + .../mii-sample-wrapper/build-model-image.sh | 164 + .../mii-sample-wrapper/create-secrets.sh | 88 + .../mii-sample-wrapper/env-init.sh | 69 + .../mii-sample-wrapper/generate-sample-doc.sh | 221 + .../mii-domain.yaml.template-JRF | 153 + .../mii-domain.yaml.template-WLS | 136 + .../stage-and-create-ingresses.sh | 186 + .../stage-domain-resource.sh | 77 + .../mii-sample-wrapper/stage-tooling.sh | 102 + .../model-in-image/run-test.sh | 445 + .../model-in-image/test-env.sh | 54 + .../model-in-image/util-dots.sh | 70 + .../model-in-image/util-misc.sh | 222 + src/scripts/operator.sh | 2 +- swagger/pom.xml | 2 +- 1333 files changed, 124954 insertions(+), 62299 deletions(-) delete mode 100644 build/kube.config delete mode 100755 deploy.sh create mode 100644 docs-source/content/faq/resource-settings.md create mode 100644 docs-source/content/samples/simple/domains/model-in-image/cleanup.md create mode 100644 docs-source/content/samples/simple/domains/model-in-image/initial.md create mode 100644 docs-source/content/samples/simple/domains/model-in-image/prerequisites.md create mode 100644 docs-source/content/samples/simple/domains/model-in-image/update1.md create mode 100644 docs-source/content/samples/simple/domains/model-in-image/update2.md create mode 100644 docs-source/content/samples/simple/domains/model-in-image/update3.md create mode 100644 docs-source/content/userguide/managing-domains/domain-lifecycle/introspection.md rename docs/apidocs/oracle/kubernetes/operator/{VersionConstants.html => IntrospectorConfigMapKeys.html} (65%) create mode 100644 docs/apidocs/oracle/kubernetes/operator/MakeRightDomainOperation.html create mode 100644 docs/apidocs/oracle/kubernetes/operator/ModelInImageDomainType.html create mode 100644 docs/apidocs/oracle/kubernetes/operator/OverrideDistributionStrategy.html delete mode 100644 docs/apidocs/oracle/kubernetes/operator/calls/OtherUnrecoverableErrorBuilder.html delete mode 100644 docs/apidocs/oracle/kubernetes/operator/calls/class-use/OtherUnrecoverableErrorBuilder.html rename docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/{UnprocessableEntityBuilder.html => UnrecoverableErrorBuilderImpl.html} (79%) rename docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/{UnprocessableEntityBuilder.html => UnrecoverableErrorBuilderImpl.html} (60%) rename docs/apidocs/oracle/kubernetes/operator/class-use/{VersionConstants.html => IntrospectorConfigMapKeys.html} (78%) create mode 100644 docs/apidocs/oracle/kubernetes/operator/class-use/MakeRightDomainOperation.html create mode 100644 docs/apidocs/oracle/kubernetes/operator/class-use/ModelInImageDomainType.html create mode 100644 docs/apidocs/oracle/kubernetes/operator/class-use/OverrideDistributionStrategy.html rename docs/apidocs/oracle/kubernetes/operator/helpers/{ConfigMapHelper.SitConfigMapContext.html => ConfigMapHelper.IntrospectorConfigMapContext.html} (55%) rename docs/apidocs/oracle/kubernetes/operator/helpers/{ConfigMapHelper.DomainTopology.html => DomainTopology.html} (71%) create mode 100644 docs/apidocs/oracle/kubernetes/operator/helpers/SemanticVersion.html rename docs/apidocs/oracle/kubernetes/operator/helpers/class-use/{ConfigMapHelper.SitConfigMapContext.html => ConfigMapHelper.IntrospectorConfigMapContext.html} (78%) rename docs/apidocs/oracle/kubernetes/operator/helpers/class-use/{ConfigMapHelper.DomainTopology.html => DomainTopology.html} (64%) create mode 100644 docs/apidocs/oracle/kubernetes/operator/helpers/class-use/SemanticVersion.html delete mode 100644 docs/apidocs/oracle/kubernetes/operator/helpers/class-use/VersionHelper.html create mode 100644 docs/apidocs/oracle/kubernetes/operator/logging/LoggingContext.html rename docs/apidocs/oracle/kubernetes/operator/{utils/class-use/WlsDomainConfigSupport.html => logging/class-use/LoggingContext.html} (51%) rename docs/apidocs/oracle/kubernetes/operator/{helpers/VersionHelper.html => rest/model/DomainAction.html} (60%) create mode 100644 docs/apidocs/oracle/kubernetes/operator/rest/model/DomainActionType.html create mode 100644 docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/DomainAction.html create mode 100644 docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/DomainActionType.html delete mode 100644 docs/apidocs/oracle/kubernetes/operator/utils/WlsDomainConfigSupport.html create mode 100644 docs/apidocs/oracle/kubernetes/weblogic/domain/model/Model.html create mode 100644 docs/apidocs/oracle/kubernetes/weblogic/domain/model/Opss.html create mode 100644 docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Model.html create mode 100644 docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Opss.html create mode 100644 docs/apidocs/system-properties.html create mode 100644 docs/charts/weblogic-operator-3.0.0.tgz create mode 100644 integration-tests/src/test/java/oracle/kubernetes/operator/ItMiiConfigUpdateCm.java create mode 100644 integration-tests/src/test/java/oracle/kubernetes/operator/ItMiiConfigUpdateImage.java create mode 100644 integration-tests/src/test/java/oracle/kubernetes/operator/ItModelInImage.java create mode 100644 integration-tests/src/test/java/oracle/kubernetes/operator/MiiBaseTest.java create mode 100644 integration-tests/src/test/java/oracle/kubernetes/operator/MiiConfigUpdateBaseTest.java create mode 100644 integration-tests/src/test/resources/model-in-image/add_os_utils create mode 100755 integration-tests/src/test/resources/model-in-image/build-app.sh create mode 100644 integration-tests/src/test/resources/model-in-image/cm.jdbc.yaml create mode 100644 integration-tests/src/test/resources/model-in-image/create-domain-inputs.yaml create mode 100755 integration-tests/src/test/resources/model-in-image/create-domain.sh create mode 100644 integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/META-INF/MANIFEST.MF create mode 100644 integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/META-INF/application.xml create mode 100644 integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/META-INF/weblogic-application.xml create mode 100644 integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/ds_war/WEB-INF/web.xml create mode 100644 integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/ds_war/WEB-INF/weblogic.xml create mode 100644 integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/ds_war/index.jsp create mode 100644 integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/config/amimemappings.properties create mode 100644 integration-tests/src/test/resources/model-in-image/jdbc.20.yaml create mode 100644 integration-tests/src/test/resources/model-in-image/miisection-toaddin-domain-template.yaml create mode 100644 integration-tests/src/test/resources/model-in-image/model.cluster.yaml create mode 100644 integration-tests/src/test/resources/model-in-image/model.cm.properties create mode 100644 integration-tests/src/test/resources/model-in-image/model.config.wls.yaml create mode 100644 integration-tests/src/test/resources/model-in-image/model.empty.properties create mode 100644 integration-tests/src/test/resources/model-in-image/model.jdbc.image.properties create mode 100644 integration-tests/src/test/resources/model-in-image/model.jdbc.image.yaml create mode 100644 integration-tests/src/test/resources/model-in-image/model.jdbc.properties create mode 100644 integration-tests/src/test/resources/model-in-image/model.jdbc.yaml create mode 100644 integration-tests/src/test/resources/model-in-image/model.jms.yaml create mode 100644 integration-tests/src/test/resources/model-in-image/model.jrf.yaml create mode 100644 integration-tests/src/test/resources/model-in-image/model.mysql.yaml create mode 100644 integration-tests/src/test/resources/model-in-image/model.properties create mode 100644 integration-tests/src/test/resources/model-in-image/model.wldf.yaml create mode 100644 integration-tests/src/test/resources/model-in-image/model.wls.yaml create mode 100644 integration-tests/src/test/resources/model-in-image/new.jdbc.10.yaml create mode 100644 integration-tests/src/test/resources/model-in-image/now.jdbc.10.yaml create mode 100644 integration-tests/src/test/resources/model-in-image/properties-template.properties create mode 100644 integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/META-INF/MANIFEST.MF create mode 100644 integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/META-INF/application.xml create mode 100644 integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/META-INF/weblogic-application.xml create mode 100644 integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/sample_war/WEB-INF/web.xml create mode 100644 integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/sample_war/WEB-INF/weblogic.xml create mode 100644 integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/sample_war/index.jsp create mode 100644 integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/config/amimemappings.properties create mode 100644 integration-tests/src/test/resources/model-in-image/scripts/verify-ds-secret.py create mode 100644 integration-tests/src/test/resources/model-in-image/scripts/verify-jdbc-resource.py create mode 100644 kubernetes/crd/domain-crdv7-260.yaml rename kubernetes/crd/{domain-v1beta1-crdv6-240.yaml => domain-v1beta1-crdv7-260.yaml} (98%) create mode 100644 kubernetes/samples/scripts/common/jrf-domain-template.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/README.md create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/META-INF/MANIFEST.MF create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/META-INF/application.xml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/META-INF/weblogic-application.xml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/web.xml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/weblogic.xml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/myapp_war/index.jsp create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/config/amimemappings.properties create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/META-INF/MANIFEST.MF create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/META-INF/application.xml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/META-INF/weblogic-application.xml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/web.xml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/weblogic.xml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/myapp_war/index.jsp create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/META-INF/MANIFEST.MF create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/META-INF/application.xml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/META-INF/weblogic-application.xml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/myapp_war/WEB-INF/web.xml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/myapp_war/WEB-INF/weblogic.xml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/myapp_war/index.jsp create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/config/amimemappings.properties create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-initial-d1-JRF-v1.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-update1-d1-JRF-v1-ds.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-update2-d2-JRF-v1-ds.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-update3-d1-JRF-v2-ds.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-initial-d1-WLS-v1.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-update1-d1-WLS-v1-ds.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-update2-d2-WLS-v1-ds.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-update3-d1-WLS-v2-ds.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/ingresses/traefik-ingress-sample-domain1-admin-server.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/ingresses/traefik-ingress-sample-domain1-cluster-cluster-1.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/ingresses/traefik-ingress-sample-domain2-cluster-cluster-1.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-configmaps/datasource/model.20.datasource.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v1/model.10.properties create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v1/model.10.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v2/model.10.properties create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v2/model.10.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v1/model.10.properties create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v1/model.10.yaml create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v2/model.10.properties create mode 100644 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v2/model.10.yaml create mode 100755 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/create-configmap.sh create mode 100755 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/create-secret.sh create mode 100755 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/opss-wallet.sh create mode 100755 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/patch-restart-version.sh create mode 100755 kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/wl-pod-wait.sh create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/domain/Experimental.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/domain/Model.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/domain/Opss.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItCoherenceTests.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItConfigDistributionStrategy.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItCrossDomainTransaction.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIntrospectVersion.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioCrossDomainTransaction.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioDomainInImage.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioDomainInPV.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioMiiDomain.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioTwoDomainsInImage.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItJrfDomainInPV.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiAddCluster.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiChangeAdminCredentials.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiConfigMap.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiConfigMapOverride.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiDomain.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiMultiModel.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiSample.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMonitoringExporter.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItOperatorRestartWhenPodRoll.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItScaleMiiDomainNginx.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItSessionMigration.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItStickySession.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItVoyagerSample.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/ClusterRole.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Ingress.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Voyager.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/VoyagerParams.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/ClusterRole.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/ClusterRoleBinding.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Deployment.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/RoleBinding.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Voyager.java delete mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/LoggedTest.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/LoggingExtension.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonMiiTestUtils.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonPatchTestUtils.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/DbUtils.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/IstioUtils.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/MySQLDBUtils.java create mode 100644 new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/ThreadSafeLogger.java create mode 100644 new-integration-tests/src/test/resources/apps/clusterview/src/java/oracle/weblogic/kubernetes/applications/clusterview/ConfigServlet.java create mode 100644 new-integration-tests/src/test/resources/apps/coherence-proxy-client/build.xml create mode 100644 new-integration-tests/src/test/resources/apps/coherence-proxy-client/buildRunProxyClient.sh create mode 100644 new-integration-tests/src/test/resources/apps/coherence-proxy-client/src/main/java/cohapp/CacheClient.java create mode 100644 new-integration-tests/src/test/resources/apps/coherence-proxy-client/src/main/java/cohapp/Main.java create mode 100644 new-integration-tests/src/test/resources/apps/coherence-proxy-client/src/main/resources/client-cache-config.xml create mode 100644 new-integration-tests/src/test/resources/apps/coherence-proxy-server/META-INF/coherence-application.xml create mode 100644 new-integration-tests/src/test/resources/apps/coherence-proxy-server/META-INF/server-cache-config.xml create mode 100644 new-integration-tests/src/test/resources/apps/opensessionapp/META-INF/MANIFEST.MF create mode 100644 new-integration-tests/src/test/resources/apps/opensessionapp/META-INF/application.xml create mode 100644 new-integration-tests/src/test/resources/apps/opensessionapp/META-INF/weblogic-application.xml create mode 100644 new-integration-tests/src/test/resources/apps/opensessionapp/opensession/WEB-INF/web.xml create mode 100644 new-integration-tests/src/test/resources/apps/opensessionapp/opensession/WEB-INF/weblogic.xml create mode 100644 new-integration-tests/src/test/resources/apps/opensessionapp/opensession/index.jsp create mode 100644 new-integration-tests/src/test/resources/apps/stickysess-app/META-INF/MANIFEST.MF create mode 100644 new-integration-tests/src/test/resources/apps/stickysess-app/META-INF/application.xml create mode 100644 new-integration-tests/src/test/resources/apps/stickysess-app/META-INF/weblogic-application.xml create mode 100644 new-integration-tests/src/test/resources/apps/stickysess-app/stickysess-war/WEB-INF/web.xml create mode 100644 new-integration-tests/src/test/resources/apps/stickysess-app/stickysess-war/WEB-INF/weblogic.xml create mode 100644 new-integration-tests/src/test/resources/apps/stickysess-app/stickysess-war/index.jsp create mode 100644 new-integration-tests/src/test/resources/apps/txforward/TxForward/WebContent/META-INF/MANIFEST.MF create mode 100644 new-integration-tests/src/test/resources/apps/txforward/TxForward/WebContent/META-INF/application.xml create mode 100644 new-integration-tests/src/test/resources/apps/txforward/TxForward/WebContent/META-INF/weblogic-application.xml create mode 100644 new-integration-tests/src/test/resources/apps/txforward/TxForward/src/example/TxForward.java create mode 100644 new-integration-tests/src/test/resources/apps/txforward/build.xml create mode 100644 new-integration-tests/src/test/resources/apps/txforward/remotesync/src/META-INF/MANIFEST.MF create mode 100644 new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/LifecycleListenerImpl.java create mode 100644 new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/RemoteSync.java create mode 100644 new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/RemoteSyncImpl.java create mode 100644 new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/Utils.java create mode 100755 new-integration-tests/src/test/resources/bash-scripts/callpyscript.sh create mode 100755 new-integration-tests/src/test/resources/bash-scripts/createRepository.sh create mode 100755 new-integration-tests/src/test/resources/bash-scripts/install-istio.sh create mode 100755 new-integration-tests/src/test/resources/bash-scripts/uninstall-istio.sh create mode 100644 new-integration-tests/src/test/resources/configfiles/configoverridesset1/config.xml create mode 100644 new-integration-tests/src/test/resources/configfiles/configoverridesset1/config1.xml create mode 100644 new-integration-tests/src/test/resources/configfiles/configoverridesset1/jdbc-JdbcTestDataSource-0.xml create mode 100644 new-integration-tests/src/test/resources/configfiles/configoverridesset1/jdbc-JdbcTestDataSource-1.xml create mode 100644 new-integration-tests/src/test/resources/configfiles/configoverridesset1/version.txt create mode 100644 new-integration-tests/src/test/resources/exporter/exporter-config.yaml rename new-integration-tests/src/test/resources/exporter/{rest_webapp.yml => rest_domainqualtrue.yaml} (92%) create mode 100644 new-integration-tests/src/test/resources/exporter/rest_dublicatedval.yaml create mode 100644 new-integration-tests/src/test/resources/exporter/rest_empty.yaml create mode 100644 new-integration-tests/src/test/resources/exporter/rest_jvm.yaml create mode 100644 new-integration-tests/src/test/resources/exporter/rest_notyaml.yaml create mode 100644 new-integration-tests/src/test/resources/exporter/rest_notyamlformat.yaml create mode 100644 new-integration-tests/src/test/resources/exporter/rest_oneattribval.yaml create mode 100644 new-integration-tests/src/test/resources/exporter/rest_snakecasefalse.yaml create mode 100644 new-integration-tests/src/test/resources/exporter/rest_snakecasetrue.yaml create mode 100644 new-integration-tests/src/test/resources/exporter/rest_twoattribs.yaml create mode 100644 new-integration-tests/src/test/resources/exporter/rest_webapp.yaml create mode 100755 new-integration-tests/src/test/resources/exporter/rest_workmanagers.yaml create mode 100644 new-integration-tests/src/test/resources/exporter/rest_wseeclient.yaml create mode 100644 new-integration-tests/src/test/resources/helper-files/pwd.txt create mode 100644 new-integration-tests/src/test/resources/istio/istio-cdt-http-template-service.yaml create mode 100644 new-integration-tests/src/test/resources/istio/istio-dr-template.yaml create mode 100644 new-integration-tests/src/test/resources/istio/istio-http-template.yaml create mode 100644 new-integration-tests/src/test/resources/istio/istio-tcp-template.yaml create mode 100644 new-integration-tests/src/test/resources/junit-platform.properties create mode 100644 new-integration-tests/src/test/resources/python-scripts/create-jdbc-resource.py create mode 100644 new-integration-tests/src/test/resources/python-scripts/jrf-wlst-create-domain-onpv.py create mode 100644 new-integration-tests/src/test/resources/python-scripts/wldf.py create mode 100644 new-integration-tests/src/test/resources/python-scripts/wlst-create-istio-domain-onpv.py create mode 100644 new-integration-tests/src/test/resources/wdt-models/coherence-wdt-config.properties create mode 100644 new-integration-tests/src/test/resources/wdt-models/coherence-wdt-config.yaml create mode 100644 new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain1.properties create mode 100644 new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain1.yaml create mode 100644 new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain2.properties create mode 100644 new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain2.yaml create mode 100644 new-integration-tests/src/test/resources/wdt-models/model.stickysess.yaml create mode 100644 operator/src/main/java/oracle/kubernetes/operator/IntrospectorConfigMapKeys.java create mode 100644 operator/src/main/java/oracle/kubernetes/operator/MakeRightDomainOperation.java create mode 100644 operator/src/main/java/oracle/kubernetes/operator/ModelInImageDomainType.java create mode 100644 operator/src/main/java/oracle/kubernetes/operator/OverrideDistributionStrategy.java delete mode 100644 operator/src/main/java/oracle/kubernetes/operator/VersionConstants.java delete mode 100644 operator/src/main/java/oracle/kubernetes/operator/calls/OtherUnrecoverableErrorBuilder.java delete mode 100644 operator/src/main/java/oracle/kubernetes/operator/calls/unprocessable/UnprocessableEntityBuilder.java create mode 100644 operator/src/main/java/oracle/kubernetes/operator/calls/unprocessable/UnrecoverableErrorBuilderImpl.java create mode 100644 operator/src/main/java/oracle/kubernetes/operator/helpers/DomainTopology.java create mode 100644 operator/src/main/java/oracle/kubernetes/operator/helpers/SemanticVersion.java delete mode 100644 operator/src/main/java/oracle/kubernetes/operator/helpers/VersionHelper.java create mode 100644 operator/src/main/java/oracle/kubernetes/operator/logging/LoggingContext.java create mode 100644 operator/src/main/java/oracle/kubernetes/operator/rest/model/DomainAction.java create mode 100644 operator/src/main/java/oracle/kubernetes/operator/rest/model/DomainActionType.java create mode 100644 operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Model.java create mode 100644 operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Opss.java rename operator/src/main/resources/schema/{domain-crd-schemav6-240.yaml => domain-crd-schemav7-260.yaml} (62%) create mode 100644 operator/src/main/resources/scripts/encryption_util.py create mode 100755 operator/src/main/resources/scripts/modelInImage.sh create mode 100644 operator/src/main/resources/scripts/model_diff.py create mode 100644 operator/src/main/resources/scripts/model_filters.json mode change 100755 => 100644 operator/src/main/resources/scripts/tailLog.sh create mode 100644 operator/src/main/resources/scripts/wdt_create_filter.py delete mode 100644 operator/src/test/java/oracle/kubernetes/operator/helpers/AsyncCallTestSupport.java create mode 100644 operator/src/test/java/oracle/kubernetes/operator/helpers/DomainTopologyTest.java create mode 100644 operator/src/test/java/oracle/kubernetes/operator/helpers/IntrospectorConfigMapTest.java create mode 100644 operator/src/test/java/oracle/kubernetes/operator/helpers/SemanticVersionTest.java delete mode 100644 operator/src/test/java/oracle/kubernetes/operator/helpers/VersionHelperTest.java create mode 100644 operator/src/test/java/oracle/kubernetes/operator/logging/LoggingFormatterTest.java create mode 100644 operator/src/test/java/oracle/kubernetes/operator/steps/ManagedServerUpIteratorStepTest.java rename operator/src/{main => test}/java/oracle/kubernetes/operator/utils/WlsDomainConfigSupport.java (100%) create mode 100755 src/integration-tests/bash/decrypt_model.sh create mode 100644 src/integration-tests/bash/encryption_util.py create mode 100755 src/integration-tests/bash/show_merged_model.sh create mode 100644 src/integration-tests/introspector/checkMIIBeans.inputt create mode 100644 src/integration-tests/introspector/mii/models/domain1.yaml create mode 100644 src/integration-tests/introspector/mii/models/model1.properties create mode 100644 src/integration-tests/introspector/mii/wdtconfigmap/domain1.10.yaml create mode 100755 src/integration-tests/introspector/util_build_mii_image.sh create mode 100755 src/integration-tests/introspector/util_download_mii_tools.sh create mode 100644 src/integration-tests/model-in-image/README create mode 100755 src/integration-tests/model-in-image/build-operator.sh create mode 100755 src/integration-tests/model-in-image/deploy-operator.sh create mode 100755 src/integration-tests/model-in-image/deploy-traefik.sh create mode 100644 src/integration-tests/model-in-image/mii-sample-wrapper/README create mode 100755 src/integration-tests/model-in-image/mii-sample-wrapper/build-model-image.sh create mode 100755 src/integration-tests/model-in-image/mii-sample-wrapper/create-secrets.sh create mode 100755 src/integration-tests/model-in-image/mii-sample-wrapper/env-init.sh create mode 100755 src/integration-tests/model-in-image/mii-sample-wrapper/generate-sample-doc.sh create mode 100644 src/integration-tests/model-in-image/mii-sample-wrapper/mii-domain.yaml.template-JRF create mode 100644 src/integration-tests/model-in-image/mii-sample-wrapper/mii-domain.yaml.template-WLS create mode 100755 src/integration-tests/model-in-image/mii-sample-wrapper/stage-and-create-ingresses.sh create mode 100755 src/integration-tests/model-in-image/mii-sample-wrapper/stage-domain-resource.sh create mode 100755 src/integration-tests/model-in-image/mii-sample-wrapper/stage-tooling.sh create mode 100755 src/integration-tests/model-in-image/run-test.sh create mode 100755 src/integration-tests/model-in-image/test-env.sh create mode 100755 src/integration-tests/model-in-image/util-dots.sh create mode 100755 src/integration-tests/model-in-image/util-misc.sh diff --git a/Dockerfile b/Dockerfile index 4c877f393fe..19301d3d559 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,23 +20,23 @@ RUN set -eux; \ # Default to UTF-8 file.encoding ENV LANG en_US.UTF-8 -ENV JAVA_HOME /usr/local/graalvm-ce-java11 +ENV JAVA_HOME /usr/local/java ENV PATH /operator:$JAVA_HOME/bin:$PATH -ENV JAVA_VERSION 11.0.7 -ENV JAVA_URL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-19.3.2/graalvm-ce-java11-linux-amd64-19.3.2.tar.gz +ENV JAVA_VERSION 14.0.2 +ENV JAVA_URL https://download.java.net/java/GA/jdk14.0.2/205943a0976c4ed48cb16f1043c5c647/11/GPL/openjdk-14.0.2_linux-x64_bin.tar.gz # Install Java and make the operator run with a non-root user id (1000 is the `oracle` user) RUN set -eux; \ - curl -fL -o /graalvm-ce-java11.tar.gz "$JAVA_URL"; \ + curl -fL -o /jdk.tar.gz "$JAVA_URL"; \ mkdir -p "$JAVA_HOME"; \ - tar --extract --file /graalvm-ce-java11.tar.gz --directory "$JAVA_HOME" --strip-components 1; \ - rm /graalvm-ce-java11.tar.gz; \ + tar --extract --file /jdk.tar.gz --directory "$JAVA_HOME" --strip-components 1; \ + rm /jdk.tar.gz; \ mkdir /usr/java; \ ln -sfT "$JAVA_HOME" /usr/java/default; \ ln -sfT "$JAVA_HOME" /usr/java/latest; \ - rm -Rf "$JAVA_HOME/include" "$JAVA_HOME/jmods" "$JAVA_HOME/languages" "$JAVA_HOME/tools" "$JAVA_HOME/lib/svm" "$JAVA_HOME/lib/installer" "$JAVA_HOME/lib/visualvm" "$JAVA_HOME/lib/truffle" "$JAVA_HOME/lib/polyglot"; \ - rm -f "$JAVA_HOME/lib/src.zip" "$JAVA_HOME/lib/libjvmcicompiler.so" "$JAVA_HOME/bin/polyglot"; \ + rm -Rf "$JAVA_HOME/include" "$JAVA_HOME/jmods"; \ + rm -f "$JAVA_HOME/lib/src.zip"; \ for bin in "$JAVA_HOME/bin/"*; do \ base="$(basename "$bin")"; \ [ ! -e "/usr/bin/$base" ]; \ @@ -60,4 +60,4 @@ HEALTHCHECK --interval=1m --timeout=10s \ WORKDIR /operator/ -CMD ["/operator/operator.sh"] \ No newline at end of file +CMD ["/operator/operator.sh"] diff --git a/LICENSE.txt b/LICENSE.txt index b07fa4a4d2d..52ff79d8ac4 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2017, 2019, Oracle Corporation and/or its affiliates. All rights reserved. +Copyright (c) 2017, 2020, Oracle Corporation and/or its affiliates. The Universal Permissive License (UPL), Version 1.0 diff --git a/README.md b/README.md index 9129fee88a5..0ecdd162b7a 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,8 @@ Oracle is finding ways for organizations using WebLogic Server to run important The fastest way to experience the operator is to follow the [Quick Start guide](https://oracle.github.io/weblogic-kubernetes-operator/quickstart/), or you can peruse our [documentation](https://oracle.github.io/weblogic-kubernetes-operator), read our [blogs](https://blogs.oracle.com/weblogicserver/updated-weblogic-kubernetes-support-with-operator-20), or try out the [samples](https://oracle.github.io/weblogic-kubernetes-operator/samples/). *** -The [current release of the operator](https://github.com/oracle/weblogic-kubernetes-operator/releases) is 2.6.0. -This release was published on June 22, 2020. +The [current release of the operator](https://github.com/oracle/weblogic-kubernetes-operator/releases) is 3.0.0. +This release was published on July 17, 2020. *** # Documentation diff --git a/build-tools/checkstyle/customized_google_checks.xml b/build-tools/checkstyle/customized_google_checks.xml index 3803d16d0be..0f87bceb92f 100644 --- a/build-tools/checkstyle/customized_google_checks.xml +++ b/build-tools/checkstyle/customized_google_checks.xml @@ -302,7 +302,7 @@ - + diff --git a/build/kube.config b/build/kube.config deleted file mode 100644 index e7e095c205b..00000000000 --- a/build/kube.config +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: v1 -clusters: -- cluster: - insecure-skip-tls-verify: true - server: %ADDRESS% - name: bmcs-k8s-cluster -contexts: -- context: - cluster: bmcs-k8s-cluster - user: default-admin - name: bmcs-k8s-context -current-context: bmcs-k8s-context -kind: Config -preferences: {} -users: -- name: default-admin - user: - client-certificate-data: %CLIENT_CERT_DATA% - client-key-data: %CLIENT_KEY_DATA% diff --git a/buildDockerImage.sh b/buildDockerImage.sh index 32d476115ff..d869171ccef 100755 --- a/buildDockerImage.sh +++ b/buildDockerImage.sh @@ -33,7 +33,7 @@ while getopts "t:" optname; do esac done -IMAGE_NAME=${name:-oracle/weblogic-kubernetes-operator:2.6.0} +IMAGE_NAME=${name:-oracle/weblogic-kubernetes-operator:3.0.0} SCRIPTPATH="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" # Proxy settings diff --git a/buildtime-reports/pom.xml b/buildtime-reports/pom.xml index 807b1f98fb2..4b8925a87bb 100644 --- a/buildtime-reports/pom.xml +++ b/buildtime-reports/pom.xml @@ -8,7 +8,7 @@ operator-parent oracle.kubernetes - 2.6.0 + 3.0.0 buildtime-reports diff --git a/deploy.sh b/deploy.sh deleted file mode 100755 index bd59773fdec..00000000000 --- a/deploy.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# Copyright (c) 2017, 2019, Oracle Corporation and/or affiliates. All rights reserved. -# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. - -IMAGE="container-registry.oracle.com/middleware/weblogic-kubernetes-operator:latest" - -echo 'Building Docker image...' -docker build -t $IMAGE --no-cache=true . - -echo 'Pushing Docker image...' -docker push $IMAGE diff --git a/docs-source/content/_index.md b/docs-source/content/_index.md index 6ed9146ba7d..56191fbef71 100644 --- a/docs-source/content/_index.md +++ b/docs-source/content/_index.md @@ -23,37 +23,12 @@ using the operator to deploy and run a WebLogic domain container-packaged web ap *** #### Current production release -The [current production release of the operator](https://github.com/oracle/weblogic-kubernetes-operator/releases) is 2.6.0. -This release was published on June 22, 2020. See the operator prerequisites and supported environments [here]({{< relref "/userguide/introduction/introduction#operator-prerequisites" >}}). - -#### Preview of next major release - -The [current preview release of the operator](https://github.com/oracle/weblogic-kubernetes-operator/releases) is 3.0.0-rc1 (release candidate). -This release candidate is suitable for use by early adopters who wish to test 3.0.0 features and provide feedback. -This release candidate was published on May 8, 2020. There may be additional release candidates before the final 3.0.0 release. - -This release candidate introduces _non-backward compatible_ changes. This release candidate cannot be run in the same -cluster as another release of the operator. You can upgrade from 2.6.0 to 3.0.0-rc1 without needing to restart or recreate -any existing domains. However, please note that we _do_ plan to support running the final 3.0.0 -release in the same cluster with at least one 2.x release of the operator to allow for staged migration. - -The feature changes in 3.0.0-rc1 are: - -* Introduction of a new ["Model In Image"]({{% relref "/userguide/managing-domains/model-in-image" %}}) feature which allows you to have a domain - created at pod startup time from a WebLogic Deploy Tool model and archive. - This supports user-requested use cases like creating multiple domains from - the same model and automated updating of the domain based on model changes. - The operator automates management of the domain encryption keys to ensure - that they are not changed during domain updates. - We provide a [sample]({{% relref "/samples/simple/domains/model-in-image" %}}) that - demonstrates the key use cases for this feature. -* Support for running the operator on Kubernetes 1.16. -* Deprecation and removal of support for running the operator on Kubernetes 1.13 - and earlier versions. -* Deprecation and removal of support for Helm 2.x. Helm 2.x uses the "tiller" pod - which needs to run with elevated privileges (`cluster-admin` or very close to that) - and which could be a vector for a privilege escalation attack. Helm 3.x removes - Tiller and does not create the same exposure. +The [current release of the operator](https://github.com/oracle/weblogic-kubernetes-operator/releases) is 3.0.0. +This release was published on July 17, 2020. See the operator prerequisites and supported environments [here]({{< relref "/userguide/introduction/introduction#operator-prerequisites" >}}). + +This release introduces _non-backward compatible_ changes; however, operators using this release can be run in the same +Kubernetes cluster as operators using the 2.6.0 version allowing for staged migration. You can replace a 2.6.0 operator with a 3.x operator without needing to recreate any existing domains; however, you must delete the 2.6.0 Helm release and then install the 3.x version rather than using a Helm upgrade. When the 3.x operator starts, it will roll any running WebLogic Server instances +started by the 2.6.0 operator. See the operator upgrade guide [here]({{< relref "/userguide/managing-operators/installation/_index.md#upgrade-the-operator" >}}). *** diff --git a/docs-source/content/developerguide/backwards-compatibility.md b/docs-source/content/developerguide/backwards-compatibility.md index 33f30ca5bea..92803a8425f 100644 --- a/docs-source/content/developerguide/backwards-compatibility.md +++ b/docs-source/content/developerguide/backwards-compatibility.md @@ -5,4 +5,4 @@ draft: false weight: 9 --- -Starting with the 2.0.1 release, operator releases must be backward compatible with respect to the domain resource schema, operator Helm chart input values, configuration overrides template, Kubernetes resources created by the operator Helm chart, Kubernetes resources created by the operator, and the operator REST interface. We will maintain compatibility for three releases, except in the case of a clearly communicated deprecated feature, which will be maintained for one release after a replacement is available. +Starting with the 2.0.1 release, operator releases must be backward compatible with respect to the Domain schema, operator Helm chart input values, configuration overrides template, Kubernetes resources created by the operator Helm chart, Kubernetes resources created by the operator, and the operator REST interface. We will maintain compatibility for three releases, except in the case of a clearly communicated deprecated feature, which will be maintained for one release after a replacement is available. diff --git a/docs-source/content/developerguide/code-structure.md b/docs-source/content/developerguide/code-structure.md index 93b591e0348..87170ff2274 100644 --- a/docs-source/content/developerguide/code-structure.md +++ b/docs-source/content/developerguide/code-structure.md @@ -7,17 +7,18 @@ weight: 6 This project has the following directory structure: -* `docs`: Generated Javadoc and Swagger -* `integration-tests`: Integration test suite +* `docs`: Helm charts, Javadoc, Operator REST API Swagger, and Domain reference +* `docs-source`: This documentation +* `integration-tests`: Original, JUnit 4 integration test suite (see also `new-integration-tests`) * `json-schema`: Java model to JSON schema generator * `json-schema-maven-plugin`: Maven plugin for schema generator * `kubernetes/charts`: Helm charts * `kubernetes/samples`: All samples, including for WebLogic domain creation -* `model`: Domain resource Java model +* `new-integration-tests`: JUnit 5 integration test suite (see also `integration-tests`) * `operator`: Operator runtime -* `site`: This documentation +* `site`: Historical documentation * `src/scripts`: Scripts operator injects into WebLogic Server instance Pods -* `swagger`: Swagger files for the Kubernetes API server and domain resource +* `swagger`: Swagger files for the Kubernetes API server and Domain type ### Watch package diff --git a/docs-source/content/developerguide/domain-processing.md b/docs-source/content/developerguide/domain-processing.md index dbfc26f04f7..227af928089 100644 --- a/docs-source/content/developerguide/domain-processing.md +++ b/docs-source/content/developerguide/domain-processing.md @@ -6,10 +6,10 @@ weight: 8 --- -When the operator starts, it lists all existing Domain resources and processes these domains to create the necessary Kubernetes resources, such as Pods and Services, if they don't already exist. This initialization also includes looking for any stranded resources that, while created by the operator, no longer correlate with a Domain resource. +When the operator starts, it lists all the existing Domains and then processes these Domains to create the necessary Kubernetes resources, such as Pods and Services, if they don't already exist. This initialization also includes looking for any stranded resources that, while created by the operator, no longer correlate with a Domain. -After this, the operator starts watches for changes to Domain resources and any changes to other resources created by the operator. When a watch event is received, the operator processes the modified Domain resource to again bring the runtime presence in to alignment with the desired state. +After this, the operator starts watches for changes to Domains and any changes to other resources created by the operator. When a watch event is received, the operator processes the modified Domain to again bring the runtime presence into alignment with the desired state. -The operator ensures that at most one `Fiber` is running for any given Domain. For instance, if the customer modifies a Domain resource to trigger a rolling restart, then the operator will create a `Fiber` to process this activity. However, if while the rolling restart is in process, the customer makes another change to the Domain resource, such as to increase the `replicas` field for a cluster, then the operator will cancel the in-flight `Fiber` and replace it with a new `Fiber`. This replacement processing must be able to handle taking over for the cancelled work regardless of where the earlier processing may have been in its flow. Therefore, domain processing always starts at the beginning of the "make right" flow without any state other than the current Domain resource. +The operator ensures that at most one `Fiber` is running for any given Domain. For instance, if the customer modifies a Domain to initiate a rolling restart, then the operator will create a `Fiber` to process this activity. However, if while the rolling restart is in process, the customer makes another change to the Domain, such as to increase the `replicas` field for a cluster, then the operator will cancel the in-flight `Fiber` and replace it with a new `Fiber`. This replacement processing must be able to handle taking over for the cancelled work regardless of where the earlier processing may have been in its flow. Therefore, domain processing always starts at the beginning of the "make right" flow without any state other than the current Domain resource. Finally, the operator periodically lists all Domains and rechecks them. This is a backstop against the possibility that a watch event is missed, such as because of a temporary network outage. Recheck activities will not interrupt already running processes for a given Domain. diff --git a/docs-source/content/faq/_index.md b/docs-source/content/faq/_index.md index 4c82501f7ab..26c81cd8a4a 100644 --- a/docs-source/content/faq/_index.md +++ b/docs-source/content/faq/_index.md @@ -1,14 +1,10 @@ -+++ -title = "Frequently asked questions" -date = 2019-02-23T08:14:59-05:00 -weight = 7 -chapter = true -draft = false -pre = "7. " -+++ - -### Chapter 7 - -# Frequently Asked Questions +--- +title: "Frequently asked questions" +date: 2019-02-23T08:14:59-05:00 +weight: 7 +draft: false +--- This section provides answers to frequently asked questions. + +{{% children style="h4" description="true" %}} diff --git a/docs-source/content/faq/boot-identity-not-valid.md b/docs-source/content/faq/boot-identity-not-valid.md index b17ef5cb67b..f63883c1cde 100644 --- a/docs-source/content/faq/boot-identity-not-valid.md +++ b/docs-source/content/faq/boot-identity-not-valid.md @@ -2,7 +2,8 @@ title: "Boot identity not valid" date: 2020-03-02T08:08:19-04:01 draft: false -weight: 20 +weight: 3 +description: "One or more WebLogic Server instances in my domain will not start and I see errors in the server log like this: Boot identity not valid." --- > One or more WebLogic Server instances in my domain will not start and I see errors in the server log like this: diff --git a/docs-source/content/faq/cannot-pull-image.md b/docs-source/content/faq/cannot-pull-image.md index 3ceb3fe2c41..0448cec6be0 100644 --- a/docs-source/content/faq/cannot-pull-image.md +++ b/docs-source/content/faq/cannot-pull-image.md @@ -2,7 +2,8 @@ title: "Cannot pull image" date: 2019-03-23T08:08:19-04:00 draft: false -weight: 10 +weight: 2 +description: "My domain will not start and I see errors like `ImagePullBackoff` or `Cannot pull image`." --- > My domain will not start and I see errors like `ImagePullBackoff` or `Cannot pull image` @@ -10,7 +11,7 @@ weight: 10 When you see these kinds of errors, it means that Kubernetes cannot find your Docker image. The most common causes are: -* The `image` value in your domain resource is set incorrectly, meaning Kubernetes will be +* The `image` value in your Domain is set incorrectly, meaning Kubernetes will be trying to pull the wrong image. * The image requires authentication or permission in order to pull it and you have not configured Kubernetes with the necessary credentials, for example in an `imagePullSecret`. @@ -91,17 +92,16 @@ Here is an example of part of a domain custom resource file with the `imagePullS specified: ``` -apiVersion: "weblogic.oracle/v7" +apiVersion: "weblogic.oracle/v8" kind: Domain metadata: name: domain1 namespace: default labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: domain1 spec: domainHome: /u01/oracle/user_projects/domains/domain1 - domainHomeInImage: true + domainHomeSourceType: Image image: "some.registry.com/owner/domain1:1.0" imagePullPolicy: "IfNotPresent" imagePullSecrets: @@ -122,15 +122,37 @@ kubectl patch serviceaccount default \ ``` {{% notice note %}} -You can provide mutliple `imagePullSecrets` if you need to pull Docker images from multiple +You can provide multiple `imagePullSecrets` if you need to pull Docker images from multiple remote Docker registries or if your images require different authentication credentials. For more information, see [Docker Image Protection]({{}}). {{% /notice %}} +#### Pushing the image to a repository + +If you have an image in your local repository that you would like to copy to +a remote repository, then the Docker steps are: + +- Use [docker login](https://docs.docker.com/engine/reference/commandline/login/) + to log in to the target repository's registry. For example: + ``` + docker login some.registry.com -u username -p password + ``` +- Use [docker tag](https://docs.docker.com/engine/reference/commandline/tag/) + to mark the image with the target registry, owner, repository name, and tag. + For example: + ``` + docker tag domain1:1.0 some.registry.com/owner/domain1:1.0 + ``` +- Use [docker push](https://docs.docker.com/engine/reference/commandline/push/) + to push the image to the repository. For example: + ``` + docker push some.registry.com/owner/domain1:1.0 + ``` + #### Manually copying the image to your worker nodes If you are not able to use a remote Docker registry, for example if your Kubernetes cluster is -in a secure network with no external access, you can manually copy the Docker images to the +in a secure network with no external access, then you can manually copy the Docker images to the cluster instead. On the machine where you created the image, export it into a TAR file using this command: @@ -150,4 +172,4 @@ docker load < domain1.tar After you have ensured that the images are accessible on all worker nodes, you may need to restart the pods so that Kubernetes will attempt to pull the images again. You can do this by -deleting the pods themselves, or deleting the domain resource and then recreating it. +deleting the pods themselves, or deleting the Domain and then recreating it. diff --git a/docs-source/content/faq/coherence-requirements.md b/docs-source/content/faq/coherence-requirements.md index fe940f7c49a..ded18798546 100644 --- a/docs-source/content/faq/coherence-requirements.md +++ b/docs-source/content/faq/coherence-requirements.md @@ -1,8 +1,11 @@ --- -title: "Coherence Requirements" +title: "Coherence requirements" date: 2019-08-12T12:41:38-04:00 draft: false -weight: 90 +weight: 12 +description: "If you are running Coherence on Kubernetes, either inside a WebLogic domain +or standalone, then there are some additional requirements to make sure +that Coherence can form clusters." --- If you are running Coherence on Kubernetes, either inside a WebLogic domain diff --git a/docs-source/content/faq/configmaps.md b/docs-source/content/faq/configmaps.md index eac6141fef0..372bfcf6d91 100644 --- a/docs-source/content/faq/configmaps.md +++ b/docs-source/content/faq/configmaps.md @@ -2,7 +2,8 @@ title: "Providing access to a ConfigMap" date: 2020-01-07T15:02:28-05:00 draft: false -weight: 70 +weight: 10 +description: "I need to provide an instance with access to a ConfigMap." --- > I need to provide an instance with access to a ConfigMap. @@ -15,7 +16,7 @@ In each case, the access is configured within the `serverPod` element of the des For example, given a ConfigMap named `my-map` with entries `key-1` and `key-2`, you can provide access to both values as separate files in the same directory within the `cluster-1` cluster with the following -in your [domain resource](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md): +in your [Domain](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md): ``` diff --git a/docs-source/content/faq/domain-secret-mismatch.md b/docs-source/content/faq/domain-secret-mismatch.md index 31d04dcdba2..debfa23b049 100644 --- a/docs-source/content/faq/domain-secret-mismatch.md +++ b/docs-source/content/faq/domain-secret-mismatch.md @@ -2,10 +2,11 @@ title: "Domain secret mismatch" date: 2020-03-02T08:08:19-04:00 draft: false -weight: 21 +weight: 4 +description: "One or more WebLogic Server instances in my domain will not start and the domain resource `status` or the pod log reports errors like this: Domain secret mismatch." --- -> One or more WebLogic Server instances in my domain will not start and the domain resource `status` or the pod log reports errors like this: +> One or more WebLogic Server instances in my domain will not start and the Domain `status` or the pod log reports errors like this: > > ***Domain secret mismatch. The domain secret in `DOMAIN_HOME/security/SerializedSystemIni.dat` where DOMAIN_HOME=`$DOMAIN_HOME` does not match the domain secret found by the introspector job. WebLogic requires that all WebLogic Servers in the same domain share the same domain secret.*** diff --git a/docs-source/content/faq/external-clients.md b/docs-source/content/faq/external-clients.md index 9b700296638..0cfd7c1373b 100644 --- a/docs-source/content/faq/external-clients.md +++ b/docs-source/content/faq/external-clients.md @@ -2,7 +2,8 @@ title: "External WebLogic clients" date: 2019-11-21T21:23:03Z draft: false -weight: 80 +weight: 11 +description: "There are two supported approaches for giving external WebLogic EJB or JMS clients access to a Kubernetes hosted WebLogic cluster: load balancer tunneling and Kubernetes `NodePorts`." --- #### Approaches @@ -146,7 +147,7 @@ In this example: A Kubernetes `NodePort` exposes a port on each worker node in the Kubernetes cluster (they are not typically exposed on masters), where the port is accessible from outside of a Kubernetes cluster. This port redirects network traffic to pods within the Kubernetes cluster. Setting up a Kubernetes `NodePort` is one approach for giving external WebLogic clients access to JMS or EJBs. -If an EJB or JMS service is running on an Administration Server, then you can skip the rest of this section and use the `spec.adminServer.adminService.channels` domain resource attribute to have the operator create a `NodePort` for you. See [Reference - Domain resource]({{}}). Otherwise, if the EJB or JMS service is running in a WebLogic cluster or standalone WebLogic Server Managed Server, and you desire to provide access to the service using a `NodePort`, then the `NodePort` must be exposed 'manually' - see the following sample and table. +If an EJB or JMS service is running on an Administration Server, then you can skip the rest of this section and use the `spec.adminServer.adminService.channels` Domain field to have the operator create a `NodePort` for you. See [Reference - Domain]({{}}). Otherwise, if the EJB or JMS service is running in a WebLogic cluster or standalone WebLogic Server Managed Server, and you desire to provide access to the service using a `NodePort`, then the `NodePort` must be exposed 'manually' - see the following sample and table. {{% notice note %}} Setting up a `NodePort` usually also requires setting up a custom network channel. See [Adding a WebLogic Custom Channel](#adding-a-weblogic-custom-channel). diff --git a/docs-source/content/faq/fan.md b/docs-source/content/faq/fan.md index 8aa545cd2f2..3d4458d5f21 100644 --- a/docs-source/content/faq/fan.md +++ b/docs-source/content/faq/fan.md @@ -2,7 +2,10 @@ title: "Disabling Fast Application Notifications" date: 2019-10-11T17:20:00-05:00 draft: false -weight: 30 +weight: 6 +description: "To support Fast Application Notifications (FAN), Oracle databases configure GRID (Oracle Grid Infrastructure). +GRID is typically associated with (and required by) Oracle RAC databases but can +also be used in other configurations. Oracle Autonomous Database-Serverless (ATP-S) does not provide GRID." --- To support Fast Application Notifications (FAN), Oracle databases configure GRID (Oracle Grid Infrastructure). @@ -36,6 +39,8 @@ to `false` as shown in the following example: env: - name: JAVA_OPTIONS value: "-Dweblogic.StdoutDebugEnabled=false -Doracle.jdbc.fanEnabled=false" + - name: WLSDEPLOY_PROPERTIES + value: "-Doracle.jdbc.fanEnabled=false" ``` 2) Configure the data source connection pool properties. @@ -65,4 +70,4 @@ The following WLST script adds the ls() ``` After changing the data source connection pool configuration, for the attribute to take effect, -make sure to undeploy and redeploy the data source, or restart WebLogic Server. +make sure to undeploy and redeploy the data source, or restart WebLogic Server. diff --git a/docs-source/content/faq/namespace-management.md b/docs-source/content/faq/namespace-management.md index 366c7097056..8e48cf69a27 100644 --- a/docs-source/content/faq/namespace-management.md +++ b/docs-source/content/faq/namespace-management.md @@ -3,6 +3,7 @@ title: "Managing domain namespaces" date: 2019-09-19T10:41:32-05:00 draft: false weight: 1 +description: "Considerations for managing namespaces while the operator is running." --- Each operator deployment manages a number of Kubernetes Namespaces. For more information, see [Operator Helm configuration values]({{< relref "/userguide/managing-operators/using-the-operator/using-helm#operator-helm-configuration-values" >}}). A number of Kubernetes resources @@ -39,7 +40,7 @@ elkIntegrationEnabled: false externalDebugHttpPort: 30999 externalRestEnabled: false externalRestHttpsPort: 31001 -image: oracle/weblogic-kubernetes-operator:2.6.0 +image: oracle/weblogic-kubernetes-operator:3.0.0 imagePullPolicy: IfNotPresent internalDebugHttpPort: 30999 istioEnabled: false @@ -62,7 +63,7 @@ $ helm list --all-namespaces If you want an operator deployment to manage a namespace, you need to add the namespace to the operator's `domainNamespaces` list. Note that the namespace has to already exist, for example, using the `kubectl create` command. Adding a namespace to the `domainNamespaces` list tells the operator deployment or runtime -to initialize the necessary Kubernetes resources for the namespace so that the operator is ready to host WebLogic domain resources in that namespace. +to initialize the necessary Kubernetes resources for the namespace so that the operator is ready to run and monitor WebLogic Server instances in that namespace. When the operator is running and managing the `default` namespace, the following example Helm command adds the namespace `ns1` to the `domainNamespaces` list, where `weblogic-operator` is the release name of the operator, and `kubernetes/charts/weblogic-operator` is the location of the operator's Helm charts. @@ -78,11 +79,11 @@ $ helm upgrade \ {{% notice note %}} Changes to the `domainNamespaces` list might not be picked up by the operator right away because the operator -monitors the changes to the setting periodically. The operator becomes ready to host domain resources in -a namespace only after the required `configmap` (namely `weblogic-domain-cm`) is initialized in the namespace. +monitors the changes to the setting periodically. The operator becomes ready to manage Domains in +a namespace only after the required `configmap` (namely `weblogic-scripts-cm`) is initialized in the namespace. {{% /notice %}} -You can verify that the operator is ready to host domain resources in a namespace by confirming the existence of the required `configmap` resource. +You can verify that the operator has initialized a namespace by confirming the existence of the required `configmap` resource. ``` $ kubetctl get cm -n @@ -95,7 +96,7 @@ bash-4.2$ kubectl get cm -n ns1 NAME DATA AGE -weblogic-domain-cm 14 12m +weblogic-scripts-cm 14 12m ``` #### Delete a Kubernetes Namespace from the operator @@ -129,8 +130,8 @@ using the `helm upgrade` commands that were illustrated previously. Make sure that you wait a sufficient period of time between deleting and recreating the namespace because it takes time for the resources in a namespace to go away after the namespace is deleted. In addition, as mentioned above, changes to the `domainNamespaces` setting is monitored by the operator -periodically, and the operator becomes ready to host domain resources only after the required domain -`configmap` (namely `weblogic-domain-cm`) is initialized in the namespace. +periodically, and the operator becomes ready to manage Domains only after the required domain +`configmap` (namely `weblogic-scripts-cm`) is initialized in the namespace. {{% /notice %}} If a domain custom resource is created before the namespace is ready, you might see that the introspector job pod @@ -147,7 +148,7 @@ Events: Normal SuccessfulMountVolume 1m kubelet, slc16ffk MountVolume.SetUp succeeded for volume "default-token-jzblm" - Warning FailedMount 27s (x8 over 1m) kubelet, slc16ffk MountVolume.SetUp failed for volume "weblogic-domain-cm-volume" : configmaps "weblogic-domain-cm" not found + Warning FailedMount 27s (x8 over 1m) kubelet, slc16ffk MountVolume.SetUp failed for volume "weblogic-scripts-cm-volume" : configmaps "weblogic-scripts-cm" not found ``` diff --git a/docs-source/content/faq/node-heating.md b/docs-source/content/faq/node-heating.md index fa35a8ec8fd..5b838fdcc60 100644 --- a/docs-source/content/faq/node-heating.md +++ b/docs-source/content/faq/node-heating.md @@ -2,12 +2,13 @@ title: "Node heating problem" date: 2020-06-03T08:08:19-04:00 draft: false -weight: 22 +weight: 5 +description: "The operator creates a Pod for each WebLogic Server instance that is started. The Kubernetes Scheduler then selects a Node for each Pod. Because the default scheduling algorithm gives substantial weight to selecting a Node where the necessary Docker images have already been pulled, this often results in Kubernetes running many of the Pods for WebLogic Server instances on the same Node while other Nodes are not fairly utilized. This is commonly known as the Node heating problem." --- -The WebLogic Server Kubernetes Operator creates a Pod for each WebLogic Server instance that is started. The [Kubernetes Scheduler](https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/) then selects a Node for each Pod. Because the default scheduling algorithm gives substantial weight to selecting a Node where the necessary Docker images have already been pulled, this often results in Kubernetes running many of the Pods for WebLogic Server instances on the same Node while other Nodes are not fairly utilized. +The WebLogic Server Kubernetes Operator creates a Pod for each WebLogic Server instance that is started. The [Kubernetes Scheduler](https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/) then selects a Node for each Pod. Because the default scheduling algorithm gives substantial weight to selecting a Node where the necessary Docker images have already been pulled, this often results in Kubernetes running many of the Pods for WebLogic Server instances on the same Node while other Nodes are not fairly utilized. This is commonly known as the "Node heating problem." -This is commonly known as the "Node heating problem." One solution is to ensure that all necessary Docker images are available on worker Nodes as part of node provisioning. When the necessary Docker images are available on each worker Node, the Kubernetes Scheduler will instead select a Node based on other factors such as available CPU and memory or a simple round-robin. +One solution is to ensure that all necessary Docker images are available on worker Nodes as part of node provisioning. When the necessary Docker images are available on each worker Node, the Kubernetes Scheduler will instead select a Node based on other factors such as available CPU and memory or a simple round-robin. The operator team recommends a different solution that is based on [inter-pod affinity and anti-affinity](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity). This solution has the advantage of both resolving the Node heating problem and of explicitly directing the Kubernetes Scheduler to spread the Pods for WebLogic Server instances from a given cluster or domain more widely across the available Nodes. Inter-pod affinity and anti-affinity are features of the Kubernetes Scheduler that allow the scheduler to choose a Node for a new Pod based on details of the Pods that are already running. For WebLogic Server use cases, the intent will often be for anti-affinity with the Pods for other WebLogic Server instances so that server instances spread over the available Nodes. diff --git a/docs-source/content/faq/oci-fss-pv.md b/docs-source/content/faq/oci-fss-pv.md index 19b81529076..6d30dfba18b 100644 --- a/docs-source/content/faq/oci-fss-pv.md +++ b/docs-source/content/faq/oci-fss-pv.md @@ -2,13 +2,19 @@ title: "Using OCI File Storage (FSS) for persistent volumes" date: 2020-02-12T12:12:12-05:00 draft: false -weight: 40 +weight: 7 +description: "If you are running your Kubernetes cluster on Oracle Container Engine +for Kubernetes (OKE), and you use OCI File Storage (FSS) +for persistent volumes to store the WebLogic domain home, then the file system +handling, as demonstrated in the operator persistent volume sample, will require +an update to properly initialize the file ownership on the persistent volume +when the domain is initially created." --- If you are running your Kubernetes cluster on Oracle Container Engine for Kubernetes (commonly known as OKE), and you use OCI File Storage (FSS) for persistent volumes to store the WebLogic domain home, then the file system -handling demonstrated in the operator persistent volume sample will require +handling, as demonstrated in the operator persistent volume sample, will require an update to properly initialize the file ownership on the persistent volume when the domain is initially created. diff --git a/docs-source/content/faq/oci-lb.md b/docs-source/content/faq/oci-lb.md index 2b5e80e0f1b..c840888a86b 100644 --- a/docs-source/content/faq/oci-lb.md +++ b/docs-source/content/faq/oci-lb.md @@ -2,11 +2,16 @@ title: "Using an OCI load balancer" date: 2019-09-25T12:41:38-04:00 draft: false -weight: 50 +weight: 8 +description: "If you are running your Kubernetes cluster on Oracle Container Engine +for Kubernetes (OKE), then you can have OCI automatically +provision load balancers for you by creating a `Service` of type +`LoadBalancer` instead of (or in addition to) installing an +ingress controller like Traefik or Voyager." --- If you are running your Kubernetes cluster on Oracle Container Engine -for Kubernetes (commonly known as OKE), you can have OCI automatically +for Kubernetes (commonly known as OKE), then you can have OCI automatically provision load balancers for you by creating a `Service` of type `LoadBalancer` instead of (or in addition to) installing an ingress controller like Traefik or Voyager. diff --git a/docs-source/content/faq/resource-settings.md b/docs-source/content/faq/resource-settings.md new file mode 100644 index 00000000000..e0eb42eab8f --- /dev/null +++ b/docs-source/content/faq/resource-settings.md @@ -0,0 +1,177 @@ +--- +title: "Pod memory and CPU resources" +date: 2020-06-30T08:55:00-05:00 +draft: false +weight: 13 +description: "Tune container memory and CPU usage by configuring Kubernetes resource requests and limits, and tune a WebLogic JVM heap usage using the `USER_MEM_ARGS` environment variable in your Domain YAML file." +--- + +#### Contents + + - [Introduction](#introduction) + - [Setting resource requests and limits in a Domain YAML file](#setting-resource-requests-and-limits-in-a-domain) + - [Determining Pod Quality Of Service](#determining-pod-quality-of-service) + - [Java heap size and memory resource considerations](#java-heap-size-and-memory-resource-considerations) + - [Importance of setting heap size and memory resources](#importance-of-setting-heap-size-and-memory-resources) + - [Default heap sizes](#default-heap-sizes) + - [Configuring heap size](#configuring-heap-size) + - [CPU resource considerations](#cpu-resource-considerations) + - [Operator sample heap and resource configuration](#operator-sample-heap-and-resource-configuration) + - [Configuring CPU affinity](#configuring-cpu-affinity) + - [Measuring JVM heap, Pod CPU, and Pod memory](#measuring-jvm-heap-pod-cpu-and-pod-memory) + - [References](#references) + +#### Introduction + +The operator creates a container in its own Pod for each WebLogic Server instance. You can tune container memory and CPU usage by configuring Kubernetes resource requests and limits, and you can tune a WebLogic JVM heap usage using the `USER_MEM_ARGS` environment variable in your Domain YAML file. A resource request sets the minimum amount of a resource that a container requires. A resource limit is the maximum amount of a resource a container is given and prevents a container from using more than its share of a resource. Additionally, resource requests and limits determine a Pod's quality of service. + +This FAQ discusses tuning these parameters so WebLogic Server instances run efficiently. + +#### Setting resource requests and limits in a Domain + +You can set Kubernetes memory and CPU requests and limits in a [Domain YAML file]({{< relref "/userguide/managing-domains/domain-resource" >}}) using its `spec.serverPod.resources` stanza, and you can override the setting for individual WebLogic Server instances or clusters using the `serverPod.resources` element in `spec.adminServer`, `spec.clusters`, or `spec.managedServers`. For example: + +``` + spec: + serverPod: + requests: + cpu: "250m" + memory: "768Mi" + limits: + cpu: "2" + memory: "2Gi" +``` + +Limits and requests for CPU resources are measured in CPU units. One CPU, in Kubernetes, is equivalent to 1 vCPU/Core for cloud providers and 1 hyperthread on bare-metal Intel processors. An `m` suffix in a CPU attribute indicates 'milli-CPU', so `250m` is 25% of a CPU. + +Memory can be expressed in various units, where one `Mi` is one IEC unit mega-byte (1024^2), and one `Gi` is one IEC unit giga-byte (1024^3). + +See also [Managing Resources for Containers](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/), [Assign Memory Resources to Containers and Pods](https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource) and [Assign CPU Resources to Containers and Pods](https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource) in the Kubernetes documentation. + +#### Determining Pod Quality Of Service + +A Pod's Quality of Service (QoS) is based on whether it's configured with resource requests and limits: + +- **Best Effort QoS** (lowest priority): If you don't configure requests and limits for a Pod, then the Pod is given a `best-effort` QoS. In cases where a Node runs out of non-shareable resources, the default out-of-resource eviction policy evicts running Pods with the `best-effort` QoS first. + +- **Burstable QoS** (medium priority): If you configure both resource requests and limits for a Pod, and set the requests to be less than their respective limits, then the Pod will be given a `burstable` QoS. Similarly, if you only configure resource requests (without limits) for a Pod, then the Pod QoS is also `burstable`. If a Node runs out of non-shareable resources, the Node's `kubelet` will evict `burstable` Pods only when there are no more running `best-effort` Pods. + +- **Guaranteed QoS** (highest priority): If you set a Pod's requests and the limits to equal values, then the Pod will have a `guaranteed` QoS. These settings indicate that your Pod will consume a fixed amount of memory and CPU. With this configuration, if a Node runs out of shareable resources, then the Node's `kubelet` will evict `best-effort` and `burstable` QoS Pods before terminating `guaranteed` QoS Pods. + +{{% notice note %}} +For most use cases, Oracle recommends configuring WebLogic Pods with memory and CPU requests and limits, and furthermore, setting requests equal to their respective limits in order to ensure a `guaranteed` QoS. +{{% /notice %}} + +{{% notice note %}} +In later versions of Kubernetes, it is possible to fine tune scheduling and eviction policies using [Pod Priority Preemption](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/) in combination with the `serverPod.priorityClassName` Domain field. Note that Kubernetes already ships with two PriorityClasses: `system-cluster-critical` and `system-node-critical`. These are common classes and are used to [ensure that critical components are always scheduled first](https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/). +{{% /notice %}} + +#### Java heap size and memory resource considerations + +{{% notice note %}} +Oracle recommends configuring Java heap sizes for WebLogic JVMs instead of relying on the defaults. +{{% /notice %}} + +##### Importance of setting heap size and memory resources + +It's extremely important to set correct heap sizes, memory requests, and memory limits for WebLogic JVMs and Pods. + +A WebLogic JVM heap must be sufficiently sized to run its applications and services, but should not be sized too large so as not to waste memory resources. + +A Pod memory limit must be sufficiently sized to accommodate the configured heap and native memory requirements, but should not be sized too large so as not to waste memory resources. If a JVM's memory usage (sum of heap and native memory) exceeds its Pod's limit, then the JVM process will be abruptly killed due to an out-of-memory error and the WebLogic container will consequently automatically restart due to a liveness probe failure. + +Oracle recommends setting minimum and maximum heap (or heap percentages) and at least a container memory request. + +{{% notice warning %}} +If resource requests and resource limits are set too high, then your Pods may not be scheduled due to a lack of Node resources. It will unnecessarily use up CPU shared resources that could be used by other Pods, or may prevent other Pods from running. +{{% /notice %}} + +##### Default heap sizes + +With the latest Java versions, Java 8 update 191 and later, or Java 11, if you don't configure a heap size (no `-Xms` or `-Xms`), the default heap size is dynamically determined: +- If you configure the memory limit for a container, then the JVM default maximum heap size will be 25% (1/4th) of container memory limit and the default minimum heap size will be 1.56% (1/64th) of the limit value. + + In this case, the default JVM heap settings are often too conservative because the WebLogic JVM is the only major process running in the container. + +- If no memory limit is configured, then the JVM default maximum heap size will be 25% (1/4th) of its Node's machine RAM and the default minimum heap size will be 1.56% (1/64th) of the RAM. + + In this case, the default JVM heap settings can have undesirable behavior, including using unnecessary amounts of memory to the point where it might affect other Pods that run on the same Node. + +##### Configuring heap size + +If you specify Pod memory limits, Oracle recommends configuring WebLogic Server heap sizes as a percentage. The JVM will interpret the percentage as a fraction of the limit. This is done using the JVM `-XX:MinRAMPercentage` and `-XX:MaxRAMPercentage` options in the `USER_MEM_ARGS` [Domain environment variable]({{< relref "/userguide/managing-domains/domain-resource#jvm-memory-and-java-option-environment-variables" >}}). For example: + +``` + spec: + resources: + env: + - name: USER_MEM_ARGS + value: "-XX:MinRAMPercentage=25.0 -XX:MaxRAMPercentage=50.0 -Djava.security.egd=file:/dev/./urandom" +``` + +Additionally, there's a `node-manager` process that's running in the same container as the WebLogic Server, which has its own heap and native memory requirements. Its heap is tuned by using `-Xms` and `-Xmx` in the `NODEMGR_MEM_ARGS` environment variable. Oracle recommends setting the Node Manager heap memory to fixed sizes, instead of percentages, where [the default tuning]({{< relref "/userguide/managing-domains/domain-resource#jvm-memory-and-java-option-environment-variables" >}}) is usually sufficient. + +{{% notice note %}} +Notice that the `NODEMGR_MEM_ARGS` and `USER_MEM_ARGS` environment variables both set `-Djava.security.egd=file:/dev/./urandom` by default, so we have also included them in the above example for specifying a `USER_MEM_ARGS` value. This helps speed up Node Manager and WebLogic Server startup time on systems with low entropy. +{{% /notice %}} + +In some cases, you might only want to configure memory resource requests but not configure memory resource limits. In such scenarios, you can use the traditional fixed heap size settings (`-Xms` and `-Xmx`) in your WebLogic Server `USER_MEM_ARGS` instead of the percentage settings (`-XX:MinRAMPercentage` and `-XX:MaxRAMPercentage`). + +#### CPU resource considerations + +It's important to set both a CPU request and a limit for WebLogic Server Pods. This ensures that all WebLogic Server Pods have enough CPU resources, and, as discussed earlier, if the request and limit are set to the same value, then they get a `guaranteed` QoS. A `guaranteed` QoS ensures that the Pods are handled with a higher priority during scheduling and as such, are the least likely to be evicted. + +If a CPU request and limit are _not_ configured for a WebLogic Server Pod: +- The Pod can end up using all the CPU resources available on its Node and starve other containers from using shareable CPU cycles. + +- The WebLogic Server JVM may choose an unsuitable garbage collection (GC) strategy. + +- A WebLogic Server self-tuning `work-manager` may incorrectly optimize the number of threads it allocates for the default thread pool. + +It's also important to keep in mind that if you set a value of CPU core count that's larger than the core count of your biggest Node, then the Pod will never be scheduled. Let's say you have a Pod that needs 4 cores but you have a Kubernetes cluster that's comprised of 2 core VMs. In this case, your Pod will never be scheduled and will have `Pending` status. For example: + +``` +$ kubectl get pod sample-domain1-managed-server1 -n sample-domain1-ns +NAME READY STATUS RESTARTS AGE +sample-domain1-managed-server1 0/1 Pending 0 65s + +$ kubectl describe pod sample-domain1-managed-server1 -n sample-domain1-ns +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Warning FailedScheduling 16s (x3 over 26s) default-scheduler 0/2 nodes are available: 2 Insufficient cpu. +``` + +#### Operator sample heap and resource configuration + +The operator samples configure non-default minimum and maximum heap sizes for WebLogic Server JVMs of at least 256MB and 512MB respectively. You can edit a sample's template or Domain YAML file `resources.env` `USER_MEM_ARGS` to have different values. See [Configuring heap size](#configuring-heap-size). + +Similarly, the operator samples configure CPU and memory resource requests to at least `250m` and `768Mi` respectively. + +There's no memory or CPU limit configured by default in samples and so the default QoS for sample WebLogic Server Pod's is `burstable`. + +If you wish to set resource requests or limits differently on a sample Domain YAML file or template, see [Setting resource requests and limits in a Domain resource](#setting-resource-requests-and-limits-in-a-domain-resource). Or, for samples that generate their Domain resource using an 'inputs' file, see the `serverPodMemoryRequest`, `serverPodMemoryLimit`, `serverPodCpuRequest`, and `serverPodCpuLimit` parameters in the sample's `create-domain.sh` input file. + +#### Configuring CPU affinity + +A Kubernetes hosted WebLogic Server may exhibit high lock contention in comparison to an on-premises deployment. This lock contention may be due to a lack of CPU cache affinity or scheduling latency when workloads move between different CPU cores. + +In an on-premises deployment, CPU cache affinity, and therefore reduced lock contention, can be achieved by binding WLS Java process to a particular CPU core(s) (using the `taskset` command). + +In a Kubernetes deployment, similar cache affinity can be achieved by doing the following: +- Ensuring a Pod's CPU resource request and limit are set and equal (to ensure a `guaranteed` QoS). +- Configuring the `kubelet` CPU manager policy to be `static` (the default is `none`). See [Control CPU Management Policies on the Node](https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies). +Note that some Kubernetes environments may not allow changing the CPU management policy. + +#### Measuring JVM heap, Pod CPU, and Pod memory +You can monitor JVM heap, Pod CPU, and Pod memory using Prometheus and Grafana with steps similar to the [Monitor a SOA Domain]({{< relref "/samples/simple/elastic-stack/soa-domain/weblogic-monitoring-exporter-setup" >}}) sample. Also, see [Tools for Monitoring Resources](https://kubernetes.io/docs/tasks/debug-application-cluster/resource-usage-monitoring/) in the Kubernetes documentation. + +#### References: +1. [Managing Resources for Containers](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/) in the Kubernetes documentation. +1. [Assign Memory Resources to Containers and Pods](https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource) in the Kubernetes documentation. +1. [Assign CPU Resources to Containers and Pods](https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource/) in the Kubernetes documentation. +1. [Pod Priority Preemption](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/) in the Kubernetes documentation. +1. [GCP Kubernetes best practices: Resource requests and limits](https://cloud.google.com/blog/products/gcp/kubernetes-best-practices-resource-requests-and-limits) +1. [Tools for Monitoring Resources](https://kubernetes.io/docs/tasks/debug-application-cluster/resource-usage-monitoring/) in the Kubernetes documentation. +1. [Blog -- Docker support in Java 8](https://blog.softwaremill.com/docker-support-in-new-java-8-finally-fd595df0ca54). (Discusses Java container support in general.) +1. [Blog -- Kubernetes Patterns : Capacity Planning](https://www.magalix.com/blog/kubernetes-patterns-capacity-planning) diff --git a/docs-source/content/faq/volumes.md b/docs-source/content/faq/volumes.md index 34a6d15a110..850bfba843b 100644 --- a/docs-source/content/faq/volumes.md +++ b/docs-source/content/faq/volumes.md @@ -2,7 +2,8 @@ title: "Providing access to a PersistentVolumeClaim" date: 2020-01-07T15:02:28-05:00 draft: false -weight: 60 +weight: 9 +description: "I need to provide an instance with access to a PersistentVolumeClaim." --- > I need to provide an instance with access to a PersistentVolumeClaim. @@ -33,7 +34,7 @@ spec: ``` To provide access to this claim to all Managed Servers in the `cluster-1` cluster, specify the following -in your [domain resource](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md): +in your [Domain](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md): ``` clusters: diff --git a/docs-source/content/quickstart/cleanup.md b/docs-source/content/quickstart/cleanup.md index 6d59b6f0be3..97c0dd28049 100644 --- a/docs-source/content/quickstart/cleanup.md +++ b/docs-source/content/quickstart/cleanup.md @@ -14,13 +14,13 @@ weight: 7 $ helm uninstall sample-domain1-ingress -n sample-domain1-ns ``` -1. Remove the domain resources by using the sample [`delete-weblogic-domain-resources`](http://github.com/oracle/weblogic-kubernetes-operator/blob/master/kubernetes/samples/scripts/delete-domain/delete-weblogic-domain-resources.sh) script: +1. Remove the Kubernetes resources associated with the domain by using the sample [`delete-weblogic-domain-resources`](http://github.com/oracle/weblogic-kubernetes-operator/blob/master/kubernetes/samples/scripts/delete-domain/delete-weblogic-domain-resources.sh) script: ```bash $ kubernetes/samples/scripts/delete-domain/delete-weblogic-domain-resources.sh -d sample-domain1 ``` -1. Use `kubectl` to confirm that the server pods and domain resource are gone: +1. Use `kubectl` to confirm that the WebLogic Server instance Pods and Domain are gone: ```bash $ kubectl get pods -n sample-domain1-ns diff --git a/docs-source/content/quickstart/create-domain.md b/docs-source/content/quickstart/create-domain.md index 5ab306116e1..ed5226c2bd0 100644 --- a/docs-source/content/quickstart/create-domain.md +++ b/docs-source/content/quickstart/create-domain.md @@ -44,7 +44,7 @@ weight: 6 1. Confirm that the operator started the servers for the domain: - a. Use `kubectl` to show that the domain resource was created: + a. Use `kubectl` to show that the Domain was created: ```bash $ kubectl describe domain sample-domain1 -n sample-domain1-ns diff --git a/docs-source/content/quickstart/get-images.md b/docs-source/content/quickstart/get-images.md index a87d0f4b6c1..ee4d90f7180 100644 --- a/docs-source/content/quickstart/get-images.md +++ b/docs-source/content/quickstart/get-images.md @@ -19,18 +19,13 @@ and accept the license agreement for the [WebLogic Server image](https://hub.doc 1. Pull the operator image: ```bash - $ docker pull oracle/weblogic-kubernetes-operator:2.6.0 + $ docker pull oracle/weblogic-kubernetes-operator:3.0.0 ``` - - {{% notice note %}} If you are here because you are following the Model In Image sample, - change the image to `oracle/weblogic-kubernetes-operator:3.0.0-rc1` - in the previous command. - {{% /notice %}} 1. Pull the Traefik load balancer image: ```bash - $ docker pull traefik:1.7.12 + $ docker pull traefik:2.2.1 ``` 1. Obtain the WebLogic image from the [Oracle Container Registry](https://container-registry.oracle.com). diff --git a/docs-source/content/quickstart/install.md b/docs-source/content/quickstart/install.md index d3e5e845a4c..76ba93192d4 100644 --- a/docs-source/content/quickstart/install.md +++ b/docs-source/content/quickstart/install.md @@ -71,7 +71,7 @@ $ helm install traefik-operator stable/traefik \ ```bash $ helm install sample-weblogic-operator kubernetes/charts/weblogic-operator \ --namespace sample-weblogic-operator-ns \ - --set image=oracle/weblogic-kubernetes-operator:2.6.0 \ + --set image=oracle/weblogic-kubernetes-operator:3.0.0 \ --set serviceAccount=sample-weblogic-operator-sa \ --set "domainNamespaces={}" \ --wait diff --git a/docs-source/content/quickstart/prepare.md b/docs-source/content/quickstart/prepare.md index e981e85f810..7b1946e0291 100644 --- a/docs-source/content/quickstart/prepare.md +++ b/docs-source/content/quickstart/prepare.md @@ -34,5 +34,5 @@ weight: 5 {{% notice note %}} If you have reached this point while following the "Model in Image" sample, please -stop here and return to the [sample instructions]({{< relref "/samples/simple/domains/model-in-image/_index.md#resume" >}}). +stop here and return to the [sample instructions]({{< relref "/samples/simple/domains/model-in-image/prerequisites#resume" >}}). {{% /notice %}} diff --git a/docs-source/content/reference/domain-resource.md b/docs-source/content/reference/domain-resource.md index b75f3692928..33419db78e2 100644 --- a/docs-source/content/reference/domain-resource.md +++ b/docs-source/content/reference/domain-resource.md @@ -3,7 +3,7 @@ title: "Domain resource" date: 2019-02-22T16:17:07-05:00 draft: false weight: 3 -description: "Use this document to set up and configure your own domain resource." +description: "Use this document to set up and configure your own Domain YAML file." --- -View the domain resource reference document [here](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md). +View the Domain reference document [here](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md). diff --git a/docs-source/content/release-notes.md b/docs-source/content/release-notes.md index 1809fc7319e..cee360928c1 100644 --- a/docs-source/content/release-notes.md +++ b/docs-source/content/release-notes.md @@ -8,12 +8,12 @@ draft: false | Date | Version | Introduces backward incompatibilities | Change | | --- | --- | --- | --- | +| July 17, 2020 | v3.0.0 | yes | Adds Model in Image feature and support for applying topology and configuration override changes without downtime. Removal of support for Helm 2.x. Operator performance improvements to manage many domains in the same Kubernetes cluster. | | June 22, 2020 | v2.6.0 | no | Kubernetes 1.16, 1.17, and 1.18 support. Removal of support for Kubernetes 1.13 and earlier. This release can be run in the same cluster with operators of either 2.5.0 and below, or with 3.x providing an upgrade path. Certified support of Oracle Linux Cloud Native Environment (OLCNE) 1.1 with Kubernetes 1.17.0. -| May 8, 2020 | v3.0.0-rc1 | yes | Adds Model in Image feature. Support for Kubernetes 1.16. Removal of support for Kubernetes 1.13 and earlier. Removal of support for Helm 2.x. This release candidate cannot be run in the same cluster as another release of the operator. You can upgrade from the current release of the operator to 3.0.0-rc1 without needing to restart or recreate any existing domains. However, please note that we _do_ plan to support running the final 3.0.0 release in the same cluster with at least one 2.x release of the operator to allow for staged migration. | | February 26, 2020 | v2.5.0 | no | Support for Helm 3.x and OpenShift 4.3. Operator can be installed in a namespace-dedicated mode where operator requires no cluster-level Kubernetes privileges. This version is not supported on Kubernetes 1.16+; check the [prerequisites]({{< relref "/userguide/introduction/introduction#operator-prerequisites" >}}). | November 15, 2019 | v2.4.0 | no | Includes fixes for a variety of issues related to FMW infrastructure domains and pod variable substitution. Operator now uses WebLogic Deploy Tooling 1.6.0 and the latest version of the Kubernetes Java Client. | August 27, 2019 | v2.3.0 | no | Added support for Coherence cluster rolling, pod templating and additional pod content, and experimental support for running under an Istio service mesh. -| June 20, 2019 | v2.2.1 | no | The operator now supports Kubernetes 1.14.0+. This release is primarily a bug fix release and resolves the following issues:
  • Servers in domains, where the domain home is on a persistent volume, would sometimes fail to start. These failures would be during the introspection phase following a full domain shutdown. Now, the introspection script better handles the relevant error conditions.
  • The domain resource provides an option to [pre-create Kubernetes Services](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md#server-service) for WebLogic Servers that are not yet running so that the DNS addresses of these services are resolvable. These services are now created as non-headless so that they have an IP address.
+| June 20, 2019 | v2.2.1 | no | The operator now supports Kubernetes 1.14.0+. This release is primarily a bug fix release and resolves the following issues: Servers in domains, where the domain home is on a persistent volume, would sometimes fail to start. These failures would be during the introspection phase following a full domain shutdown. Now, the introspection script better handles the relevant error conditions. Also, now the Domain provides an option to [pre-create Kubernetes Services](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md#server-service) for WebLogic Servers that are not yet running so that the DNS addresses of these services are resolvable. These services are now created as non-headless so that they have an IP address. | June 6, 2019 | v2.2.0 | no | Added support for FMW Infrastructure domains. WebLogic Server instances are now gracefully shut down by default and shutdown options are configurable. Operator is now built and runs on JDK 11. | April 4, 2019 | v2.1 | no | Customers can add init and sidecar containers to generated pods. | March 4, 2019 | v2.0.1 | no | OpenShift support is now certified. Many bug fixes, including fixes for configuration overrides, cluster services, and domain status processing. diff --git a/docs-source/content/samples/simple/credentials/_index.md b/docs-source/content/samples/simple/credentials/_index.md index 69372a399e2..f48d693a3f9 100644 --- a/docs-source/content/samples/simple/credentials/_index.md +++ b/docs-source/content/samples/simple/credentials/_index.md @@ -2,7 +2,7 @@ title: "Credentials" date: 2019-02-23T17:32:31-05:00 weight: 1 -description: "Sample for creating a Kubernetes Secret that contains the Administration Server credentials. This secret can be used in creating a WebLogic domain resource." +description: "Sample for creating a Kubernetes Secret that contains the Administration Server credentials. This Secret can be used in creating a WebLogic Domain YAML file." --- diff --git a/docs-source/content/samples/simple/domains/delete-domain/_index.md b/docs-source/content/samples/simple/domains/delete-domain/_index.md index fb48b973574..6a9e35c6c36 100644 --- a/docs-source/content/samples/simple/domains/delete-domain/_index.md +++ b/docs-source/content/samples/simple/domains/delete-domain/_index.md @@ -1,16 +1,16 @@ --- -title: "Delete domain resources" +title: "Delete resources associated with the domain" date: 2019-02-23T17:32:31-05:00 weight: 7 -description: "Delete the domain resources created while executing the samples." +description: "Delete the Kubernetes resources associated with the domain created while executing the samples." --- -After running the samples, you will need to release domain resources that +After running the samples, you will need to release resources associated with the domain that can then be used for other purposes. The script in this sample demonstrates one approach to releasing -domain resources. +these resources. -#### Use this script to delete domain resources +#### Use this script to delete resources associated with the domain ``` $ ./delete-weblogic-domain-resources.sh \ @@ -19,9 +19,9 @@ $ ./delete-weblogic-domain-resources.sh \ [-t] ``` The required option `-d` takes `domain-uid` values (separated - by commas and no spaces) to identify the domain resources that should be deleted. + by commas and no spaces) to identify the resources that should be deleted. -To limit the amount of time spent on attempting to delete domain resources, use `-s`. +To limit the amount of time spent on attempting to delete resources, use `-s`. The option must be followed by an integer that represents the total number of seconds that will be spent attempting to delete resources. The default number of seconds is 120. diff --git a/docs-source/content/samples/simple/domains/domain-home-in-image/_index.md b/docs-source/content/samples/simple/domains/domain-home-in-image/_index.md index a14e40269cc..cddbe5b09cb 100644 --- a/docs-source/content/samples/simple/domains/domain-home-in-image/_index.md +++ b/docs-source/content/samples/simple/domains/domain-home-in-image/_index.md @@ -2,7 +2,7 @@ title: "Domain home in image" date: 2019-02-23T17:32:31-05:00 weight: 3 -description: "Sample for creating a WebLogic domain home inside a Docker image, and the domain resource YAML file for deploying the generated WebLogic domain." +description: "Sample for creating a WebLogic domain home inside a Docker image, and the Domain YAML file for deploying the generated WebLogic domain." --- The sample scripts demonstrate the creation of a WebLogic domain home in a Docker image using one of the domain home in image samples in the Oracle WebLogic Docker images [GitHub project](https://github.com/oracle/docker-images/tree/master/OracleWebLogic/samples). The sample scripts have the option of putting the WebLogic domain log, server logs, server output files, and the Node Manager logs on an existing Kubernetes PersistentVolume (PV) and PersistentVolumeClaim (PVC). The scripts also generate the domain YAML file, which can then be used by the scripts or used manually to start the Kubernetes artifacts of the corresponding domain, including the WebLogic Server pods and services. @@ -33,7 +33,7 @@ $ create-weblogic-credentials.sh #### Use the script to create a domain {{% notice note %}} -The `create-domain.sh` script generates a new Docker image on each run with a new domain home and a different internal `domain secret` in it. To prevent having disparate images with different domain secrets in the same domain, we strongly recommend that a new domain uses a `domainUID` that is different from any of the active domains, or that you delete the existing domain resource using the following command and wait until all the server pods are terminated before you create a domain with the same `domainUID`: +The `create-domain.sh` script generates a new Docker image on each run with a new domain home and a different internal `domain secret` in it. To prevent having disparate images with different domain secrets in the same domain, we strongly recommend that a new domain uses a `domainUID` that is different from any of the active domains, or that you delete the existing Domain using the following command and wait until all the WebLogic Server instance Pods are terminated before you create a Domain with the same `domainUID`: `$ kubectl delete domain [domainUID] -n [domainNamespace]` {{% /notice %}} @@ -77,7 +77,7 @@ $ kubectl apply -f //weblogic-domains//doma As a convenience, using the `-e` option, the script can optionally create the domain object, which in turn results in the creation of the corresponding WebLogic Server pods and services. This option should be used in a single node Kubernetes cluster only. -For a multi-node Kubernetes cluster, make sure that the generated image is available on all nodes before creating the domain resource using the `kubectl apply -f` command. +For a multi-node Kubernetes cluster, make sure that the generated image is available on all nodes before creating the Domain YAML file using the `kubectl apply -f` command. The usage of the create script is as follows: @@ -139,7 +139,7 @@ The following parameters can be provided in the inputs file. | `domainHomeImageBase` | Base WebLogic binary image used to build the WebLogic domain image. The operator requires either Oracle WebLogic Server 12.2.1.3.0 with patch 29135930 applied, or Oracle WebLogic Server 12.2.1.4.0, or Oracle WebLogic Server 14.1.1.0.0. The existing WebLogic Docker image, `container-registry.oracle.com/middleware/weblogic:12.2.1.3`, has all the necessary patches applied. For details on how to obtain or create the image, see [WebLogic Docker images]({{< relref "/userguide/managing-domains/domain-in-image/base-images/_index.md#creating-or-obtaining-weblogic-docker-images" >}}). | `container-registry.oracle.com/middleware/weblogic:12.2.1.3` | | `domainHomeImageBuildPath` | Location of the WebLogic "domain home in image" Docker image in the `https://github.com/oracle/docker-images.git` project. If not specified, use `./docker-images/OracleWebLogic/samples/12213-domain-home-in-image`. Another possible value is `./docker-images/OracleWebLogic/samples/12213-domain-home-in-image-wdt` which uses WDT, instead of WLST, to generate the domain configuration. | `./docker-images/OracleWebLogic/samples/12213-domain-home-in-image` | | `domainPVMountPath` | Mount path of the domain persistent volume. This parameter is required if `logHomeOnPV` is true. Otherwise, it is ignored. | `/shared` | -| `domainUID` | Unique ID that will be used to identify this particular domain. Used as the name of the generated WebLogic domain as well as the name of the Kubernetes domain resource. This ID must be unique across all domains in a Kubernetes cluster. This ID cannot contain any character that is not valid in a Kubernetes Service name. | `domain1` | +| `domainUID` | Unique ID that will be used to identify this particular domain. Used as the name of the generated WebLogic domain as well as the name of the Domain. This ID must be unique across all domains in a Kubernetes cluster. This ID cannot contain any character that is not valid in a Kubernetes Service name. | `domain1` | | `exposeAdminNodePort` | Boolean indicating if the Administration Server is exposed outside of the Kubernetes cluster. | `false` | | `exposeAdminT3Channel` | Boolean indicating if the T3 administrative channel is exposed outside the Kubernetes cluster. | `false` | | `httpAccessLogInLogHome` | Boolean indicating if server HTTP access log files should be written to the same directory as `logHome` if `logHomeOnPV` is true. Otherwise, server HTTP access log files will be written to the directory specified in the WebLogic domain home configuration. | `true` | @@ -183,19 +183,18 @@ The content of the generated `domain.yaml`: # # This is an example of how to define a Domain resource. # -apiVersion: "weblogic.oracle/v7" +apiVersion: "weblogic.oracle/v8" kind: Domain metadata: name: domain1 namespace: default labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: domain1 spec: # The WebLogic Domain Home domainHome: /u01/oracle/user_projects/domains/domain1 - # Set domain home in image to true for domain-in-image or false for domain-in-pv - domainHomeInImage: true + # Set domain home type to PersistentVolume for domain-in-pv, Image for domain-in-image, or FromModel for model-in-image + domainHomeSourceType: Image # The WebLogic Server Docker image that the operator uses to start the domain image: "domain-home-in-image:12.2.1.4" # imagePullPolicy defaults to "Always" if image version is :latest @@ -273,7 +272,6 @@ $ kubectl describe domain domain1 Name: domain1 Namespace: default Labels: weblogic.domainUID=domain1 - weblogic.resourceVersion=domain-v2 Annotations: API Version: weblogic.oracle/v2 Kind: Domain diff --git a/docs-source/content/samples/simple/domains/domain-home-on-pv/_index.md b/docs-source/content/samples/simple/domains/domain-home-on-pv/_index.md index b3c36a7f40e..baf9ea25e14 100644 --- a/docs-source/content/samples/simple/domains/domain-home-on-pv/_index.md +++ b/docs-source/content/samples/simple/domains/domain-home-on-pv/_index.md @@ -2,7 +2,7 @@ title: "Domain home on a PV" date: 2019-02-23T17:32:31-05:00 weight: 2 -description: "Sample for creating a WebLogic domain home on an existing PV or PVC, and the domain resource YAML file for deploying the generated WebLogic domain." +description: "Sample for creating a WebLogic domain home on an existing PV or PVC, and the Domain YAML file for deploying the generated WebLogic domain." --- @@ -108,7 +108,7 @@ The following parameters can be provided in the inputs file. | `createDomainScriptName` | Script that the create domain script uses to create a WebLogic domain. The `create-domain.sh` script creates a Kubernetes Job to run this script to create a domain home. The script is located in the in-pod directory that is specified in the `createDomainScriptsMountPath` property. If you need to provide your own scripts to create the domain home, instead of using the built-it scripts, you must use this property to set the name of the script that you want the create domain job to run. | `create-domain-job.sh` | | `domainHome` | Home directory of the WebLogic domain. If not specified, the value is derived from the `domainUID` as `/shared/domains/`. | `/shared/domains/domain1` | | `domainPVMountPath` | Mount path of the domain persistent volume. | `/shared` | -| `domainUID` | Unique ID that will be used to identify this particular domain. Used as the name of the generated WebLogic domain as well as the name of the Kubernetes domain resource. This ID must be unique across all domains in a Kubernetes cluster. This ID cannot contain any character that is not valid in a Kubernetes Service name. | `domain1` | +| `domainUID` | Unique ID that will be used to identify this particular domain. Used as the name of the generated WebLogic domain as well as the name of the Domain. This ID must be unique across all domains in a Kubernetes cluster. This ID cannot contain any character that is not valid in a Kubernetes Service name. | `domain1` | | `exposeAdminNodePort` | Boolean indicating if the Administration Server is exposed outside of the Kubernetes cluster. | `false` | | `exposeAdminT3Channel` | Boolean indicating if the T3 administrative channel is exposed outside the Kubernetes cluster. | `false` | | `httpAccessLogInLogHome` | Boolean indicating if server HTTP access log files should be written to the same directory as `logHome`. Otherwise, server HTTP access log files will be written to the directory specified in the WebLogic domain home configuration. | `true` | @@ -151,19 +151,18 @@ The content of the generated `domain.yaml`: # # This is an example of how to define a Domain resource. # -apiVersion: "weblogic.oracle/v7" +apiVersion: "weblogic.oracle/v8" kind: Domain metadata: name: domain1 namespace: default labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: domain1 spec: # The WebLogic Domain Home domainHome: /shared/domains/domain1 - # Set domain home in image to true for domain-in-image or false for domain-in-pv - domainHomeInImage: false + # Set domain home type to PersistentVolume for domain-in-pv, Image for domain-in-image, or FromModel for model-in-image + domainHomeSourceType: PersistentVolume # The WebLogic Server Docker image that the operator uses to start the domain image: "container-registry.oracle.com/middleware/weblogic:12.2.1.4" # imagePullPolicy defaults to "Always" if image version is :latest @@ -241,8 +240,7 @@ $ kubectl describe domain domain1 Name: domain1 Namespace: default Labels: weblogic.domainUID=domain1 - weblogic.resourceVersion=domain-v2 -Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"weblogic.oracle/v2","kind":"Domain","metadata":{"annotations":{},"labels":{"weblogic.domainUID":"domain1","weblogic.resourceVersion":"do... +Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"weblogic.oracle/v2","kind":"Domain","metadata":{"annotations":{},"labels":{"weblogic.domainUID":"domain1",... API Version: weblogic.oracle/v2 Kind: Domain Metadata: diff --git a/docs-source/content/samples/simple/domains/fmw-domain/_index.md b/docs-source/content/samples/simple/domains/fmw-domain/_index.md index 30b3ccda911..003e011faab 100644 --- a/docs-source/content/samples/simple/domains/fmw-domain/_index.md +++ b/docs-source/content/samples/simple/domains/fmw-domain/_index.md @@ -3,7 +3,7 @@ title: "FMW Infrastructure domain" date: 2019-04-18T07:32:31-05:00 weight: 5 description: "Sample for creating an FMW Infrastructure domain home on an existing PV or -PVC, and the domain resource YAML file for deploying the generated WebLogic domain." +PVC, and the Domain YAML file for deploying the generated WebLogic domain." --- @@ -112,7 +112,7 @@ The following parameters can be provided in the inputs file. | `createDomainScriptName` | Script that the create domain script uses to create a WebLogic domain. The `create-domain.sh` script creates a Kubernetes Job to run this script to create a domain home. The script is located in the in-pod directory that is specified in the `createDomainScriptsMountPath` property. If you need to provide your own scripts to create the domain home, instead of using the built-it scripts, you must use this property to set the name of the script that you want the create domain job to run. | `create-domain-job.sh` | | `domainHome` | Home directory of the WebLogic domain. If not specified, the value is derived from the `domainUID` as `/shared/domains/`. | `/shared/domains/domain1` | | `domainPVMountPath` | Mount path of the domain persistent volume. | `/shared` | -| `domainUID` | Unique ID that will be used to identify this particular domain. Used as the name of the generated WebLogic domain as well as the name of the Kubernetes domain resource. This ID must be unique across all domains in a Kubernetes cluster. This ID cannot contain any character that is not valid in a Kubernetes Service name. | `domain1` | +| `domainUID` | Unique ID that will be used to identify this particular domain. Used as the name of the generated WebLogic domain as well as the name of the Domain. This ID must be unique across all domains in a Kubernetes cluster. This ID cannot contain any character that is not valid in a Kubernetes Service name. | `domain1` | | `exposeAdminNodePort` | Boolean indicating if the Administration Server is exposed outside of the Kubernetes cluster. | `false` | | `exposeAdminT3Channel` | Boolean indicating if the T3 administrative channel is exposed outside the Kubernetes cluster. | `false` | | `httpAccessLogInLogHome` | Boolean indicating if server HTTP access log files should be written to the same directory as `logHome`. Otherwise, server HTTP access log files will be written to the directory specified in the WebLogic domain home configuration. | `true` | @@ -168,19 +168,18 @@ The content of the generated `domain.yaml`: # # This is an example of how to define a Domain resource. # -apiVersion: "weblogic.oracle/v7" +apiVersion: "weblogic.oracle/v8" kind: Domain metadata: name: fmw-domain namespace: default labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: fmw-domain spec: # The WebLogic Domain Home domainHome: /shared/domains/fmw-domain - # Set domain home in image to true for domain-in-image or false for domain-in-pv - domainHomeInImage: false + # Set domain home type to PersistentVolume for domain-in-pv, Image for domain-in-image, or FromModel for model-in-image + domainHomeSourceType: PersistentVolume # The WebLogic Server Docker image that the Operator uses to start the domain image: "container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.4" # imagePullPolicy defaults to "Always" if image version is :latest @@ -257,7 +256,6 @@ Here is an example of the output of this command: Name: fmw-domain Namespace: default Labels: weblogic.domainUID=fmw-domain - weblogic.resourceVersion=domain-v2 Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"weblogic.oracle/v4","kind":"Domain","metadata":{"annotations":{},"labels":{"weblogic.domainUID":"fmw-domain","weblogic.reso... API Version: weblogic.oracle/v4 diff --git a/docs-source/content/samples/simple/domains/model-in-image/_index.md b/docs-source/content/samples/simple/domains/model-in-image/_index.md index 9d692ac67eb..9b0ff9dc676 100644 --- a/docs-source/content/samples/simple/domains/model-in-image/_index.md +++ b/docs-source/content/samples/simple/domains/model-in-image/_index.md @@ -5,9 +5,6 @@ weight: 4 description: "Sample for supplying a WebLogic Deploy Tooling (WDT) model that the operator expands into a full domain home during runtime." --- -{{% notice info %}} -This feature is supported only in 3.0.0-rc1. -{{% /notice %}} ### Contents @@ -15,20 +12,23 @@ This feature is supported only in 3.0.0-rc1. - [Model in Image domain types (WLS, JRF, and Restricted JRF)](#model-in-image-domain-types-wls-jrf-and-restricted-jrf) - [Use cases](#use-cases) - [Sample directory structure](#sample-directory-structure) - - [Prerequisites for all domain types](#prerequisites-for-all-domain-types) - - [Additional prerequisites for JRF domains](#additional-prerequisites-for-jrf-domains) - - [Initial use case](#initial-use-case): An initial WebLogic domain - - [Update1 use case](#update1-use-case): Dynamically adding a data source using a model ConfigMap - - [Cleanup](#cleanup) + - [Ensuring your Kubernetes cluster can access images](#ensuring-your-kubernetes-cluster-can-access-images) - [References](#references) + - [Prerequisites for all domain types]({{< relref "/samples/simple/domains/model-in-image/prerequisites#prerequisites-for-all-domain-types" >}}) + - [Additional prerequisites for JRF domains]({{< relref "/samples/simple/domains/model-in-image/prerequisites#additional-prerequisites-for-jrf-domains" >}}) + - [Initial]({{< relref "/samples/simple/domains/model-in-image/initial.md" >}}) use case: An initial WebLogic domain + - [Update 1]({{< relref "/samples/simple/domains/model-in-image/update1.md" >}}): Dynamically adding a data source using a model ConfigMap + - [Update 2]({{< relref "/samples/simple/domains/model-in-image/update2.md" >}}): Deploying an additional domain + - [Update 3]({{< relref "/samples/simple/domains/model-in-image/update3.md" >}}): Updating an application in an image + - [Cleanup]({{< relref "/samples/simple/domains/model-in-image/cleanup.md" >}}) ### Introduction -This sample demonstrates deploying a Model in Image [domain home source type]({{< relref "/userguide/managing-domains/choosing-a-model/_index.md" >}}). Unlike Domain in PV and Domain in Image, Model in Image eliminates the need to pre-create your WebLogic domain home prior to deploying your domain resource. Instead, Model in Image uses a WebLogic Deploy Tooling (WDT) model to specify your WebLogic configuration. +This sample demonstrates deploying a Model in Image [domain home source type]({{< relref "/userguide/managing-domains/choosing-a-model/_index.md" >}}). Unlike Domain in PV and Domain in Image, Model in Image eliminates the need to pre-create your WebLogic domain home prior to deploying your Domain YAML file. Instead, Model in Image uses a WebLogic Deploy Tooling (WDT) model to specify your WebLogic configuration. -WDT models are a convenient and simple alternative to WebLogic WLST configuration scripts and templates. They compactly define a WebLogic domain using YAML files and support including application archives in a ZIP file. The WDT model format is described in the open source, [WebLogic Deploy Tooling](https://github.com/oracle/weblogic-deploy-tooling) GitHub project, and the required directory structure for a WDT archive is specifically discussed [here](https://github.com/oracle/weblogic-deploy-tooling/blob/master/site/archive.md). +WDT models are a convenient and simple alternative to WebLogic Scripting Tool (WLST) configuration scripts and templates. They compactly define a WebLogic domain using YAML files and support including application archives in a ZIP file. The WDT model format is described in the open source, [WebLogic Deploy Tooling](https://github.com/oracle/weblogic-deploy-tooling) GitHub project, and the required directory structure for a WDT archive is specifically discussed [here](https://github.com/oracle/weblogic-deploy-tooling/blob/master/site/archive.md). For more information on Model in Image, see the [Model in Image user guide]({{< relref "/userguide/managing-domains/model-in-image/_index.md" >}}). For a comparison of Model in Image to other domain home source types, see [Choose a domain home source type]({{< relref "/userguide/managing-domains/choosing-a-model/_index.md" >}}). @@ -40,9 +40,9 @@ The `JRF` domain path through the sample includes additional steps required for #### Use cases -This sample demonstrates two Model in Image use cases: +This sample demonstrates four Model in Image use cases: -- [Initial](#initial-use-case): An initial WebLogic domain with the following characteristics: +- [Initial]({{< relref "/samples/simple/domains/model-in-image/initial.md" >}}): An initial WebLogic domain with the following characteristics: - Image `model-in-image:WLS-v1` with: - A WebLogic installation @@ -55,23 +55,44 @@ This sample demonstrates two Model in Image use cases: - Kubernetes Secrets: - WebLogic credentials - Required WDT runtime password - - A domain resource with: + - A Domain with: + - `metadata.name` and `weblogic.domainUID` label set to `sample-domain1` - `spec.domainHomeSourceType: FromModel` - `spec.image: model-in-image:WLS-v1` - References to the secrets -- [Update1](#update1-use-case): Demonstrates udpating the initial domain by dynamically adding a data source using a model ConfigMap: +- [Update 1]({{< relref "/samples/simple/domains/model-in-image/update1.md" >}}): Demonstrates updating the initial domain by dynamically adding a data source using a model ConfigMap. - Image `model-in-image:WLS-v1`: - Same image as Initial use case - Kubernetes Secrets: - - Same as Initial use case plus secrets for data source credentials and URL + - Same as Initial use case, plus secrets for data source credentials and URL - Kubernetes ConfigMap with: - A WDT model for a data source targeted to the cluster - - A domain resource with: - - Same as Initial use case plus: - - `spec.model.configMap` referencing the ConfigMap - - References to data source secrets + - A Domain, same as Initial use case, plus: + - `spec.model.configMap` referencing the ConfigMap + - References to data source secrets + +- [Update 2]({{< relref "/samples/simple/domains/model-in-image/update2.md" >}}): Demonstrates deploying a second domain (similar to the Update 1 use case domain). + + - Image `model-in-image:WLS-v1`: + - Same image as the Initial and Update 1 use cases + - Kubernetes Secrets and ConfigMap: + - Similar to the Update 1 use case, except names and labels are decorated with a new domain UID + - A Domain, similar to Update 1 use case, except: + - Its `metadata.name` and `weblogic.domainUid` label become `sample-domain2` instead of `sample-domain1` + - Its secret/ConfigMap references are decorated with `sample-domain2` instead of `sample-domain1` + - Has a changed `env` variable that sets a new domain name + +- [Update 3]({{< relref "/samples/simple/domains/model-in-image/update3.md" >}}): Demonstrates deploying an updated image with an updated application to the Update 1 use case domain. + + - Image `model-in-image:WLS-v2`, similar to `model-in-image:WLS-v1` image with: + - An updated web application `v2` at the `myapp-v2` directory path instead of `myapp-v1` + - An updated model that points to the new web application path + - Kubernetes Secrets and ConfigMap: + - Same as the Update 1 use case + - A Domain: + - Same as the Update 1 use case, except `spec.image` is `model-in-image:WLS-v2` #### Sample directory structure @@ -79,1700 +100,30 @@ The sample contains the following files and directories: Location | Description | ------------- | ----------- | -`domain-resources` | JRF and WLS domain resources. | +`domain-resources` | JRF and WLS Domain YAML files. | `archives` | Source code location for WebLogic Deploy Tooling application ZIP archives. | -`model-images` | Staging for each model image's WDT YAML, WDT properties, and WDT archive ZIP files. The directories in `model images` are named for their respective images. | +`model-images` | Staging for each model image's WDT YAML files, WDT properties, and WDT archive ZIP files. The directories in `model images` are named for their respective images. | `model-configmaps` | Staging files for a model ConfigMap that configures a data source. | `ingresses` | Ingress resources. | -`utils/wl-pod-wait.sh` | Utility for watching the pods in a domain reach their expected `restartVersion`, image name, and ready state. | -`utils/patch-restart-version.sh` | Utility for updating a running domain `spec.restartVersion` field (which causes it to 're-instrospect' and 'roll'). | -`utils/opss-wallet.sh` | Utility for exporting or importing a JRF domain OPSS wallet file. | +`utils/wl-pod-wait.sh` | Utility script for watching the pods in a domain reach their expected `restartVersion`, image name, and ready state. | +`utils/patch-restart-version.sh` | Utility script for updating a running domain `spec.restartVersion` field (which causes it to 're-instrospect' and 'roll'). | +`utils/opss-wallet.sh` | Utility script for exporting or importing a JRF domain OPSS wallet file. | -### Prerequisites for all domain types +#### Ensuring your Kubernetes cluster can access images -1. Choose the type of domain you're going to use throughout the sample, `WLS` or `JRF`. +If you run the sample from a machine that is remote to one or more of your Kubernetes cluster worker nodes, then you need to ensure that the images you create can be accessed from any node in the cluster. - - The first time you try this sample, we recommend that you choose `WLS` even if you're familiar with `JRF`. - - This is because `WLS` is simpler and will more easily familiarize you with Model in Image concepts. - - We recommend choosing `JRF` only if you are already familiar with `JRF`, you have already tried the `WLS` path through this sample, and you have a definite use case where you need to use `JRF`. +For example, if you have permission to put the image in a Docker repository that the cluster can also access, then: + - After you've created an image: + - `docker tag` the image with a target image name (including the registry host name, port, repository name, and the tag, if needed). + - `docker push` the tagged image to the target repository. + - Before you deploy a Domain: + - Modify the Domain YAML file's `image:` value to match the Docker tag for the image in the repository. + - If the repository requires a login, then also deploy a corresponding Kubernetes `docker secret` to the same namespace that the Domain will use, and modify the Domain YAML file's `imagePullSecrets:` to reference this secret. -1. The `JAVA_HOME` environment variable must be set and must reference a valid JDK 8 or 11 installation. - -1. Get the operator source from the `release/3.0.0-rc1` branch and put it in `/tmp/weblogic-kubernetes-operator`. - - For example: - - ``` - $ cd /tmp - $ git clone https://github.com/oracle/weblogic-kubernetes-operator.git - $ cd weblogic-kubernetes-operator - $ git checkout release/3.0.0-rc1 - ``` - - > **Note**: We will refer to the top directory of the operator source tree as `/tmp/weblogic-kubernetes-operator`; however, you can use a different location. - - For additional information about obtaining the operator source, see the [Developer Guide Requirements](https://oracle.github.io/weblogic-kubernetes-operator/developerguide/requirements/). - -1. Copy the sample to a new directory; for example, use directory `/tmp/mii-sample`. - - - ``` - $ mkdir /tmp/mii-sample - $ cp -r /tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/* /tmp/mii-sample - ``` - - > **Note**: We will refer to this working copy of the sample as `/tmp/mii-sample`; however, you can use a different location. - {{< rawhtml >}} - - {{< /rawhtml >}} -1. Make sure an operator is set up to manage namespace `sample-domain1-ns`. Also, make sure a Traefik ingress controller is managing the same namespace and listening on port 30305. - - For example, follow the same steps as the [Quick Start](https://oracle.github.io/weblogic-kubernetes-operator/quickstart/) - guide from the beginning through to the [Prepare for a domain]({{< relref "/quickstart/prepare.md" >}}) step. - - {{% notice info %}} - Make sure you stop when you complete the "Prepare for a domain" step and then resume following these instructions. - {{% /notice %}} - -1. Set up ingresses that will redirect HTTP from Traefik port 30305 to the clusters in this sample's WebLogic domains. - - - Option 1: To create the ingresses, use the following YAML to create a file called `/tmp/mii-sample/ingresses/myingresses.yaml` and then call `kubectl apply -f /tmp/mii-sample/ingresses/myingresses.yaml`: - - ``` - apiVersion: extensions/v1beta1 - kind: Ingress - metadata: - name: traefik-ingress-sample-domain1-admin-server - namespace: sample-domain1-ns - labels: - weblogic.domainUID: sample-domain1 - annotations: - kubernetes.io/ingress.class: traefik - spec: - rules: - - host: - http: - paths: - - path: /console - backend: - serviceName: sample-domain1-admin-server - servicePort: 7001 - --- - apiVersion: extensions/v1beta1 - kind: Ingress - metadata: - name: traefik-ingress-sample-domain1-cluster-cluster-1 - namespace: sample-domain1-ns - labels: - weblogic.domainUID: sample-domain1 - annotations: - kubernetes.io/ingress.class: traefik - spec: - rules: - - host: sample-domain1-cluster-cluster-1.mii-sample.org - http: - paths: - - path: - backend: - serviceName: sample-domain1-cluster-cluster-1 - servicePort: 8001 - --- - apiVersion: extensions/v1beta1 - kind: Ingress - metadata: - name: traefik-ingress-sample-domain1-cluster-cluster-2 - namespace: sample-domain1-ns - labels: - weblogic.domainUID: sample-domain1 - annotations: - kubernetes.io/ingress.class: traefik - spec: - rules: - - host: sample-domain1-cluster-cluster-2.mii-sample.org - http: - paths: - - path: - backend: - serviceName: sample-domain1-cluster-cluster-2 - servicePort: 8001 - --- - apiVersion: extensions/v1beta1 - kind: Ingress - metadata: - name: traefik-ingress-sample-domain2-cluster-cluster-1 - namespace: sample-domain1-ns - labels: - weblogic.domainUID: sample-domain2 - annotations: - kubernetes.io/ingress.class: traefik - spec: - rules: - - host: sample-domain2-cluster-cluster-1.mii-sample.org - http: - paths: - - path: - backend: - serviceName: sample-domain2-cluster-cluster-1 - servicePort: 8001 - ``` - - - Option 2: Run `kubectl apply -f` on each of the ingress YAML files that are already included in the sample source `/tmp/mii-sample/ingresses` directory: - - ``` - $ cd /tmp/mii-sample/ingresses - $ kubectl apply -f traefik-ingress-sample-domain1-admin-server.yaml - $ kubectl apply -f traefik-ingress-sample-domain1-cluster-cluster-1.yaml - $ kubectl apply -f traefik-ingress-sample-domain1-cluster-cluster-2.yaml - $ kubectl apply -f traefik-ingress-sample-domain2-cluster-cluster-1.yaml - $ kubectl apply -f traefik-ingress-sample-domain2-cluster-cluster-2.yaml - ``` - - > **NOTE**: We give each cluster ingress a different host name that is decorated using both its operator domain UID and its cluster name. This makes each cluster uniquely addressable even when cluster names are the same across different clusters. When using `curl` to access the WebLogic domain through the ingress, you will need to supply a host name header that matches the host names in the ingress. - - For more on information ingresses and load balancers, see [Ingress]({{< relref "/userguide/managing-domains/ingress/_index.md" >}}). - -1. Obtain the WebLogic 12.2.1.4 image that is required to create the sample's model images. - - a. Use a browser to access [Oracle Container Registry](http://container-registry.oracle.com). - - b. Choose an image location: for `JRF` domains, select `Middleware`, then `fmw-infrastructure`; for `WLS` domains, select `Middleware`, then `weblogic`. - - c. Select Sign In and accept the license agreement. - - d. Use your terminal to log in to Docker locally: `docker login container-registry.oracle.com`. - - e. Later in this sample, when you run WebLogic Image Tool commands, the tool will use the image as a base image for creating model images. Specifically, the tool will implicitly call `docker pull` for one of the above licensed images as specified in the tool's command line using the `--fromImage` parameter. For `JRF`, this sample specifies `container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.4`, and for `WLS`, the sample specifies `container-registry.oracle.com/middleware/weblogic:12.2.1.4`. - - {{% notice info %}} - If you prefer, you can create your own base image and then substitute this image name in the WebLogic Image Tool `--fromImage` parameter throughout this sample. See [Preparing a Base Image]({{< relref "/userguide/managing-domains/domain-in-image/base-images/_index.md" >}}). - {{% /notice %}} - -1. Download the latest WebLogic Deploying Tooling and WebLogic Image Tool installer ZIP files to your `/tmp/mii-sample/model-images` directory. - - Both WDT and WIT are required to create your Model in Image Docker images. Download the latest version of each tool's installer ZIP file to the `/tmp/mii-sample/model-images` directory. - - For example, visit the GitHub [WebLogic Deploy Tooling Releses](https://github.com/oracle/weblogic-deploy-tooling/releases) and [WebLogic Image Tool Releases](https://github.com/oracle/weblogic-image-tool/releases) web pages to determine the latest release version for each, and then, assuming the version numbers are `1.8.0` and `1.8.4` respectively, call: - - ``` - $ curl -m 30 -fL https://github.com/oracle/weblogic-deploy-tooling/releases/download/weblogic-deploy-tooling-1.8.0/weblogic-deploy.zip \ - -o /tmp/mii-sample/model-images/weblogic-deploy.zip - $ curl -m 30 -fL https://github.com/oracle/weblogic-image-tool/releases/download/release-1.8.4/imagetool.zip \ - -o /tmp/mii-sample/model-images/imagetool.zip - ``` - -1. Set up the WebLogic Image Tool. - - Run the following commands: - - ``` - $ cd /tmp/mii-sample/model-images - - $ unzip imagetool.zip - - $ ./imagetool/bin/imagetool.sh cache addInstaller \ - --type wdt \ - --version latest \ - --path /tmp/mii-sample/model-images/weblogic-deploy.zip - ``` - - These steps will install WIT to the `/tmp/mii-sample/model-images/imagetool` directory, plus put a `wdt_latest` entry in the tool's cache which points to the WDT ZIP installer. We will use WIT later in the sample for creating model images. - - -### Additional prerequisites for JRF domains - -> __NOTE__: If you're using a `WLS` domain type, skip this section and continue [here](#initial-use-case). - -#### JRF Prerequisites Contents - - - [Introduction to JRF setups](#introduction-to-jrf-setups) - - [Set up and initialize an infrastructure database](#set-up-and-initialize-an-infrastructure-database) - - [Increase introspection job timeout](#increase-introspection-job-timeout) - - [Important considerations for RCU model attributes, domain resource attributes, and secrets](#important-considerations-for-rcu-model-attributes-domain-resource-attributes-and-secrets) - -##### Introduction to JRF setups - -> __NOTE__: The requirements in this section are in addition to [Prerequisites for all domain types](#prerequisites-for-all-domain-types). - -A JRF domain requires an infrastructure database, initializing this database with RCU, and configuring your domain to access this database. All of these steps must occur before you create your domain. - - -##### Set up and initialize an infrastructure database - -A JRF domain requires an infrastructure database and also requires initializing this database with a schema and a set of tables. The following example shows how to set up a database and use the RCU tool to create the infrastructure schema for a JRF domain. The database is set up with the following attributes: - -| Attribute | Value | -| --------- | ----- | -| database Kubernetes namespace | `default` | -| database Kubernetes pod | `oracle-db` | -| database image | `container-registry.oracle.com/database/enterprise:12.2.0.1-slim` | -| database password | `Oradoc_db1` | -| infrastructure schema prefix | `FMW1` | -| infrastructure schema password | `Oradoc_db1` | -| database URL | `oracle-db.default.svc.cluster.local:1521/devpdb.k8s` | - - -1. Ensure that you have access to the database image, and then create a deployment using it: - - - Use a browser to log in to `https://container-registry.oracle.com`, select `database->enterprise` and accept the license agreement. - - - Get the database image: - - In the local shell, `docker login container-registry.oracle.com`. - - In the local shell, `docker pull container-registry.oracle.com/database/enterprise:12.2.0.1-slim`. - - - Use the sample script in `/tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-oracle-db-service` to create an Oracle database running in the pod, `oracle-db`. - - ``` - $ cd /tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-oracle-db-service - $ start-db-service.sh - ``` - - This script will deploy a database in the `default` namespace with the connect string `oracle-db.default.svc.cluster.local:1521/devpdb.k8s`, and administration password `Oradoc_db1`. - - This step is based on the steps documented in [Run a Database](https://oracle.github.io/weblogic-kubernetes-operator/userguide/overview/database/). - - **WARNING:** The Oracle Database Docker images are supported only for non-production use. For more details, see My Oracle Support note: Oracle Support for Database Running on Docker (Doc ID 2216342.1). - - -2. Use the sample script in `/tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-rcu-schema` to create the RCU schema with the schema prefix `FMW1`. - - Note that this script assumes `Oradoc_db1` is the DBA password, `Oradoc_db1` is the schema password, and that the database URL is `oracle-db.default.svc.cluster.local:1521/devpdb.k8s`. - - ``` - $ cd /tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-rcu-schema - $ ./create-rcu-schema.sh -s FMW1 -i container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.4 - ``` - - __NOTE__: If you need to drop the repository, use this command: - - ``` - $ drop-rcu-schema.sh -s FMW1 - ``` - - -##### Increase introspection job timeout - -The JRF domain home creation can take more time than the introspection job's default timeout. You should increase the timeout for the introspection job. Use the `configuration.introspectorJobActiveDeadlineSeconds` in your domain resource to override the default with a value of at least 300 seconds (the default is 120 seconds). Note that the `JRF` versions of the domain resource files that are provided in `/tmp/mii-sample/domain-resources` already set this value. - -##### Important considerations for RCU model attributes, domain resource attributes, and secrets - -To allow Model in Image to access the database and OPSS wallet, you must create an RCU access secret containing the database connect string, user name, and password that's referenced from your model and an OPSS wallet password secret that's referenced from your domain resource before deploying your domain. It's also necessary to define an `RCUDbInfo` stanza in your model. - -The sample includes examples of JRF models and domain resources in the `/tmp/mii-sample/model-images` and `/tmp/mii-sample/domain-resources` directories, and instructions in the following sections will describe setting up the RCU and OPSS secrets. - -When you follow the instructions later in this sample, avoid instructions that are `WLS` only, and substitute `JRF` for `WLS` in the corresponding model image tags and domain resource file names. - -For example: - - - JRF domain resources in this sample have an `opss.walletPasswordSecret` field that references a secret named `sample-domain1-opss-wallet-password-secret`, with `password=welcome1`. - - - JRF image models in this sample have a `domainInfo -> RCUDbInfo` stanza that reference a `sample-domain1-rcu-access` secret with appropriate values for attributes `rcu_prefix`, `rcu_schema_password`, and `rcu_db_conn_string` for accessing the Oracle database that you deployed to the default namespace as one of the prerequisite steps. - -##### Important considerations for reusing or sharing OPSS tables - -{{% notice warning %}} -We do not recommend that most users share OPSS tables. Extreme caution is required when sharing OPSS tables between domains. -{{% /notice %}} - -When you successfully deploy your JRF domain resource for the first time, the introspector job will initialize the OPSS tables for the domain using the `domainInfo -> RCUDbInfo` stanza in the WDT model plus the `configuration.opss.walletPasswordSecret` specified in the domain resource. The job will also create a new domain home. Finally, the operator will also capture an OPSS wallet file from the new domain's local directory and place this file in a new Kubernetes ConfigMap. - -There are scenarios when the domain needs to be recreated between updates, such as when WebLogic credentials are changed, security roles defined in the WDT model have been changed, or you want to share the same infrastructure tables with different domains. In these scenarios, the operator needs the `walletPasswordSecret` as well as the OPSS wallet file, together with the exact information in `domainInfo -> RCUDbInfo` so that the domain can be recreated and access the same set of tables. Without the wallet file and wallet password, you will not be able to recreate a domain accessing the same set of tables, therefore we strongly recommend that you back up the wallet file. - -To recover a domain's OPSS tables between domain restarts or to share an OPSS schema between different domains, it is necessary to extract this wallet file from the domain's automatically deployed introspector ConfigMap and save the OPSS wallet password secret that was used for the original domain. The wallet password and wallet file are needed again when you recreate the domain or share the database with other domains. - -To save the wallet file, assuming that your namespace is `sample-domain1-ns` and your domain UID is `sample-domain1`: - -``` - $ kubectl -n sample-domain1-ns \ - get configmap sample-domain1-weblogic-domain-introspect-cm \ - -o jsonpath='{.data.ewallet\.p12}' \ - > ./ewallet.p12 -``` - -Alternatively, you can save the file using the sample's wallet utility: - -``` - $ /tmp/mii-sample/utils/opss-wallet.sh -n sample-domain1-ns -d sample-domain1 -wf ./ewallet.p12 - # For help: /tmp/mii-sample/utils/opss-wallet.sh -? -``` - -__Important! Back up your wallet file to a safe location that can be retrieved later.__ - -To reuse the wallet file in subsequent redeployments or to share the domain's OPSS tables between different domains: - -1. Load the saved wallet file into a secret with a key named `walletFile` (again, assuming that your domain UID is `sample-domain1` and your namespace is `sample-domain1-ns`): - -``` - $ kubectl -n sample-domain1-ns create secret generic sample-domain1-opss-walletfile-secret \ - --from-file=walletFile=./ewallet.p12 - $ kubectl -n sample-domain1-ns label secret sample-domain1-opss-walletfile-secret \ - weblogic.domainUID=`sample-domain1` -``` - -Alternatively, use the sample's wallet utility: -``` - $ /tmp/mii-sample/utils/opss-wallet.sh -n sample-domain1-ns -d sample-domain1 -wf ./ewallet.p12 -ws sample-domain1-opss-walletfile-secret - # For help: /tmp/mii-sample/utils/opss-wallet.sh -? -``` - -2. Modify your domain resource JRF YAML files to provide the wallet file secret name, for example: - -``` - configuration: - opss: - # Name of secret with walletPassword for extracting the wallet - walletPasswordSecret: sample-domain1-opss-wallet-password-secret - # Name of secret with walletFile containing base64 encoded opss wallet - walletFileSecret: sample-domain1-opss-walletfile-secret -``` -> **Note**: The sample JRF domain resource files included in `/tmp/mii-sample/domain-resources` already have the above YAML stanza. - -### Initial use case - -#### Contents - - - [Overview](#overview) - - Image creation - - [Image creation - Introduction](#image-creation---introduction) - - [Understanding our first archive](#understanding-our-first-archive) - - [Staging a ZIP file of the archive](#staging-a-zip-file-of-the-archive) - - [Staging model files](#staging-model-files) - - [Creating the image with WIT](#creating-the-image-with-wit) - - Deploy resources - - [Deploy resources - Introduction](#deploy-resources---introduction) - - [Secrets](#secrets) - - [Domain resource](#domain-resource) - -#### Overview - -In this use case, we set up an initial WebLogic domain. This involves: - - - A WDT archive ZIP file that contains your applications. - - A WDT model that describes your WebLogic configuration. - - A Docker image that contains your WDT model files and archive. - - Creating secrets for the domain. - - Creating a domain resource for the domain that references your secrets and image. - -After the domain resource is deployed, the WebLogic operator will start an 'introspector job' that converts your models into a WebLogic configuration, and then the operator will pass this configuration to each WebLogic Server in the domain. - -{{% notice note %}} -Perform the steps in [Prerequisites for all domain types](#prerequisites-for-all-domain-types) before performing the steps in this use case. -If you are taking the `JRF` path through the sample, then substitute `JRF` for `WLS` in your image names and directory paths. Also note that the JRF-v1 model YAML differs from the WLS-v1 YAML file (it contains an additional `domainInfo -> RCUDbInfo` stanza). -{{% /notice %}} - -#### Image creation - Introduction - -The goal of the initial use case 'image creation' is to demonstrate using the WebLogic Image Tool to create an image named `model-in-image:WLS-v1` from files that we will stage to `/tmp/mii-sample/model-images/model-in-image:WLS-v1/`. The staged files will contain a web application in a WDT archive, and WDT model configuration for a WebLogic Administration Server called `admin-server` and a WebLogic cluster called `cluster-1`. - -Overall, a Model in Image image must contain a WebLogic installation and also a WebLogic Deploy Tooling installation in its `/u01/wdt/weblogic-deploy` directory. In addition, if you have WDT model archive files, then the image must also contain these files in its `/u01/wdt/models` directory. Finally, an image may optionally also contain your WDT model YAML and properties files in the same `/u01/wdt/models` directory. If you do not specify WDT model YAML in your `/u01/wdt/models` directory, then the model YAML must be supplied dynamically using a Kubernetes ConfigMap that is referenced by your domain resource `spec.model.configMap` attribute. We will provide an example of using a model ConfigMap later in this sample. - -Let's walk through the steps for creating the image `model-in-image:WLS-v1`: - -- [Understanding our first archive](#understanding-our-first-archive) -- [Staging a ZIP file of the archive](#staging-a-zip-file-of-the-archive) -- [Staging model files](#staging-model-files) -- [Creating the image with WIT](#creating-the-image-with-wit) - -#### Understanding our first archive - -The sample includes a predefined archive directory in `/tmp/mii-sample/archives/archive-v1` that we will use to create an archive ZIP file for the image. - -The archive top directory, named `wlsdeploy`, contains a directory named `applications`, which includes an 'exploded' sample JSP web application in the directory, `myapp-v1`. Three useful aspects to remember about WDT archives are: - - A model image can contain multiple WDT archives. - - WDT archives can contain multiple applications, libraries, and other components. - - WDT archives have a [well defined directory structure](https://github.com/oracle/weblogic-deploy-tooling/blob/master/site/archive.md), which always has `wlsdeploy` as the top directory. - -{{%expand "If you are interested in the web application source, click here to see the JSP code." %}} - -``` -<%-- Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. --%> -<%-- Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. --%> -<%@ page import="javax.naming.InitialContext" %> -<%@ page import="javax.management.*" %> -<%@ page import="java.io.*" %> -<% - InitialContext ic = null; - try { - ic = new InitialContext(); - - String srName=System.getProperty("weblogic.Name"); - String domainUID=System.getenv("DOMAIN_UID"); - String domainName=System.getenv("CUSTOM_DOMAIN_NAME"); - - out.println("
");
-    out.println("*****************************************************************");
-    out.println();
-    out.println("Hello World! This is version 'v1' of the mii-sample JSP web-app.");
-    out.println();
-    out.println("Welcome to WebLogic server '" + srName + "'!");
-    out.println();
-    out.println(" domain UID  = '" + domainUID +"'");
-    out.println(" domain name = '" + domainName +"'");
-    out.println();
-
-    MBeanServer mbs = (MBeanServer)ic.lookup("java:comp/env/jmx/runtime");
-
-    // display the current server's cluster name
-    Set clusterRuntimes = mbs.queryMBeans(new ObjectName("*:Type=ClusterRuntime,*"), null);
-    out.println("Found " + clusterRuntimes.size() + " local cluster runtime" + (String)((clusterRuntimes.size()!=1)?"s:":":"));
-    for (ObjectInstance clusterRuntime : clusterRuntimes) {
-       String cName = (String)mbs.getAttribute(clusterRuntime.getObjectName(), "Name");
-       out.println("  Cluster '" + cName + "'");
-    }
-    out.println();
-
-
-    // display local data sources
-    ObjectName jdbcRuntime = new ObjectName("com.bea:ServerRuntime=" + srName + ",Name=" + srName + ",Type=JDBCServiceRuntime");
-    ObjectName[] dataSources = (ObjectName[])mbs.getAttribute(jdbcRuntime, "JDBCDataSourceRuntimeMBeans");
-    out.println("Found " + dataSources.length + " local data source" + (String)((dataSources.length!=1)?"s:":":"));
-    for (ObjectName dataSource : dataSources) {
-       String dsName  = (String)mbs.getAttribute(dataSource, "Name");
-       String dsState = (String)mbs.getAttribute(dataSource, "State");
-       out.println("  Datasource '" + dsName + "': State='" + dsState +"'");
-    }
-    out.println();
-
-    out.println("*****************************************************************");
-
-  } catch (Throwable t) {
-    t.printStackTrace(new PrintStream(response.getOutputStream()));
-  } finally {
-    out.println("
"); - if (ic != null) ic.close(); - } -%> -``` -{{% /expand%}} - -The application displays important details about the WebLogic Server that it's running on: namely its domain name, cluster name, and server name, as well as the names of any data sources that are targeted to the server. You can also see that application output reports that it's at version `v1`; we will update this to `v2` in a future use case to demonstrate upgrading the application. - -#### Staging a ZIP file of the archive - -When we create our image, we will use the files in staging directory `/tmp/mii-sample/model-in-image__WLS-v1`. In preparation, we need it to contain a ZIP file of the WDT application archive. - -Run the following commands to create your application archive ZIP file and put it in the expected directory: - -``` -# Delete existing archive.zip in case we have an old leftover version -$ rm -f /tmp/mii-sample/model-images/model-in-image__WLS-v1/archive.zip - -# Move to the directory which contains the source files for our archive -$ cd /tmp/mii-sample/archives/archive-v1 - -# Zip the archive to the location will later use when we run the WebLogic Image Tool -$ zip -r /tmp/mii-sample/model-images/model-in-image__WLS-v1/archive.zip wlsdeploy -``` - -#### Staging model files - -In this step, we explore the staged WDT model YAML file and properties in directory `/tmp/mii-sample/model-in-image__WLS-v1`. The model in this directory references the web application in our archive, configures a WebLogic Administration Server, and configures a WebLogic cluster. It consists of only two files, `model.10.properties`, a file with a single property, and, `model.10.yaml`, a YAML file with our WebLogic configuration `model.10.yaml`. - -``` -CLUSTER_SIZE=5 -``` - -Here is the WLS `model.10.yaml`: - -``` -domainInfo: - AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' - AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' - ServerStartMode: 'prod' - -topology: - Name: '@@ENV:CUSTOM_DOMAIN_NAME@@' - AdminServerName: 'admin-server' - Cluster: - 'cluster-1': - DynamicServers: - ServerTemplate: 'cluster-1-template' - ServerNamePrefix: 'managed-server' - DynamicClusterSize: '@@PROP:CLUSTER_SIZE@@' - MaxDynamicClusterSize: '@@PROP:CLUSTER_SIZE@@' - MinDynamicClusterSize: '0' - CalculatedListenPorts: false - Server: - 'admin-server': - ListenPort: 7001 - ServerTemplate: - 'cluster-1-template': - Cluster: 'cluster-1' - ListenPort: 8001 - -appDeployments: - Application: - myapp: - SourcePath: 'wlsdeploy/applications/myapp-v1' - ModuleType: ear - Target: 'cluster-1' -``` - - -{{%expand "Click here to expand the JRF `model.10.yaml`, and note the RCUDbInfo stanza and its references to a DOMAIN_UID-rcu-access secret." %}} - -``` -domainInfo: - AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' - AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' - ServerStartMode: 'prod' - RCUDbInfo: - rcu_prefix: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_prefix@@' - rcu_schema_password: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_schema_password@@' - rcu_db_conn_string: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_db_conn_string@@' - -topology: - AdminServerName: 'admin-server' - Name: '@@ENV:CUSTOM_DOMAIN_NAME@@' - Cluster: - 'cluster-1': - Server: - 'admin-server': - ListenPort: 7001 - 'managed-server1-c1-': - Cluster: 'cluster-1' - ListenPort: 8001 - 'managed-server2-c1-': - Cluster: 'cluster-1' - ListenPort: 8001 - 'managed-server3-c1-': - Cluster: 'cluster-1' - ListenPort: 8001 - 'managed-server4-c1-': - Cluster: 'cluster-1' - ListenPort: 8001 - -appDeployments: - Application: - myapp: - SourcePath: 'wlsdeploy/applications/myapp-v1' - ModuleType: ear - Target: 'cluster-1' -``` -{{% /expand%}} - - -The model files: - -- Define a WebLogic domain with: - - Cluster `cluster-1` - - Administration Server `admin-server` - - A `cluster-1` targeted `ear` application that's located in the WDT archive ZIP file at `wlsdeploy/applications/myapp-v1` - -- Leverage macros to inject external values: - - The property file `CLUSTER_SIZE` property is referenced in the model YAML `DynamicClusterSize` and `MaxDynamicClusterSize` fields using a PROP macro. - - The model file domain name is injected using a custom environment variable named `CUSTOM_DOMAIN_NAME` using an ENV macro. - - We set this environment variable later in this sample using an `env` field in its domain resource. - - _This conveniently provides a simple way to deploy multiple differently named domains using the same model image._ - - The model file administrator user name and password are set using a `weblogic-credentials` secret macro reference to the WebLogic credential secret. - - This secret is in turn referenced using the `weblogicCredentialsSecret` field in the domain resource. - - The `weblogic-credentials` is a reserved name that always dereferences to the owning domain resource actual WebLogic credentials secret name. - -A Model in Image image can contain multiple properties files, archive ZIP files, and YAML files, but in this sample we use just one of each. For a full discussion of Model in Images model file naming conventions, file loading order, and macro syntax, see [Model files]({{< relref "/userguide/managing-domains/model-in-image/model-files.md" >}}) in the Model in Image user documentation. - - -#### Creating the image with WIT - -> **Note**: If you are using JRF in this sample, substitute `JRF` for each occurrence of `WLS` in the `imagetool` command line below, plus substitute `container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.4` for the `--fromImage` value. - -At this point, we have staged all of the files needed for image `model-in-image:WLS-v1`, they include: - - - `/tmp/mii-sample/model-images/weblogic-deploy.zip` - - `/tmp/mii-sample/model-images/model-in-image__WLS-v1/model.10.yaml` - - `/tmp/mii-sample/model-images/model-in-image__WLS-v1/model.10.properties` - - `/tmp/mii-sample/model-images/model-in-image__WLS-v1/archive.zip` - -If you don't see the `weblogic-deploy.zip` file, then it means that you missed a step in the prerequisites. - -Now let's use the Image Tool to create an image named `model-in-image:WLS-v1` that's layered on a base WebLogic image. We've already set up this tool during the prerequisite steps at the beginning of this sample. - -Run the following commands to create the model image and verify that it worked: - - ``` - $ cd /tmp/mii-sample/model-images - $ ./imagetool/bin/imagetool.sh update \ - --tag model-in-image:WLS-v1 \ - --fromImage container-registry.oracle.com/middleware/weblogic:12.2.1.4 \ - --wdtModel ./model-in-image__WLS-v1/model.10.yaml \ - --wdtVariables ./model-in-image__WLS-v1/model.10.properties \ - --wdtArchive ./model-in-image__WLS-v1/archive.zip \ - --wdtModelOnly \ - --wdtDomainType WLS - ``` - -If you don't see the `imagetool` directory, then it means that you missed a step in the prerequisites. - -This command runs the WebLogic Image Tool in its Model in Image mode, and does the following: - - - Builds the final Docker image as a layer on the `container-registry.oracle.com/middleware/weblogic:12.2.1.4` base image. - - Copies the WDT ZIP file that's referenced in the WIT cache into the image. - - Note that we cached WDT in WIT using the keyword `latest` when we set up the cache during the sample prerequisites steps. - - This lets WIT implicitly assume its the desired WDT version and removes the need to pass a `-wdtVersion` flag. - - Copies the specified WDT model, properties, and application archives to image location `/u01/wdt/models`. - -When the command succeeds, it should end with output like: - - ``` - [INFO ] Build successful. Build time=36s. Image tag=model-in-image:WLS-v1 - ``` - -Also, if you run the `docker images` command, then you should see a Docker image named `model-in-image:WLS-v1`. - -#### Deploy resources - Introduction - -In this section we will deploy our new image to namespace `sample-domain1-ns`, including the following steps: - - - Create a secret containing your WebLogic administrator user name and password. - - Create a secret containing your Model in Image runtime encryption password: - - All Model in Image domains must supply a runtime encryption secret with a `password` value. - - It is used to encrypt configuration that is passed around internally by the operator. - - The value must be kept private but can be arbitrary; you can optionally supply a different secret value every time you restart the domain. - - If your domain type is `JRF`, create secrets containing your RCU access URL, credentials, and prefix. - - Deploy a domain resource YAML file that references the new image. - - Wait for the domain's pods to start and reach their ready state. - -#### Secrets - -First, create the secrets needed by both `WLS` and `JRF` type model domains. In this case, we have two secrets. - -Run the following `kubectl` commands to deploy the required secrets: - - ``` - $ kubectl -n sample-domain1-ns create secret generic \ - sample-domain1-weblogic-credentials \ - --from-literal=username=weblogic --from-literal=password=welcome1 - $ kubectl -n sample-domain1-ns label secret \ - sample-domain1-weblogic-credentials \ - weblogic.domainUID=sample-domain1 - - $ kubectl -n sample-domain1-ns create secret generic \ - sample-domain1-runtime-encryption-secret \ - --from-literal=password=my_runtime_password - $ kubectl -n sample-domain1-ns label secret \ - sample-domain1-runtime-encryption-secret \ - weblogic.domainUID=sample-domain1 - ``` - - Some important details about these secrets: - - - The WebLogic credentials secret: - - It is required and must contain `username` and `password` fields. - - It must be referenced by the `spec.weblogicCredentialsSecret` field in your domain resource. - - It also must be referenced by macros in the `domainInfo.AdminUserName` and `domainInfo.AdminPassWord` fields in your model YAML file. - - - The Model WDT runtime secret: - - This is a special secret required by Model in Image. - - It must contain a `password` field. - - It must be referenced using the `spec.model.runtimeEncryptionSecret` attribute in its domain resource. - - It must remain the same for as long as the domain is deployed to Kubernetes, but can be changed between deployments. - - It is used to encrypt data as it's internally passed using log files from the domain's introspector job and on to its WebLogic Server pods. - - - Deleting and recreating the secrets: - - We delete a secret before creating it, otherwise the create command will fail if the secret already exists. - - This allows us to change the secret when using the `kubectl create secret` command. - - - We name and label secrets using their associated domain UID for two reasons: - - To make it obvious which secrets belong to which domains. - - To make it easier to clean up a domain. Typical cleanup scripts use the `weblogic.domainUID` label as a convenience for finding all resources associated with a domain. - - - If you're following the `JRF` path through the sample, then you also need to deploy the additional secret referenced by macros in the `JRF` model `RCUDbInfo` clause, plus an `OPSS` wallet password secret. For details about the uses of these secrets, see the [Model in Image]({{< relref "/userguide/managing-domains/model-in-image/_index.md" >}}) user documentation. - - {{%expand "Click here for the commands for deploying additional secrets for JRF." %}} - - ``` - $ kubectl -n sample-domain1-ns create secret generic \ - sample-domain1-rcu-access \ - --from-literal=rcu_prefix=FMW1 \ - --from-literal=rcu_schema_password=Oradoc_db1 \ - --from-literal=rcu_db_conn_string=oracle-db.default.svc.cluster.local:1521/devpdb.k8s - $ kubectl -n sample-domain1-ns label secret \ - sample-domain1-rcu-access \ - weblogic.domainUID=sample-domain1 - - $ kubectl -n sample-domain1-ns create secret generic \ - sample-domain1-opss-wallet-password-secret \ - --from-literal=walletPassword=welcome1 - $ kubectl -n sample-domain1-ns label secret \ - sample-domain1-opss-wallet-password-secret \ - weblogic.domainUID=sample-domain1 - ``` - - {{% /expand%}} - - -#### Domain resource - -Now let's create a domain resource. A domain resource is the key resource that tells the operator how to deploy a WebLogic domain. - -Copy the following to a file called `/tmp/mii-sample/mii-initial.yaml` or similar, or use the file `/tmp/mii-sample/domain-resources/WLS/mii-initial-d1-WLS-v1.yaml` that is included in the sample source. - - {{%expand "Click here to expand the WLS domain resource YAML." %}} - ``` - # - # This is an example of how to define a Domain resource. - # - # If you are using 3.0.0-rc1, then the version on the following line - # should be `v8` not `v7`. - apiVersion: "weblogic.oracle/v8" - kind: Domain - metadata: - name: sample-domain1 - namespace: sample-domain1-ns - labels: - weblogic.resourceVersion: domain-v2 - weblogic.domainUID: sample-domain1 - - spec: - # For 3.0.0-rc1, set to 'FromModel' to indicate 'Model in Image'. - domainHomeSourceType: FromModel - - # The WebLogic Domain Home, this must be a location within - # the image for 'Model in Image' domains. - domainHome: /u01/domains/sample-domain1 - - # The WebLogic Server Docker image that the Operator uses to start the domain - image: "model-in-image:WLS-v1" - - # Defaults to "Always" if image tag (version) is ':latest' - imagePullPolicy: "IfNotPresent" - - # Identify which Secret contains the credentials for pulling an image - #imagePullSecrets: - #- name: regsecret - - # Identify which Secret contains the WebLogic Admin credentials, - # the secret must contain 'username' and 'password' fields. - webLogicCredentialsSecret: - name: sample-domain1-weblogic-credentials - - # Whether to include the WebLogic server stdout in the pod's stdout, default is true - includeServerOutInPodLog: true - - # Whether to enable overriding your log file location, see also 'logHome' - #logHomeEnabled: false - - # The location for domain log, server logs, server out, and Node Manager log files - # see also 'logHomeEnabled', 'volumes', and 'volumeMounts'. - #logHome: /shared/logs/sample-domain1 - - # Set which WebLogic servers the Operator will start - # - "NEVER" will not start any server in the domain - # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) - # - "IF_NEEDED" will start all non-clustered servers, including the administration server, and clustered servers up to their replica count. - serverStartPolicy: "IF_NEEDED" - - # Settings for all server pods in the domain including the introspector job pod - serverPod: - # Optional new or overridden environment variables for the domain's pods - # - This sample uses CUSTOM_DOMAIN_NAME in its image model file - # to set the Weblogic domain name - env: - - name: CUSTOM_DOMAIN_NAME - value: "domain1" - - name: JAVA_OPTIONS - value: "-Dweblogic.StdoutDebugEnabled=false" - - name: USER_MEM_ARGS - value: "-XX:+UseContainerSupport -Djava.security.egd=file:/dev/./urandom " - - # Optional volumes and mounts for the domain's pods. See also 'logHome'. - #volumes: - #- name: weblogic-domain-storage-volume - # persistentVolumeClaim: - # claimName: sample-domain1-weblogic-sample-pvc - #volumeMounts: - #- mountPath: /shared - # name: weblogic-domain-storage-volume - - # The desired behavior for starting the domain's administration server. - adminServer: - # The serverStartState legal values are "RUNNING" or "ADMIN" - # "RUNNING" means the listed server will be started up to "RUNNING" mode - # "ADMIN" means the listed server will be start up to "ADMIN" mode - serverStartState: "RUNNING" - # Setup a Kubernetes node port for the administration server default channel - #adminService: - # channels: - # - channelName: default - # nodePort: 30701 - - # The number of managed servers to start for unlisted clusters - replicas: 1 - - # The desired behavior for starting a specific cluster's member servers - clusters: - - clusterName: cluster-1 - serverStartState: "RUNNING" - replicas: 2 - - # Change the `restartVersion` to force the introspector job to rerun - # and apply any new model configuration, to also force a subsequent - # roll of your domain's WebLogic pods. - restartVersion: '1' - - configuration: - - # Settings for domainHomeSourceType 'FromModel' - model: - # Valid model domain types are 'WLS', 'JRF', and 'RestrictedJRF', default is 'WLS' - domainType: "WLS" - - # Optional configmap for additional models and variable files - #configMap: sample-domain1-wdt-config-map - - # All 'FromModel' domains require a runtimeEncryptionSecret with a 'password' field - runtimeEncryptionSecret: sample-domain1-runtime-encryption-secret - - # Secrets that are referenced by model yaml macros - # (the model yaml in the optional configMap or in the image) - #secrets: - #- sample-domain1-datasource-secret - ``` - {{% /expand%}} - - {{%expand "Click here to expand the JRF domain resource YAML." %}} - ``` - # Copyright (c) 2020, Oracle Corporation and/or its affiliates. - # Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. - # - # This is an example of how to define a Domain resource. - # - # If you are using 3.0.0-rc1, then the version on the following line - # should be `v8` not `v7`. - apiVersion: "weblogic.oracle/v7" - kind: Domain - metadata: - name: sample-domain1 - namespace: sample-domain1-ns - labels: - weblogic.resourceVersion: domain-v2 - weblogic.domainUID: sample-domain1 - - spec: - # Set to 'FromModel' to indicate 'Model in Image'. - domainHomeSourceType: FromModel - - # The WebLogic Domain Home, this must be a location within - # the image for 'Model in Image' domains. - domainHome: /u01/domains/sample-domain1 - - # The WebLogic Server Docker image that the Operator uses to start the domain - image: "model-in-image:JRF-v1" - - # Defaults to "Always" if image tag (version) is ':latest' - imagePullPolicy: "IfNotPresent" - - # Identify which Secret contains the credentials for pulling an image - #imagePullSecrets: - #- name: regsecret - - # Identify which Secret contains the WebLogic Admin credentials, - # the secret must contain 'username' and 'password' fields. - webLogicCredentialsSecret: - name: sample-domain1-weblogic-credentials - - # Whether to include the WebLogic server stdout in the pod's stdout, default is true - includeServerOutInPodLog: true - - # Whether to enable overriding your log file location, see also 'logHome' - #logHomeEnabled: false - - # The location for domain log, server logs, server out, and Node Manager log files - # see also 'logHomeEnabled', 'volumes', and 'volumeMounts'. - #logHome: /shared/logs/sample-domain1 - - # Set which WebLogic servers the Operator will start - # - "NEVER" will not start any server in the domain - # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) - # - "IF_NEEDED" will start all non-clustered servers, including the administration server, and clustered servers up to their replica count. - serverStartPolicy: "IF_NEEDED" - - # Settings for all server pods in the domain including the introspector job pod - serverPod: - # Optional new or overridden environment variables for the domain's pods - # - This sample uses CUSTOM_DOMAIN_NAME in its image model file - # to set the Weblogic domain name - env: - - name: CUSTOM_DOMAIN_NAME - value: "domain1" - - name: JAVA_OPTIONS - value: "-Dweblogic.StdoutDebugEnabled=false" - - name: USER_MEM_ARGS - value: "-XX:+UseContainerSupport -Djava.security.egd=file:/dev/./urandom " - - # Optional volumes and mounts for the domain's pods. See also 'logHome'. - #volumes: - #- name: weblogic-domain-storage-volume - # persistentVolumeClaim: - # claimName: sample-domain1-weblogic-sample-pvc - #volumeMounts: - #- mountPath: /shared - # name: weblogic-domain-storage-volume - - # The desired behavior for starting the domain's administration server. - adminServer: - # The serverStartState legal values are "RUNNING" or "ADMIN" - # "RUNNING" means the listed server will be started up to "RUNNING" mode - # "ADMIN" means the listed server will be start up to "ADMIN" mode - serverStartState: "RUNNING" - # Setup a Kubernetes node port for the administration server default channel - #adminService: - # channels: - # - channelName: default - # nodePort: 30701 - - # The number of managed servers to start for unlisted clusters - replicas: 1 - - # The desired behavior for starting a specific cluster's member servers - clusters: - - clusterName: cluster-1 - serverStartState: "RUNNING" - replicas: 2 - - # Change the restartVersion to force the introspector job to rerun - # and apply any new model configuration, to also force a subsequent - # roll of your domain's WebLogic pods. - restartVersion: '1' - - configuration: - - # Settings for domainHomeSourceType 'FromModel' - model: - # Valid model domain types are 'WLS', 'JRF', and 'RestrictedJRF', default is 'WLS' - domainType: "JRF" - - # Optional configmap for additional models and variable files - #configMap: sample-domain1-wdt-config-map - - # All 'FromModel' domains require a runtimeEncryptionSecret with a 'password' field - runtimeEncryptionSecret: sample-domain1-runtime-encryption-secret - - # Secrets that are referenced by model yaml macros - # (the model yaml in the optional configMap or in the image) - secrets: - #- sample-domain1-datasource-secret - - sample-domain1-rcu-access - - # Increase the introspector job active timeout value for JRF use cases - introspectorJobActiveDeadlineSeconds: 300 - - opss: - - # Name of secret with walletPassword for extracting the wallet, used for JRF domains - walletPasswordSecret: sample-domain1-opss-wallet-password-secret - - # Name of secret with walletFile containing base64 encoded opss wallet, used for JRF domains - #walletFileSecret: sample-domain1-opss-walletfile-secret - ``` - {{% /expand%}} - - - Run the following command to create the domain custom resource: - - ``` - $ kubectl apply -f /tmp/mii-sample/domain-resources/WLS/mii-initial-d1-WLS-v1.yaml - ``` - - > Note: If you are choosing not to use the predefined domain resource YAML file and instead created your own domain resource file earlier, then substitute your custom file name in the above command. You might recall that we suggested naming it `/tmp/mii-sample/mii-initial.yaml`. - - If you run `kubectl get pods -n sample-domain1-ns --watch`, then you should see the introspector job run and your WebLogic Server pods start. The output should look something like this: - - {{%expand "Click here to expand." %}} - ``` - $ kubectl get pods -n sample-domain1-ns --watch - NAME READY STATUS RESTARTS AGE - sample-domain1-introspect-domain-job-lqqj9 0/1 Pending 0 0s - sample-domain1-introspect-domain-job-lqqj9 0/1 ContainerCreating 0 0s - sample-domain1-introspect-domain-job-lqqj9 1/1 Running 0 1s - sample-domain1-introspect-domain-job-lqqj9 0/1 Completed 0 65s - sample-domain1-introspect-domain-job-lqqj9 0/1 Terminating 0 65s - sample-domain1-admin-server 0/1 Pending 0 0s - sample-domain1-admin-server 0/1 ContainerCreating 0 0s - sample-domain1-admin-server 0/1 Running 0 1s - sample-domain1-admin-server 1/1 Running 0 32s - sample-domain1-managed-server1 0/1 Pending 0 0s - sample-domain1-managed-server2 0/1 Pending 0 0s - sample-domain1-managed-server1 0/1 ContainerCreating 0 0s - sample-domain1-managed-server2 0/1 ContainerCreating 0 0s - sample-domain1-managed-server1 0/1 Running 0 2s - sample-domain1-managed-server2 0/1 Running 0 2s - sample-domain1-managed-server1 1/1 Running 0 43s - sample-domain1-managed-server2 1/1 Running 0 42s - ``` - {{% /expand%}} - -Alternatively, you can run `/tmp/mii-sample/utils/wl-pod-wait.sh -p 3`. This is a utility script that provides useful information about a domain's pods and waits for them to reach a `ready` state, reach their target `restartVersion`, and reach their target `image` before exiting. - - {{%expand "Click here to expand the `wl-pod-wait.sh` usage." %}} - ``` - $ ./wl-pod-wait.sh -? - - Usage: - - wl-pod-wait.sh [-n mynamespace] [-d mydomainuid] \ - [-p expected_pod_count] \ - [-t timeout_secs] \ - [-q] - - Exits non-zero if 'timeout_secs' is reached before 'pod_count' is reached. - - Parameters: - - -d : Defaults to 'sample-domain1'. - - -n : Defaults to 'sample-domain1-ns'. - - pod_count > 0 : Wait until exactly 'pod_count' WebLogic server pods for - a domain all (a) are ready, (b) have the same - 'domainRestartVersion' label value as the - current domain resource's 'spec.restartVersion, and - (c) have the same image as the current domain - resource's image. - - pod_count = 0 : Wait until there are no running WebLogic server pods - for a domain. The default. - - -t : Timeout in seconds. Defaults to '600'. - - -q : Quiet mode. Show only a count of wl pods that - have reached the desired criteria. - - -? : This help. - ``` - {{% /expand%}} - - {{%expand "Click here to expand sample output from `wl-pod-wait.sh`." %}} - ``` - @@ [2020-04-30T13:50:42][seconds=0] Info: Waiting up to 600 seconds for exactly '3' WebLogic server pods to reach the following criteria: - @@ [2020-04-30T13:50:42][seconds=0] Info: ready='true' - @@ [2020-04-30T13:50:42][seconds=0] Info: image='model-in-image:WLS-v1' - @@ [2020-04-30T13:50:42][seconds=0] Info: domainRestartVersion='1' - @@ [2020-04-30T13:50:42][seconds=0] Info: namespace='sample-domain1-ns' - @@ [2020-04-30T13:50:42][seconds=0] Info: domainUID='sample-domain1' - - @@ [2020-04-30T13:50:42][seconds=0] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:50:42][seconds=0] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------------------- ------- ----- ----- --------- - 'sample-domain1-introspect-domain-job-rkdkg' '' '' '' 'Pending' - - @@ [2020-04-30T13:50:45][seconds=3] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:50:45][seconds=3] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------------------- ------- ----- ----- --------- - 'sample-domain1-introspect-domain-job-rkdkg' '' '' '' 'Running' - - - @@ [2020-04-30T13:51:50][seconds=68] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:51:50][seconds=68] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - ---- ------- ----- ----- ----- - - @@ [2020-04-30T13:51:59][seconds=77] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:51:59][seconds=77] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - ----------------------------- ------- ----------------------- ------- --------- - 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'false' 'Pending' - - @@ [2020-04-30T13:52:02][seconds=80] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:52:02][seconds=80] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - ----------------------------- ------- ----------------------- ------- --------- - 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'false' 'Running' - - @@ [2020-04-30T13:52:32][seconds=110] Info: '1' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:52:32][seconds=110] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------- --------- - 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'false' 'Pending' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'false' 'Pending' - - @@ [2020-04-30T13:52:34][seconds=112] Info: '1' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:52:34][seconds=112] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------- --------- - 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'false' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'false' 'Running' - - @@ [2020-04-30T13:53:14][seconds=152] Info: '3' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:53:14][seconds=152] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------ --------- - 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - - @@ [2020-04-30T13:53:14][seconds=152] Info: Success! - - ``` - {{% /expand%}} - - -If you see an error, then consult [Debugging]({{< relref "/userguide/managing-domains/model-in-image/debugging.md" >}}) in the Model in Image user guide. - -#### Invoke the web application - -Now that all the initial use case resources have been deployed, you can invoke the sample web application through the Traefik ingress controller's NodePort. Note: The web application will display a list of any data sources it finds, but we don't expect it to find any because the model doesn't contain any at this point. - -Send a web application request to the load balancer: - - ``` - $ curl -s -S -m 10 -H 'host: sample-domain1-cluster-cluster-1.mii-sample.org' \ - http://localhost:30305/myapp_war/index.jsp - ``` -Or, if Traefik is unavailable and your Administration Server pod is running, you can use `kubectl exec`: - - ``` - $ kubectl exec -n sample-domain1-ns sample-domain1-admin-server -- bash -c \ - "curl -s -S -m 10 http://sample-domain1-cluster-cluster-1:8001/myapp_war/index.jsp" - ``` - -You should see output like the following: - - ``` - $ curl -s -S -m 10 -H 'host: sample-domain1-cluster-cluster-1.mii-sample.org' \ - http://localhost:30305/myapp_war/index.jsp - -
-  *****************************************************************
-
-  Hello World! This is version 'v1' of the mii-sample JSP web-app.
-
-  Welcome to WebLogic server 'managed-server2'!
-
-   domain UID  = 'sample-domain1'
-   domain name = 'domain1'
-
-  Found 1 local cluster runtime:
-    Cluster 'cluster-1'
-
-  Found 0 local data sources:
-
-  *****************************************************************
-  
- ``` - - **Note**: If you're running your `curl` commands on a remote machine, then substitute `localhost` with an external address suitable for contacting your Kubernetes cluster. A Kubernetes cluster address that often works can be obtained by using the address just after `https://` in the KubeDNS line of the output from the `kubectl cluster-info` command. - - If you want to continue to the next use case, then leave your domain running. - -### Update1 use case - -This use case demonstrates dynamically adding a data source to your running domain. It demonstrates several features of WDT and Model in Image: - -- The syntax used for updating a model is exactly the same syntax you use for creating the original model. -- A domain's model can be updated dynamically by supplying a model update in a file in a Kubernetes ConfigMap. -- Model updates can be as simple as changing the value of a single attribute, or more complex, such as adding a JMS Server. - -For a detailed discussion of model updates, see [Runtime Updates]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates.md" >}}) in the Model in Image user guide. - -{{% notice warning %}} -The operator does not support all possible dynamic model updates. For model update limitations, consult [Runtime Updates]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates.md" >}}) in the Model in Image user docs, and carefully test any model update before attempting a dynamic update in production. -{{% /notice %}} - -Here are the steps: - -1. Ensure that you have a running domain. - - Make sure you have deployed the domain from the [Initial use case](#initial-use-case). - -1. Create a data source model YAML file. - - Create a WDT model snippet for a data source (or use the example provided). Make sure that its target is set to `cluster-1`, and that its initial capacity is set to `0`. - - The reason for the latter is to prevent the data source from causing a WebLogic Server startup failure if it can't find the database, which would be likely to happen because we haven't deployed one (unless you're using the `JRF` path through the sample). - - Here's an example data source model configuration that meets these criteria: - - - ``` - resources: - JDBCSystemResource: - mynewdatasource: - Target: 'cluster-1' - JdbcResource: - JDBCDataSourceParams: - JNDIName: [ - jdbc/mydatasource1, - jdbc/mydatasource2 - ] - GlobalTransactionsProtocol: TwoPhaseCommit - JDBCDriverParams: - DriverName: oracle.jdbc.xa.client.OracleXADataSource - URL: '@@SECRET:@@ENV:DOMAIN_UID@@-datasource-secret:url@@' - PasswordEncrypted: '@@SECRET:@@ENV:DOMAIN_UID@@-datasource-secret:password@@' - Properties: - user: - Value: 'sys as sysdba' - oracle.net.CONNECT_TIMEOUT: - Value: 5000 - oracle.jdbc.ReadTimeout: - Value: 30000 - JDBCConnectionPoolParams: - InitialCapacity: 0 - MaxCapacity: 1 - TestTableName: SQL ISVALID - TestConnectionsOnReserve: true - - ``` - - Place the above model snippet in a file named `/tmp/mii-sample/mydatasource.yaml` and then use it in the later step where we deploy the model ConfigMap, or alternatively, use the same data source that's provided in `/tmp/mii-sample/model-configmaps/datasource/model.20.datasource.yaml`. - -1. Create the data source secret. - - The data source references a new secret that needs to be created. Run the following commands to create the secret: - - ``` - $ kubectl -n sample-domain1-ns create secret generic \ - sample-domain1-datasource-secret \ - --from-literal=password=Oradoc_db1 \ - --from-literal=url=jdbc:oracle:thin:@oracle-db.default.svc.cluster.local:1521/devpdb.k8s - $ kubectl -n sample-domain1-ns label secret \ - sample-domain1-datasource-secret \ - weblogic.domainUID=sample-domain1 - ``` - - We name and label secrets using their associated domain UID for two reasons: - - To make it obvious which secret belongs to which domains. - - To make it easier to clean up a domain. Typical cleanup scripts use the `weblogic.domainUID` label as a convenience for finding all the resources associated with a domain. - - -1. Create a ConfigMap with the WDT model that contains the data source definition. - - Run the following commands: - - - ``` - $ kubectl -n sample-domain1-ns create configmap sample-domain1-wdt-config-map \ - --from-file=/tmp/mii-sample/model-configmaps/datasource - $ kubectl -n sample-domain1-ns label configmap sample-domain1-wdt-config-map \ - weblogic.domainUID=sample-domain1 - ``` - - - If you've created your own data source file, then substitute the file name in the `--from-file=` parameter (we suggested `/tmp/mii-sample/mydatasource.yaml` earlier). - - Note that the `-from-file=` parameter can reference a single file, in which case it puts the designated file in the ConfigMap, or it can reference a directory, in which case it populates the ConfigMap with all of the files in the designated directory. - - We name and label ConfigMap using their associated domain UID for two reasons: - - To make it obvious which ConfigMap belong to which domains. - - To make it easier to cleanup a domain. Typical cleanup scripts use the `weblogic.domainUID` label as a convenience for finding all resources associated with a domain. - -1. Update your domain resource to refer to the ConfigMap and secret. - - - Option 1: Update your current domain resource file from the "Initial" use case. - - Add the secret to its `spec.configuration.secrets` stanza: - - ``` - spec: - ... - configuration: - ... - secrets: - - sample-domain1-datasource-secret - ``` - (Leave any existing secrets in place.) - - - Change its `spec.configuration.model.configMap` to look like: - - ``` - spec: - ... - configuration: - ... - model: - ... - configMap: sample-domain1-wdt-config-map - ``` - - Apply your changed domain resource: - - ``` - $ kubectl apply -f your-domain-resource.yaml - ``` - - - Option 2: Use the updated domain resource file that is supplied with the sample: - - ``` - $ kubectl apply -f /tmp/miisample/domain-resources/mii-update1-d1-WLS-v1-ds.yaml - ``` - - -1. Restart ('roll') the domain. - - Now that the data source is deployed in a ConfigMap and its secret is also deployed, and we have applied an updated domain resource with its `spec.configuration.model.configMap` and `spec.configuration.secrets` referencing the ConfigMap and secret, let's tell the operator to roll the domain. - - When a model domain restarts, it will rerun its introspector job in order to regenerate its configuration, and it will also pass the configuration changes found by the introspector to each restarted server. - One way to cause a running domain to restart is to change the domain's `spec.restartVersion`. To do this: - - - Option 1: Edit your domain custom resource. - - Call `kubectl -n sample-domain1-ns edit domain sample-domain1`. - - Edit the value of the `spec.restartVersion` field and save. - - The field is a string; typically, you use a number in this field and increment it with each restart. - - - Option 2: Dynamically change your domain using `kubectl patch`. - - To get the current `restartVersion` call: - ``` - $ kubectl -n sample-domain1-ns get domain sample-domain1 '-o=jsonpath={.spec.restartVersion}' - ``` - - Choose a new restart version that's different from the current restart version. - - The field is a string; typically, you use a number in this field and increment it with each restart. - - - Use `kubectl patch` to set the new value. For example, assuming the new restart version is `2`: - ``` - $ kubectl -n sample-domain1-ns patch domain sample-domain1 --type=json '-p=[{"op": "replace", "path": "/spec/restartVersion", "value": "2" }]' - ``` - - Option 3: Use the sample helper script. - - Call `/tmp/mii-sample/utils/patch-restart-version.sh -n sample-domain1-ns -d sample-domain1`. - - This will perform the same `kubectl get` and `kubectl patch` commands as Option 2. - - -1. Wait for the roll to complete. - - Now that you've started a domain roll, you'll need to wait for it to complete if you want to verify that the data source was deployed. - - - One way to do this is to call `kubectl get pods -n sample-domain1-ns --watch` and wait for the pods to cycle back to their `ready` state. - - - Alternatively, you can run `/tmp/mii-sample/utils/wl-pod-wait.sh -p 3`. This is a utility script that provides useful information about a domain's pods and waits for them to reach a `ready` state, reach their target `restartVersion`, and reach their target `image` before exiting. - - {{%expand "Click here to expand the `wl-pod-wait.sh` usage." %}} - ``` - $ ./wl-pod-wait.sh -? - - Usage: - - wl-pod-wait.sh [-n mynamespace] [-d mydomainuid] \ - [-p expected_pod_count] \ - [-t timeout_secs] \ - [-q] - - Exits non-zero if 'timeout_secs' is reached before 'pod_count' is reached. - - Parameters: - - -d : Defaults to 'sample-domain1'. - - -n : Defaults to 'sample-domain1-ns'. - - pod_count > 0 : Wait until exactly 'pod_count' WebLogic server pods for - a domain all (a) are ready, (b) have the same - 'domainRestartVersion' label value as the - current domain resource's 'spec.restartVersion, and - (c) have the same image as the current domain - resource's image. - - pod_count = 0 : Wait until there are no running WebLogic server pods - for a domain. The default. - - -t : Timeout in seconds. Defaults to '600'. - - -q : Quiet mode. Show only a count of wl pods that - have reached the desired criteria. - - -? : This help. - ``` - {{% /expand%}} - - {{%expand "Click here to expand sample output from `wl-pod-wait.sh` that shows a rolling domain." %}} - ``` - @@ [2020-04-30T13:53:19][seconds=0] Info: Waiting up to 600 seconds for exactly '3' WebLogic server pods to reach the following criteria: - @@ [2020-04-30T13:53:19][seconds=0] Info: ready='true' - @@ [2020-04-30T13:53:19][seconds=0] Info: image='model-in-image:WLS-v1' - @@ [2020-04-30T13:53:19][seconds=0] Info: domainRestartVersion='2' - @@ [2020-04-30T13:53:19][seconds=0] Info: namespace='sample-domain1-ns' - @@ [2020-04-30T13:53:19][seconds=0] Info: domainUID='sample-domain1' - - @@ [2020-04-30T13:53:19][seconds=0] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:53:19][seconds=0] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------------------- ------- ----------------------- ------ --------- - 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-introspect-domain-job-wlkpr' '' '' '' 'Pending' - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:53:20][seconds=1] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:53:20][seconds=1] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------------------- ------- ----------------------- ------ --------- - 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-introspect-domain-job-wlkpr' '' '' '' 'Running' - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:54:18][seconds=59] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:54:18][seconds=59] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------------------- ------- ----------------------- ------ ----------- - 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-introspect-domain-job-wlkpr' '' '' '' 'Succeeded' - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:54:19][seconds=60] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:54:19][seconds=60] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------ --------- - 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:54:31][seconds=72] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:54:31][seconds=72] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------- --------- - 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'false' 'Running' - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:54:40][seconds=81] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:54:40][seconds=81] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------ --------- - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:54:52][seconds=93] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:54:52][seconds=93] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------ --------- - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:54:58][seconds=99] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:54:58][seconds=99] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------- --------- - 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'false' 'Pending' - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:55:00][seconds=101] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:55:00][seconds=101] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------- --------- - 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'false' 'Running' - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:55:12][seconds=113] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:55:12][seconds=113] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------- --------- - 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'false' 'Running' - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:55:24][seconds=125] Info: '0' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:55:24][seconds=125] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------- --------- - 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'false' 'Running' - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:55:33][seconds=134] Info: '1' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:55:33][seconds=134] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------ --------- - 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:55:34][seconds=135] Info: '1' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:55:34][seconds=135] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------- --------- - 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'false' 'Pending' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:55:40][seconds=141] Info: '1' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:55:40][seconds=141] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------ --------- - 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:55:44][seconds=145] Info: '1' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:55:44][seconds=145] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------- --------- - 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'false' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:56:25][seconds=186] Info: '2' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:56:25][seconds=186] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------ --------- - 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:56:26][seconds=187] Info: '2' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:56:26][seconds=187] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------- --------- - 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'false' 'Pending' - - @@ [2020-04-30T13:56:30][seconds=191] Info: '2' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:56:30][seconds=191] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------ --------- - 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' - - @@ [2020-04-30T13:56:34][seconds=195] Info: '2' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:56:34][seconds=195] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------- --------- - 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'false' 'Pending' - - @@ [2020-04-30T13:57:09][seconds=230] Info: '3' WebLogic pods currently match all criteria, expecting '3'. - @@ [2020-04-30T13:57:09][seconds=230] Info: Introspector and WebLogic pods with same namespace and domain-uid: - - NAME VERSION IMAGE READY PHASE - -------------------------------- ------- ----------------------- ------ --------- - 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' - 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'true' 'Running' - - - @@ [2020-04-30T13:57:09][seconds=230] Info: Success! - ``` - {{% /expand%}} - -1. After your domain is running, you can call the sample web application to determine if the data source was deployed. - - Send a web application request to the ingress controller: - - ``` - $ curl -s -S -m 10 -H 'host: sample-domain1-cluster-cluster-1.mii-sample.org' \ - http://localhost:30305/myapp_war/index.jsp - ``` - - Or, if Traefik is unavailable and your Administration Server pod is running, you can run `kubectl exec`: - - ``` - $ kubectl exec -n sample-domain1-ns sample-domain1-admin-server -- bash -c \ - "curl -s -S -m 10 http://sample-domain1-cluster-cluster-1:8001/myapp_war/index.jsp" - ``` - - You should see something like the following: - - {{%expand "Click here to see the expected web application output." %}} - - ``` - $ curl -s -S -m 10 -H 'host: sample-domain1-cluster-cluster-1.mii-sample.org' \ - http://localhost:30305/myapp_war/index.jsp - -
-   *****************************************************************
-
-   Hello World! This is version 'v1' of the mii-sample JSP web-app.
-
-   Welcome to WebLogic server 'managed-server1'!
-
-    domain UID  = 'sample-domain1'
-    domain name = 'domain1'
-
-   Found 1 local cluster runtime:
-     Cluster 'cluster-1'
-
-   Found 1 local data source:
-     Datasource 'mynewdatasource': State='Running'
-
-   *****************************************************************
-   
- - ``` - {{% /expand%}} - -If you see an error, then consult [Debugging]({{< relref "/userguide/managing-domains/model-in-image/debugging.md" >}}) in the Model in Image user guide. - -This completes the sample scenarios. - - -### Cleanup - -To remove the resources you have created in these samples: - -1. Delete the domain resources. - ``` - $ /tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/delete-domain/delete-weblogic-domain-resources.sh -d sample-domain1 - $ /tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/delete-domain/delete-weblogic-domain-resources.sh -d sample-domain2 - ``` - - This deletes the domain and any related resources that are labeled with the domain UID `sample-domain1` and `sample-domain2`. - - It leaves the namespace intact, the operator running, the load balancer running (if installed), and the database running (if installed). - - > **Note**: When you delete a domain, the operator should detect your domain deletion and shut down its pods. Wait for these pods to exit before deleting the operator that monitors the `sample-domain1-ns` namespace. You can monitor this process using the command `kubectl get pods -n sample-domain1-ns --watch` (`ctrl-c` to exit). - -2. If you set up the Traefik ingress controller: - - ``` - $ helm delete --purge traefik-operator - $ kubectl delete namespace traefik - ``` - -3. If you set up a database for `JRF`: - ``` - $ /tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-oracle-db-service/stop-db-service.sh - ``` - -4. Delete the operator and its namespace: - ``` - $ helm delete --purge sample-weblogic-operator - $ kubectl delete namespace sample-weblogic-operator-ns - ``` - -6. Delete the domain's namespace: - ``` - $ kubectl delete namespace sample-domain1-ns - ``` - -7. Delete the images you may have created in this sample: - ``` - $ docker image rm model-in-image:WLS-v1 - $ docker image rm model-in-image:WLS-v2 - $ docker image rm model-in-image:JRF-v1 - $ docker image rm model-in-image:JRF-v2 - ``` +Alternatively, if you have access to the local Docker image cache on each worker node in the cluster, then you can use a Docker command to save the image to a file, copy the image file to each worker node, and use a `docker` command to load the image file into the node's image cache. +For more information, see the [Cannot pull image FAQ]({{}}). ### References diff --git a/docs-source/content/samples/simple/domains/model-in-image/cleanup.md b/docs-source/content/samples/simple/domains/model-in-image/cleanup.md new file mode 100644 index 00000000000..bd3a74fc7c5 --- /dev/null +++ b/docs-source/content/samples/simple/domains/model-in-image/cleanup.md @@ -0,0 +1,50 @@ +--- +title: "Cleanup" +date: 2019-02-23T17:32:31-05:00 +weight: 6 +--- + +To remove the resources you have created in these samples: + +1. Delete the resources associated with the domain. + ``` + $ /tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/delete-domain/delete-weblogic-domain-resources.sh -d sample-domain1 + $ /tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/delete-domain/delete-weblogic-domain-resources.sh -d sample-domain2 + ``` + + This deletes the domain and any related resources that are labeled with the domain UID `sample-domain1` and `sample-domain2`. + + It leaves the namespace intact, the operator running, the load balancer running (if installed), and the database running (if installed). + + > **Note**: When you delete a domain, the operator will detect your domain deletion and shut down its pods. Wait for these pods to exit before deleting the operator that monitors the `sample-domain1-ns` namespace. You can monitor this process using the command `kubectl get pods -n sample-domain1-ns --watch` (`ctrl-c` to exit). + +2. If you set up the Traefik ingress controller: + + ``` + $ helm delete --purge traefik-operator + $ kubectl delete namespace traefik + ``` + +3. If you set up a database for `JRF`: + ``` + $ /tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-oracle-db-service/stop-db-service.sh + ``` + +4. Delete the operator and its namespace: + ``` + $ helm delete --purge sample-weblogic-operator + $ kubectl delete namespace sample-weblogic-operator-ns + ``` + +6. Delete the domain's namespace: + ``` + $ kubectl delete namespace sample-domain1-ns + ``` + +7. Delete the images you may have created in this sample: + ``` + $ docker image rm model-in-image:WLS-v1 + $ docker image rm model-in-image:WLS-v2 + $ docker image rm model-in-image:JRF-v1 + $ docker image rm model-in-image:JRF-v2 + ``` diff --git a/docs-source/content/samples/simple/domains/model-in-image/initial.md b/docs-source/content/samples/simple/domains/model-in-image/initial.md new file mode 100644 index 00000000000..19354315502 --- /dev/null +++ b/docs-source/content/samples/simple/domains/model-in-image/initial.md @@ -0,0 +1,842 @@ +--- +title: "Initial use case" +date: 2019-02-23T17:32:31-05:00 +weight: 2 +--- + +#### Contents + + - [Overview](#overview) + - Image creation + - [Image creation - Introduction](#image-creation---introduction) + - [Understanding your first archive](#understanding-your-first-archive) + - [Staging a ZIP file of the archive](#staging-a-zip-file-of-the-archive) + - [Staging model files](#staging-model-files) + - [Creating the image with WIT](#creating-the-image-with-wit) + - Deploy resources + - [Deploy resources - Introduction](#deploy-resources---introduction) + - [Secrets](#secrets) + - [Domain resource](#domain-resource) + +#### Overview + +In this use case, you set up an initial WebLogic domain. This involves: + + - A WDT archive ZIP file that contains your applications. + - A WDT model that describes your WebLogic configuration. + - A Docker image that contains your WDT model files and archive. + - Creating secrets for the domain. + - Creating a Domain YAML for the domain that references your Secrets and image. + +After the Domain is deployed, the operator starts an 'introspector job' that converts your models into a WebLogic configuration, and then passes this configuration to each WebLogic Server in the domain. + +{{% notice note %}} +Perform the steps in [Prerequisites for all domain types]({{< relref "/samples/simple/domains/model-in-image/prerequisites.md" >}}) before performing the steps in this use case. +If you are taking the `JRF` path through the sample, then substitute `JRF` for `WLS` in your image names and directory paths. Also note that the JRF-v1 model YAML file differs from the WLS-v1 YAML file (it contains an additional `domainInfo -> RCUDbInfo` stanza). +{{% /notice %}} + +#### Image creation - Introduction + +The goal of the initial use case 'image creation' is to demonstrate using the WebLogic Image Tool to create an image named `model-in-image:WLS-v1` from files that you will stage to `/tmp/mii-sample/model-images/model-in-image:WLS-v1/`. The staged files will contain a web application in a WDT archive, and WDT model configuration for a WebLogic Administration Server called `admin-server` and a WebLogic cluster called `cluster-1`. + +Overall, a Model in Image image must contain a WebLogic installation and a WebLogic Deploy Tooling installation in its `/u01/wdt/weblogic-deploy` directory. In addition, if you have WDT model archive files, then the image must also contain these files in its `/u01/wdt/models` directory. Finally, an image optionally may also contain your WDT model YAML file and properties files in the same `/u01/wdt/models` directory. If you do not specify a WDT model YAML file in your `/u01/wdt/models` directory, then the model YAML file must be supplied dynamically using a Kubernetes ConfigMap that is referenced by your Domain `spec.model.configMap` field. We provide an example of using a model ConfigMap later in this sample. + +Here are the steps for creating the image `model-in-image:WLS-v1`: + +- [Understanding your first archive](#understanding-your-first-archive) +- [Staging a ZIP file of the archive](#staging-a-zip-file-of-the-archive) +- [Staging model files](#staging-model-files) +- [Creating the image with WIT](#creating-the-image-with-wit) + +#### Understanding your first archive + +The sample includes a predefined archive directory in `/tmp/mii-sample/archives/archive-v1` that you will use to create an archive ZIP file for the image. + +The archive top directory, named `wlsdeploy`, contains a directory named `applications`, which includes an 'exploded' sample JSP web application in the directory, `myapp-v1`. Three useful aspects to remember about WDT archives are: + - A model image can contain multiple WDT archives. + - WDT archives can contain multiple applications, libraries, and other components. + - WDT archives have a [well defined directory structure](https://github.com/oracle/weblogic-deploy-tooling/blob/master/site/archive.md), which always has `wlsdeploy` as the top directory. + +{{%expand "If you are interested in the web application source, click here to see the JSP code." %}} + +``` +<%-- Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. --%> +<%-- Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. --%> +<%@ page import="javax.naming.InitialContext" %> +<%@ page import="javax.management.*" %> +<%@ page import="java.io.*" %> +<% + InitialContext ic = null; + try { + ic = new InitialContext(); + + String srName=System.getProperty("weblogic.Name"); + String domainUID=System.getenv("DOMAIN_UID"); + String domainName=System.getenv("CUSTOM_DOMAIN_NAME"); + + out.println("
");
+    out.println("*****************************************************************");
+    out.println();
+    out.println("Hello World! This is version 'v1' of the mii-sample JSP web-app.");
+    out.println();
+    out.println("Welcome to WebLogic Server '" + srName + "'!");
+    out.println();
+    out.println(" domain UID  = '" + domainUID +"'");
+    out.println(" domain name = '" + domainName +"'");
+    out.println();
+
+    MBeanServer mbs = (MBeanServer)ic.lookup("java:comp/env/jmx/runtime");
+
+    // display the current server's cluster name
+    Set clusterRuntimes = mbs.queryMBeans(new ObjectName("*:Type=ClusterRuntime,*"), null);
+    out.println("Found " + clusterRuntimes.size() + " local cluster runtime" + (String)((clusterRuntimes.size()!=1)?"s:":":"));
+    for (ObjectInstance clusterRuntime : clusterRuntimes) {
+       String cName = (String)mbs.getAttribute(clusterRuntime.getObjectName(), "Name");
+       out.println("  Cluster '" + cName + "'");
+    }
+    out.println();
+
+
+    // display local data sources
+    ObjectName jdbcRuntime = new ObjectName("com.bea:ServerRuntime=" + srName + ",Name=" + srName + ",Type=JDBCServiceRuntime");
+    ObjectName[] dataSources = (ObjectName[])mbs.getAttribute(jdbcRuntime, "JDBCDataSourceRuntimeMBeans");
+    out.println("Found " + dataSources.length + " local data source" + (String)((dataSources.length!=1)?"s:":":"));
+    for (ObjectName dataSource : dataSources) {
+       String dsName  = (String)mbs.getAttribute(dataSource, "Name");
+       String dsState = (String)mbs.getAttribute(dataSource, "State");
+       out.println("  Datasource '" + dsName + "': State='" + dsState +"'");
+    }
+    out.println();
+
+    out.println("*****************************************************************");
+
+  } catch (Throwable t) {
+    t.printStackTrace(new PrintStream(response.getOutputStream()));
+  } finally {
+    out.println("
"); + if (ic != null) ic.close(); + } +%> +``` +{{% /expand %}} + +The application displays important details about the WebLogic Server instance that it's running on: namely its domain name, cluster name, and server name, as well as the names of any data sources that are targeted to the server. Also, you can see that application output reports that it's at version `v1`; you will update this to `v2` in a later use case that demonstrates upgrading the application. + +#### Staging a ZIP file of the archive + +When you create the image, you will use the files in the staging directory, `/tmp/mii-sample/model-in-image__WLS-v1`. In preparation, you need it to contain a ZIP file of the WDT application archive. + +Run the following commands to create your application archive ZIP file and put it in the expected directory: + +``` +# Delete existing archive.zip in case we have an old leftover version +$ rm -f /tmp/mii-sample/model-images/model-in-image__WLS-v1/archive.zip + +# Move to the directory which contains the source files for our archive +$ cd /tmp/mii-sample/archives/archive-v1 + +# Zip the archive to the location will later use when we run the WebLogic Image Tool +$ zip -r /tmp/mii-sample/model-images/model-in-image__WLS-v1/archive.zip wlsdeploy +``` + +#### Staging model files + +In this step, you explore the staged WDT model YAML file and properties in the `/tmp/mii-sample/model-in-image__WLS-v1` directory. The model in this directory references the web application in your archive, configures a WebLogic Server Administration Server, and configures a WebLogic cluster. It consists of only two files, `model.10.properties`, a file with a single property, and, `model.10.yaml`, a YAML file with your WebLogic configuration `model.10.yaml`. + +``` +CLUSTER_SIZE=5 +``` + +Here is the WLS `model.10.yaml`: + +``` +domainInfo: + AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' + AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' + ServerStartMode: 'prod' + +topology: + Name: '@@ENV:CUSTOM_DOMAIN_NAME@@' + AdminServerName: 'admin-server' + Cluster: + 'cluster-1': + DynamicServers: + ServerTemplate: 'cluster-1-template' + ServerNamePrefix: 'managed-server' + DynamicClusterSize: '@@PROP:CLUSTER_SIZE@@' + MaxDynamicClusterSize: '@@PROP:CLUSTER_SIZE@@' + MinDynamicClusterSize: '0' + CalculatedListenPorts: false + Server: + 'admin-server': + ListenPort: 7001 + ServerTemplate: + 'cluster-1-template': + Cluster: 'cluster-1' + ListenPort: 8001 + +appDeployments: + Application: + myapp: + SourcePath: 'wlsdeploy/applications/myapp-v1' + ModuleType: ear + Target: 'cluster-1' +``` + + +{{%expand "Click here to view the JRF `model.10.yaml`, and note the `RCUDbInfo` stanza and its references to a `DOMAIN_UID-rcu-access` secret." %}} + +``` +domainInfo: + AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' + AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' + ServerStartMode: 'prod' + RCUDbInfo: + rcu_prefix: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_prefix@@' + rcu_schema_password: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_schema_password@@' + rcu_db_conn_string: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_db_conn_string@@' + +topology: + AdminServerName: 'admin-server' + Name: '@@ENV:CUSTOM_DOMAIN_NAME@@' + Cluster: + 'cluster-1': + Server: + 'admin-server': + ListenPort: 7001 + 'managed-server1-c1-': + Cluster: 'cluster-1' + ListenPort: 8001 + 'managed-server2-c1-': + Cluster: 'cluster-1' + ListenPort: 8001 + 'managed-server3-c1-': + Cluster: 'cluster-1' + ListenPort: 8001 + 'managed-server4-c1-': + Cluster: 'cluster-1' + ListenPort: 8001 + +appDeployments: + Application: + myapp: + SourcePath: 'wlsdeploy/applications/myapp-v1' + ModuleType: ear + Target: 'cluster-1' +``` +{{% /expand %}} + + +The model files: + +- Define a WebLogic domain with: + - Cluster `cluster-1` + - Administration Server `admin-server` + - A `cluster-1` targeted `ear` application that's located in the WDT archive ZIP file at `wlsdeploy/applications/myapp-v1` + +- Leverage macros to inject external values: + - The property file `CLUSTER_SIZE` property is referenced in the model YAML file `DynamicClusterSize` and `MaxDynamicClusterSize` fields using a PROP macro. + - The model file domain name is injected using a custom environment variable named `CUSTOM_DOMAIN_NAME` using an ENV macro. + - You set this environment variable later in this sample using an `env` field in its Domain. + - _This conveniently provides a simple way to deploy multiple differently named domains using the same model image._ + - The model file administrator user name and password are set using a `weblogic-credentials` secret macro reference to the WebLogic credential secret. + - This secret is in turn referenced using the `webLogicCredentialsSecret` field in the Domain. + - The `weblogic-credentials` is a reserved name that always dereferences to the owning Domain actual WebLogic credentials secret name. + +A Model in Image image can contain multiple properties files, archive ZIP files, and YAML files but in this sample you use just one of each. For a complete discussion of Model in Images model file naming conventions, file loading order, and macro syntax, see [Model files]({{< relref "/userguide/managing-domains/model-in-image/model-files.md" >}}) in the Model in Image user documentation. + + +#### Creating the image with WIT + +> **Note**: If you are using JRF in this sample, substitute `JRF` for each occurrence of `WLS` in the `imagetool` command line below, plus substitute `container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.4` for the `--fromImage` value. + +At this point, you have staged all of the files needed for image `model-in-image:WLS-v1`; they include: + + - `/tmp/mii-sample/model-images/weblogic-deploy.zip` + - `/tmp/mii-sample/model-images/model-in-image__WLS-v1/model.10.yaml` + - `/tmp/mii-sample/model-images/model-in-image__WLS-v1/model.10.properties` + - `/tmp/mii-sample/model-images/model-in-image__WLS-v1/archive.zip` + +If you don't see the `weblogic-deploy.zip` file, then you missed a step in the [prerequisites]({{< relref "/samples/simple/domains/model-in-image/prerequisites.md" >}}). + +Now, you use the Image Tool to create an image named `model-in-image:WLS-v1` that's layered on a base WebLogic image. You've already set up this tool during the prerequisite steps. + +Run the following commands to create the model image and verify that it worked: + + ``` + $ cd /tmp/mii-sample/model-images + $ ./imagetool/bin/imagetool.sh update \ + --tag model-in-image:WLS-v1 \ + --fromImage container-registry.oracle.com/middleware/weblogic:12.2.1.4 \ + --wdtModel ./model-in-image__WLS-v1/model.10.yaml \ + --wdtVariables ./model-in-image__WLS-v1/model.10.properties \ + --wdtArchive ./model-in-image__WLS-v1/archive.zip \ + --wdtModelOnly \ + --wdtDomainType WLS + ``` + +If you don't see the `imagetool` directory, then you missed a step in the [prerequisites]({{< relref "/samples/simple/domains/model-in-image/prerequisites.md" >}}). + +This command runs the WebLogic Image Tool in its Model in Image mode, and does the following: + + - Builds the final Docker image as a layer on the `container-registry.oracle.com/middleware/weblogic:12.2.1.4` base image. + - Copies the WDT ZIP file that's referenced in the WIT cache into the image. + - Note that you cached WDT in WIT using the keyword `latest` when you set up the cache during the sample prerequisites steps. + - This lets WIT implicitly assume it's the desired WDT version and removes the need to pass a `-wdtVersion` flag. + - Copies the specified WDT model, properties, and application archives to image location `/u01/wdt/models`. + +When the command succeeds, it should end with output like the following: + + ``` + [INFO ] Build successful. Build time=36s. Image tag=model-in-image:WLS-v1 + ``` + +Also, if you run the `docker images` command, then you will see a Docker image named `model-in-image:WLS-v1`. + +> Note: If you have Kubernetes cluster worker nodes that are remote to your local machine, then you need to put the image in a location that these nodes can access. See [Ensuring your Kubernetes cluster can access images](#ensuring-your-kubernetes-cluster-can-access-images). + +#### Deploy resources - Introduction + +In this section, you will deploy the new image to namespace `sample-domain1-ns`, including the following steps: + + - Create a Secret containing your WebLogic administrator user name and password. + - Create a Secret containing your Model in Image runtime encryption password: + - All Model in Image domains must supply a runtime encryption Secret with a `password` value. + - It is used to encrypt configuration that is passed around internally by the operator. + - The value must be kept private but can be arbitrary; you can optionally supply a different secret value every time you restart the domain. + - If your domain type is `JRF`, create secrets containing your RCU access URL, credentials, and prefix. + - Deploy a Domain YAML file that references the new image. + - Wait for the domain's Pods to start and reach their ready state. + +#### Secrets + +First, create the secrets needed by both `WLS` and `JRF` type model domains. In this case, you have two secrets. + +Run the following `kubectl` commands to deploy the required secrets: + + ``` + $ kubectl -n sample-domain1-ns create secret generic \ + sample-domain1-weblogic-credentials \ + --from-literal=username=weblogic --from-literal=password=welcome1 + $ kubectl -n sample-domain1-ns label secret \ + sample-domain1-weblogic-credentials \ + weblogic.domainUID=sample-domain1 + + $ kubectl -n sample-domain1-ns create secret generic \ + sample-domain1-runtime-encryption-secret \ + --from-literal=password=my_runtime_password + $ kubectl -n sample-domain1-ns label secret \ + sample-domain1-runtime-encryption-secret \ + weblogic.domainUID=sample-domain1 + ``` + + Some important details about these secrets: + + - The WebLogic credentials secret: + - It is required and must contain `username` and `password` fields. + - It must be referenced by the `spec.webLogicCredentialsSecret` field in your Domain. + - It also must be referenced by macros in the `domainInfo.AdminUserName` and `domainInfo.AdminPassWord` fields in your model YAML file. + + - The Model WDT runtime secret: + - This is a special secret required by Model in Image. + - It must contain a `password` field. + - It must be referenced using the `spec.model.runtimeEncryptionSecret` field in its Domain. + - It must remain the same for as long as the domain is deployed to Kubernetes but can be changed between deployments. + - It is used to encrypt data as it's internally passed using log files from the domain's introspector job and on to its WebLogic Server pods. + + - Deleting and recreating the secrets: + - You delete a secret before creating it, otherwise the create command will fail if the secret already exists. + - This allows you to change the secret when using the `kubectl create secret` command. + + - You name and label secrets using their associated domain UID for two reasons: + - To make it obvious which secrets belong to which domains. + - To make it easier to clean up a domain. Typical cleanup scripts use the `weblogic.domainUID` label as a convenience for finding all resources associated with a domain. + + + If you're following the `JRF` path through the sample, then you also need to deploy the additional secret referenced by macros in the `JRF` model `RCUDbInfo` clause, plus an `OPSS` wallet password secret. For details about the uses of these secrets, see the [Model in Image]({{< relref "/userguide/managing-domains/model-in-image/_index.md" >}}) user documentation. + + {{%expand "Click here for the commands for deploying additional secrets for JRF." %}} + + ``` + $ kubectl -n sample-domain1-ns create secret generic \ + sample-domain1-rcu-access \ + --from-literal=rcu_prefix=FMW1 \ + --from-literal=rcu_schema_password=Oradoc_db1 \ + --from-literal=rcu_db_conn_string=oracle-db.default.svc.cluster.local:1521/devpdb.k8s + $ kubectl -n sample-domain1-ns label secret \ + sample-domain1-rcu-access \ + weblogic.domainUID=sample-domain1 + + $ kubectl -n sample-domain1-ns create secret generic \ + sample-domain1-opss-wallet-password-secret \ + --from-literal=walletPassword=welcome1 + $ kubectl -n sample-domain1-ns label secret \ + sample-domain1-opss-wallet-password-secret \ + weblogic.domainUID=sample-domain1 + ``` + + {{% /expand %}} + + +#### Domain resource + +Now, you create a Domain YAML file. A Domain is the key resource that tells the operator how to deploy a WebLogic domain. + +Copy the following to a file called `/tmp/mii-sample/mii-initial.yaml` or similar, or use the file `/tmp/mii-sample/domain-resources/WLS/mii-initial-d1-WLS-v1.yaml` that is included in the sample source. + + {{%expand "Click here to view the WLS Domain YAML file." %}} + ``` + # + # This is an example of how to define a Domain resource. + # + apiVersion: "weblogic.oracle/v8" + kind: Domain + metadata: + name: sample-domain1 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain1 + + spec: + # Set to 'FromModel' to indicate 'Model in Image'. + domainHomeSourceType: FromModel + + # The WebLogic Domain Home, this must be a location within + # the image for 'Model in Image' domains. + domainHome: /u01/domains/sample-domain1 + + # The WebLogic Server Docker image that the Operator uses to start the domain + image: "model-in-image:WLS-v1" + + # Defaults to "Always" if image tag (version) is ':latest' + imagePullPolicy: "IfNotPresent" + + # Identify which Secret contains the credentials for pulling an image + #imagePullSecrets: + #- name: regsecret + + # Identify which Secret contains the WebLogic Admin credentials, + # the secret must contain 'username' and 'password' fields. + webLogicCredentialsSecret: + name: sample-domain1-weblogic-credentials + + # Whether to include the WebLogic Server stdout in the pod's stdout, default is true + includeServerOutInPodLog: true + + # Whether to enable overriding your log file location, see also 'logHome' + #logHomeEnabled: false + + # The location for domain log, server logs, server out, and Node Manager log files + # see also 'logHomeEnabled', 'volumes', and 'volumeMounts'. + #logHome: /shared/logs/sample-domain1 + + # Set which WebLogic Servers the Operator will start + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server, and clustered servers up to their replica count. + serverStartPolicy: "IF_NEEDED" + + # Settings for all server pods in the domain including the introspector job pod + serverPod: + # Optional new or overridden environment variables for the domain's pods + # - This sample uses CUSTOM_DOMAIN_NAME in its image model file + # to set the Weblogic domain name + env: + - name: CUSTOM_DOMAIN_NAME + value: "domain1" + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: "-XX:+UseContainerSupport -Djava.security.egd=file:/dev/./urandom " + + # Optional volumes and mounts for the domain's pods. See also 'logHome'. + #volumes: + #- name: weblogic-domain-storage-volume + # persistentVolumeClaim: + # claimName: sample-domain1-weblogic-sample-pvc + #volumeMounts: + #- mountPath: /shared + # name: weblogic-domain-storage-volume + + # The desired behavior for starting the domain's administration server. + adminServer: + # The serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + # Setup a Kubernetes node port for the administration server default channel + #adminService: + # channels: + # - channelName: default + # nodePort: 30701 + + # The number of managed servers to start for unlisted clusters + replicas: 1 + + # The desired behavior for starting a specific cluster's member servers + clusters: + - clusterName: cluster-1 + serverStartState: "RUNNING" + replicas: 2 + + # Change the `restartVersion` to force the introspector job to rerun + # and apply any new model configuration, to also force a subsequent + # roll of your domain's WebLogic Server pods. + restartVersion: '1' + + configuration: + + # Settings for domainHomeSourceType 'FromModel' + model: + # Valid model domain types are 'WLS', 'JRF', and 'RestrictedJRF', default is 'WLS' + domainType: "WLS" + + # Optional configmap for additional models and variable files + #configMap: sample-domain1-wdt-config-map + + # All 'FromModel' domains require a runtimeEncryptionSecret with a 'password' field + runtimeEncryptionSecret: sample-domain1-runtime-encryption-secret + + # Secrets that are referenced by model yaml macros + # (the model yaml in the optional configMap or in the image) + #secrets: + #- sample-domain1-datasource-secret + ``` + {{% /expand %}} + + {{%expand "Click here to view the JRF Domain YAML file." %}} + ``` + # Copyright (c) 2020, Oracle Corporation and/or its affiliates. + # Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. + # + # This is an example of how to define a Domain resource. + # + apiVersion: "weblogic.oracle/v8" + kind: Domain + metadata: + name: sample-domain1 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain1 + + spec: + # Set to 'FromModel' to indicate 'Model in Image'. + domainHomeSourceType: FromModel + + # The WebLogic Domain Home, this must be a location within + # the image for 'Model in Image' domains. + domainHome: /u01/domains/sample-domain1 + + # The WebLogic Server Docker image that the Operator uses to start the domain + image: "model-in-image:JRF-v1" + + # Defaults to "Always" if image tag (version) is ':latest' + imagePullPolicy: "IfNotPresent" + + # Identify which Secret contains the credentials for pulling an image + #imagePullSecrets: + #- name: regsecret + + # Identify which Secret contains the WebLogic Admin credentials, + # the secret must contain 'username' and 'password' fields. + webLogicCredentialsSecret: + name: sample-domain1-weblogic-credentials + + # Whether to include the WebLogic Server stdout in the pod's stdout, default is true + includeServerOutInPodLog: true + + # Whether to enable overriding your log file location, see also 'logHome' + #logHomeEnabled: false + + # The location for domain log, server logs, server out, and Node Manager log files + # see also 'logHomeEnabled', 'volumes', and 'volumeMounts'. + #logHome: /shared/logs/sample-domain1 + + # Set which WebLogic Servers the Operator will start + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server, and clustered servers up to their replica count. + serverStartPolicy: "IF_NEEDED" + + # Settings for all server pods in the domain including the introspector job pod + serverPod: + # Optional new or overridden environment variables for the domain's pods + # - This sample uses CUSTOM_DOMAIN_NAME in its image model file + # to set the Weblogic domain name + env: + - name: CUSTOM_DOMAIN_NAME + value: "domain1" + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: "-XX:+UseContainerSupport -Djava.security.egd=file:/dev/./urandom " + + # Optional volumes and mounts for the domain's pods. See also 'logHome'. + #volumes: + #- name: weblogic-domain-storage-volume + # persistentVolumeClaim: + # claimName: sample-domain1-weblogic-sample-pvc + #volumeMounts: + #- mountPath: /shared + # name: weblogic-domain-storage-volume + + # The desired behavior for starting the domain's administration server. + adminServer: + # The serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + # Setup a Kubernetes node port for the administration server default channel + #adminService: + # channels: + # - channelName: default + # nodePort: 30701 + + # The number of managed servers to start for unlisted clusters + replicas: 1 + + # The desired behavior for starting a specific cluster's member servers + clusters: + - clusterName: cluster-1 + serverStartState: "RUNNING" + replicas: 2 + + # Change the restartVersion to force the introspector job to rerun + # and apply any new model configuration, to also force a subsequent + # roll of your domain's WebLogic Server pods. + restartVersion: '1' + + configuration: + + # Settings for domainHomeSourceType 'FromModel' + model: + # Valid model domain types are 'WLS', 'JRF', and 'RestrictedJRF', default is 'WLS' + domainType: "JRF" + + # Optional configmap for additional models and variable files + #configMap: sample-domain1-wdt-config-map + + # All 'FromModel' domains require a runtimeEncryptionSecret with a 'password' field + runtimeEncryptionSecret: sample-domain1-runtime-encryption-secret + + # Secrets that are referenced by model yaml macros + # (the model yaml in the optional configMap or in the image) + secrets: + #- sample-domain1-datasource-secret + - sample-domain1-rcu-access + + # Increase the introspector job active timeout value for JRF use cases + introspectorJobActiveDeadlineSeconds: 300 + + opss: + + # Name of secret with walletPassword for extracting the wallet, used for JRF domains + walletPasswordSecret: sample-domain1-opss-wallet-password-secret + + # Name of secret with walletFile containing base64 encoded opss wallet, used for JRF domains + #walletFileSecret: sample-domain1-opss-walletfile-secret + ``` + {{% /expand %}} + + > **Note**: Before you deploy the domain custom resource, determine if you have Kubernetes cluster worker nodes that are remote to your local machine. If so, you need to put the Domain's image in a location that these nodes can access and you may also need to modify your Domain YAML file to reference the new location. See [Ensuring your Kubernetes cluster can access images]({{< relref "/samples/simple/domains/model-in-image/_index.md#ensuring-your-kubernetes-cluster-can-access-images" >}}). + + Run the following command to create the domain custom resource: + + ``` + $ kubectl apply -f /tmp/mii-sample/domain-resources/WLS/mii-initial-d1-WLS-v1.yaml + ``` + + > Note: If you are choosing _not_ to use the predefined Domain YAML file and instead created your own Domain YAML file earlier, then substitute your custom file name in the above command. Previously, we suggested naming it `/tmp/mii-sample/mii-initial.yaml`. + + If you run `kubectl get pods -n sample-domain1-ns --watch`, then you will see the introspector job run and your WebLogic Server pods start. The output will look something like this: + + {{%expand "Click here to expand." %}} + ``` + $ kubectl get pods -n sample-domain1-ns --watch + NAME READY STATUS RESTARTS AGE + sample-domain1-introspect-domain-job-lqqj9 0/1 Pending 0 0s + sample-domain1-introspect-domain-job-lqqj9 0/1 ContainerCreating 0 0s + sample-domain1-introspect-domain-job-lqqj9 1/1 Running 0 1s + sample-domain1-introspect-domain-job-lqqj9 0/1 Completed 0 65s + sample-domain1-introspect-domain-job-lqqj9 0/1 Terminating 0 65s + sample-domain1-admin-server 0/1 Pending 0 0s + sample-domain1-admin-server 0/1 ContainerCreating 0 0s + sample-domain1-admin-server 0/1 Running 0 1s + sample-domain1-admin-server 1/1 Running 0 32s + sample-domain1-managed-server1 0/1 Pending 0 0s + sample-domain1-managed-server2 0/1 Pending 0 0s + sample-domain1-managed-server1 0/1 ContainerCreating 0 0s + sample-domain1-managed-server2 0/1 ContainerCreating 0 0s + sample-domain1-managed-server1 0/1 Running 0 2s + sample-domain1-managed-server2 0/1 Running 0 2s + sample-domain1-managed-server1 1/1 Running 0 43s + sample-domain1-managed-server2 1/1 Running 0 42s + ``` + {{% /expand %}} + +Alternatively, you can run `/tmp/mii-sample/utils/wl-pod-wait.sh -p 3`. This is a utility script that provides useful information about a domain's pods and waits for them to reach a `ready` state, reach their target `restartVersion`, and reach their target `image` before exiting. + + {{%expand "Click here to display the `wl-pod-wait.sh` usage." %}} + ``` + $ ./wl-pod-wait.sh -? + + Usage: + + wl-pod-wait.sh [-n mynamespace] [-d mydomainuid] \ + [-p expected_pod_count] \ + [-t timeout_secs] \ + [-q] + + Exits non-zero if 'timeout_secs' is reached before 'pod_count' is reached. + + Parameters: + + -d : Defaults to 'sample-domain1'. + + -n : Defaults to 'sample-domain1-ns'. + + pod_count > 0 : Wait until exactly 'pod_count' WebLogic Server pods for + a domain all (a) are ready, (b) have the same + 'domainRestartVersion' label value as the + current Domain's 'spec.restartVersion, and + (c) have the same image as the current Domain's + image. + + pod_count = 0 : Wait until there are no running WebLogic Server pods + for a domain. The default. + + -t : Timeout in seconds. Defaults to '1000'. + + -q : Quiet mode. Show only a count of wl pods that + have reached the desired criteria. + + -? : This help. + ``` + {{% /expand %}} + + {{%expand "Click here to view sample output from `wl-pod-wait.sh`." %}} + ``` + @@ [2020-04-30T13:50:42][seconds=0] Info: Waiting up to 1000 seconds for exactly '3' WebLogic Server pods to reach the following criteria: + @@ [2020-04-30T13:50:42][seconds=0] Info: ready='true' + @@ [2020-04-30T13:50:42][seconds=0] Info: image='model-in-image:WLS-v1' + @@ [2020-04-30T13:50:42][seconds=0] Info: domainRestartVersion='1' + @@ [2020-04-30T13:50:42][seconds=0] Info: namespace='sample-domain1-ns' + @@ [2020-04-30T13:50:42][seconds=0] Info: domainUID='sample-domain1' + + @@ [2020-04-30T13:50:42][seconds=0] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:50:42][seconds=0] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------------------- ------- ----- ----- --------- + 'sample-domain1-introspect-domain-job-rkdkg' '' '' '' 'Pending' + + @@ [2020-04-30T13:50:45][seconds=3] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:50:45][seconds=3] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------------------- ------- ----- ----- --------- + 'sample-domain1-introspect-domain-job-rkdkg' '' '' '' 'Running' + + + @@ [2020-04-30T13:51:50][seconds=68] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:51:50][seconds=68] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + ---- ------- ----- ----- ----- + + @@ [2020-04-30T13:51:59][seconds=77] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:51:59][seconds=77] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + ----------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'false' 'Pending' + + @@ [2020-04-30T13:52:02][seconds=80] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:52:02][seconds=80] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + ----------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'false' 'Running' + + @@ [2020-04-30T13:52:32][seconds=110] Info: '1' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:52:32][seconds=110] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'false' 'Pending' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'false' 'Pending' + + @@ [2020-04-30T13:52:34][seconds=112] Info: '1' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:52:34][seconds=112] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'false' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'false' 'Running' + + @@ [2020-04-30T13:53:14][seconds=152] Info: '3' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:53:14][seconds=152] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + + @@ [2020-04-30T13:53:14][seconds=152] Info: Success! + + ``` + {{% /expand %}} + + +If you see an error, then consult [Debugging]({{< relref "/userguide/managing-domains/model-in-image/debugging.md" >}}) in the Model in Image user guide. + +#### Invoke the web application + +Now that all the initial use case resources have been deployed, you can invoke the sample web application through the Traefik ingress controller's NodePort. + +**Note**: The web application will display a list of any data sources it finds, but at this point, we don't expect it to find any because the model doesn't contain any. + +Send a web application request to the load balancer: + + ``` + $ curl -s -S -m 10 -H 'host: sample-domain1-cluster-cluster-1.mii-sample.org' \ + http://localhost:30305/myapp_war/index.jsp + ``` +Or, if Traefik is unavailable and your Administration Server pod is running, you can use `kubectl exec`: + + ``` + $ kubectl exec -n sample-domain1-ns sample-domain1-admin-server -- bash -c \ + "curl -s -S -m 10 http://sample-domain1-cluster-cluster-1:8001/myapp_war/index.jsp" + ``` + +You will see output like the following: + + ``` +
+   *****************************************************************
+
+   Hello World! This is version 'v1' of the mii-sample JSP web-app.
+
+   Welcome to WebLogic Server 'managed-server2'!
+
+    domain UID  = 'sample-domain1'
+    domain name = 'domain1'
+
+   Found 1 local cluster runtime:
+     Cluster 'cluster-1'
+
+   Found 0 local data sources:
+
+   *****************************************************************
+   
+ ``` + + **Note**: If you're running your `curl` commands on a remote machine, then substitute `localhost` with an external address suitable for contacting your Kubernetes cluster. A Kubernetes cluster address that often works can be obtained by using the address just after `https://` in the KubeDNS line of the output from the `kubectl cluster-info` command. + + If you want to continue to the [Update 1]({{< relref "/samples/simple/domains/model-in-image/update1.md" >}}) use case, then leave your domain running. + + To remove the resources you have created in this sample, see [Cleanup]({{< relref "/samples/simple/domains/model-in-image/cleanup.md" >}}). diff --git a/docs-source/content/samples/simple/domains/model-in-image/prerequisites.md b/docs-source/content/samples/simple/domains/model-in-image/prerequisites.md new file mode 100644 index 00000000000..8319b7281bd --- /dev/null +++ b/docs-source/content/samples/simple/domains/model-in-image/prerequisites.md @@ -0,0 +1,325 @@ +--- +title: "Prerequisites" +date: 2019-02-23T17:32:31-05:00 +weight: 1 +--- + + +### Prerequisites for all domain types + +1. Choose the type of domain you're going to use throughout the sample, `WLS` or `JRF`. + + - The first time you try this sample, we recommend that you choose `WLS` even if you're familiar with `JRF`. + - This is because `WLS` is simpler and will more easily familiarize you with Model in Image concepts. + - We recommend choosing `JRF` only if you are already familiar with `JRF`, you have already tried the `WLS` path through this sample, and you have a definite use case where you need to use `JRF`. + +1. The `JAVA_HOME` environment variable must be set and must reference a valid JDK 8 or 11 installation. + +1. Get the operator source and put it in `/tmp/weblogic-kubernetes-operator`. + + For example: + + ``` + $ cd /tmp + $ git clone https://github.com/oracle/weblogic-kubernetes-operator.git + ``` + + > **Note**: We will refer to the top directory of the operator source tree as `/tmp/weblogic-kubernetes-operator`; however, you can use a different location. + + For additional information about obtaining the operator source, see the [Developer Guide Requirements](https://oracle.github.io/weblogic-kubernetes-operator/developerguide/requirements/). + +1. Copy the sample to a new directory; for example, use directory `/tmp/mii-sample`. + + + ``` + $ mkdir /tmp/mii-sample + $ cp -r /tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/* /tmp/mii-sample + ``` + + > **Note**: We will refer to this working copy of the sample as `/tmp/mii-sample`; however, you can use a different location. + {{< rawhtml >}} + + {{< /rawhtml >}} +1. Make sure an operator is set up to manage namespace `sample-domain1-ns`. Also, make sure a Traefik ingress controller is managing the same namespace and listening on port 30305. + + For example, follow the same steps as the [Quick Start](https://oracle.github.io/weblogic-kubernetes-operator/quickstart/) guide up through the [Prepare for a domain]({{< relref "/quickstart/prepare.md" >}}) step. + + {{% notice info %}} + Make sure you stop when you complete the "Prepare for a domain" step and then resume following these instructions. + {{% /notice %}} + +1. Set up ingresses that will redirect HTTP from Traefik port 30305 to the clusters in this sample's WebLogic domains. + + - Option 1: To create the ingresses, use the following YAML file to create a file called `/tmp/mii-sample/ingresses/myingresses.yaml` and then call `kubectl apply -f /tmp/mii-sample/ingresses/myingresses.yaml`: + + ```yaml + apiVersion: networking.k8s.io/v1beta1 + kind: Ingress + metadata: + name: traefik-ingress-sample-domain1-admin-server + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain1 + annotations: + kubernetes.io/ingress.class: traefik + spec: + rules: + - host: + http: + paths: + - path: /console + backend: + serviceName: sample-domain1-admin-server + servicePort: 7001 + --- + apiVersion: networking.k8s.io/v1beta1 + kind: Ingress + metadata: + name: traefik-ingress-sample-domain1-cluster-cluster-1 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain1 + annotations: + kubernetes.io/ingress.class: traefik + spec: + rules: + - host: sample-domain1-cluster-cluster-1.mii-sample.org + http: + paths: + - path: + backend: + serviceName: sample-domain1-cluster-cluster-1 + servicePort: 8001 + --- + apiVersion: networking.k8s.io/v1beta1 + kind: Ingress + metadata: + name: traefik-ingress-sample-domain2-cluster-cluster-1 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain2 + annotations: + kubernetes.io/ingress.class: traefik + spec: + rules: + - host: sample-domain2-cluster-cluster-1.mii-sample.org + http: + paths: + - path: + backend: + serviceName: sample-domain2-cluster-cluster-1 + servicePort: 8001 + ``` + + - Option 2: Run `kubectl apply -f` on each of the ingress YAML files that are already included in the sample source `/tmp/mii-sample/ingresses` directory: + + ``` + $ cd /tmp/mii-sample/ingresses + $ kubectl apply -f traefik-ingress-sample-domain1-admin-server.yaml + $ kubectl apply -f traefik-ingress-sample-domain1-cluster-cluster-1.yaml + $ kubectl apply -f traefik-ingress-sample-domain2-cluster-cluster-1.yaml + ``` + + > **NOTE**: We give each cluster ingress a different host name that is decorated using both its operator domain UID and its cluster name. This makes each cluster uniquely addressable even when cluster names are the same across different clusters. When using `curl` to access the WebLogic domain through the ingress, you will need to supply a host name header that matches the host names in the ingress. + + For more information on ingresses and load balancers, see [Ingress]({{< relref "/userguide/managing-domains/ingress/_index.md" >}}). + +1. Obtain the WebLogic 12.2.1.4 image that is required to create the sample's model images. + + a. Use a browser to access [Oracle Container Registry](http://container-registry.oracle.com). + + b. Choose an image location: for `JRF` domains, select `Middleware`, then `fmw-infrastructure`; for `WLS` domains, select `Middleware`, then `weblogic`. + + c. Select Sign In and accept the license agreement. + + d. Use your terminal to log in to Docker locally: `docker login container-registry.oracle.com`. + + e. Later in this sample, when you run WebLogic Image Tool commands, the tool will use the image as a base image for creating model images. Specifically, the tool will implicitly call `docker pull` for one of the above licensed images as specified in the tool's command line using the `--fromImage` parameter. For `JRF`, this sample specifies `container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.4`, and for `WLS`, the sample specifies `container-registry.oracle.com/middleware/weblogic:12.2.1.4`. + + {{% notice info %}} + If you prefer, you can create your own base image and then substitute this image name in the WebLogic Image Tool `--fromImage` parameter throughout this sample. For example, you may wish to start with a base image that has patches applied. See [Preparing a Base Image]({{< relref "/userguide/managing-domains/domain-in-image/base-images/_index.md" >}}). + {{% /notice %}} + +1. Download the latest WebLogic Deploying Tooling (WDT) and WebLogic Image Tool (WIT) installer ZIP files to your `/tmp/mii-sample/model-images` directory. Both WDT and WIT are required to create your Model in Image Docker images. + + For example, visit the GitHub [WebLogic Deploy Tooling Releases](https://github.com/oracle/weblogic-deploy-tooling/releases) and [WebLogic Image Tool Releases](https://github.com/oracle/weblogic-image-tool/releases) web pages to determine the latest release version for each, and then, assuming the version numbers are `1.9.1` and `1.9.1` respectively, call: + + ``` + $ cd /tmp/mii-sample/model-images + + $ curl -m 120 -fL https://github.com/oracle/weblogic-deploy-tooling/releases/download/weblogic-deploy-tooling-1.9.1/weblogic-deploy.zip \ + -o /tmp/mii-sample/model-images/weblogic-deploy.zip + + $ curl -m 120 -fL https://github.com/oracle/weblogic-image-tool/releases/download/release-1.9.1/imagetool.zip \ + -o /tmp/mii-sample/model-images/imagetool.zip + ``` + +1. To set up the WebLogic Image Tool, run the following commands: + + ``` + $ cd /tmp/mii-sample/model-images + + $ unzip imagetool.zip + + $ ./imagetool/bin/imagetool.sh cache addInstaller \ + --type wdt \ + --version latest \ + --path /tmp/mii-sample/model-images/weblogic-deploy.zip + ``` + + These steps will install WIT to the `/tmp/mii-sample/model-images/imagetool` directory, plus put a `wdt_latest` entry in the tool's cache which points to the WDT ZIP file installer. You will use WIT later in the sample for creating model images. + + +### Additional prerequisites for JRF domains + +> __NOTE__: If you're using a `WLS` domain type, skip this section and continue [here]({{< relref "/samples/simple/domains/model-in-image/initial.md" >}}). + +#### JRF Prerequisites Contents + + - [Introduction to JRF setups](#introduction-to-jrf-setups) + - [Set up and initialize an infrastructure database](#set-up-and-initialize-an-infrastructure-database) + - [Increase introspection job timeout](#increase-introspection-job-timeout) + - [Important considerations for RCU model attributes, Domain fields, and secrets](#important-considerations-for-rcu-model-attributes-domain-fields-and-secrets) + +##### Introduction to JRF setups + +> __NOTE__: The requirements in this section are in addition to [Prerequisites for all domain types](#prerequisites-for-all-domain-types). + +A JRF domain requires an infrastructure database, initializing this database with RCU, and configuring your domain to access this database. You must perform all these steps _before_ you create your domain. + + +##### Set up and initialize an infrastructure database + +A JRF domain requires an infrastructure database and requires initializing this database with a schema and a set of tables for each different domain. The following example shows how to set up a database and use the RCU tool to create the infrastructure schemas for two JRF domains. The database is set up with the following attributes: + +| Attribute | Value | +| --------- | ----- | +| database Kubernetes namespace | `default` | +| database Kubernetes pod | `oracle-db` | +| database image | `container-registry.oracle.com/database/enterprise:12.2.0.1-slim` | +| database password | `Oradoc_db1` | +| infrastructure schema prefixes | `FMW1` and `FMW2` (for domain1 and domain2) | +| infrastructure schema password | `Oradoc_db1` | +| database URL | `oracle-db.default.svc.cluster.local:1521/devpdb.k8s` | + + +1. Ensure that you have access to the database image, and then create a deployment using it: + + - Use a browser to log in to `https://container-registry.oracle.com`, select `Database -> enterprise` and accept the license agreement. + + - Get the database image: + - In the local shell, `docker login container-registry.oracle.com`. + - In the local shell, `docker pull container-registry.oracle.com/database/enterprise:12.2.0.1-slim`. + + - Use the sample script in `/tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-oracle-db-service` to create an Oracle database running in the pod, `oracle-db`. + + ``` + $ cd /tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-oracle-db-service + $ start-db-service.sh + ``` + + This script will deploy a database in the `default` namespace with the connect string `oracle-db.default.svc.cluster.local:1521/devpdb.k8s`, and administration password `Oradoc_db1`. + + This step is based on the steps documented in [Run a Database](https://oracle.github.io/weblogic-kubernetes-operator/userguide/overview/database/). + + __NOTE__: If your Kubernetes cluster nodes do not all have access to the database image in a local Docker cache, then deploy a Kubernetes `docker secret` to the default namespace with login credentials for `container-registry.oracle.com`, and pass the name of this secret as a parameter to `start-db-service.sh` using `-s your-image-pull-secret`. Alternatively, copy the database image to each local Docker cache in the cluster. For more information, see the [Cannot pull image FAQ]({{}}). + + **WARNING:** The Oracle Database Docker images are supported only for non-production use. For more details, see My Oracle Support note: Oracle Support for Database Running on Docker (Doc ID 2216342.1). + + +2. Use the sample script in `/tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-rcu-schema` to create an RCU schema for each domain (schema prefixes `FMW1` and `FMW2`). + + Note that this script assumes `Oradoc_db1` is the DBA password, `Oradoc_db1` is the schema password, and that the database URL is `oracle-db.default.svc.cluster.local:1521/devpdb.k8s`. + + ``` + $ cd /tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-rcu-schema + $ ./create-rcu-schema.sh -s FMW1 -i container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.4 + $ ./create-rcu-schema.sh -s FMW2 -i container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.4 + ``` + + __NOTE__: If your Kubernetes cluster nodes do not all have access to the FMW infrastructure image in a local Docker cache, then deploy a Kubernetes `docker secret` to the default namespace with login credentials for `container-registry.oracle.com`, and pass the name of this secret as a parameter to `./create-rcu-schema.sh` using `-p your-image-pull-secret`. Alternatively, copy the FMW infrastructure image to each local Docker cache in the cluster. For more information, see the [Cannot pull image FAQ]({{}}). + + __NOTE__: If you need to drop the repository, use this command: + + ``` + $ drop-rcu-schema.sh -s FMW1 + ``` + + + +##### Increase introspection job timeout + +The JRF domain home creation can take more time than the introspection job's default timeout. You should increase the timeout for the introspection job. Use the `configuration.introspectorJobActiveDeadlineSeconds` in your Domain to override the default with a value of at least 300 seconds (the default is 120 seconds). Note that the `JRF` versions of the Domain YAML files that are provided in `/tmp/mii-sample/domain-resources` already set this value. + +##### Important considerations for RCU model attributes, Domain fields, and secrets + +To allow Model in Image to access the database and OPSS wallet, you must create an RCU access secret containing the database connect string, user name, and password that's referenced from your model and an OPSS wallet password secret that's referenced from your Domain before deploying your domain. It's also necessary to define an `RCUDbInfo` stanza in your model. + +The sample includes examples of JRF models and Domain YAML files in the `/tmp/mii-sample/model-images` and `/tmp/mii-sample/domain-resources` directories, and instructions in the following sections will describe setting up the RCU and OPSS secrets. + +When you follow the instructions in the samples, avoid instructions that are `WLS` only, and substitute `JRF` for `WLS` in the corresponding model image tags and Domain YAML file names. + +For example, in this sample: + + - JRF Domain YAML files have an `configuration.opss.walletPasswordSecret` field that references a secret named `sample-domain1-opss-wallet-password-secret`, with `password=welcome1`. + + - JRF image models have a `domainInfo -> RCUDbInfo` stanza that reference a `sample-domain1-rcu-access` secret with appropriate values for attributes `rcu_prefix`, `rcu_schema_password`, and `rcu_db_conn_string` for accessing the Oracle database that you deployed to the default namespace as one of the prerequisite steps. + +##### Important considerations for reusing or sharing OPSS tables + +{{% notice warning %}} +We do not recommend that users share OPSS tables. Extreme caution is required when sharing OPSS tables between domains. +{{% /notice %}} + +When you successfully deploy your JRF Domain YAML file for the first time, the introspector job will initialize the OPSS tables for the domain using the `domainInfo -> RCUDbInfo` stanza in the WDT model plus the `configuration.opss.walletPasswordSecret` specified in the Domain YAML file. The job will also create a new domain home. Finally, the operator will also capture an OPSS wallet file from the new domain's local directory and place this file in a new Kubernetes ConfigMap. + +There are scenarios when the domain needs to be recreated between updates, such as when WebLogic credentials are changed, security roles defined in the WDT model have been changed, or you want to share the same infrastructure tables with different domains. In these scenarios, the operator needs the `walletPasswordSecret` as well as the OPSS wallet file, together with the exact information in `domainInfo -> RCUDbInfo` so that the domain can be recreated and access the same set of tables. Without the wallet file and wallet password, you will not be able to recreate a domain accessing the same set of tables, therefore we strongly recommend that you back up the wallet file. + +To recover a domain's OPSS tables between domain restarts or to share an OPSS schema between different domains, it is necessary to extract this wallet file from the domain's automatically deployed introspector ConfigMap and save the OPSS wallet password secret that was used for the original domain. The wallet password and wallet file are needed again when you recreate the domain or share the database with other domains. + +To save the wallet file, assuming that your namespace is `sample-domain1-ns` and your domain UID is `sample-domain1`: + +``` + $ kubectl -n sample-domain1-ns \ + get configmap sample-domain1-weblogic-domain-introspect-cm \ + -o jsonpath='{.data.ewallet\.p12}' \ + > ./ewallet.p12 +``` + +Alternatively, you can save the file using the sample's wallet utility: + +``` + $ /tmp/mii-sample/utils/opss-wallet.sh -n sample-domain1-ns -d sample-domain1 -wf ./ewallet.p12 + # For help: /tmp/mii-sample/utils/opss-wallet.sh -? +``` + +__Important! Back up your wallet file to a safe location that can be retrieved later.__ + +To reuse the wallet file in subsequent redeployments or to share the domain's OPSS tables between different domains: + +1. Load the saved wallet file into a secret with a key named `walletFile` (again, assuming that your domain UID is `sample-domain1` and your namespace is `sample-domain1-ns`): + +``` + $ kubectl -n sample-domain1-ns create secret generic sample-domain1-opss-walletfile-secret \ + --from-file=walletFile=./ewallet.p12 + $ kubectl -n sample-domain1-ns label secret sample-domain1-opss-walletfile-secret \ + weblogic.domainUID=`sample-domain1` +``` + +Alternatively, use the sample's wallet utility: +``` + $ /tmp/mii-sample/utils/opss-wallet.sh -n sample-domain1-ns -d sample-domain1 -wf ./ewallet.p12 -ws sample-domain1-opss-walletfile-secret + # For help: /tmp/mii-sample/utils/opss-wallet.sh -? +``` + +2. Modify your Domain JRF YAML files to provide the wallet file secret name, for example: + +``` + configuration: + opss: + # Name of secret with walletPassword for extracting the wallet + walletPasswordSecret: sample-domain1-opss-wallet-password-secret + # Name of secret with walletFile containing base64 encoded opss wallet + walletFileSecret: sample-domain1-opss-walletfile-secret +``` +> **Note**: The sample JRF Domain YAML files included in `/tmp/mii-sample/domain-resources` already have the above YAML file stanza. diff --git a/docs-source/content/samples/simple/domains/model-in-image/update1.md b/docs-source/content/samples/simple/domains/model-in-image/update1.md new file mode 100644 index 00000000000..d9a4da861ae --- /dev/null +++ b/docs-source/content/samples/simple/domains/model-in-image/update1.md @@ -0,0 +1,468 @@ +--- +title: "Update 1" +date: 2019-02-23T17:32:31-05:00 +weight: 3 +--- + +This use case demonstrates dynamically adding a data source to your running domain. It demonstrates several features of WDT and Model in Image: + +- The syntax used for updating a model is the same syntax you use for creating the original model. +- A domain's model can be updated dynamically by supplying a model update in a file in a Kubernetes ConfigMap. +- Model updates can be as simple as changing the value of a single attribute, or more complex, such as adding a JMS Server. + +For a detailed discussion of model updates, see [Runtime Updates]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates.md" >}}) in the Model in Image user guide. + +{{% notice warning %}} +The operator does not support all possible dynamic model updates. For model update limitations, consult [Runtime Updates]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates.md" >}}) in the Model in Image user docs, and carefully test any model update before attempting a dynamic update in production. +{{% /notice %}} + +Here are the steps: + +1. Ensure that you have a running domain. + + Make sure you have deployed the domain from the [Initial]({{< relref "/samples/simple/domains/model-in-image/initial.md" >}}) use case. + +1. Create a data source model YAML file. + + Create a WDT model snippet for a data source (or use the example provided). Make sure that its target is set to `cluster-1`, and that its initial capacity is set to `0`. + + The reason for the latter is to prevent the data source from causing a WebLogic Server startup failure if it can't find the database, which would be likely to happen because you haven't deployed one (unless you're using the `JRF` path through the sample). + + Here's an example data source model configuration that meets these criteria: + + + ``` + resources: + JDBCSystemResource: + mynewdatasource: + Target: 'cluster-1' + JdbcResource: + JDBCDataSourceParams: + JNDIName: [ + jdbc/mydatasource1, + jdbc/mydatasource2 + ] + GlobalTransactionsProtocol: TwoPhaseCommit + JDBCDriverParams: + DriverName: oracle.jdbc.xa.client.OracleXADataSource + URL: '@@SECRET:@@ENV:DOMAIN_UID@@-datasource-secret:url@@' + PasswordEncrypted: '@@SECRET:@@ENV:DOMAIN_UID@@-datasource-secret:password@@' + Properties: + user: + Value: 'sys as sysdba' + oracle.net.CONNECT_TIMEOUT: + Value: 5000 + oracle.jdbc.ReadTimeout: + Value: 30000 + JDBCConnectionPoolParams: + InitialCapacity: 0 + MaxCapacity: 1 + TestTableName: SQL ISVALID + TestConnectionsOnReserve: true + + ``` + + Place the above model snippet in a file named `/tmp/mii-sample/mydatasource.yaml` and then use it in the later step where you deploy the model ConfigMap, or alternatively, use the same data source that's provided in `/tmp/mii-sample/model-configmaps/datasource/model.20.datasource.yaml`. + +1. Create the data source secret. + + The data source references a new secret that needs to be created. Run the following commands to create the secret: + + ``` + $ kubectl -n sample-domain1-ns create secret generic \ + sample-domain1-datasource-secret \ + --from-literal=password=Oradoc_db1 \ + --from-literal=url=jdbc:oracle:thin:@oracle-db.default.svc.cluster.local:1521/devpdb.k8s + $ kubectl -n sample-domain1-ns label secret \ + sample-domain1-datasource-secret \ + weblogic.domainUID=sample-domain1 + ``` + + You name and label secrets using their associated domain UID for two reasons: + - To make it obvious which secret belongs to which domains. + - To make it easier to clean up a domain. Typical cleanup scripts use the `weblogic.domainUID` label as a convenience for finding all the resources associated with a domain. + + +1. Create a ConfigMap with the WDT model that contains the data source definition. + + Run the following commands: + + + ``` + $ kubectl -n sample-domain1-ns create configmap sample-domain1-wdt-config-map \ + --from-file=/tmp/mii-sample/model-configmaps/datasource + $ kubectl -n sample-domain1-ns label configmap sample-domain1-wdt-config-map \ + weblogic.domainUID=sample-domain1 + ``` + + - If you've created your own data source file, then substitute the file name in the `--from-file=` parameter (we suggested `/tmp/mii-sample/mydatasource.yaml` earlier). + - Note that the `-from-file=` parameter can reference a single file, in which case it puts the designated file in the ConfigMap, or it can reference a directory, in which case it populates the ConfigMap with all of the files in the designated directory. + + You name and label the ConfigMap using its associated domain UID for two reasons: + - To make it obvious which ConfigMap belong to which domains. + - To make it easier to clean up a domain. Typical cleanup scripts use the `weblogic.domainUID` label as a convenience for finding all resources associated with a domain. + +1. Update your Domain YAML file to refer to the ConfigMap and Secret. + + - Option 1: Update a copy of your Domain YAML file from the Initial use case. + + - In the [Initial]({{< relref "/samples/simple/domains/model-in-image/initial.md" >}}) use case, we suggested creating a Domain YAML file named `/tmp/mii-sample/mii-initial.yaml` or using the `/tmp/mii-sample/domain-resources/WLS/mii-initial-d1-WLS-v1.yaml` file that is supplied with the sample. + - We suggest copying the original Domain YAML file and naming the copy `/tmp/mii-sample/mii-update1.yaml` before making any changes. + + - Working on a copy is not strictly necessary, but it helps keep track of your work for the different use cases in this sample and provides you a backup of your previous work. + + - Add the secret to its `spec.configuration.secrets` stanza: + + ``` + spec: + ... + configuration: + ... + secrets: + - sample-domain1-datasource-secret + ``` + (Leave any existing secrets in place.) + + - Change its `spec.configuration.model.configMap` to look like the following: + + ``` + spec: + ... + configuration: + ... + model: + ... + configMap: sample-domain1-wdt-config-map + ``` + + - Apply your changed Domain YAML file: + + > **Note**: Before you deploy the domain custom resource, determine if you have Kubernetes cluster worker nodes that are remote to your local machine. If so, then you need to put the Domain YAML file's image in a location that these nodes can access and you may also need to modify your Domain YAML file to reference the new location. See [Ensuring your Kubernetes cluster can access images]({{< relref "/samples/simple/domains/model-in-image/_index.md#ensuring-your-kubernetes-cluster-can-access-images" >}}). + + ``` + $ kubectl apply -f /tmp/mii-sample/mii-update1.yaml + ``` + + - Option 2: Use the updated Domain YAML file that is supplied with the sample: + + > **Note**: Before you deploy the domain custom resource, determine if you have Kubernetes cluster worker nodes that are remote to your local machine. If so, then you need to put the Domain YAML file's image in a location that these nodes can access and you may also need to modify your Domain YAML file to reference the new location. See [Ensuring your Kubernetes cluster can access images]({{< relref "/samples/simple/domains/model-in-image/_index.md#ensuring-your-kubernetes-cluster-can-access-images" >}}). + + ``` + $ kubectl apply -f /tmp/miisample/domain-resources/WLS/mii-update1-d1-WLS-v1-ds.yaml + ``` + + +1. Restart ('roll') the domain. + + Now that the data source is deployed in a ConfigMap and its secret is also deployed, and you have applied an updated Domain YAML file with its `spec.configuration.model.configMap` and `spec.configuration.secrets` referencing the ConfigMap and secret, tell the operator to roll the domain. + + When a model domain restarts, it will rerun its introspector job in order to regenerate its configuration, and it will also pass the configuration changes found by the introspector to each restarted server. + One way to cause a running domain to restart is to change the domain's `spec.restartVersion`. To do this: + + - Option 1: Edit your domain custom resource. + - Call `kubectl -n sample-domain1-ns edit domain sample-domain1`. + - Edit the value of the `spec.restartVersion` field and save. + - The field is a string; typically, you use a number in this field and increment it with each restart. + + - Option 2: Dynamically change your domain using `kubectl patch`. + - To get the current `restartVersion` call: + ``` + $ kubectl -n sample-domain1-ns get domain sample-domain1 '-o=jsonpath={.spec.restartVersion}' + ``` + - Choose a new restart version that's different from the current restart version. + - The field is a string; typically, you use a number in this field and increment it with each restart. + + - Use `kubectl patch` to set the new value. For example, assuming the new restart version is `2`: + ``` + $ kubectl -n sample-domain1-ns patch domain sample-domain1 --type=json '-p=[{"op": "replace", "path": "/spec/restartVersion", "value": "2" }]' + ``` + - Option 3: Use the sample helper script. + - Call `/tmp/mii-sample/utils/patch-restart-version.sh -n sample-domain1-ns -d sample-domain1`. + - This will perform the same `kubectl get` and `kubectl patch` commands as Option 2. + + +1. Wait for the roll to complete. + + Now that you've started a domain roll, you'll need to wait for it to complete if you want to verify that the data source was deployed. + + - One way to do this is to call `kubectl get pods -n sample-domain1-ns --watch` and wait for the pods to cycle back to their `ready` state. + + - Alternatively, you can run `/tmp/mii-sample/utils/wl-pod-wait.sh -p 3`. This is a utility script that provides useful information about a domain's pods and waits for them to reach a `ready` state, reach their target `restartVersion`, and reach their target `image` before exiting. + + {{%expand "Click here to display the `wl-pod-wait.sh` usage." %}} + ``` + $ ./wl-pod-wait.sh -? + + Usage: + + wl-pod-wait.sh [-n mynamespace] [-d mydomainuid] \ + [-p expected_pod_count] \ + [-t timeout_secs] \ + [-q] + + Exits non-zero if 'timeout_secs' is reached before 'pod_count' is reached. + + Parameters: + + -d : Defaults to 'sample-domain1'. + + -n : Defaults to 'sample-domain1-ns'. + + pod_count > 0 : Wait until exactly 'pod_count' WebLogic Server pods for + a domain all (a) are ready, (b) have the same + 'domainRestartVersion' label value as the + current Domain's 'spec.restartVersion, and + (c) have the same image as the current Domain's + image. + + pod_count = 0 : Wait until there are no running WebLogic Server pods + for a domain. The default. + + -t : Timeout in seconds. Defaults to '1000'. + + -q : Quiet mode. Show only a count of wl pods that + have reached the desired criteria. + + -? : This help. + ``` + {{% /expand %}} + + {{%expand "Click here to view sample output from `wl-pod-wait.sh` that shows a rolling domain." %}} + ``` + @@ [2020-04-30T13:53:19][seconds=0] Info: Waiting up to 1000 seconds for exactly '3' WebLogic Server pods to reach the following criteria: + @@ [2020-04-30T13:53:19][seconds=0] Info: ready='true' + @@ [2020-04-30T13:53:19][seconds=0] Info: image='model-in-image:WLS-v1' + @@ [2020-04-30T13:53:19][seconds=0] Info: domainRestartVersion='2' + @@ [2020-04-30T13:53:19][seconds=0] Info: namespace='sample-domain1-ns' + @@ [2020-04-30T13:53:19][seconds=0] Info: domainUID='sample-domain1' + + @@ [2020-04-30T13:53:19][seconds=0] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:53:19][seconds=0] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-introspect-domain-job-wlkpr' '' '' '' 'Pending' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:53:20][seconds=1] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:53:20][seconds=1] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-introspect-domain-job-wlkpr' '' '' '' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:54:18][seconds=59] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:54:18][seconds=59] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------------------- ------- ----------------------- ------ ----------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-introspect-domain-job-wlkpr' '' '' '' 'Succeeded' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:54:19][seconds=60] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:54:19][seconds=60] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:54:31][seconds=72] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:54:31][seconds=72] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v1' 'false' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:54:40][seconds=81] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:54:40][seconds=81] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:54:52][seconds=93] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:54:52][seconds=93] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:54:58][seconds=99] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:54:58][seconds=99] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'false' 'Pending' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:55:00][seconds=101] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:55:00][seconds=101] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'false' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:55:12][seconds=113] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:55:12][seconds=113] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'false' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:55:24][seconds=125] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:55:24][seconds=125] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'false' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:55:33][seconds=134] Info: '1' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:55:33][seconds=134] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:55:34][seconds=135] Info: '1' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:55:34][seconds=135] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v1' 'false' 'Pending' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:55:40][seconds=141] Info: '1' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:55:40][seconds=141] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:55:44][seconds=145] Info: '1' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:55:44][seconds=145] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'false' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:56:25][seconds=186] Info: '2' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:56:25][seconds=186] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:56:26][seconds=187] Info: '2' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:56:26][seconds=187] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v1' 'false' 'Pending' + + @@ [2020-04-30T13:56:30][seconds=191] Info: '2' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:56:30][seconds=191] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-04-30T13:56:34][seconds=195] Info: '2' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:56:34][seconds=195] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'false' 'Pending' + + @@ [2020-04-30T13:57:09][seconds=230] Info: '3' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-04-30T13:57:09][seconds=230] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'true' 'Running' + + + @@ [2020-04-30T13:57:09][seconds=230] Info: Success! + ``` + {{% /expand %}} + +1. After your domain is running, you can call the sample web application to determine if the data source was deployed. + + Send a web application request to the ingress controller: + + ``` + $ curl -s -S -m 10 -H 'host: sample-domain1-cluster-cluster-1.mii-sample.org' \ + http://localhost:30305/myapp_war/index.jsp + ``` + + Or, if Traefik is unavailable and your Administration Server pod is running, you can run `kubectl exec`: + + ``` + $ kubectl exec -n sample-domain1-ns sample-domain1-admin-server -- bash -c \ + "curl -s -S -m 10 http://sample-domain1-cluster-cluster-1:8001/myapp_war/index.jsp" + ``` + + You will see something like the following: + + ``` +
+    *****************************************************************
+
+    Hello World! This is version 'v1' of the mii-sample JSP web-app.
+
+    Welcome to WebLogic Server 'managed-server1'!
+
+     domain UID  = 'sample-domain1'
+     domain name = 'domain1'
+
+    Found 1 local cluster runtime:
+      Cluster 'cluster-1'
+
+    Found 1 local data source:
+      Datasource 'mynewdatasource': State='Running'
+
+    *****************************************************************
+    
+ + ``` + +If you see an error, then consult [Debugging]({{< relref "/userguide/managing-domains/model-in-image/debugging.md" >}}) in the Model in Image user guide. + +If you plan to run the [Update 3]({{< relref "/samples/simple/domains/model-in-image/update3.md" >}}) use case, then leave your domain running. + +To remove the resources you have created in the samples, see [Cleanup]({{< relref "/samples/simple/domains/model-in-image/cleanup.md" >}}). diff --git a/docs-source/content/samples/simple/domains/model-in-image/update2.md b/docs-source/content/samples/simple/domains/model-in-image/update2.md new file mode 100644 index 00000000000..60803355918 --- /dev/null +++ b/docs-source/content/samples/simple/domains/model-in-image/update2.md @@ -0,0 +1,471 @@ +--- +title: "Update 2" +date: 2019-02-23T17:32:31-05:00 +weight: 4 +--- + +This use case demonstrates concurrently deploying a domain that is similar to the [Update 1]({{< relref "/samples/simple/domains/model-in-image/update1.md" >}}) use case domain to the same `sample-domain1-ns` namespace, but with a different domain UID, a different WebLogic domain name, and a different WebLogic domain encryption key. It does this by: + +- Using the same image, image model YAML file, and application archive as the Initial and Update 1 use cases. +- Using the same model update ConfigMap source file as the Update 1 use case (a data source). +- Using a different (unique) domain UID, `sample-domain2`, for the new domain. +- Using a different (unique) domain name, `domain2`, for the different domains. +- Deploying secrets and a model update ConfigMap that are uniquely labeled and named for the new domain. + +Note that this use case shows Model in Image's unique ability to quickly deploy a copy of a WebLogic domain that has a different WebLogic domain name and domain encryption key. This is a useful capability that is not supported by the Domain in Image [domain home source type]({{< relref "/userguide/managing-domains/choosing-a-model/_index.md" >}}): + +- Domain in Image does not support overriding the domain name, but different domain names are necessary when two domains need to interoperate. This use case takes advantage of model macros to ensure that its two different domains have a different domain name: + + - First, you define the domain name in the model YAML file using the `@@ENV:CUSTOM_DOMAIN_NAME@@` environment variable macro. + - Second, you set the value of the `CUSTOM_DOMAIN_NAME` environment variable to be different using the `env` stanza in each Domain's YAML file. + +- Domain in Image requires that its images embed a WebLogic `security/SerializedSystemIni.dat` domain encryption key that cannot be changed for the image (see [Why layering matters]({{< relref "/userguide/cicd/why-layering-matters.md" >}}) in CI/CD considerations). This necessarily means that two Domain in Image domains that share the same image can decrypt each other's encrypted passwords. On the other hand, a Model in Image's domain encryption key is not embedded in the image and instead, is dynamically and uniquely created each time the domain is started. + +{{% notice warning %}} +Oracle requires interoperating WebLogic domains to have different domain names. This is necessary when two domains communicate, or when a WebLogic Server or WebLogic Java client concurrently connects to multiple domains. +{{% /notice %}} + +Here are the steps for this use case: + +1. Make sure you have deployed the domain from the [Update 1]({{< relref "/samples/simple/domains/model-in-image/update1.md" >}}) use case. + +1. Create a ConfigMap with the WDT model that contains the data source definition. + + Run the following commands: + + ``` + $ kubectl -n sample-domain1-ns create configmap sample-domain2-wdt-config-map \ + --from-file=/tmp/mii-sample/model-configmaps/datasource + $ kubectl -n sample-domain1-ns label configmap sample-domain2-wdt-config-map \ + weblogic.domainUID=sample-domain2 + ``` + + If you've created your own data source file in the Update 1 use case, then substitute the file name in the `--from-file=` parameter (we suggested `/tmp/mii-sample/mydatasource.yaml` earlier). Note that the `-from-file=` parameter can reference a single file, in which case it puts the designated file in the ConfigMap, or it can reference a directory, in which case it populates the ConfigMap with all of the files in the designated directory. + + Observations: + - We are leaving the namespace `sample-domain1-ns` unchanged for the ConfigMap because you will deploy domain `sample-domain2` to the same namespace as `sample-domain1`. + - You name and label the ConfigMap using its associated domain UID for two reasons: + - To make it obvious which ConfigMap belongs to which domain. + - To make it easier to clean up a domain. Typical cleanup scripts use the `weblogic.domainUID` label as a convenience for finding all resources associated with a domain. + - You use a different ConfigMap for the new domain for two reasons: + - To make it easier to keep the life cycle and/or CI/CD process for the two domains simple and independent. + - To 'future proof' the new domain so that changes to the original domain or new domain's ConfigMap can be independent. + + +1. Create the secrets that are referenced by the WDT model files in the image and ConfigMap; they also will be referenced by the Domain YAML file. + + Run the following commands: + ``` + # spec.webLogicCredentialsSecret + $ kubectl -n sample-domain1-ns create secret generic \ + sample-domain2-weblogic-credentials \ + --from-literal=username=weblogic --from-literal=password=welcome1 + $ kubectl -n sample-domain1-ns label secret \ + sample-domain2-weblogic-credentials \ + weblogic.domainUID=sample-domain2 + + # spec.configuration.model.runtimeEncryptionSecret + $ kubectl -n sample-domain1-ns create secret generic \ + sample-domain2-runtime-encryption-secret \ + --from-literal=password=my_runtime_password + $ kubectl -n sample-domain1-ns label secret \ + sample-domain2-runtime-encryption-secret \ + weblogic.domainUID=sample-domain2 + + # referenced by spec.configuration.secrets and by the data source model YAML in the ConfigMap + $ kubectl -n sample-domain1-ns create secret generic \ + sample-domain2-datasource-secret \ + --from-literal=password=Oradoc_db1 \ + --from-literal=url=jdbc:oracle:thin:@oracle-db.default.svc.cluster.local:1521/devpdb.k8s + $ kubectl -n sample-domain1-ns label secret \ + sample-domain2-datasource-secret \ + weblogic.domainUID=sample-domain2 + ``` + + Observations: + - We are leaving the namespace `sample-domain1-ns` unchanged for each secret because you will deploy domain `sample-domain2` to the same namespace as `sample-domain1`. + - You name and label the secrets using their associated domain UID for two reasons: + - To make it obvious which secret belongs to which domain. + - To make it easier to clean up a domain. Typical cleanup scripts use the `weblogic.domainUID` label as a convenience for finding all resources associated with a domain. + - You use a different set of secrets for the new domain for two reasons: + - To make it easier to keep the life cycle and/or CI/CD process for the two domains simple and independent. + - To 'future proof' the new domain so that changes to the original domain's secrets or new domain's secrets can be independent. + + If you're following the `JRF` path through the sample, then you also need to deploy the additional secret referenced by macros in the `JRF` model `RCUDbInfo` clause, plus an `OPSS` wallet password secret. For details about the uses of these secrets, see the [Model in Image]({{< relref "/userguide/managing-domains/model-in-image/_index.md" >}}) user documentation. Note that we are using the RCU prefix `FMW2` for this domain, because the first domain is already using `FMW1`. + + {{%expand "Click here for the commands for deploying additional secrets for JRF." %}} + + ``` + $ kubectl -n sample-domain1-ns create secret generic \ + sample-domain2-rcu-access \ + --from-literal=rcu_prefix=FMW2 \ + --from-literal=rcu_schema_password=Oradoc_db1 \ + --from-literal=rcu_db_conn_string=oracle-db.default.svc.cluster.local:1521/devpdb.k8s + $ kubectl -n sample-domain1-ns label secret \ + sample-domain2-rcu-access \ + weblogic.domainUID=sample-domain2 + + $ kubectl -n sample-domain1-ns create secret generic \ + sample-domain2-opss-wallet-password-secret \ + --from-literal=walletPassword=welcome1 + $ kubectl -n sample-domain1-ns label secret \ + sample-domain2-opss-wallet-password-secret \ + weblogic.domainUID=sample-domain2 + ``` + {{% /expand %}} + +1. Set up a Domain YAML file that is similar to your Update 1 use case Domain YAML file but with a different domain UID, domain name, model update ConfigMap reference, and Secret references: + + - Option 1: Update a copy of your Domain YAML file from the Update 1 use case. + + - In the [Update 1]({{< relref "/samples/simple/domains/model-in-image/update1.md" >}}) use case, we suggested creating a file named `/tmp/mii-sample/mii-update1.yaml` or using the `/tmp/mii-sample/domain-resources/WLS/mii-update1-d1-WLS-v1-ds.yaml` file that is supplied with the sample. + - We suggest copying this Domain YAML file and naming the copy `/tmp/mii-sample/mii-update2.yaml` before making any changes. + + - Working on a copy is not strictly necessary, but it helps keep track of your work for the different use cases in this sample and provides you a backup of your previous work. + + - Change the `/tmp/mii-sample/mii-update2.yaml` Domain YAML file name and `weblogic.domainUID` label to `sample-domain2`. + + The final result will look something like this: + + ``` + apiVersion: "weblogic.oracle/v8" + kind: Domain + metadata: + name: sample-domain2 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain2 + ``` + + > __NOTE__: We are leaving the namespace `sample-domain1-ns` unchanged because you will be deploying domain `sample-domain2` to the same namespace as `sample-domain1`. + + - Change the `/tmp/mii-sample/mii-update2.yaml` Domain YAML file's `CUSTOM_DOMAIN_NAME` environment variable from `domain1` to `domain2`. + + The model file in the image uses macro `@@ENV:CUSTOM_DOMAIN_NAME@@` to reference this environment variable when setting its domain name. + + Specifically, change the corresponding Domain `spec.serverPod.env` YAML file stanza to look something like this: + + ``` + ... + spec: + ... + serverPod: + ... + env: + - name: CUSTOM_DOMAIN_NAME + value: "domain2" + ... + ``` + + - Change the `/tmp/mii-sample/mii-update2.yaml` Domain YAML file's `spec.domainHome` value to `/u01/domains/sample-domain2`. The corresponding YAML file stanza will look something like this: + + ``` + ... + spec: + ... + domainHome: /u01/domains/sample-domain2 + ... + ``` + + (This change is not strictly needed, but it is a helpful convention to decorate a WebLogic domain's home directory with its domain name or domain UID.) + + - Change the `/tmp/mii-sample/mii-update2.yaml` secret references in the `spec.webLogicCredentialsSecret` and `spec.configuration.secrets` stanzas to reference this use case's secrets. Specifically, change: + + ``` + spec: + ... + webLogicCredentialsSecret: + name: sample-domain1-weblogic-credentials + ... + configuration: + ... + secrets: + - sample-domain1-datasource-secret + ... + model: + ... + runtimeEncryptionSecret: sample-domain1-runtime-encryption-secret + ``` + + To this: + + + ``` + spec: + ... + webLogicCredentialsSecret: + name: sample-domain2-weblogic-credentials + ... + configuration: + ... + secrets: + - sample-domain2-datasource-secret + ... + model: + ... + runtimeEncryptionSecret: sample-domain2-runtime-encryption-secret + ``` + + > __NOTE__: If you are following the `JRF` path through the sample, similarly change your `spec.configuration.opss.walletPasswordSecret` and the RCU secret name referenced in `spec.configuration.secrets`. + + + - Change the Domain YAML file's `spec.configuration.model.configMap` value from `sample-domain1-wdt-config-map` to `sample-domain2-wdt-config-map`. The corresponding YAML file stanza will look something like this: + ``` + spec: + ... + configuration: + ... + model: + ... + configMap: sample-domain2-wdt-config-map + ``` + + - Now, compare your original and changed Domain YAML files to double check your changes. + + ``` + $ diff /tmp/mii-sample/mii-update1.yaml /tmp/mii-sample/mii-update2.yaml + 9c9 + < name: sample-domain1 + --- + > name: sample-domain2 + 13c13 + < weblogic.domainUID: sample-domain1 + --- + > weblogic.domainUID: sample-domain2 + 21c21 + < domainHome: /u01/domains/sample-domain1 + --- + > domainHome: /u01/domains/sample-domain2 + 36c36 + < name: sample-domain1-weblogic-credentials + --- + > name: sample-domain2-weblogic-credentials + 46c46 + < #logHome: /shared/logs/sample-domain1 + --- + > #logHome: /shared/logs/sample-domain2 + 61c61 + < value: "domain1" + --- + > value: "domain2" + 71c71 + < # claimName: sample-domain1-weblogic-sample-pvc + --- + > # claimName: sample-domain2-weblogic-sample-pvc + 110c110 + < configMap: sample-domain1-wdt-config-map + --- + > configMap: sample-domain2-wdt-config-map + 113c113 + < runtimeEncryptionSecret: sample-domain1-runtime-encryption-secret + --- + > runtimeEncryptionSecret: sample-domain2-runtime-encryption-secret + 118c118 + < - sample-domain1-datasource-secret + --- + > - sample-domain2-datasource-secret + ``` + + {{%expand "Click here to see additional 'diff' expected for the JRF path through the sample." %}} + + ``` + < walletPasswordSecret: sample-domain1-opss-wallet-password-secret + --- + > walletPasswordSecret: sample-domain2-opss-wallet-password-secret + 130c130 + < #walletFileSecret: sample-domain1-opss-walletfile-secret + --- + > #walletFileSecret: sample-domain2-opss-walletfile-secret + ``` + {{% /expand %}} + + > __NOTE__: The diff should _not_ contain a namespace change. You are deploying domain `sample-domain2` to the same namespace as `sample-domain1` (namespace `sample-domain1-ns`). + + + - Apply your changed Domain YAML file: + + > **Note**: Before you deploy the Domain YAML file, determine if you have Kubernetes cluster worker nodes that are remote to your local machine. If so, you need to put the Domain's image in a location that these nodes can access and you may also need to modify your Domain YAML file to reference the new location. See [Ensuring your Kubernetes cluster can access images]({{< relref "/samples/simple/domains/model-in-image/_index.md#ensuring-your-kubernetes-cluster-can-access-images" >}}). + + ``` + $ kubectl apply -f /tmp/mii-sample/mii-update2.yaml + ``` + + - Option 2: Use the updated Domain YAML file that is supplied with the sample: + + > **Note**: Before you deploy the Domain YAML file, determine if you have Kubernetes cluster worker nodes that are remote to your local machine. If so, you need to put the Domain's image in a location that these nodes can access and you may also need to modify your Domain YAML file to reference the new location. See [Ensuring your Kubernetes cluster can access images]({{< relref "/samples/simple/domains/model-in-image/_index.md#ensuring-your-kubernetes-cluster-can-access-images" >}}). + + ``` + $ kubectl apply -f /tmp/miisample/domain-resources/WLS/mii-update2-d2-WLS-v1-ds.yaml + ``` + +1. Wait for `sample-domain2` to start. + + If you run `kubectl get pods -n sample-domain1-ns --watch`, then you will see the introspector job for `sample-domain2` run and your WebLogic Server pods start. The output will look something like this: + + {{%expand "Click here to expand." %}} + ``` + $ kubectl get pods -n sample-domain1-ns --watch + NAME READY STATUS RESTARTS AGE + sample-domain1-admin-server 1/1 Running 0 5d2h + sample-domain1-managed-server1 1/1 Running 1 5d2h + sample-domain1-managed-server2 1/1 Running 2 5d2h + sample-domain2-introspect-domain-job-plssr 0/1 Pending 0 0s + sample-domain2-introspect-domain-job-plssr 0/1 Pending 0 0s + sample-domain2-introspect-domain-job-plssr 0/1 ContainerCreating 0 0s + sample-domain2-introspect-domain-job-plssr 1/1 Running 0 2s + sample-domain2-introspect-domain-job-plssr 0/1 Completed 0 69s + sample-domain2-introspect-domain-job-plssr 0/1 Terminating 0 71s + sample-domain2-introspect-domain-job-plssr 0/1 Terminating 0 71s + sample-domain2-admin-server 0/1 Pending 0 0s + sample-domain2-admin-server 0/1 Pending 0 0s + sample-domain2-admin-server 0/1 ContainerCreating 0 0s + sample-domain2-admin-server 0/1 Running 0 1s + sample-domain2-admin-server 1/1 Running 0 34s + sample-domain2-managed-server1 0/1 Pending 0 0s + sample-domain2-managed-server1 0/1 Pending 0 0s + sample-domain2-managed-server1 0/1 ContainerCreating 0 0s + sample-domain2-managed-server2 0/1 Pending 0 0s + sample-domain2-managed-server2 0/1 Pending 0 0s + sample-domain2-managed-server2 0/1 ContainerCreating 0 0s + sample-domain2-managed-server1 0/1 Running 0 1s + sample-domain2-managed-server2 0/1 Running 0 1s + sample-domain2-managed-server1 1/1 Running 0 45s + sample-domain2-managed-server2 1/1 Running 0 45s + ``` + {{% /expand %}} + + For a more detailed view of this activity, you can instead call `/tmp/mii-sample/utils/wl-pod-wait.sh -n sample-domain1-ns -d sample-domain2 -p 3`. The output will look something like this: + + {{%expand "Click here to expand." %}} + ``` + $ ./wl-pod-wait.sh -n sample-domain1-ns -d sample-domain2 -p 3 + + @@ [2020-05-13T17:06:00][seconds=1] Info: Waiting up to 1000 seconds for exactly '3' WebLogic Server pods to reach the following criteria: + @@ [2020-05-13T17:06:00][seconds=1] Info: ready='true' + @@ [2020-05-13T17:06:00][seconds=1] Info: image='model-in-image:WLS-v1' + @@ [2020-05-13T17:06:00][seconds=1] Info: domainRestartVersion='1' + @@ [2020-05-13T17:06:00][seconds=1] Info: namespace='sample-domain1-ns' + @@ [2020-05-13T17:06:00][seconds=1] Info: domainUID='sample-domain2' + + @@ [2020-05-13T17:06:00][seconds=1] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-13T17:06:00][seconds=1] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------------------- ------- ----- ----- --------- + 'sample-domain2-introspect-domain-job-plssr' '' '' '' 'Running' + + @@ [2020-05-13T17:07:03][seconds=64] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-13T17:07:03][seconds=64] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------------------- ------- ----- ----- ----------- + 'sample-domain2-introspect-domain-job-plssr' '' '' '' 'Succeeded' + + @@ [2020-05-13T17:07:06][seconds=67] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-13T17:07:06][seconds=67] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + ---- ------- ----- ----- ----- + + @@ [2020-05-13T17:07:14][seconds=75] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-13T17:07:14][seconds=75] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + ----------------------------- ------- ----------------------- ------- --------- + 'sample-domain2-admin-server' '1' 'model-in-image:WLS-v1' 'false' 'Running' + + @@ [2020-05-13T17:07:47][seconds=108] Info: '1' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-13T17:07:47][seconds=108] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain2-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain2-managed-server1' '1' 'model-in-image:WLS-v1' 'false' 'Pending' + + @@ [2020-05-13T17:07:49][seconds=110] Info: '1' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-13T17:07:49][seconds=110] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain2-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain2-managed-server1' '1' 'model-in-image:WLS-v1' 'false' 'Running' + 'sample-domain2-managed-server2' '1' 'model-in-image:WLS-v1' 'false' 'Pending' + + @@ [2020-05-13T17:07:50][seconds=111] Info: '1' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-13T17:07:50][seconds=111] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain2-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain2-managed-server1' '1' 'model-in-image:WLS-v1' 'false' 'Running' + 'sample-domain2-managed-server2' '1' 'model-in-image:WLS-v1' 'false' 'Running' + + @@ [2020-05-13T17:08:32][seconds=153] Info: '2' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-13T17:08:32][seconds=153] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain2-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain2-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain2-managed-server2' '1' 'model-in-image:WLS-v1' 'false' 'Running' + + @@ [2020-05-13T17:08:34][seconds=155] Info: '3' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-13T17:08:34][seconds=155] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain2-admin-server' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain2-managed-server1' '1' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain2-managed-server2' '1' 'model-in-image:WLS-v1' 'true' 'Running' + + + @@ [2020-05-13T17:08:34][seconds=155] Info: Success! + + ``` + {{% /expand %}} + +1. After the `sample-domain2` domain is running, you can call its sample web application to verify that it's fully active. + + Send a web application request to the ingress controller for `sample-domain2`: + + ``` + $ curl -s -S -m 10 -H 'host: sample-domain2-cluster-cluster-1.mii-sample.org' \ + http://localhost:30305/myapp_war/index.jsp + ``` + + Or, if Traefik is unavailable and your `domain2` Administration Server pod is running, you can run `kubectl exec`: + + ``` + $ kubectl exec -n sample-domain1-ns sample-domain2-admin-server -- bash -c \ + "curl -s -S -m 10 http://sample-domain2-cluster-cluster-1:8001/myapp_war/index.jsp" + ``` + + You will see something like the following: + + ``` +
+    *****************************************************************
+
+    Hello World! This is version 'v1' of the mii-sample JSP web-app.
+
+    Welcome to WebLogic Server 'managed-server1'!
+
+     domain UID  = 'sample-domain2'
+     domain name = 'domain2'
+
+    Found 1 local cluster runtime:
+      Cluster 'cluster-1'
+
+    Found 1 local data source:
+      Datasource 'mynewdatasource': State='Running'
+
+    *****************************************************************
+    
+ + ``` + +If you see an error, then consult [Debugging]({{< relref "/userguide/managing-domains/model-in-image/debugging.md" >}}) in the Model in Image user guide. + +You will not be using the `sample-domain2` domain again in this sample; if you wish, you can shut it down now by calling `kubectl -n sample-domain1-ns delete domain sample-domain2`. + +To remove the resources you have created in the samples, see [Cleanup]({{< relref "/samples/simple/domains/model-in-image/cleanup.md" >}}). diff --git a/docs-source/content/samples/simple/domains/model-in-image/update3.md b/docs-source/content/samples/simple/domains/model-in-image/update3.md new file mode 100644 index 00000000000..33053cf7fbf --- /dev/null +++ b/docs-source/content/samples/simple/domains/model-in-image/update3.md @@ -0,0 +1,421 @@ +--- +title: "Update 3" +date: 2019-02-23T17:32:31-05:00 +weight: 5 +--- + +The Update 3 use case demonstrates deploying an updated WebLogic application to the running [Update 1]({{< relref "/samples/simple/domains/model-in-image/update1.md" >}}) use case domain using an updated Docker image. + +In the use case, you will: + + - Create an image `model-in-image:WLS-v2` that is similar to the currently active `model-in-image:WLS-v1` image, but with the following updates: + - An updated web application `v2` at the `myapp-v2` directory path within the WDT application archive instead of `myapp-v1`. + - An updated model YAML file within the image that points to the new web application path. + - Apply an updated Domain YAML file that references the new image while still referencing the original [Update 1]({{< relref "/samples/simple/domains/model-in-image/update1.md" >}}) use case secrets and model ConfigMap. + +After the updated Domain YAML file is applied, the operator will: + + - Rerun the introspector job and generate a new domain home based on the new model. + - Restart the domain's Administration Server pod so that it loads the new image and new domain home. + - Roll the domain's cluster servers one at a time so that they each load the new image, new domain home, and revised application. + +Finally, you will call the application to verify that its revision is active. + +Note that the old version of the application `v1` remains in the new image's archive but is unused. We leave it there to demonstrate that the old version can remain in case you want to revert to it. After the new image is applied, you can revert by modifying your model's `configuration.model.configMap` to override the related application path in your image model. + +Here are the steps for this use case: + +1. Make sure you have deployed the domain from the [Update 1]({{< relref "/samples/simple/domains/model-in-image/update1.md" >}}) use case. + +2. Create an updated image. + + Recall that a goal of the [Initial]({{< relref "/samples/simple/domains/model-in-image/initial.md" >}}) use case was to demonstrate using the WebLogic Image Tool to create an image named `model-in-image:WLS-v1` from files that were staged in `/tmp/mii-sample/model-images/model-in-image:WLS-v1/`. The staged files included a web application in a WDT ZIP archive, and WDT model configuration for a WebLogic Administration Server called `admin-server` and a WebLogic cluster called `cluster-1`. The final image was called `model-in-image:WLS-v1` and, in addition to having a copy of the staged files in its `/u01/wdt/models` directory, also contained a WebLogic installation and a WebLogic Deploy Tooling installation. + + In this use case, you will follow similar steps to the [Initial]({{< relref "/samples/simple/domains/model-in-image/initial.md" >}}) use case in order to create a new image with an updated application and model, plus deploy the updated model and application to the running [Update 1]({{< relref "/samples/simple/domains/model-in-image/update1.md" >}}) use case domain. + + - Understanding your updated WDT archive. + + The updated archive for this use case is in directory `/tmp/mii-sample/archives/archive-v2`. You will use it to create an archive ZIP file for the image. This archive is similar to the `/tmp/mii-sample/archives/archive-v1` from the [Initial]({{< relref "/samples/simple/domains/model-in-image/initial.md" >}}) use case with the following differences: + - It includes an updated version of the application in `./wlsdeploy/applications/myapp-v2` (while keeping the original application in directory `./wlsdeploy/applications/myapp-v1`). + - The application in `./wlsdeploy/applications/myapp-v2/myapp_war/index.jsp` contains a single difference from the original application: it changes the line `out.println("Hello World! This is version 'v1' of the mii-sample JSP web-app.");` to `out.println("Hello World! This is version 'v2' of the mii-sample JSP web-app.");`. + + For additional information about archives, see [Understanding your first archive]({{< relref "/samples/simple/domains/model-in-image/initial#understanding-your-first-archive" >}}) in the Initial use case. + + - Stage a ZIP file of the WDT archive. + + > **Note**: If you are using JRF in this sample, substitute `JRF` for each occurrence of `WLS` in the paths below. + + When you create your updated image, you will use the files in staging directory `/tmp/mii-sample/model-in-image__WLS-v2`. In preparation, you need it to contain a ZIP file of the new WDT application archive. + + Run the following commands to create your application archive ZIP file and put it in the expected directory: + + ``` + # Delete existing archive.zip in case we have an old leftover version + $ rm -f /tmp/mii-sample/model-images/model-in-image__WLS-v2/archive.zip + + # Move to the directory which contains the source files for our new archive + $ cd /tmp/mii-sample/archives/archive-v2 + + # Zip the archive to the location will later use when we run the WebLogic Image Tool + $ zip -r /tmp/mii-sample/model-images/model-in-image__WLS-v2/archive.zip wlsdeploy + ``` + + - Understanding your staged model files. + + The WDT model YAML file and properties for this use case have already been staged for you to directory `/tmp/mii-sample/model-in-image__WLS-v2`. + + The `model.10.yaml` file in this directory has an updated path `wlsdeploy/applications/myapp-v2` that references the updated web application in your archive, but is otherwise identical to the model staged for the original image. The final related YAML file stanza looks like this: + + ``` + appDeployments: + Application: + myapp: + SourcePath: 'wlsdeploy/applications/myapp-v2' + ModuleType: ear + Target: 'cluster-1' + ``` + + If you would like to review the entire original model before this change, see [Staging model files]({{< relref "/samples/simple/domains/model-in-image/initial#staging-model-files" >}}) in the Initial use case. + + - Create a new image from your staged model files using WIT. + + > **Note**: If you are using JRF in this sample, substitute `JRF` for each occurrence of `WLS` in the `imagetool` command line below, plus substitute `container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.4` for the `--fromImage` value. + + At this point, you have staged all of the files needed for image `model-in-image:WLS-v2`; they include: + + - `/tmp/mii-sample/model-images/weblogic-deploy.zip` + - `/tmp/mii-sample/model-images/model-in-image__WLS-v2/model.10.yaml` + - `/tmp/mii-sample/model-images/model-in-image__WLS-v2/model.10.properties` + - `/tmp/mii-sample/model-images/model-in-image__WLS-v2/archive.zip` + + If you don't see the `weblogic-deploy.zip` file, then you missed a step in the [prerequisites]({{< relref "/samples/simple/domains/model-in-image/prerequisites.md" >}}). + + Now, you use the Image Tool to create an image named `model-in-image:WLS-v2` that's layered on a base WebLogic image. You've already set up this tool during the prerequisite steps. + + Run the following commands to create the model image and verify that it worked: + + ``` + $ cd /tmp/mii-sample/model-images + $ ./imagetool/bin/imagetool.sh update \ + --tag model-in-image:WLS-v2 \ + --fromImage container-registry.oracle.com/middleware/weblogic:12.2.1.4 \ + --wdtModel ./model-in-image__WLS-v2/model.10.yaml \ + --wdtVariables ./model-in-image__WLS-v2/model.10.properties \ + --wdtArchive ./model-in-image__WLS-v2/archive.zip \ + --wdtModelOnly \ + --wdtDomainType WLS + ``` + + If you don't see the `imagetool` directory, then you missed a step in the [prerequisites]({{< relref "/samples/simple/domains/model-in-image/prerequisites.md" >}}). + + This command runs the WebLogic Image Tool in its Model in Image mode, and does the following: + - Builds the final Docker image as a layer on the `container-registry.oracle.com/middleware/weblogic:12.2.1.4` base image. + - Copies the WDT ZIP file that's referenced in the WIT cache into the image. + - Note that you cached WDT in WIT using the keyword `latest` when you set up the cache during the sample prerequisites steps. + - This lets WIT implicitly assume it's the desired WDT version and removes the need to pass a `-wdtVersion` flag. + - Copies the specified WDT model, properties, and application archives to image location `/u01/wdt/models`. + + When the command succeeds, it will end with output like the following: + + ``` + [INFO ] Build successful. Build time=36s. Image tag=model-in-image:WLS-v2 + ``` + + Also, if you run the `docker images` command, then you will see a Docker image named `model-in-image:WLS-v2`. + + > **Note**: If you have Kubernetes cluster worker nodes that are remote to your local machine, then you need to put the image in a location that these nodes can access. See [Ensuring your Kubernetes cluster can access images]({{< relref "/samples/simple/domains/model-in-image/_index.md#ensuring-your-kubernetes-cluster-can-access-images" >}}). + +#### Deploy resources - Introduction + +1. Set up and apply a Domain YAML file that is similar to your Update 1 use case Domain YAML file but with a different image: + + > **Note**: If you are using JRF in this sample, substitute `JRF` for each occurrence of `WLS` in the paths, files, and image names below. + + - Option 1: Update a copy of your Domain YAML file from the Update 1 use case. + + - In the [Update 1]({{< relref "/samples/simple/domains/model-in-image/update1.md" >}}) use case, we suggested creating a file named `/tmp/mii-sample/mii-update1.yaml` or using the `/tmp/mii-sample/domain-resources/WLS/mii-update1-d1-WLS-v1-ds.yaml` file that is supplied with the sample. + + - We suggest copying this Domain YAML file and naming the copy `/tmp/mii-sample/mii-update3.yaml` before making any changes. + + - Working on a copy is not strictly necessary, but it helps keep track of your work for the different use cases in this sample and provides you a backup of your previous work. + + - Change the `/tmp/mii-sample/mii-update3.yaml` Domain YAML file's `image` field to reference `model-in-image:WLS-v2` instead of `model-in-image:WLS-v1`. + + The final result will look something like this: + + ``` + ... + spec: + ... + image: "model-in-image:WLS-v2" + ``` + + - Apply your changed Domain YAML file: + + > **Note**: Before you deploy the domain custom resource, determine if you have Kubernetes cluster worker nodes that are remote to your local machine. If so, you need to put the Domain YAML file's image in a location that these nodes can access and you may also need to modify your Domain YAML file to reference the new location. See [Ensuring your Kubernetes cluster can access images]({{< relref "/samples/simple/domains/model-in-image/_index.md#ensuring-your-kubernetes-cluster-can-access-images" >}}). + + ``` + $ kubectl apply -f /tmp/mii-sample/mii-update3.yaml + ``` + + - Option 2: Use the updated Domain YAML file that is supplied with the sample: + + > **Note**: Before you deploy the Domain YAML file, determine if you have Kubernetes cluster worker nodes that are remote to your local machine. If so, you need to put the Domain YAML file's image in a location that these nodes can access and you may also need to modify your Domain YAML file to reference the new location. See [Ensuring your Kubernetes cluster can access images]({{< relref "/samples/simple/domains/model-in-image/_index.md#ensuring-your-kubernetes-cluster-can-access-images" >}}). + + ``` + $ kubectl apply -f /tmp/miisample/domain-resources/WLS/mii-update3-d1-WLS-v2-ds.yaml + ``` + + +1. Wait for the roll to complete. + + Now that you've applied a Domain YAML file with an updated image, the operator will automatically rerun the domain's introspector job in order to generate a new domain home, and then will restart ('roll') each of the domain's pods so that they use the new domain home and the new image. You'll need to wait for this roll to complete before you can verify that the new image and its associated new application have been deployed. + + - One way to do this is to call `kubectl get pods -n sample-domain1-ns --watch` and wait for the pods to cycle back to their `ready` state. + + - Alternatively, you can run `/tmp/mii-sample/utils/wl-pod-wait.sh -p 3`. This is a utility script that provides useful information about a domain's pods and waits for them to reach a `ready` state, reach their target `restartVersion`, and reach their target `image` before exiting. + + {{%expand "Click here to display the `wl-pod-wait.sh` usage." %}} + ``` + $ ./wl-pod-wait.sh -? + + Usage: + + wl-pod-wait.sh [-n mynamespace] [-d mydomainuid] \ + [-p expected_pod_count] \ + [-t timeout_secs] \ + [-q] + + Exits non-zero if 'timeout_secs' is reached before 'pod_count' is reached. + + Parameters: + + -d : Defaults to 'sample-domain1'. + + -n : Defaults to 'sample-domain1-ns'. + + pod_count > 0 : Wait until exactly 'pod_count' WebLogic Server pods for + a domain all (a) are ready, (b) have the same + 'domainRestartVersion' label value as the + current Domain's 'spec.restartVersion, and + (c) have the same image as the current Domain's + image. + + pod_count = 0 : Wait until there are no running WebLogic Server pods + for a domain. The default. + + -t : Timeout in seconds. Defaults to '1000'. + + -q : Quiet mode. Show only a count of wl pods that + have reached the desired criteria. + + -? : This help. + ``` + {{% /expand %}} + + {{%expand "Click here to view sample output from `wl-pod-wait.sh` that shows a rolling domain." %}} + ``` + $ ./wl-pod-wait.sh -n sample-domain1-ns -d sample-domain1 -p 3 + + @@ [2020-05-14T17:28:47][seconds=1] Info: Waiting up to 1000 seconds for exactly '3' WebLogic Server pods to reach the following criteria: + @@ [2020-05-14T17:28:47][seconds=1] Info: ready='true' + @@ [2020-05-14T17:28:47][seconds=1] Info: image='model-in-image:WLS-v2' + @@ [2020-05-14T17:28:47][seconds=1] Info: domainRestartVersion='1' + @@ [2020-05-14T17:28:47][seconds=1] Info: namespace='sample-domain1-ns' + @@ [2020-05-14T17:28:47][seconds=1] Info: domainUID='sample-domain1' + + @@ [2020-05-14T17:28:47][seconds=1] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:28:47][seconds=1] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-introspect-domain-job-g5kzn' '' '' '' 'Running' + 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-05-14T17:29:39][seconds=53] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:29:39][seconds=53] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-05-14T17:29:50][seconds=64] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:29:50][seconds=64] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-05-14T17:29:58][seconds=72] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:29:58][seconds=72] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v2' 'false' 'Pending' + 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-05-14T17:29:59][seconds=73] Info: '0' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:29:59][seconds=73] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v2' 'false' 'Running' + 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-05-14T17:30:30][seconds=104] Info: '1' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:30:30][seconds=104] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'true' 'Running' + 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-05-14T17:31:13][seconds=147] Info: '1' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:31:13][seconds=147] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server1' '2' 'model-in-image:WLS-v1' 'false' 'Running' + 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-05-14T17:31:15][seconds=149] Info: '1' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:31:15][seconds=149] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-05-14T17:31:41][seconds=175] Info: '1' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:31:41][seconds=175] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v2' 'false' 'Pending' + 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-05-14T17:31:42][seconds=176] Info: '1' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:31:42][seconds=176] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v2' 'false' 'Running' + 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-05-14T17:32:21][seconds=215] Info: '2' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:32:21][seconds=215] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'true' 'Running' + + @@ [2020-05-14T17:32:31][seconds=225] Info: '2' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:32:31][seconds=225] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server2' '2' 'model-in-image:WLS-v1' 'false' 'Running' + + @@ [2020-05-14T17:32:40][seconds=234] Info: '2' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:32:40][seconds=234] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v2' 'true' 'Running' + + @@ [2020-05-14T17:32:51][seconds=245] Info: '2' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:32:51][seconds=245] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v2' 'false' 'Pending' + + @@ [2020-05-14T17:32:52][seconds=246] Info: '2' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:32:52][seconds=246] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------- --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v2' 'false' 'Running' + + @@ [2020-05-14T17:33:25][seconds=279] Info: '3' WebLogic Server pods currently match all criteria, expecting '3'. + @@ [2020-05-14T17:33:25][seconds=279] Info: Introspector and WebLogic Server pods with same namespace and domain-uid: + + NAME VERSION IMAGE READY PHASE + -------------------------------- ------- ----------------------- ------ --------- + 'sample-domain1-admin-server' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server1' '1' 'model-in-image:WLS-v2' 'true' 'Running' + 'sample-domain1-managed-server2' '1' 'model-in-image:WLS-v2' 'true' 'Running' + + + @@ [2020-05-14T17:33:25][seconds=279] Info: Success! + + ``` + {{% /expand %}} + +1. After your domain roll is complete, you can call the sample web application to determine if the updated application was deployed. + + When the application is invoked, it will contain an output string like `Hello World! This is version 'v2' of the mii-sample JSP web-app.`. + + Send a web application request to the ingress controller: + + ``` + $ curl -s -S -m 10 -H 'host: sample-domain1-cluster-cluster-1.mii-sample.org' \ + http://localhost:30305/myapp_war/index.jsp + ``` + + Or, if Traefik is unavailable and your Administration Server pod is running, you can run `kubectl exec`: + + ``` + $ kubectl exec -n sample-domain1-ns sample-domain1-admin-server -- bash -c \ + "curl -s -S -m 10 http://sample-domain1-cluster-cluster-1:8001/myapp_war/index.jsp" + ``` + + You will see something like the following: + + ``` +
+    *****************************************************************
+
+    Hello World! This is version 'v2' of the mii-sample JSP web-app.
+
+    Welcome to WebLogic Server 'managed-server1'!
+
+     domain UID  = 'sample-domain1'
+     domain name = 'domain1'
+
+    Found 1 local cluster runtime:
+      Cluster 'cluster-1'
+
+    Found 1 local data source:
+      Datasource 'mynewdatasource': State='Running'
+
+    *****************************************************************
+    
+ + ``` + +If you see an error, then consult [Debugging]({{< relref "/userguide/managing-domains/model-in-image/debugging.md" >}}) in the Model in Image user guide. + +This completes the sample scenarios. + +To remove the resources you have created in the samples, see [Cleanup]({{< relref "/samples/simple/domains/model-in-image/cleanup.md" >}}). diff --git a/docs-source/content/samples/simple/domains/soa-domain/_index.md b/docs-source/content/samples/simple/domains/soa-domain/_index.md index cda0a359571..917a812b565 100644 --- a/docs-source/content/samples/simple/domains/soa-domain/_index.md +++ b/docs-source/content/samples/simple/domains/soa-domain/_index.md @@ -3,7 +3,7 @@ title: "SOA domain" date: 2019-04-18T07:32:31-05:00 weight: 6 description: "Sample for creating a SOA Suite domain home on an existing PV or -PVC, and the domain resource YAML file for deploying the generated SOA domain." +PVC, and the Domain YAML file for deploying the generated SOA domain." --- {{% notice warning %}} @@ -94,7 +94,7 @@ The following parameters can be provided in the inputs file. | `createDomainScriptName` | Script that the create domain script uses to create a WebLogic domain. The `create-domain.sh` script creates a Kubernetes Job to run this script to create a domain home. The script is located in the in-pod directory that is specified in the `createDomainScriptsMountPath` property. If you need to provide your own scripts to create the domain home, instead of using the built-it scripts, you must use this property to set the name of the script that you want the create domain job to run. | `create-domain-job.sh` | | `domainHome` | Home directory of the SOA domain. If not specified, the value is derived from the `domainUID` as `/shared/domains/`. | `/u01/oracle/user_projects/domains/soainfra` | | `domainPVMountPath` | Mount path of the domain persistent volume. | `/u01/oracle/user_projects` | -| `domainUID` | Unique ID that will be used to identify this particular domain. Used as the name of the generated WebLogic domain as well as the name of the Kubernetes domain resource. This ID must be unique across all domains in a Kubernetes cluster. This ID cannot contain any character that is not valid in a Kubernetes Service name. | `soainfra` | +| `domainUID` | Unique ID that will be used to identify this particular domain. Used as the name of the generated WebLogic domain as well as the name of the Kubernetes Domain. This ID must be unique across all domains in a Kubernetes cluster. This ID cannot contain any character that is not valid in a Kubernetes Service name. | `soainfra` | | `domainType` | Type of the domain. Mandatory input for SOA Suite domains. You must provide one of the supported domain type values: `soa` (deploys a SOA domain),`osb` (deploys an OSB (Oracle Service Bus) domain),`soaess` (deploys a SOA domain with Enterprise Scheduler (ESS)),`soaosb` (deploys a domain with SOA and OSB), and `soaessosb` (deploys a domain with SOA, OSB, and ESS). | `soa` | `exposeAdminNodePort` | Boolean indicating if the Administration Server is exposed outside of the Kubernetes cluster. | `false` | | `exposeAdminT3Channel` | Boolean indicating if the T3 administrative channel is exposed outside the Kubernetes cluster. | `false` | @@ -194,15 +194,12 @@ $ cat output/weblogic-domains/soainfra/domain.yaml # # This is an example of how to define a Domain resource. # -# If you are using 3.0.0-rc1, then the version on the following line -# should be `v8` not `v7`. -apiVersion: "weblogic.oracle/v7" +apiVersion: "weblogic.oracle/v8" kind: Domain metadata: name: soainfra namespace: soans labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: soainfra spec: # The WebLogic Domain Home @@ -315,15 +312,14 @@ $ kubectl describe domain soainfra -n soans Name: soainfra Namespace: soans Labels: weblogic.domainUID=soainfra - weblogic.resourceVersion=domain-v2 Annotations: -API Version: weblogic.oracle/v7 +API Version: weblogic.oracle/v8 Kind: Domain Metadata: Creation Timestamp: 2020-01-27T10:04:11Z Generation: 6 Resource Version: 18537800 - Self Link: /apis/weblogic.oracle/v7/namespaces/soans/domains/soainfra + Self Link: /apis/weblogic.oracle/v8/namespaces/soans/domains/soainfra UID: 5dcb76e4-40ec-11ea-b332-020017041cc2 Spec: Admin Server: diff --git a/docs-source/content/samples/simple/elastic-stack/weblogic-domain/_index.md b/docs-source/content/samples/simple/elastic-stack/weblogic-domain/_index.md index 998350db479..b253c23e3cd 100644 --- a/docs-source/content/samples/simple/elastic-stack/weblogic-domain/_index.md +++ b/docs-source/content/samples/simple/elastic-stack/weblogic-domain/_index.md @@ -89,7 +89,6 @@ kind: ConfigMap metadata: labels: weblogic.domainUID: bobs-bookstore - weblogic.resourceVersion: domain-v2 name: fluentd-config namespace: bob data: @@ -256,14 +255,11 @@ _id:OQIeiG0BGd1zHsxmUrEJ _type:fluentd _index:bobs-bookstore _score:1 The following is a complete example of a domain custom resource with a `fluentd` container configured. ```yaml -# If you are using 3.0.0-rc1, then the version on the following line -# should be `v8` not `v7`. -apiVersion: weblogic.oracle/v7 +apiVersion: weblogic.oracle/v8 kind: Domain metadata: labels: weblogic.domainUID: bobs-bookstore - weblogic.resourceVersion: domain-v2 name: bobs-bookstore namespace: bob spec: @@ -278,7 +274,7 @@ spec: - clusterName: cluster-1 serverPod: domainHome: /u01/oracle/user_projects/domains/bobs-bookstore - domainHomeInImage: true + domainHomeSourceType: Image domainUID: bobs-bookstore experimental: istio: diff --git a/docs-source/content/samples/simple/storage/_index.md b/docs-source/content/samples/simple/storage/_index.md index 581eb6ae05f..d8bea83135d 100644 --- a/docs-source/content/samples/simple/storage/_index.md +++ b/docs-source/content/samples/simple/storage/_index.md @@ -2,13 +2,13 @@ title: "Storage" date: 2019-02-23T17:32:31-05:00 weight: 1 -description: "Sample for creating a PV or PVC that can be used by a domain resource as the persistent storage for the WebLogic domain home or log files." +description: "Sample for creating a PV or PVC that can be used by a Domain YAML file as the persistent storage for the WebLogic domain home or log files." --- ### Sample PersistentVolume and PersistentVolumeClaim -The sample scripts demonstrate the creation of a Kubernetes PersistentVolume (PV) and PersistentVolumeClaim (PVC), which can then be used in a domain resource as a persistent storage for the WebLogic domain home or log files. +The sample scripts demonstrate the creation of a Kubernetes PersistentVolume (PV) and PersistentVolumeClaim (PVC), which can then be used in a Domain YAML file as a persistent storage for the WebLogic domain home or log files. A PV and PVC can be shared by multiple WebLogic domains or dedicated to a particular domain. @@ -57,7 +57,7 @@ The PV and PVC creation inputs can be customized by editing the `create-pv-pvc-i | Parameter | Definition | Default | | --- | --- | --- | -| `domainUID` | ID of the domain resource to which the generated PV and PVC will be dedicated. Leave it empty if the PV and PVC are going to be shared by multiple domains. | no default | +| `domainUID` | ID of the Domain to which the generated PV and PVC will be dedicated. Leave it empty if the PV and PVC are going to be shared by multiple domains. | no default | | `namespace` | Kubernetes Namespace to create the PVC. | `default` | | `baseName` | Base name of the PV and PVC. The generated PV and PVC will be `-pv` and `-pvc` respectively. | `weblogic-sample` | | `weblogicDomainStoragePath` | Physical path of the storage for the PV. When `weblogicDomainStorageType` is set to `HOST_PATH`, this value should be set the to path to the domain storage on the Kubernetes host. When `weblogicDomainStorageType` is set to NFS, then `weblogicDomainStorageNFSServer` should be set to the IP address or name of the DNS server, and this value should be set to the exported path on that server. Note that the path where the domain is mounted in the WebLogic containers is not affected by this setting; that is determined when you create your domain. | no default | @@ -68,7 +68,7 @@ The PV and PVC creation inputs can be customized by editing the `create-pv-pvc-i #### Shared versus dedicated PVC -By default, the `domainUID` is left empty in the inputs file, which means the generated PV and PVC will not be associated with a particular domain, but can be shared by multiple domain resources in the same Kubernetes Namespaces as the PV and PVC. If the PV/PVC is being shared across domains, then, as a best practice, you should specify a unique `baseName`. +By default, the `domainUID` is left empty in the inputs file, which means the generated PV and PVC will not be associated with a particular domain, but can be shared by multiple Domains in the same Kubernetes Namespaces as the PV and PVC. If the PV/PVC is being shared across domains, then, as a best practice, you should specify a unique `baseName`. For the use cases where dedicated PV and PVC are desired for a particular domain, the `domainUID` needs to be set in the `create-pv-pvc-inputs.yaml` file. The presence of a non-empty `domainUID` in the inputs file will cause the generated PV and PVC to be associated with the specified `domainUID`. The association includes that the names of the generated YAML files and the Kubernetes PV and PVC objects are decorated with the `domainUID`, and the PV and PVC objects are also labeled with the `domainUID`. @@ -89,8 +89,6 @@ apiVersion: v1 metadata: name: weblogic-sample-pvc namespace: default - labels: - weblogic.resourceVersion: domain-v2 storageClassName: weblogic-sample-storage-class accessModes: @@ -109,9 +107,8 @@ apiVersion: v1 kind: PersistentVolume metadata: name: weblogic-sample-pv - labels: - weblogic.resourceVersion: domain-v2 - # weblogic.domainUID: + # labels: + # weblogic.domainUID: spec: storageClassName: weblogic-sample-storage-class capacity: @@ -141,7 +138,6 @@ metadata: name: domain1-weblogic-sample-pvc namespace: default labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: domain1 spec: storageClassName: domain1-weblogic-sample-storage-class @@ -162,7 +158,6 @@ kind: PersistentVolume metadata: name: domain1-weblogic-sample-pv labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: domain1 spec: storageClassName: domain1-weblogic-sample-storage-class @@ -186,7 +181,6 @@ should have the value `Bound`, indicating the that PersistentVolume has been cla ``` $ kubectl describe pv weblogic-sample-pv Name: weblogic-sample-pv -Labels: weblogic.resourceVersion=domain-v2 Annotations: pv.kubernetes.io/bound-by-controller=yes StorageClass: weblogic-sample-storage-class Status: Bound @@ -212,7 +206,6 @@ Namespace: default StorageClass: weblogic-sample-storage-class Status: Bound Volume: weblogic-sample-pv -Labels: weblogic.resourceVersion=domain-v2 Annotations: pv.kubernetes.io/bind-completed=yes pv.kubernetes.io/bound-by-controller=yes Finalizers: [] diff --git a/docs-source/content/security/domain-security/image-protection.md b/docs-source/content/security/domain-security/image-protection.md index 43ab585596d..bdbfc870fd7 100644 --- a/docs-source/content/security/domain-security/image-protection.md +++ b/docs-source/content/security/domain-security/image-protection.md @@ -38,10 +38,9 @@ metadata: name: domain1 namespace: domain1-ns labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: domain1 spec: - domainHomeInImage: true + domainHomeSourceType: Image image: "my-domain-home-in-image" imagePullPolicy: "IfNotPresent" imagePullSecrets: diff --git a/docs-source/content/security/secrets.md b/docs-source/content/security/secrets.md index c8783ac45e5..ccf57e7c7e1 100644 --- a/docs-source/content/security/secrets.md +++ b/docs-source/content/security/secrets.md @@ -20,7 +20,7 @@ the secret is specified using `webLogicCredentialsSecret` in the WebLogic `Domai Also, the domain credentials secret must be created in the namespace where the `Domain` will be running. {{% notice note %}} -For an example of a WebLogic domain resource using `webLogicCredentialsSecret`, +For an example of a WebLogic Domain YAML file using `webLogicCredentialsSecret`, see [Docker Image Protection]({{}}). {{% /notice %}} diff --git a/docs-source/content/userguide/introduction/architecture.md b/docs-source/content/userguide/introduction/architecture.md index 4344ddd3e01..6dae3ecaaf7 100644 --- a/docs-source/content/userguide/introduction/architecture.md +++ b/docs-source/content/userguide/introduction/architecture.md @@ -18,12 +18,12 @@ The operator is packaged in a [Docker image](https://hub.docker.com/r/oracle/web ``` $ docker login -$ docker pull oracle/weblogic-kubernetes-operator:2.6.0 +$ docker pull oracle/weblogic-kubernetes-operator:3.0.0 ``` For more details on acquiring the operator image and prerequisites for installing the operator, consult the [Quick Start guide]({{< relref "/quickstart/_index.md" >}}). -The operator registers a Kubernetes custom resource definition called `domain.weblogic.oracle` (shortname `domain`, plural `domains`). More details about the domain resource type defined by this CRD, including its schema, are available [here]({{< relref "/userguide/managing-domains/domain-resource.md" >}}). +The operator registers a Kubernetes custom resource definition called `domain.weblogic.oracle` (shortname `domain`, plural `domains`). More details about the Domain type defined by this CRD, including its schema, are available [here]({{< relref "/userguide/managing-domains/domain-resource.md" >}}). The diagram below shows the general layout of high-level components, including optional components, in a Kubernetes cluster that is hosting WebLogic domains and the operator: @@ -56,9 +56,9 @@ The diagram below shows the components inside the containers running WebLogic Se ![Inside a container](/weblogic-kubernetes-operator/images/inside-a-container.png) -The domain resource specifies a Docker image, defaulting to `container-registry.oracle.com/middleware/weblogic:12.2.1.4`. All containers running WebLogic Server use this same Docker image. Depending on the use case, this image could contain the WebLogic Server product binaries or also include the domain directory. +The Domain specifies a container image, defaulting to `container-registry.oracle.com/middleware/weblogic:12.2.1.4`. All containers running WebLogic Server use this same Docker image. Depending on the use case, this image could contain the WebLogic Server product binaries or also include the domain directory. {{% notice note %}} -During a rolling event caused by a change to the domain resource's `image` field, containers will be using a mix of the updated value of the `image` field and its previous value. +During a rolling event caused by a change to the Domain's `image` field, containers will be using a mix of the updated value of the `image` field and its previous value. {{% /notice %}} Within the container, the following aspects are configured by the operator: @@ -68,7 +68,7 @@ Within the container, the following aspects are configured by the operator: * A shutdown hook is configured that will execute a script that performs a graceful shutdown of the server. This ensures that servers have an opportunity to shut down cleanly before they are killed. ### Domain state stored outside Docker images -The operator expects (and requires) that all state be stored outside of the Docker images that are used to run the domain. This means either in a persistent file system, or in a database. The WebLogic configuration, that is, the domain directory and the applications directory may come from the Docker image or a persistent volume. However, other state, such as file-based persistent stores, and such, must be stored on a persistent volume or in a database. All of the containers that are participating in the WebLogic domain use the same image, and take on their personality; that is, which server they execute, at startup time. Each pod mounts storage, according to the domain resource, and has access to the state information that it needs to fulfill its role in the domain. +The operator expects (and requires) that all state be stored outside of the Docker images that are used to run the domain. This means either in a persistent file system, or in a database. The WebLogic configuration, that is, the domain directory and the applications directory may come from the Docker image or a persistent volume. However, other state, such as file-based persistent stores, and such, must be stored on a persistent volume or in a database. All of the containers that are participating in the WebLogic domain use the same image, and take on their personality; that is, which server they execute, at startup time. Each Pod mounts storage, according to the Domain, and has access to the state information that it needs to fulfill its role in the domain. It is worth providing some background information on why this approach was adopted, in addition to the fact that this separation is consistent with other existing operators (for other products) and the Kubernetes “cattle, not pets” philosophy when it comes to containers. diff --git a/docs-source/content/userguide/introduction/design.md b/docs-source/content/userguide/introduction/design.md index 3aa6a3e3cc6..03d5d936354 100644 --- a/docs-source/content/userguide/introduction/design.md +++ b/docs-source/content/userguide/introduction/design.md @@ -26,8 +26,8 @@ The operator is designed with security in mind from the outset. Some examples o The operator is designed to avoid imposing any arbitrary restriction on how WebLogic Server may be configured or used in Kubernetes. Where there are restrictions, these are based on the availability of some specific feature in Kubernetes; for example, multicast support. -The operator learns of WebLogic domains through instances of a domain Kubernetes resource. When the operator is installed, it creates a Kubernetes [Custom Resource Definition](https://kubernetes.io/docs/concepts/api-extension/custom-resources/). This custom resource definition defines the domain resource type. After this type is defined, you can manage domain resources using `kubectl` just like any other resource type. For instance, `kubectl get domain` or `kubectl edit domain domain1`. +The operator learns of WebLogic domains through instances of a domain Kubernetes resource. When the operator is installed, it creates a Kubernetes [Custom Resource Definition](https://kubernetes.io/docs/concepts/api-extension/custom-resources/). This custom resource definition defines the Domain type. After this type is defined, you can manage Domains using `kubectl` just like any other resource type. For instance, `kubectl get domain` or `kubectl edit domain domain1`. -Schema for domain resources is [here](https://oracle.github.io/weblogic-kubernetes-operator/domains/Domain.json). +Schema for Domains is [here](https://oracle.github.io/weblogic-kubernetes-operator/domains/Domain.json). -The schema for the domain resource is designed to be as sparse as possible. It includes the connection details for the Administration Server, but all of the other content is operational details about which servers should be started, environment variables, and details about what should be exposed outside the Kubernetes cluster. This way, the WebLogic domain's configuration remains the normative configuration. +The schema for the Domain type is designed to be as sparse as possible. It includes the connection details for the Administration Server, but all of the other content is operational details about which servers should be started, environment variables, and details about what should be exposed outside the Kubernetes cluster. This way, the WebLogic domain's configuration remains the normative configuration. diff --git a/docs-source/content/userguide/introduction/introduction.md b/docs-source/content/userguide/introduction/introduction.md index 79aecd6193c..bb9dca40aeb 100644 --- a/docs-source/content/userguide/introduction/introduction.md +++ b/docs-source/content/userguide/introduction/introduction.md @@ -16,9 +16,9 @@ Detailed instructions are available [here]({{< relref "/userguide/managing-opera ### Operator prerequisites -For the current production release 2.6.0: +For the current production release 3.0.0: -* Kubernetes 1.14.8+, 1.15.7+, 1.1.6.0+, 1.17.0+, and 1.18.0+ (check with `kubectl version`). +* Kubernetes 1.14.8+, 1.15.7+, 1.16.0+, 1.17.0+, and 1.18.0+ (check with `kubectl version`). * Flannel networking v0.9.1-amd64 or later (check with `docker images | grep flannel`) *or* OpenShift SDN on OpenShift 4.3 systems. * Docker 18.9.1 or 19.03.1 (check with `docker version`) *or* CRI-O 1.14.7 (check with `crictl version | grep RuntimeVersion`). * Helm 3.0.3+ (check with `helm version --client --short`). @@ -31,7 +31,6 @@ For the current production release 2.6.0: not need the `cluster-admin` role at runtime. * We do not currently support running WebLogic in non-Linux containers. - ### Cloud providers The Oracle [Global Pricing and Licensing site](https://www.oracle.com/corporate/pricing/specialty-topics.html) diff --git a/docs-source/content/userguide/istio/istio.md b/docs-source/content/userguide/istio/istio.md index 2a0e27896cc..e6113b25e78 100644 --- a/docs-source/content/userguide/istio/istio.md +++ b/docs-source/content/userguide/istio/istio.md @@ -22,7 +22,7 @@ The current support for Istio has these limitations: multicluster installations of Istio. * You cannot expose any of the default channels; any attempt will result in an error when deploying the domain. * If the `istio-ingressgateway` service in your environment does not have an `EXTERNAL-IP` defined, -in order to use WLST commands, define a network access point (NAP) in your WebLogic domain and expose it as a `NodePort` in your domain resource YAML file +in order to use WLST commands, define a network access point (NAP) in your WebLogic domain and expose it as a `NodePort` in your Domain YAML file and access it through the `NodePort` instead of accessing the channel through the Istio mesh network. To learn more about service mesh, see [Istio](https://istio.io/latest/docs/concepts/what-is-istio/). @@ -72,13 +72,12 @@ To enable Istio support for a domain, you need to add the following example: ``` -apiVersion: "weblogic.oracle/v7" +apiVersion: "weblogic.oracle/v8" kind: Domain metadata: name: domain2 namespace: domain1 labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: domain2 spec: ... other content ... @@ -94,7 +93,7 @@ and defaults to `8888` if not provided; it is used for a readiness health check. ##### How Istio-enabled domains differ from regular domains -Istio enforces a number of requirements on Pods. When you enable Istio support in the domain resource, the +Istio enforces a number of requirements on Pods. When you enable Istio support in the Domain YAML file, the introspector job automatically creates configuration overrides with the necessary channels for the domain to satisfy Istio's requirements, including: When deploying a domain with Istio sidecar injection enabled, the operator automatically adds the following network @@ -134,9 +133,9 @@ Additionally, when Istio support is enabled for a domain, the operator ensures that the Istio sidecar is not injected into the introspector job's pods. -### Apply the domain resource YAML file +### Apply the Domain YAML file -After the domain resource YAML file is modified, apply it by: +After the Domain YAML file is modified, apply it by: ``` kubect apply -f domain.yaml @@ -265,4 +264,4 @@ as shown in the image above. ![Distributed tracing with Jaeger](/weblogic-kubernetes-operator/images/jaeger.png) -To learn more, see [distrubting tracing in Istio](https://istio.io/docs/tasks/telemetry/distributed-tracing/). \ No newline at end of file +To learn more, see [distrubting tracing in Istio](https://istio.io/docs/tasks/telemetry/distributed-tracing/). diff --git a/docs-source/content/userguide/managing-domains/_index.md b/docs-source/content/userguide/managing-domains/_index.md index b05d3770348..8f58491e1a3 100644 --- a/docs-source/content/userguide/managing-domains/_index.md +++ b/docs-source/content/userguide/managing-domains/_index.md @@ -10,7 +10,7 @@ description: "Important considerations for WebLogic domains in Kubernetes." * [Important considerations for WebLogic domains in Kubernetes](#important-considerations-for-weblogic-domains-in-kubernetes) * [Creating and managing WebLogic domains](#creating-and-managing-weblogic-domains) * [Modifying domain configurations](#modifying-domain-configurations) -* [About the domain resource](#about-the-domain-resource) +* [About the Domain resource](#about-the-domain-resource) * [Managing life cycle operations](#managing-life-cycle-operations) * [Scaling clusters](#scaling-clusters) @@ -18,12 +18,10 @@ description: "Important considerations for WebLogic domains in Kubernetes." Be aware of the following important considerations for WebLogic domains running in Kubernetes: -* _Domain Home Location:_ The WebLogic domain home location is determined by the domain resource `domainHome` and `domainHomeInImage` fields. - If you are using 3.0.0-rc1, these same fields are used, if specified; otherwise, a default location is determined by the `domainHomeSourceType` setting. - The `domainHomeSourceType` field is *not* available in releases before 3.0.0-rc1. - - If the domain resource `domainHome` field is not specified and `domainHomeSourceType` is `Image` (the default), then the operator will assume that the domain home is a directory under `/u01/oracle/user_projects/domains/`, and report an error if no domain is found or more than one domain is found. - - If the domain resource `domainHome` field is not specified and `domainHomeSourceType` is `PersistentVolume`, then the operator will assume that the domain home is `/shared/domains/DOMAIN_UID`. - - Finally, if the domain resource `domainHome` field is not specified and the `domainHomeSourceType` is `FromModel`, then the operator will assume that the domain home is `/u01/domains/DOMAIN_UID`. +* _Domain Home Location:_ The WebLogic domain home location is determined by the Domain YAML file `domainHome`, if specified; otherwise, a default location is determined by the `domainHomeSourceType` setting. + - If the Domain `domainHome` field is not specified and `domainHomeSourceType` is `Image` (the default), then the operator will assume that the domain home is a directory under `/u01/oracle/user_projects/domains/`, and report an error if no domain is found or more than one domain is found. + - If the Domain `domainHome` field is not specified and `domainHomeSourceType` is `PersistentVolume`, then the operator will assume that the domain home is `/shared/domains/DOMAIN_UID`. + - Finally, if the Domain `domainHome` field is not specified and the `domainHomeSourceType` is `FromModel`, then the operator will assume that the domain home is `/u01/domains/DOMAIN_UID`. {{% notice warning %}} Oracle strongly recommends storing an image containing a WebLogic domain home (`domainHomeSourceType` is `Image`) @@ -35,7 +33,7 @@ Be aware of the following important considerations for WebLogic domains running {{% /notice %}} * _Log File Locations:_ The operator can automatically override WebLogic domain and server log locations using - configuration overrides. This occurs if the domain resource `logHomeEnabled` field is explicitly set to `true`, or if `logHomeEnabled` isn't set + configuration overrides. This occurs if the Domain `logHomeEnabled` field is explicitly set to `true`, or if `logHomeEnabled` isn't set and `domainHomeSourceType` is set to `PersistentVolume`. When overriding, the log location will be the location specified by the `logHome` setting. * _Listen Address Overrides:_ The operator will automatically override all WebLogic domain default, @@ -63,7 +61,7 @@ Be aware of the following important considerations for WebLogic domains running * _Host Path Persistent Volumes:_ If using a `hostPath` persistent volume, then it must be available on all worker nodes in the cluster and have read/write/many permissions for all container/pods in the WebLogic Server deployment. Be aware that many cloud provider's volume providers may not support volumes across availability zones. You may want to use NFS or a clustered file system to work around this limitation. -* _Security Note:_ The `USER_MEM_ARGS` environment variable defaults to `-Djava.security.egd=file:/dev/./urandom` in all WebLogic Server pods and the WebLogic introspection job. It can be explicitly set to another value in your domain resource YAML file using the `env` attribute under the `serverPod` configuration. +* _Security Note:_ The `USER_MEM_ARGS` environment variable defaults to `-Djava.security.egd=file:/dev/./urandom` in all WebLogic Server pods and the WebLogic introspection job. It can be explicitly set to another value in your Domain YAML file using the `env` attribute under the `serverPod` configuration. * _JVM Memory and Java Option Arguments:_ The following environment variables can be used to customize the JVM memory and Java options for both the WebLogic Server Managed Servers and Node Manager instances: @@ -99,7 +97,7 @@ sample]({{< relref "/samples/simple/domains/manually-create-domain/_index.md" >} ### Modifying domain configurations -You can modify the WebLogic domain configuration for Domain in PV, Domain in Image, and Model in Image before deploying a domain resource: +You can modify the WebLogic domain configuration for Domain in PV, Domain in Image, and Model in Image before deploying a Domain YAML file: When the domain is in a persistent volume, you can use WLST or WDT to change the configuration. @@ -109,9 +107,15 @@ Configuration overrides allow changing a configuration without modifying its ori parameterizing overrides so that you can inject values into them from Kubernetes Secrets. For example, you can inject database user names, passwords, and URLs that are stored in a secret. +For Domain in Image and Domain in PV you can use [configuration overrides]({{< relref "/userguide/managing-domains/configoverrides/_index.md" >}}). + +Configuration overrides allow changing a configuration without modifying its original `config.xml` or system resource XML files, and supports +parameterizing overrides so that you can inject values into them from Kubernetes Secrets. For example, you can inject database user names, passwords, +and URLs that are stored in a secret. + For Model in Image you use [Runtime Updates]({{}}). -### About the domain resource +### About the Domain resource For more information, see [Domain resource]({{< relref "/userguide/managing-domains/domain-resource/_index.md" >}}). @@ -124,7 +128,7 @@ See [Starting and stopping]({{< relref "/userguide/managing-domains/domain-lifec The operator let's you initiate scaling of clusters in various ways: -* [Using kubectl to edit the domain resource]({{< relref "/userguide/managing-domains/domain-lifecycle/scaling#on-demand-updating-the-domain-resource-directly" >}}) +* [Using kubectl to edit the Domain resource]({{< relref "/userguide/managing-domains/domain-lifecycle/scaling#on-demand-updating-the-domain-resource-directly" >}}) * [Using the operator's REST APIs]({{< relref "/userguide/managing-domains/domain-lifecycle/scaling#calling-the-operators-rest-scale-api" >}}) * [Using WLDF policies]({{< relref "/userguide/managing-domains/domain-lifecycle/scaling#using-a-wldf-policy-rule-and-script-action-to-call-the-operators-rest-scale-api" >}}) * [Using a Prometheus action]({{< relref "/userguide/managing-domains/domain-lifecycle/scaling#using-a-prometheus-alert-action-to-call-the-operators-rest-scale-api" >}}) diff --git a/docs-source/content/userguide/managing-domains/choosing-a-model/_index.md b/docs-source/content/userguide/managing-domains/choosing-a-model/_index.md index 4bca79bc298..822bd08a02c 100644 --- a/docs-source/content/userguide/managing-domains/choosing-a-model/_index.md +++ b/docs-source/content/userguide/managing-domains/choosing-a-model/_index.md @@ -5,25 +5,26 @@ weight = 1 pre = " " +++ -When using the operator to deploy a WebLogic domain, you have the choice of the following WebLogic domain home source types: +When using the operator to start WebLogic Server instances from a domain, you have the choice of the following WebLogic domain home source types: - **Domain in PV**: Supply your domain home configuration in a persistent volume. - **Domain in Image**: Supply your domain home in a Docker image. - - **Model in Image**: Supply a WebLogic Deployment Tool model file in a Docker image. + - **Model in Image**: Supply a WebLogic Deployment Tool (WDT) model file in a Docker image. -There are advantages for each domain home source type, but sometimes there are technical limitations of various cloud providers that may make one type better suited to your needs. +There are advantages for each domain home source type, but sometimes there are also technical limitations of various cloud providers that may make one type better suited to your needs. -Note that you can use different domain home types for different domains; there's no restriction on having domains with different domain home types deployed to the same Kubernetes cluster or namespace. +Note that you can use different domain home types for different domains; there's no restriction on having domains with different domain home types in the same Kubernetes cluster or namespace. | Domain in PV | Domain in Image | Model in Image | | --- | --- | --- | -| Lets you use the same standard read-only Docker image for every server in every domain. | Requires a different image for each domain, but all servers in that domain use the same image. | Different domains can use the same image, but require different domainUID and may have different configuration. | -| No state is kept in Docker images making them completely throw away (cattle not pets). | Runtime state should not be kept in the images, but applications and configuration are. | Runtime state should not be kept in the images. Application and configuration may be. | -| The domain is long-lived, so you can mutate the configuration or deploy new applications using standard methods (Administration Console, WLST, and such). You can also mutate the configuration using configuration overrides. | If you want to mutate the domain home configuration, then you can apply configuration overrides or create a new image. If you want to deploy application updates, then you must create a new image. | If you want to mutate the domain home configuration, then you can override it with additional model files supplied in a ConfigMap or you can supply a new image. If you want to deploy application updates, then you must create a new image. | -| You can use configuration overrides to mutate the domain at runtime, but this requires first shutting down the entire domain, and then restarting it for the change to take effect. | You can use configuration overrides to mutate the domain home at runtime, but this requires first shutting down the entire domain, and then restarting it for the change to take effect. You should not use the Administration Console or WLST for these domains as changes are ephemeral and will be lost when servers restart. | You can deploy model files to a ConfigMap to mutate the domain at runtime, and may not need to restart the entire domain for the change to take effect. Instead, you can initiate a rolling upgrade, which restarts your WebLogic Server pods one at a time. Also, the model file syntax is far simpler and less error prone than the configuration override syntax, and, unlike configuration overrides, allows you to directly add data sources and JMS modules. You should not use the Administration Console or WLST for these domains as changes are ephemeral and will be lost when servers restart. | -| Logs are automatically placed on persistent storage and sent to the pod's stdout. | Logs are kept in the images and sent to the pod's log (`stdout`) by default. To change their location, you can set the domain resource `logHomeEnabled` to true and configure the desired directory using `logHome`. | Same as Domain in Image. | +| Lets you use the same standard WebLogic Docker image for every server in every domain. | Requires a different image for each domain, but all servers in that domain use the same image. | Different domains can use the same image, but require different domainUID and may have different configuration. | +| No state is kept in Docker images making the containers created from these images completely throw away (cattle not pets). | Runtime state should not be kept in the images, but applications and configuration are. | Runtime state should not be kept in the images. Application and configuration may be. | +| The domain is long-lived, so you can mutate the configuration or deploy new applications using the Administration Console or WLST. You can also mutate the configuration using configuration overrides. | If you want to mutate the domain home configuration, then you can apply configuration overrides or create a new image. If you want to deploy application updates, then you must create a new image. | If you want to mutate the domain home configuration, then you can override it with additional model files supplied in a ConfigMap or you can supply a new image. If you want to deploy application updates, then you must create a new image. | +| You can use configuration overrides to mutate the domain configuration, but there are [limitations]({{< relref "/userguide/managing-domains/configoverrides/_index.md#unsupported-overrides" >}}). | You can use configuration overrides to mutate the domain configuration, but there are [limitations]({{< relref "/userguide/managing-domains/configoverrides/_index.md#unsupported-overrides" >}}). | You can deploy model files to a ConfigMap to mutate the domain, and may not need to restart the entire domain for the change to take effect. Instead, you can initiate a rolling upgrade, which restarts your WebLogic Server instance Pods one at a time. Also, the model file syntax is far simpler and less error prone than the configuration override syntax, and, unlike configuration overrides, allows you to directly add data sources and JMS modules. | +| You can change WebLogic domain configuration using the Administration Console or WLST. You can also change configuration overrides and [distribute the new overrides]({{< relref "/userguide/managing-domains/domain-lifecycle/introspection.md#distributing-changes-to-configuration-overrides" >}}) to running servers; however, non-dynamic configuration attributes can only be changed when servers are starting. | You can also change configuration overrides and [distribute the new overrides]({{< relref "/userguide/managing-domains/domain-lifecycle/introspection.md#distributing-changes-to-configuration-overrides" >}}) to running servers; however, non-dynamic configuration attributes can only be changed when servers are starting. You should not use the Administration Console or WLST for these domains as changes are ephemeral and will be lost when servers restart. | You should not use the Administration Console or WLST for these domains as changes are ephemeral and will be lost when servers restart. | +| Logs are automatically placed on persistent storage and sent to the pod's stdout. | Logs are kept in the containers and sent to the pod's log (`stdout`) by default. To change the log location, you can set the Domain `logHomeEnabled` to true and configure the desired directory using `logHome`. | Same as Domain in Image. | | Patches can be applied by simply changing the image and rolling the domain. | To apply patches, you must update the domain-specific image and then restart or roll the domain depending on the nature of the patch. | Same as Domain in PV. | | Many cloud providers do not provide persistent volumes that are shared across availability zones, so you may not be able to use a single persistent volume. You may need to use some kind of volume replication technology or a clustered file system. | Provided you do not store and state in containers, you do not have to worry about volume replication across availability zones because each pod has its own copy of the domain. WebLogic replication will handle propagation of any online configuration changes. | Same as Domain in Image. | -| CI/CD pipelines may be more complicated because you would probably need to run WLST against the live domain directory to effect changes. | CI/CD pipelines are simpler because you can create the whole domain in the image and don't have to worry about a persistent copy of the domain. | CI/CD pipelines are even simpler because you don't need to generate a domain home. The operator will create a domain home for you based on the model that you supply. | +| CI/CD pipelines may be more complicated because you would need to run WLST against the live domain directory to effect changes. | CI/CD pipelines are simpler because you can create the whole domain in the image and don't have to worry about a persistent copy of the domain. | CI/CD pipelines are even simpler because you don't need to generate a domain home. The operator will create a domain home for you based on the model that you supply. | | There are less images to manage and store, which could provide significant storage and network savings. | There are more images to manage and store in this approach. | Same as Domain in Image.| | You may be able to use standard Oracle-provided images or, at least, a very small number of self-built images, for example, with patches installed. | You may need to do more work to set up processes to build and maintain your images. | Same as Domain in Image.| diff --git a/docs-source/content/userguide/managing-domains/configoverrides/_index.md b/docs-source/content/userguide/managing-domains/configoverrides/_index.md index 8e633620b09..873fbf5ca24 100644 --- a/docs-source/content/userguide/managing-domains/configoverrides/_index.md +++ b/docs-source/content/userguide/managing-domains/configoverrides/_index.md @@ -11,6 +11,7 @@ pre = " " * [Prerequisites](#prerequisites) * [Typical overrides](#typical-overrides) * [Unsupported overrides](#unsupported-overrides) +* [Overrides distribution](#overrides-distribution) * [Override template names and syntax](#override-template-names-and-syntax) * [Override template names](#override-template-names) * [Override template schemas](#override-template-schemas) @@ -28,47 +29,53 @@ pre = " " Configuration overrides can only be used in combination with Domain in Image and Domain in PV domains. For Model in Image domains, use [Model in Image Runtime Updates]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates.md" >}}) instead. {{% /notice %}} -Use configuration overrides (also called _situational configuration_) to customize a Domain in Image or Domain in PV domain's WebLogic domain home configuration without modifying the domain's actual `config.xml` or system resource files. For example, you may want to override a JDBC data source XML module user name, password, and URL so that it references a local database. +Use configuration overrides (also called _situational configuration_) to customize a Domain in Image or Domain in PV domain's WebLogic domain configuration without modifying the domain's actual `config.xml` or system resource files. For example, you may want to override a JDBC data source XML module user name, password, and URL so that it references a local database. -You can use overrides to customize domains as they are moved from QA to production, are deployed to different sites, or are even deployed multiple times at the same site. +You can use overrides to customize domains as they are moved from QA to production, are deployed to different sites, or are even deployed multiple times at the same site. Beginning with operator version 3.0.0, you can now modify configuration overrides for running WebLogic Server instances and have these new overrides take effect dynamically. There are [limitations](#unsupported-overrides) to the WebLogic configuration attributes that can be modified by overrides and only changes to dynamic configuration MBean attributes may be changed while a server is running. Other changes, specifically overrides to non-dynamic MBeans, must be applied when servers are starting or restarting. #### How do you specify overrides? * Make sure your domain home meets the prerequisites. See [Prerequisites](#prerequisites). * Make sure your overrides are supported. See [Typical overrides](#typical-overrides) and [Unsupported overrides](#unsupported-overrides). -* Create a Kubernetes configuration map that contains: +* Create a Kubernetes ConfigMap that contains: * Override templates (also known as situational configuration templates), with names and syntax as described in [Override template names and syntax](#override-template-names-and-syntax). * A file named `version.txt` that contains the exact string `2.0`. -* Set your domain resource `configuration.overridesConfigMap` to the name of this configuration map. -* If templates leverage `secret macros`: +* Set your Domain `configuration.overridesConfigMap` field to the name of this ConfigMap. +* If templates leverage secret macros: * Create Kubernetes Secrets that contain template macro values. - * Set your domain `configuration.secrets` to reference the aforementioned secrets. -* Stop all running WebLogic Server pods in your domain. (See [Starting and stopping servers]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#starting-and-stopping-servers" >}}).) -* Start or restart your domain. (See [Starting and stopping servers]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#starting-and-stopping-servers" >}}) and [Restarting servers]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#restarting-servers" >}}).) + * Set your domain `configuration.secrets` to reference the aforementioned Secrets. +* If your configuration overrides modify non-dynamic MBean attributes and you currently have WebLogic Server instances from this domain running: + * Decide if the changes you are making to non-dynamic MBean attributes can be applied by rolling the affected clusters or Managed Server instances or if the change required a full domain shutdown. + * If a full domain shut down is requried, stop all running WebLogic Server instance Pods in your domain and then restart them. (See [Starting and stopping servers]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#starting-and-stopping-servers" >}}).) + * Otherwise, simply restart your domain, which includes rolling clusters. (See [Restarting servers]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#restarting-servers" >}}).) * Verify your overrides are taking effect. (See [Debugging](#debugging)). For a detailed walk-through of these steps, see the [Step-by-step guide](#step-by-step-guide). #### How do overrides work during runtime? -* When a domain is first deployed, or is restarted after shutting down all the WebLogic Server pods, the operator will: +* Configuration overrides are processed during the operator's [introspection]({{< relref "/userguide/managing-domains/domain-lifecycle/introspection.md" >}}) phase. +* Introspection automatically occurs when: + 1. The operator is starting a WebLogic Server instance when there are currently no other servers running. This occurs when the operator first starts servers for a domain or when starting servers following a full domain shutdown. + 2. For Model in Image, the operator determines that at least one WebLogic Server instance that is currently running must be shut down and restarted. This could be a rolling of one or more clusters, the shut down and restart of one or more WebLogic Server instances, or a combination. +* You can [initiate introspection]({{< relref "/userguide/managing-domains/domain-lifecycle/introspection.md#initiating-introspection" >}}) by changing the value of the Domain `introspectVersion` field. +* For configuration overrides and during introspection, the operator will: * Resolve any macros in your override templates. * Place expanded override templates in the `optconfig` directory located in each WebLogic domain home directory. -* When the WebLogic Servers start, they will: +* When the WebLogic Server instances start, they will: * Automatically load the override files from the `optconfig` directory. * Use the override values in the override files instead of the values specified in their `config.xml` or system resource XML files. +* WebLogic Server instances monitor the files in the `optconfig` directory so that if these files change while the server is running, WebLogic will detect and use the new configuration values based on the updated contents of these files. This only works for changes to configuration overrides related to dynamic configuration MBean attributes. For a detailed walk-through of the runtime flow, see the [Internal design flow](#internal-design-flow). --- ### Prerequisites -* Configuration overrides can be used in combination with Domain in Image and Domain in PV domains in releases before 3.0.0-rc1. - In release candidate 3.0.0-rc1, configuration overrides can be used in combination with Domain in Image and Domain in PV - domains (the `domainHomeSourceType` must be either `PersistentVolume` or `Image`). For Model in Image domains (introduced in 3.0.0-rc1) - (`domainHomeSourceType` is `FromModel`), use [Model in Image Runtime Updates]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates.md" >}}) instead. +* Configuration overrides can be used in combination with Domain in Image and Domain in PV domains. + For Model in Image domains (introduced in 3.0.0), use [Model in Image Runtime Updates]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates.md" >}}) instead. -* A WebLogic domain home must not contain any situational configuration XML file in its `optconfig` directory that was not placed there by the operator. Any existing situational configuration XML files in this directory will be deleted and replaced by your operator override templates (if any). +* A WebLogic domain home must not contain any configuration overrides XML file in its `optconfig` directory that was not placed there by the operator. Any existing configuration overrides XML files in this directory will be deleted and replaced by your operator override templates, if any. * If you want to override a JDBC, JMS, or WLDF (diagnostics) module, then the original module must be located in your domain home `config/jdbc`, `config/jms`, and `config/diagnostics` directory, respectively. These are the default locations for these types of modules. @@ -88,10 +95,12 @@ Typical attributes for overrides include: * Debugging * Tuning (`MaxMessageSize`, and such) +See [overrides distribution](#overrides-distribution) for a discussion of distributing new or changed configuration overrides to already running WebLogic Server instances. + --- ### Unsupported overrides -**IMPORTANT: The operator does not support custom overrides in the following areas.** +**IMPORTANT: The operator does not support customer-provided overrides in the following areas.** * Domain topology (cluster members) * Network channel listen address, port, and enabled configuration @@ -115,18 +124,24 @@ Typical attributes for overrides include: * Node Manager access credentials * Any existing MBean name (for example, you cannot change the domain name) -Note that it's OK, even expected, to override network access point `public` or `external` addresses and ports. Also note that external access to JMX (MBean) or online WLST requires that the network access point internal port and external port match (external T3 or HTTP tunneling access to JMS, RMI, or EJBs don't require port matching). +Note that it's supported, even expected, to override network access point `public` or `external` addresses and ports. Also note that external access to JMX (MBean) or online WLST requires that the network access point internal port and external port match (external T3 or HTTP tunneling access to JMS, RMI, or EJBs don't require port matching). The behavior when using an unsupported override is undefined. +### Overrides distribution + +The operator generates the final configuration overrides, combining customer-provided configuration overrides and operator-generated overrides, during the operator's introspection phase. These overrides are then used when starting or restarting WebLogic Server instances. Starting with operator version 3.0.0, these [overrides can also be distributed]({{< relref "/userguide/managing-domains/domain-lifecycle/introspection.md#distributing-changes-to-configuration-overrides" >}}) and applied to already running WebLogic Server instances. + +For [Domain in PV]({{< relref "/userguide/managing-domains/domain-lifecycle/restarting.md#domain-in-pv" >}}), the ability to change WebLogic domain configuration using traditional management transactions involving the Administration Console or WLST can be combined with the ability to initiate a repeat introspection and distribute updated configuration overrides. This combination supports use cases such as defining a new WebLogic cluster and then immediately starting Managed Server cluster members. + --- ### Override template names and syntax -Overrides leverage a built-in WebLogic feature called "Configuration Overriding" which is often informally called "Situational Configuration." Situational configuration consists of XML formatted files that closely resemble the structure of WebLogic `config.xml` and system resource module XML files. In addition, the attribute fields in these files can embed `add`, `replace`, and `delete` verbs to specify the desired override action for the field. +Overrides leverage a built-in WebLogic feature called "Configuration Overriding" which is often informally called "Situational Configuration." Configuration overriding consists of XML formatted files that closely resemble the structure of WebLogic `config.xml` and system resource module XML files. In addition, the attribute fields in these files can embed `add`, `replace`, and `delete` verbs to specify the desired override action for the field. #### Override template names -The operator requires a different file name format for override templates than WebLogic's built-in situational configuration feature. It converts the names to the format required by situational configuration when it moves the templates to the domain home `optconfig` directory. The following table describes the format: +The operator requires a different file name format for override templates than WebLogic's built-in configuration overrides feature. It converts the names to the format required by the configuration overrides feature when it moves the templates to the domain home `optconfig` directory. The following table describes the format: | Original Configuration | Required Override Name | | --------------- | --------------------- | @@ -139,7 +154,7 @@ A `MODULENAME` must correspond to the MBean name of a system resource defined in #### Override template schemas -An override template must define the exact schemas required by the situational configuration feature. The schemas vary based on the file type you wish to override. +An override template must define the exact schemas required by the configuration overrides feature. The schemas vary based on the file type you wish to override. _`config.xml`_ ``` @@ -185,24 +200,24 @@ _`diagnostics-MODULENAME.xml`_ The operator supports embedding macros within override templates. This helps make your templates flexibly handle multiple use cases, such as specifying a different URL, user name, and password for a different deployment. -Two types of macros are supported, `environment variable macros` and `secret macros`: +Two types of macros are supported, environment variable macros and secret macros: * Environment variable macros have the syntax `${env:ENV-VAR-NAME}`, where the supported environment variables include `DOMAIN_UID`, `DOMAIN_NAME`, `DOMAIN_HOME`, and `LOG_HOME`. * Secret macros have the syntax `${secret:SECRETNAME.SECRETKEY}` and `${secret:SECRETNAME.SECRETKEY:encrypt}`. -The secret macro `SECRETNAME` field must reference the name of a Kubernetes Secret, and the `SECRETKEY` field must reference a key within that secret. For example, if you have created a secret named `dbuser` with a key named `username` that contains the value `scott`, then the macro `${secret:dbuser.username}` will be replaced with the word `scott` before the template is copied into its WebLogic Server pod. +The secret macro `SECRETNAME` field must reference the name of a Kubernetes Secret, and the `SECRETKEY` field must reference a key within that Secret. For example, if you have created a Secret named `dbuser` with a key named `username` that contains the value `scott`, then the macro `${secret:dbuser.username}` will be replaced with the word `scott` before the template is copied into its WebLogic Server instance Pod. -**SECURITY NOTE: Use the `:encrypt` suffix in a secret macro to encrypt its replacement value with the WebLogic WLST `encrypt` command (instead of leaving it at its plain text value). This is useful for overriding MBean attributes that expect encrypted values, such as the `password-encrypted` field of a data source, and is also useful for ensuring that a custom override situational configuration file the operator places in the domain home does not expose passwords in plain-text.** +**SECURITY NOTE: Use the `:encrypt` suffix in a secret macro to encrypt its replacement value with the WebLogic WLST `encrypt` command (instead of leaving it at its plain text value). This is useful for overriding MBean attributes that expect encrypted values, such as the `password-encrypted` field of a data source, and is also useful for ensuring that a custom overrides configuration file the operator places in the domain home does not expose passwords in plain-text.** #### Override template syntax special requirements -**Check each item below for best practices and to ensure custom situational configuration takes effect:** +**Check each item below for best practices and to ensure custom overrides configuration takes effect:** * Reference the name of the current bean and each parent bean in any hierarchy you override. * Note that the `combine-mode` verbs (`add` and `replace`) should be omitted for beans that are already defined in your original domain home configuration. * See [Override template samples](#override-template-samples) for examples. -* Use situational config `replace` and `add` verbs as follows: +* Use `replace` and `add` verbs as follows: * If you are adding a new bean that doesn't already exist in your original domain home `config.xml`, then specify `add` on the MBean itself and on each attribute within the bean. * See the `server-debug` stanza in [Override template samples](#override-template-samples) for an example. * If you are adding a new attribute to an existing bean in the domain home `config.xml`, then the attribute needs an `add` verb. @@ -211,7 +226,7 @@ The secret macro `SECRETNAME` field must reference the name of a Kubernetes Secr * See the `public-address` stanza in [Override template samples](#override-template-samples) for an example. * When overriding `config.xml`: * The XML namespace (`xmlns:` in the XML) must be exactly as specified in [Override template schemas](#override-template-schemas). - * For example, use `d:` to reference `config.xml` beans and attributes, `f:` for `add` and `replace` `domain-fragment` verbs, and `s:` to reference the situational configuration schema. + * For example, use `d:` to reference `config.xml` beans and attributes, `f:` for `add` and `replace` `domain-fragment` verbs, and `s:` to reference the configuration overrides schema. * Avoid specifying the domain name stanza, as this may cause some overrides to be ignored (for example, server-template scoped overrides). * When overriding modules: * It is a best practice to use XML namespace abbreviations `jms:`, `jdbc:`, and `wldf:` respectively for JMS, JDBC, and WLDF (diagnostics) module override files. @@ -229,7 +244,7 @@ Here are some sample template override files. The following `config.xml` override file demonstrates: * Setting the `max-message-size` field on a WebLogic Server named `admin-server`. It assumes the original `config.xml` does not define this value, and so uses `add` instead of `replace`. - * Sets the `public-address` and `public-port` fields with values obtained from a secret named `test-host` with keys `hostname` and `port`. It assumes the original config.xml already sets these fields, and so uses `replace` instead of `add`. + * Sets the `public-address` and `public-port` fields with values obtained from a Secret named `test-host` with keys `hostname` and `port`. It assumes the original config.xml already sets these fields, and so uses `replace` instead of `add`. * Sets two debug settings. It assumes the original config.xml does not have a `server-debug` stanza, so it uses `add` throughout the entire stanza. ``` @@ -255,7 +270,7 @@ The following `config.xml` override file demonstrates: #### Overriding a data source module -The following `jdbc-testDS.xml` override template demonstrates setting the URL, user name, and password-encrypted fields of a JDBC module named `testDS` by using `secret macros`. The generated situational configuration that replaces the macros with secret values will be located in the `DOMAIN_HOME/optconfig/jdbc` directory. The `password-encrypted` field will be populated with an encrypted value because it uses a secret macro with an `:encrypt` suffix. The secret is named `dbsecret` and contains three keys: `url`, `username`, and `password`. +The following `jdbc-testDS.xml` override template demonstrates setting the URL, user name, and password-encrypted fields of a JDBC module named `testDS` by using `secret macros`. The generated configuration overrides that replaces the macros with secret values will be located in the `DOMAIN_HOME/optconfig/jdbc` directory. The `password-encrypted` field will be populated with an encrypted value because it uses a secret macro with an `:encrypt` suffix. The Secret is named `dbsecret` and contains three keys: `url`, `username`, and `password`. Best practices for data source modules and their overrides: @@ -287,53 +302,52 @@ Best practices for data source modules and their overrides: ### Step-by-step guide * Make sure your domain home meets the prerequisites. See [Prerequisites](#prerequisites). -* Make sure your overrides are supported. See [Typical overrides](#typical-overrides) and [Unsupported overrides](#unsupported-overrides). -* Create a directory containing (A) a set of situational configuration templates for overriding the MBean properties you want to replace and (B) a `version.txt` file. +* Make sure your overrides are supported. See [Typical overrides](#typical-overrides), [Overrides distribution](#overrides-distribution), and [Unsupported overrides](#unsupported-overrides). +* Create a directory containing (A) a set of configuration overrides templates for overriding the MBean properties you want to replace and (B) a `version.txt` file. * This directory must not contain any other files. * The `version.txt` file must contain exactly the string `2.0`. * Note: This version.txt file must stay `2.0` even when you are updating your templates from a previous deployment. * Templates must not override the settings listed in [Unsupported overrides](#unsupported-overrides). * Templates must be formatted and named as per [Override template names and syntax](#override-template-names-and-syntax). * Templates can embed macros that reference environment variables or Kubernetes Secrets. See [Override template macros](#override-template-macros). -* Create a Kubernetes configuration map from the directory of templates. - * The configuration map must be in the same Kubernetes Namespace as the domain. - * If the configuration map is going to be used by a single `DOMAIN_UID`, then we recommend adding the `weblogic.domainUID=` label to help track the resource. +* Create a Kubernetes ConfigMap from the directory of templates. + * The ConfigMap must be in the same Kubernetes Namespace as the domain. + * If the ConfigMap is going to be used by a single `DOMAIN_UID`, then we recommend adding the `weblogic.domainUID=` label to help track the resource. * For example, assuming `./mydir` contains your `version.txt` and situation configuration template files: ``` kubectl -n MYNAMESPACE create cm MYCMNAME --from-file ./mydir kubectl -n MYNAMESPACE label cm MYCMNAME weblogic.domainUID=DOMAIN_UID ``` -* Create any Kubernetes Secrets referenced by a template 'secret macro'. +* Create any Kubernetes Secrets referenced by a template "secret macro". * Secrets can have multiple keys (files) that can hold either cleartext or base64 values. We recommend that you use base64 values for passwords by using `Opaque` type secrets in their `data` field, so that they can't be easily read at a casual glance. For more information, see https://kubernetes.io/docs/concepts/configuration/secret/. * Secrets must be in the same Kubernetes Namespace as the domain. - * If a secret is going to be used by a single `DOMAIN_UID`, then we recommend adding the `weblogic.domainUID=` label to help track the resource. + * If a Secret is going to be used by a single `DOMAIN_UID`, then we recommend adding the `weblogic.domainUID=` label to help track the resource. * For example: ``` kubectl -n MYNAMESPACE create secret generic my-secret --from-literal=key1=supersecret --from-literal=key2=topsecret kubectl -n MYNAMESPACE label secret my-secret weblogic.domainUID=DOMAIN_UID ``` -* Configure the name of the configuration map in the domain CR `configuration.overridesConfigMap` field. -* Configure the names of each secret in domain CR. - * If the secret contains the WebLogic admin `username` and `password` keys, then set the domain CR `webLogicCredentialsSecret` field. - * For all other secrets, add them to the domain CR `configuration.secrets` field. Note: This must be in an array format even if you only add one secret (see the sample domain resource YAML below). -* Any override changes require stopping all WebLogic pods, applying your domain resource (if it changed), and restarting the WebLogic pods before they can take effect. - * Custom override changes on an existing running domain, such as updating an override configuration map, a secret, or a domain resource, will not take effect until all running WebLogic Server pods in your domain are shutdown (so no servers are left running), and the domain is subsequently restarted with your new domain resource (if it changed), or with your existing domain resource (if you haven't changed it). - * To stop all running WebLogic Server pods in your domain, apply a changed resource, and then start/restart the domain: - * Set your domain resource `serverStartPolicy` to `NEVER`, wait, and apply your latest domain resource with the `serverStartPolicy` restored back to `ALWAYS` or `IF_NEEDED` (See [Starting and stopping servers]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#starting-and-stopping-servers" >}}).) - * Or delete your domain resource, wait, and apply your (potentially changed) domain resource. -* See [Debugging](#debugging) for ways to check if the situational configuration is taking effect or if there are errors. - -Example domain resource YAML: +* Configure the name of the ConfigMap in the Domain YAML file `configuration.overridesConfigMap` field. +* Configure the names of each Secret in Domain YAML file. + * If the Secret contains the WebLogic admin `username` and `password` keys, then set the Domain YAML file `webLogicCredentialsSecret` field. + * For all other Secrets, add them to the Domain YAML file `configuration.secrets` field. Note: This must be in an array format even if you only add one Secret (see the sample Domain YAML below). +* Changes to configuration overrides, including the contents of the ConfigMap containing the override templates or the contents of referenced Secrets, do not take effect until the operator runs or repeats its [introspection]({{< relref "/userguide/managing-domains/domain-lifecycle/introspection.md" >}}) of the WebLogic domain configuration. +* If your configuration overrides modify non-dynamic MBean attributes and you currently have WebLogic Server instances from this domain running: + * Decide if the changes you are making to non-dynamic MBean attributes can be applied by rolling the affected clusters or Managed Server instances, or if the change requires a full domain shutdown. (See [Overrides distribution](#overrides-distribution)) + * If a full domain shut down is requried, stop all running WebLogic Server instance Pods in your domain and then restart them. (See [Starting and stopping servers]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#starting-and-stopping-servers" >}}).) + * Otherwise, simply restart your domain, which includes rolling clusters. (See [Restarting servers]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#restarting-servers" >}}).) +* See [Debugging](#debugging) for ways to check if the configuration overrides are taking effect or if there are errors. + +Example Domain YAML: ``` -apiVersion: "weblogic.oracle/v2" +apiVersion: "weblogic.oracle/v8" kind: Domain metadata: name: domain1 namespace: default labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: domain1 spec: [ ... ] @@ -348,28 +362,28 @@ spec: --- ### Debugging -Incorrectly formatted override files may be accepted without warnings or errors and may not prevent WebLogic pods from booting. So, it is important to make sure that the template files are correct in a QA environment, otherwise your WebLogic Servers may start even though critically required overrides are failing to take effect. +Incorrectly formatted override files may be accepted without warnings or errors and may not prevent WebLogic Server instance Pods from booting. So, it is important to make sure that the template files are correct in a QA environment, otherwise your WebLogic Servers may start even though critically required overrides are failing to take effect. -On WebLogic Servers that support the `weblogic.SituationalConfig.failBootOnError` system property ( Note: It is not supported in WebLogic Server 12.2.1.3.0 ), -by default the WebLogic Server will fail to boot if any situational configuration files are invalid, -or if it encounters an error while loading situational configuration files. +On WebLogic Server versions that support the `weblogic.SituationalConfig.failBootOnError` system property (Note: It is not supported in WebLogic Server 12.2.1.3.0), +by default the WebLogic Server will fail to boot if any configuration overrides files are invalid, +or if it encounters an error while loading configuration overrides files. By setting the `FAIL_BOOT_ON_SITUATIONAL_CONFIG_ERROR` environment variable in the Kubernetes containers for the WebLogic Servers to `false`, you can start up the WebLogic Servers even with incorrectly formatted override files. * Make sure you've followed each step in the [Step-by-step guide](#step-by-step-guide). -* If WebLogic pods do not come up at all, then: +* If WebLogic Server instance Pods do not come up at all, then: * In the domain's namespace, see if you can find a job named `DOMAIN_UID-introspect-domain-job` and a corresponding pod named something like `DOMAIN_UID-introspect-domain-job-xxxx`. If so, examine: * `kubectl -n MYDOMAINNAMESPACE describe job INTROSPECTJOBNAME` * `kubectl -n MYDOMAINNAMESPACE logs INTROSPECTPODNAME` * Check your operator log for Warning/Error/Severe messages. * `kubectl -n MYOPERATORNAMESPACE logs OPERATORPODNAME` -* If WebLogic pods do start, then: - * Search your Administration Server pod's `kubectl log` for the keyword `situational`, for example `kubectl logs MYADMINPOD | grep -i situational`. +* If WebLogic Server instance Pods do start, then: + * Search your Administration Server Pod's `kubectl log` for the keyword `situational`, for example `kubectl logs MYADMINPOD | grep -i situational`. * The only WebLogic Server log lines that match should look something like: * ` ` - * This line indicates a situational configuration file has been loaded. - * If the search yields Warning or Error lines, then the format of the custom situational configuration template is incorrect, and the Warning or Error text should describe the problem. + * This line indicates a configuration overrides file has been loaded. + * If the search yields Warning or Error lines, then the format of the custom configuration overrides template is incorrect, and the Warning or Error text should describe the problem. * Note: The following exception may show up in your server logs when overriding JDBC modules. It is not expected to affect runtime behavior, and can be ignored (a fix is pending for them): ``` java.lang.NullPointerException @@ -380,18 +394,18 @@ By setting the `FAIL_BOOT_ON_SITUATIONAL_CONFIG_ERROR` environment variable in t ... ``` * Look in your `DOMAIN_HOME/optconfig` directory. - * This directory, or a subdirectory within this directory, should contain each of your custom situational configuration files. - * If it doesn't, then this likely indicates your domain resource `configuration.overridesConfigMap` was not set to match your custom override configuration map name, or that your custom override configuration map does not contain your override files. + * This directory, or a subdirectory within this directory, should contain each of your custom configuration ovrrides files. + * If it doesn't, then this likely indicates your Domain YAML file `configuration.overridesConfigMap` was not set to match your custom override ConfigMap name, or that your custom override ConfigMap does not contain your override files. -* If the Administration Server pod does start but fails to reach ready state or tries to restart: - * Check for this message ` WebLogic Server failed to start due to missing or invalid situational configuration files` in the Administration Server pod's `kubectl log` +* If the Administration Server Pod does start but fails to reach ready state or tries to restart: + * Check for this message ` WebLogic Server failed to start due to missing or invalid situational configuration files` in the Administration Server Pod's `kubectl log` * This suggests that the Administration Server failure to start may have been caused by errors found in a configuration override file. - * Lines containing the String `situational` may be found in the Administration Server pod log to provide more hints. + * Lines containing the String `situational` may be found in the Administration Server Pod log to provide more hints. * For example: * ` ".` * The warning message suggests a syntax error is found in the provided configuration override file for the testDS JDBC datasource. -* If you'd like to verify that the situational configuration is taking effect in the WebLogic MBean tree, then one way to do this is to compare the `server config` and `domain config` MBean tree values. +* If you'd like to verify that the configuration overrides are taking effect in the WebLogic MBean tree, then one way to do this is to compare the `server config` and `domain config` MBean tree values. * The `domain config` value should reflect the original value in your domain home configuration. * The `server config` value should reflect the overridden value. * For example, assuming your `DOMAIN_UID` is `domain1`, and your domain contains a WebLogic Server named `admin-server`, then: @@ -406,7 +420,7 @@ By setting the `FAIL_BOOT_ON_SITUATIONAL_CONFIG_ERROR` environment variable in t > get('/Servers/admin-server/MaxMessageSize') > exit() ``` -* To cause the WebLogic situational configuration feature to produce additional debugging information in the WebLogic Server logs, configure the `JAVA_OPTIONS` environment variable in your domain resource with: +* To cause the WebLogic configuration overrides feature to produce additional debugging information in the WebLogic Server logs, configure the `JAVA_OPTIONS` environment variable in your Domain YAML file with: ``` -Dweblogic.debug.DebugSituationalConfig=true -Dweblogic.debug.DebugSituationalConfigDumpXml=true @@ -418,27 +432,36 @@ By setting the `FAIL_BOOT_ON_SITUATIONAL_CONFIG_ERROR` environment variable in t --- ### Internal design flow -* When a domain is first deployed, or is restarted, the operator runtime creates a Kubernetes introspector job named `DOMAIN_UID-introspect-domain-job`. -* The introspector job's pod: - * Mounts the Kubernetes configuration map and secrets specified by using the operator domain resource `configuration.overridesConfigMap`, `webLogicCredentialsSecret`, and `configuration.secrets` fields. - * Reads the mounted situational configuration templates from the configuration map and expands them to create the actual situational configuration files for the domain: +* The operator generates the final configuration overrides, which include the merging of operator-generated overrides and the processing of any customer-provided configuration overrides templates and Secrets, during its introspection phase. +* The operator creates a Kubernetes Job for introspection named `DOMAIN_UID-introspect-domain-job`. +* The introspector Job's Pod: + * Mounts the Kubernetes ConfigMap and Secrets specified by using the operator Domain `configuration.overridesConfigMap`, `webLogicCredentialsSecret`, and `configuration.secrets` fields. + * Reads the mounted configuration overrides templates from the ConfigMap and expands them to create the actual configuration overrides files for the domain: * It expands some fixed replaceable values (for example, `${env:DOMAIN_UID}`). - * It expands referenced secrets by reading the value from the corresponding mounted secret file (for example, `${secret:mysecret.mykey}`). + * It expands referenced Secrets by reading the value from the corresponding mounted secret file (for example, `${secret:mysecret.mykey}`). * It optionally encrypts secrets using offline WLST to encrypt the value - useful for passwords (for example, `${secret:mysecret.mykey:encrypt}`). - * It returns expanded situational configuration files to the operator. + * It returns expanded configuration overrides files to the operator. * It reports any errors when attempting expansion to the operator. * The operator runtime: - * Reads the expanded situational configuration files or errors from the introspector. + * Reads the expanded configuration overrides files or errors from the introspector. * And, if the introspector reported no errors, it: - * Puts situational configuration files in a configuration map named `DOMAIN_UID-weblogic-domain-introspect-cm`. - * Mounts this configuration map into the WebLogic Server pods. - * Starts the WebLogic Server pods. + * Puts configuration overrides files in a ConfigMap named `DOMAIN_UID-weblogic-domain-introspect-cm`. + * Mounts this ConfigMap into the WebLogic Server instance Pods. * Otherwise, if the introspector reported errors, it: * Logs warning, error, or severe messages. - * Will not start WebLogic Server pods. -* The `startServer.sh` script in the WebLogic Server pods: - * Copies the expanded situational configuration files to a special location where the WebLogic runtime can find them: + * Will not start WebLogic Server instance Pods; however, any already running Pods are preserved. +* The `startServer.sh` script in the WebLogic Server instance Pods: + * Copies the expanded configuration overrides files to a special location where the WebLogic runtime can find them: * `config.xml` overrides are copied to the `optconfig` directory in its domain home. * Module overrides are copied to the `optconfig/jdbc`, `optconfig/jms`, or `optconfig/diagnostics` directory. - * Deletes any situational configuration files in the `optconfig` directory that do not have corresponding template files in the configuration map. + * Deletes any configuration overrides files in the `optconfig` directory that do not have corresponding template files in the ConfigMap. * WebLogic Servers read their overrides from their domain home's `optconfig` directory. +* If WebLogic Server instance Pods are already running when introspection is repeated and this new introspection generates different configuration overrides then: + * After the operator updates the ConfigMap, Kubernetes modifies the mounted files in running containers to match the new contents of the ConfigMap. + * The rate of this periodic sync of ConfigMap data by `kubelet` is configurable, but defaults to 10 seconds. + * If `overridesDistributionStrategy` is DYNAMIC, then the `livenessProbe.sh` script, which is already periodically invoked by Kubernetes, will perform the same actions as `startServer.sh` to update the files in `optconfig`. + * WebLogic Server instances monitor the files in `optconfig` and dynamically update the active configuration based on the current contents of the configuration overrides files. + * Otherwise, if the `overridesDistributionStrategy` is ON_RESTART, then the updated files at the ConfigMap's mount point are not copied to `optconfig` while the WebLogic Server instance is running and, therefore, don't affect the active configuration. + +{{% notice note %}} Changes to configuration overrides distributed to running WebLogic Server instances can only take effect if the corresponding WebLogic configuration MBean attribute is "dynamic". For instance, the Data Source "passwordEncrypted" attribute is dynamic while the "Url" attribute is non-dynamic. +{{% /notice %}} diff --git a/docs-source/content/userguide/managing-domains/domain-lifecycle/_index.md b/docs-source/content/userguide/managing-domains/domain-lifecycle/_index.md index 133c26fe192..a0d3325ca11 100644 --- a/docs-source/content/userguide/managing-domains/domain-lifecycle/_index.md +++ b/docs-source/content/userguide/managing-domains/domain-lifecycle/_index.md @@ -5,6 +5,6 @@ weight = 8 pre = " " +++ -Learn how to start, stop, restart, and scale the domain's servers. +Learn how to start, stop, restart, and scale the WebLogic Server instances in your domain. {{% children style="h4" description="true" %}} diff --git a/docs-source/content/userguide/managing-domains/domain-lifecycle/introspection.md b/docs-source/content/userguide/managing-domains/domain-lifecycle/introspection.md new file mode 100644 index 00000000000..dd7c77fc9dc --- /dev/null +++ b/docs-source/content/userguide/managing-domains/domain-lifecycle/introspection.md @@ -0,0 +1,105 @@ +--- +title: "Domain introspection" +date: 2020-07-07T08:14:51-05:00 +draft: false +weight: 5 +description: "This document describes domain introspection in the Oracle WebLogic Server in Kubernetes environment." +--- + + +This document describes domain introspection, when it occurs automatically, and how and when to initiate additional introspections of the domain configuration in the Oracle WebLogic Server in Kubernetes environment. + +In order to manage the operation of WebLogic domains in Kubernetes, the Oracle WebLogic Kubernetes Operator analyzes the WebLogic +domain configuration using an "introspection" job. This Job will be named `DOMAIN_UID-introspect-domain-job`, will be run in the same namespace as the Domain, and must successfully complete before the operator will begin to start WebLogic Server instances. Because each of the +[domain home source types]({{< relref "/userguide/managing-domains/choosing-a-model/_index.md" >}}) are different (for instance, Domain in PV uses a domain home on a PersistentVolume while Model in Image generates the domain home dynamically from a WDT model), the Pod created by this Job will be +as similar as possible to the Pod that will later be generated for the Administration Server. This guarantees that the operator is +analyzing the same WebLogic domain configuration that WebLogic Server instances will use. + +Introspection ensures that: +1. The operator is aware of domain topology from the WebLogic domain configuration, including servers, clusters, network access points, listen addresses, and other configurations. +2. The operator can generate configuration overrides to adjust the WebLogic domain configuration to match the Kubernetes environment, such as modifying listen addresses. +3. For Model in Image, the operator can generate the WebLogic domain home, including the final domain configuration. +4. For Domain in PV and Domain in Image, the operator can use any customer-provided [configuration overrides]({{}}) along with the operator-generated overrides to generate the final configuration overrides. + +#### When introspection occurs automatically + +Introspection automatically occurs when: +1. The operator is starting a WebLogic Server instance when there are currently no other servers running. This occurs when the operator first starts servers for a domain or when starting servers following a full domain shutdown. +2. For Model in Image, the operator determines that at least one WebLogic Server instance that is currently running must be shut down and restarted. This could be a rolling of one or more clusters, the shut down and restart of one or more WebLogic Server instances, or a combination. + +#### Initiating introspection + +Sometimes, such as for the [use cases](#introspection-use-cases) described below, it is desirable to explicitly initiate introspection. To initiate introspection, change the value of your Domain `introspectVersion` field. + +Set `introspectVersion` to a new value. + +``` + kind: Domain + metadata: + name: domain1 + spec: + introspectVersion: "2" + ... +``` + +As with `restartVersion`, the `introspectVersion` field has no required format; however, we recommend using a value likely to be unique such as a continually increasing number or a timestamp. + +#### Failed introspection + +Sometimes the Kubernetes Job, named `DOMAIN_UID-introspect-domain-job`, created for the introspection will fail. + +When introspection fails, the operator will not start any WebLogic Server instances. If this is not the initial introspection and there are already WebLogic Server instances running, then a failed introspection will leave the existing WebLogic Server instances running without making any changes to the operational state of the domain. + +The introspection will be periodically retried and then will eventually timeout with the Domain `status` indicating the processing failed. To recover from a failed state, correct the underlying problem and update the `introspectVersion`. + +Please review the details for diagnosing introspection failures related to [configuration overrides]({{}}) or [Model in Image domain home generation]({{}}). + +### Introspection use cases + +#### Adding clusters or Managed Servers to the WebLogic domain configuration + +When you have an existing WebLogic domain home on a persistent volume ("Domain in PV") and you currently have WebLogic Server instances running, it is now possible to define new WebLogic clusters or Managed Servers in the domain configuration and start these new instances without affecting the life cycle of any WebLogic Server instances that are already running. + +Prior to operator 3.0.0, this was not possible because there was no mechanism to initiate introspection other than a full domain shut down and restart and so the operator was unaware of the new clusters or Managed Servers. Now, after updating the domain configuration, you can initiate introspection by changing the `introspectVersion`. + +For instance, if you had a domain configuration with a single cluster named "cluster-1" then your Domain YAML file may have content like this: + +``` +spec: + ... + clusters: + - clusterName: cluster-1 + replicas: 3 + ... +``` + +If you modified your WebLogic domain configuration (using the console or WLST) to add a new dynamic cluster named "cluster-2", then you could immediately start cluster members of this new cluster by updating your Domain YAML file like this: + +``` +spec: + ... + clusters: + - clusterName: cluster-1 + replicas: 3 + - clusterName: cluster-2 + replicas: 2 + introspectVersion: "2" + ... +``` + +When this updated Domain YAML file is applied, the operator will initiate a new introspection of the domain configuration during which it will learn about the additional WebLogic cluster and then the operator will continue to start WebLogic Server instances that are members of this new cluster. In this case, the operator will start two Managed Servers that are members of the cluster named "cluster-2". + +#### Distributing changes to configuration overrides + +The operator supports customer-provided [configuration overrides]({{}}). These configuration overrides, which are supported with Domain in PV or Domain in Image, allow you to override elements of the domain configuration, such as data source URL's or credentials. + +With operator 3.0.0, you can now change the configuration overrides and distribute these new configuration overrides to already running WebLogic Server instances. To do this, update the ConfigMap that contains the configuration overrides or update one or more of the Secrets referenced by those configuration overrides and then initiate introspection by changing the `introspectVersion` field. + +We have introduced a new field, called `overrideDistributionStrategy` and located under `configuration`, that controls whether updated configuration overrides are distributed dynamically to already running WebLogic Server instances or if the new configuration overrides are only applied when servers are started or restarted. + +The default value for `overrideDistributionStrategy` is DYNAMIC, which means that new configuration overrides are distributed dynamically to already running WebLogic Server instances. + +Alternately, you can set `overrideDistributionStrategy` to ON_RESTART, which means that the new configuration overrides will not be distributed to already running WebLogic Server instances, but will instead be applied only to servers as they start or restart. Use of this value will *not* cause WebLogic Server instances to restart absent changes to other fields, such as `restartVersion`. + +{{% notice note %}} Changes to configuration overrides distributed to running WebLogic Server instances can only take effect if the corresponding WebLogic configuration MBean attribute is "dynamic". For instance, the Data Source "passwordEncrypted" attribute is dynamic while the "Url" attribute is non-dynamic. +{{% /notice %}} diff --git a/docs-source/content/userguide/managing-domains/domain-lifecycle/restarting.md b/docs-source/content/userguide/managing-domains/domain-lifecycle/restarting.md index dca6d92e7ac..844ff32157e 100644 --- a/docs-source/content/userguide/managing-domains/domain-lifecycle/restarting.md +++ b/docs-source/content/userguide/managing-domains/domain-lifecycle/restarting.md @@ -3,116 +3,128 @@ title: "Restarting" date: 2019-02-23T20:58:51-05:00 draft: false weight: 2 -description: "This document describes when to restart servers in the Oracle WebLogic Server in Kubernetes environment." +description: "This document describes when WebLogic Server instances should and will be restarted in the Kubernetes environment." --- -This document describes _when_ to restart servers in the Oracle WebLogic Server in Kubernetes environment. +This document describes when WebLogic Server instances should and will be restarted in the Kubernetes environment. #### Overview -There are many situations where changes to the Oracle WebLogic Server in Kubernetes environment require that all the servers in +There are many situations where changes to the WebLogic or Kubernetes environment configuration require that all the servers in a domain or cluster be restarted, for example, when applying a WebLogic Server patch or when upgrading an application. -One of the operator's most important jobs is to start and stop WebLogic Servers by creating and deleting their corresponding Kubernetes Pods. Sometimes, you need to make changes that make the pods obsolete, therefore the pods need to be deleted and recreated. Depending on the change, sometimes the pods can be gradually recreated, without taking the entire domain out of service -(for example, `rolling restarts`) and sometimes all the pods need to be deleted then recreated, taking the entire domain out of -service for a while (for example, `full restarts`). +One of the operator's most important jobs is to start and stop WebLogic Server instances by creating and deleting their corresponding Kubernetes pods. Sometimes, you need to make changes that make the pods obsolete, therefore the pods need to be deleted and recreated. Depending on the change, often the pods can be gradually recreated, without taking the domain or cluster out of service +(for example, "rolling restarts") and sometimes all the pods need to be deleted and then recreated as part of a downtime (for example, "full restarts"). -The following types of server restarts are supported in Oracle WebLogic Server in Kubernetes: +The following types of server restarts are supported by the operator: * Rolling restarts - a coordinated and controlled shut down of all of the servers in a domain or cluster while ensuring that service to the end user is not interrupted. - * Operator initiated - where the WebLogic Server Kubernetes Operator can detect some types of changes and will automatically initiate rolling restarts of server pods in a WebLogic domain. + * Operator initiated - where the WebLogic Server Kubernetes Operator can detect some types of changes and will automatically initiate rolling restarts of pods in a domain or cluster. * Manually initiated - required when certain changes in the Oracle WebLogic Server in Kubernetes environment cannot be detected by the operator, so a rolling restart must be manually initiated. * Full domain restarts - the Administration Server and all the Managed Servers in a domain are shutdown, impacting service availability to the end user, and then restarted. Unlike a rolling restart, the operator cannot detect and initiate a full domain restart; it must always be manually initiated. -For detailed information on how to restart servers in a Oracle WebLogic Server in Kubernetes environment, see [Starting, stopping, and restarting servers]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md" >}}). +For detailed information on how to restart servers using the operator, see [Starting, stopping, and restarting servers]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md" >}}). #### Common restart scenarios This document describes what actions you need to take to properly restart your servers for a number of common scenarios: -* Modifying the WebLogic configuration -* Changing the custom domain configuration overrides (also called situational configuration) for Domain in PV and Domain in Image domains +* Modifying the WebLogic domain configuration +* Changing the domain configuration overrides (also called situational configuration) for Domain in PV and Domain in Image domains * Changing the model files for Model in Image domains * Changing the WebLogic Server credentials (the user name and password) -* Changing properties on the domain resource that affect server pods (such as `image`, `volumes`, and `env`) +* Changing fields on the Domain that [affect WebLogic Server instance Pod generation]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#fields-that-cause-servers-to-be-restarted" >}}) (such as `image`, `volumes`, and `env`) * Applying WebLogic Server patches -* Updating deployed applications for domain home in image +* Updating deployed applications for Domain in Image or Model in Image ### Use cases -#### Modifying the WebLogic Server configuration +#### Modifying the WebLogic domain configuration -Changes to the Oracle WebLogic Server configuration may require either a rolling or full domain restart depending on the domain home location and the type of configuration change. +Changes to the WebLogic domain configuration may require either a rolling or full domain restart depending on the domain home location and the type of configuration change. -* **Domain in Image:** -For a domain home in image, any changes (dynamic or non-dynamic) to the WebLogic configuration requires a full domain restart. - * If you create a new image with a new name, then you must avoid a rolling restart, which can cause unexpected behavior for the running domain due to configuration inconsistencies as seen by the various servers, by following the steps in [Avoiding a rolling restart when changing image property on a domain resource](#avoiding-a-rolling-restart-when-changing-image-property-on-a-domain-resource). - * If you create a new image with the same name, then you must manually initiate a full domain restart. See [Full domain restarts]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#full-domain-restarts" >}}). +##### Domain in Image -* **Model in Image:** +For Domain in Image, you may only perform a rolling restart if both the WebLogic configuration changes between the present image and a new image are dynamic and you have [followed the CI/CD guidelines]({{< relref "/userguide/cicd/mutate-the-domain-layer">}}) to create an image with compatible encryption keys. - * Any image that supplies configuration changes that are incompatible with the current running domain require a full shutdown before changing the domain resource image setting, instead of a rolling restart. For changes that support a rolling restart, see [Supported and unsupported updates]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates/_index.md#supported-and-unsupported-updates" >}}). +Otherwise, use of a new image that does not have compatible encryption keys or any non-dynamic configuration changes require a full domain restart. + +* If you create a new image with a new name, then you must avoid a rolling restart, which can cause unexpected behavior for the running domain due to configuration inconsistencies as seen by the various servers, by following the steps in [Avoiding a rolling restart when changing image field on a Domain](#avoiding-a-rolling-restart-when-changing-image-field-on-a-domain). +* If you create a new image with the same name, then you must manually initiate a full domain restart. See [Full domain restarts]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#full-domain-restarts">}}). - * If you create a new image with a new name, and you want to avoid a rolling restart, see [Avoiding a rolling restart when changing image property on a domain resource](#avoiding-a-rolling-restart-when-changing-image-property-on-a-domain-resource). +##### Model in Image - * If you create a new image with the same name, then you must manually initiate either a full domain restart or rolling restart for pods to run with the new image. To initiate a full restart, see [Full domain restarts]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#full-domain-restarts" >}}). To initiate a rolling restart, change the value of your domain resource `restartVersion` field. See [Restarting servers]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#restarting-servers" >}}) and [Rolling restarts]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#rolling-restarts" >}}). +* Any image that supplies configuration changes that are incompatible with the current running domain require a full shut down before changing the Domain `image` field, instead of a rolling restart. For changes that support a rolling restart, see [Supported and unsupported updates]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates/_index.md#supported-and-unsupported-updates" >}}). - * If you are supplying updated models or secrets for a running domain, and you want the configuration updates to take effect using a rolling restart: - * You must either supply a new image name in the domain resource or change the domain resource `restartVersion` in order to force the operator to reload the configuration. - * With either of these two changes, the operator will rerun the domain's introspector job, which will verify and apply the new configuration. If the introspector job's configuration verification succeeds, then it will subsequently roll (restart) the pods; if the job fails, then a roll will not occur. - * If you change other fields that typically cause a restart, such as `volumes`, `env`, and such, then the introspector job will not rerun and a rolling restart will proceed without loading the configuration changes. +* If you create a new image with a new name, and you want to avoid a rolling restart, see [Avoiding a rolling restart when changing the image field on a Domain](#avoiding-a-rolling-restart-when-changing-the-image-field-on-a-domain). -* **Domain in PV:** -For a domain home on PV, the type of restart needed to apply the changes depends on the nature of the WebLogic configuration change: - * Changes to parts of the WebLogic configuration that the operator introspects, require a full restart, even if the changes are dynamic. - The following are the types of changes to the WebLogic Server configuration that the operator introspects: - * Adding or removing a cluster, server, dynamic server, or network access point - * Changing a cluster, server, dynamic server, or network access point name - * Enabling or disabling the listen port, SSL port, or admin port - * Changing any port numbers - * Changing a network access point's public address - * Other dynamic WebLogic configuration changes do not require a restart. For example, a change to a server's connection timeout property -is dynamic and does not require a restart. - * Other non-dynamic WebLogic configuration changes require either a manually initiated rolling restart or a full domain restart, depending on the nature of the change. - For example, a rolling restart is applicable when changing a WebLogic Server `stuck thread timer interval` property. See [Restart all the servers in the domain]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#restart-all-the-servers-in-the-domain" >}}). +* If you create a new image with the same name, then you must manually initiate either a full domain restart or rolling restart for pods to run with the new image. To initiate a full restart, see [Full domain restarts]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#full-domain-restarts">}}). To initiate a rolling restart, change the value of your Domain `restartVersion` field. See [Restarting servers]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#restarting-servers" >}}) and [Rolling restarts]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#rolling-restarts" >}}). +* If you are supplying updated models or Secrets for a running domain, and you want the configuration updates to take effect using a rolling restart, then do one of the following: + * Supply a new value for the `image` field in the Domain or any of the other [fields affecting WebLogic Server instance Pod generation]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#fields-that-cause-servers-to-be-restarted" >}}). + * Change the Domain `restartVersion` field. This will cause the operator to restart all running servers and, prior to the restarts, the operator will introspect any new configuration. + * Change the Domain `introspectVersion` field. This will cause the operator to introspect any new configuration and, if needed, restart servers to use that new configuration. -#### Changing the custom domain configuration overrides +##### Domain in PV -Any change to domain configuration overrides requires a full domain restart. This includes: +For Domain in PV, the type of restart needed depends on the nature of the WebLogic domain configuration change: +* Domain configuration changes that add new clusters (either configured or dynamic), member servers for these new clusters, or non-clustered servers can now be performed dynamically. This support requires that the new clusters or servers are added to the domain configuration and then that you [initiate the operator's introspection]({{< relref "/userguide/managing-domains/domain-lifecycle/introspection.md" >}}) of that new configuration. +* Other changes to parts of the domain configuration that the operator introspects, require a full shutdown and restart, even if the changes are dynamic for WebLogic Server, such as: + * Adding or removing a network access point + * Adding a server to an existing cluster + * Changing a cluster, server, dynamic server, or network access point name + * Enabling or disabling the listen port, SSL port, or admin port + * Changing any port numbers + * Changing a network access point's public address +* Other dynamic WebLogic configuration changes do not require a restart. For example, a change to a server's connection timeout property is dynamic and does not require a restart. +* Other non-dynamic domain configuration changes require either a manually initiated rolling restart or a full domain shut down and restart, depending on the nature of the change. + * For example, a rolling restart is applicable when changing a WebLogic Server `stuck thread timer interval` property. See [Restart all the servers in the domain]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#restart-all-the-servers-in-the-domain" >}}). - * Changing the domain resource's `configuration.overridesConfigMap` to point to a different configuration map - * Changing the domain resource's `configuration.secrets` to point to a different list of secrets - * Changing the contents of the configuration map referenced by `configuration.overridesConfigMap` - * Changing the contents to any of the secrets referenced by `configuration.secrets` +{{% notice note %}} The preceding description of the operator's life cycle of responding to WebLogic domain configuration changes applies to version 3.0.0 and later. Prior to operator version 3.0.0, while you could make changes to WebLogic domain configuration using the Administration Console or WLST, the operator would only detect and respond to those changes following a full domain shut down and restart. +{{% /notice %}} + +#### Changing the domain configuration overrides + +Beginning with operator version 3.0.0, many changes to domain configuration overrides can be applied dynamically or as part of a rolling restart. Previously, any changes to the configuration overrides required a full domain shutdown and restart. +Changes to configuration overrides include: + +* Changing the Domain YAML file's `configuration.overridesConfigMap` to point to a different ConfigMap +* Changing the Domain YAML file's `configuration.secrets` to point to a different list of Secrets +* Changing the contents of the ConfigMap referenced by `configuration.overridesConfigMap` +* Changing the contents to any of the Secrets referenced by `configuration.secrets` + +The changes to the above fields or contents of related resources are not processed automatically. Instead, these fields are processed only when you [initiate operator introspection]({{< relref "/userguide/managing-domains/domain-lifecycle/introspection.md" >}}). The operator then will apply the new configuration overrides dynamically or only apply the overrides when WebLogic Server instances restart, depending on the strategy that you select. + +{{% notice note %}} Changes to configuration overrides distributed to running WebLogic Server instances can only take effect if the corresponding WebLogic configuration MBean attribute is "dynamic". For instance, the Data Source "passwordEncrypted" attribute is dynamic while the "Url" attribute is non-dynamic. +{{% /notice %}} #### Changing the WebLogic Server credentials A change to the WebLogic Server credentials (the user name and password), contained in the Kubernetes Secret for the domain, requires a -_full domain restart_. The Kubernetes Secret can be updated directly or a new secret can be created and then referenced by the `webLogicCredentialsSecret` -property in the domain resource. +_full domain restart_. The Kubernetes Secret can be updated directly or a new Secret can be created and then referenced by the `webLogicCredentialsSecret` +field in the Domain YAML file. -#### Changing properties on the domain resource that affect server pods +#### Changing fields on the Domain that affect WebLogic Server instance Pods -The operator will initiate a rolling restart of the domain when you modify any of the domain resource properties that affect the server pods configuration, -such as `image`, `volumes`, and `env`. For a complete list, see [Properties that cause servers to be restarted]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#properties-that-cause-servers-to-be-restarted" >}}). +The operator will initiate a rolling restart of the domain when you modify any of the Domain YAML file fields that affect the WebLogic Server instance Pod generation, +such as `image`, `volumes`, and `env`. For a complete list, see [Fields that cause servers to be restarted]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#fields-that-cause-servers-to-be-restarted" >}}). -You can modify these properties using the `kubectl` command-line tool's `edit` and `patch` commands or through the Kubernetes REST API. +You can modify these fields using the `kubectl` command-line tool's `edit` and `patch` commands or through the Kubernetes REST API. -For example, to edit the domain resource directly using the `kubectl` command-line tool: +For example, to edit the Domain YAML file directly using the `kubectl` command-line tool: ``` kubectl edit domain -n ``` -The `edit` command opens a text editor which lets you edit the domain resource in place. +The `edit` command opens a text editor which lets you edit the Domain in place. {{% notice note %}} -Typically, it's better to edit the domain resource directly; otherwise, if you scaled the domain, and you edit only the original `domain.yaml` file and reapply it, you could go back to your old replicas count. +Typically, it's better to edit the Domain YAML file directly; otherwise, if you scaled the domain, and you edit only the original `domain.yaml` file and reapply it, you could go back to your old replicas count. {{% /notice %}} #### Applying WebLogic Server patches @@ -129,12 +141,12 @@ With rolling-compatible patches: With patches that are not rolling-compatible: -* If you keep the same image name, then you must manually initiate a full domain restart. See [Full domain restarts]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#full-domain-restarts">}}). -* If you update the `image` property with a new image name, then you must avoid the rolling restart by following the steps in [Avoiding a rolling restart when changing image property on a domain resource](#avoiding-a-rolling-restart-when-changing-image-property-on-a-domain-resource). +* If you keep the same image name, then you must manually initiate a full domain restart. See [Full domain restarts]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#full-domain-restarts" >}}). +* If you update the `image` property with a new image name, then you must avoid the rolling restart by following the steps in [Avoiding a rolling restart when changing the image field on a Domain](#avoiding-a-rolling-restart-when-changing-the-image-field-on-a-domain). #### Updating deployed applications -Frequent updates of deployed applications using a continuous integration/continuous delivery (CI/CD) process is a very common use case. +Frequent updates of deployed applications using a [continuous integration/continuous delivery]({{< relref "/userguide/cicd/mutate-the-domain-layer">}}) (CI/CD) process is a very common use case. The process for applying an updated application is different for domain home in image and model in image than it is for domain home on PV. A rolling-compatible application update is where some servers are running the old version and some are running the new version of the application during the rolling restart process. On the other hand, an application update that is not rolling-compatible requires that all the servers @@ -148,7 +160,7 @@ If the application update is rolling-compatible: If the application update is not rolling-compatible: * If you keep the same image name, then you must manually initiate a full domain restart. See [Full domain restarts]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#full-domain-restarts">}}). -* If you update the `image` property with a new image name, then you must avoid the rolling restart by following the steps in [Avoiding a rolling restart when changing image property on a domain resource](#avoiding-a-rolling-restart-when-changing-image-property-on-a-domain-resource). +* If you update the `image` property with a new image name, then you must avoid the rolling restart by following the steps in [Avoiding a rolling restart when changing the image field on a Domain](#avoiding-a-rolling-restart-when-changing-the-image-field-on-a-domain). #### Rolling out an updated domain home in image or model in image @@ -156,31 +168,31 @@ Follow these steps to create new rolling-compatible image if you only need to pa a. Select a different name for the new image. -b. For domain home in image domains, it is important to keep your original domain home in your new image. +b. For Domain in Image, it is important to keep your original domain home in your new image. Using the same domain home-in-image Docker image as a base, create a new Docker image by copying (`COPY` command in a Dockerfile) the updated application deployment files or WebLogic Server patches into the Docker image during the Docker image build. {{% notice note %}} The key here is to make sure that you do not re-run WLST or WDT to create a new domain home even though it will - have the same configuration. Creating a new domain will change the domain secret and you won't be able to do a + have the same configuration. Creating a new domain will change the domain encryption secret and you won't be able to do a rolling restart. {{% /notice %}} c. Deploy the new Docker image to your Docker repository with the new name. -d. Update the `image` property of the domain resource, specifying the new image name. +d. Update the `image` field of the Domain YAML file, specifying the new image name. For example: ``` domain: spec: - image: oracle/weblogic-updated:2.6.0 + image: oracle/weblogic-updated:3.0.0 ``` -e. The operator will now initiate a rolling restart, which will apply the updated image, for all the server pods in the domain. +e. The operator will now initiate a rolling restart, which will apply the updated image, for all the servers in the domain. -#### Avoiding a rolling restart when changing the `image` property on a domain resource +#### Avoiding a rolling restart when changing the image field on a Domain If you've created a new image that is not rolling-compatible, and you've changed the image name, then: 1. Bring the domain down (stopping all the server pods) by setting the `serverStartPolicy` to `NEVER`. See [Shut down all the servers]({{< relref "/userguide/managing-domains/domain-lifecycle/startup/_index.md#shut-down-all-the-servers">}}). @@ -195,7 +207,7 @@ If you've created a new image that is not rolling-compatible, and you've changed If you need to make multiple changes to your domain at the same time, you'll want to be careful about the order in which you do your changes, so that servers aren't restarted prematurely or restarted needlessly. - For example, if you want to change the readiness probe's tuning parameters and the Java options (both of which are rolling-compatible), then you should update the domain resource once, changing both values, + For example, if you want to change the readiness probe's tuning parameters and the Java options (both of which are rolling-compatible), then you should update the Domain YAML file once, changing both values, so that the operator rolling restarts the servers once. Or, if you want to change the readiness probe's tuning parameters (which is rolling-compatible) and change the domain customizations (which require a full restart), then you should do a full shutdown first, then make the changes, and then restart the servers. @@ -210,7 +222,7 @@ If you've created a new image that is not rolling-compatible, and you've changed * **Changes that require domain knowledge**. - Sometimes you need to make changes that require server restarts, yet the changes are not to the WebLogic configuration, + Sometimes you need to make changes that require server restarts, yet the changes are not to the domain configuration, the image, or the Kubernetes resources that register your domain with the operator. For example, your servers are caching information from an external database and you've modified the contents of the database. In these cases, you must manually initiate a restart. diff --git a/docs-source/content/userguide/managing-domains/domain-lifecycle/scaling.md b/docs-source/content/userguide/managing-domains/domain-lifecycle/scaling.md index bb42cdc0b90..9a4446942ed 100644 --- a/docs-source/content/userguide/managing-domains/domain-lifecycle/scaling.md +++ b/docs-source/content/userguide/managing-domains/domain-lifecycle/scaling.md @@ -6,7 +6,7 @@ weight: 3 description: "The operator provides several ways to initiate scaling of WebLogic clusters." --- -WebLogic Server supports two types of clustering configurations, configured and dynamic. Configured clusters are created by manually configuring each individual Managed Server instance. In dynamic clusters, the Managed Server configurations are generated from a single, shared template.  With dynamic clusters, when additional server capacity is needed, new server instances can be added to the cluster without having to manually configure them individually. Also, unlike configured clusters, scaling up of dynamic clusters is not restricted to the set of servers defined in the cluster but can be increased based on runtime demands. For more information on how to create, configure, and use dynamic clusters in WebLogic Server, see [Dynamic Clusters](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/clust/dynamic_clusters.html#GUID-DA7F7FAD-49AA-4F3D-8A05-0D9921B96971). +WebLogic Server supports two types of clustering configurations, configured and dynamic. Configured clusters are created by defining each individual Managed Server instance. In dynamic clusters, the Managed Server configurations are generated from a single, shared template.  With dynamic clusters, when additional server capacity is needed, new server instances can be added to the cluster without having to configure them individually. Also, unlike configured clusters, scaling up of dynamic clusters is not restricted to the set of servers defined in the cluster but can be increased based on runtime demands. For more information on how to create, configure, and use dynamic clusters in WebLogic Server, see [Dynamic Clusters](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/clust/dynamic_clusters.html#GUID-DA7F7FAD-49AA-4F3D-8A05-0D9921B96971). The following blogs provide more in-depth information on support for scaling WebLogic clusters in Kubernetes: @@ -15,17 +15,17 @@ The following blogs provide more in-depth information on support for scaling Web The operator provides several ways to initiate scaling of WebLogic clusters, including: -* [On-demand, updating the domain resource directly (using `kubectl`)](#on-demand-updating-the-domain-resource-directly). +* [On-demand, updating the Domain directly (using `kubectl`)](#on-demand-updating-the-domain-directly). * [Calling the operator's REST scale API, for example, from `curl`](#calling-the-operators-rest-scale-api). * [Using a WLDF policy rule and script action to call the operator's REST scale API](#using-a-wldf-policy-rule-and-script-action-to-call-the-operators-rest-scale-api). * [Using a Prometheus alert action to call the operator's REST scale API](#using-a-prometheus-alert-action-to-call-the-operators-rest-scale-api). -#### On-demand, updating the domain resource directly -The easiest way to scale a WebLogic cluster in Kubernetes is to simply edit the `replicas` property within a domain resource. This can be done by using the `kubectl` command-line interface for running commands against Kubernetes clusters. More specifically, you can modify the domain resource directly by using the `kubectl edit` command. For example: +#### On-demand, updating the Domain directly +The easiest way to scale a WebLogic cluster in Kubernetes is to simply edit the `replicas` field of a Domain. This can be done by using `kubectl`. More specifically, you can modify the Domain directly by using the `kubectl edit` command. For example: ``` $ kubectl edit domain domain1 -n [namespace] ``` -Here we are editing a domain resource named `domain1`. The `kubectl edit` command will open the domain resource definition in an editor and allow you to modify the `replicas` value directly. Once committed, the operator will be notified of the change and will immediately attempt to scale the corresponding dynamic cluster by reconciling the number of running pods/Managed Server instances with the `replicas` value specification. +Here we are editing a Domain named `domain1`. The `kubectl edit` command will open the Domain definition in an editor and allow you to modify the `replicas` value directly. Once committed, the operator will be notified of the change and will immediately attempt to scale the corresponding cluster by reconciling the number of running pods/Managed Server instances with the `replicas` value specification. ``` spec: ... @@ -35,7 +35,7 @@ spec: ... ``` -Alternatively, you can specify a default `replicas` value for all the clusters. If you do this, then you don't need to list the cluster in the domain resource (unless you want to customize another property of the cluster). +Alternatively, you can specify a default `replicas` value for all the clusters. If you do this, then you don't need to list the cluster in the Domain (unless you want to customize another property of the cluster). ``` spec: ... @@ -45,8 +45,7 @@ spec: #### Calling the operator's REST scale API -Scaling up or scaling down a WebLogic cluster provides increased reliability of customer applications as well as optimization of resource usage. In Kubernetes cloud environments, scaling WebLogic clusters involves scaling the corresponding pods in which WebLogic Server Managed Server instances are running. Because the operator manages the life cycle of a WebLogic domain, the operator exposes a REST API that allows an authorized actor to request scaling of a WebLogic cluster. - +Scaling up or scaling down a WebLogic cluster provides increased reliability of customer applications as well as optimization of resource usage. In Kubernetes environments, scaling WebLogic clusters involves scaling the number of corresponding Pods in which Managed Server instances are running. Because the operator manages the life cycle of a WebLogic domain, the operator exposes a REST API that allows an authorized actor to request scaling of a WebLogic cluster. The following URL format is used for describing the resources for scaling (up and down) a WebLogic cluster: @@ -75,7 +74,7 @@ The `/scale` REST endpoint accepts an HTTP POST request and the request body sup } ``` -The `managedServerCount` value designates the number of WebLogic Server instances to scale to. Note that the scale resource is implemented using the JAX-RS framework, and so a successful scaling request will return an HTTP response code of `204 (“No Content”)` because the resource method’s return type is void and does not return a message body. +The `managedServerCount` value designates the number of Managed Server instances to scale to. On a successful scaling request, the REST interface will return an HTTP response code of `204 (“No Content”)`. When you POST to the `/scale` REST endpoint, you must send the following headers: @@ -88,9 +87,10 @@ For example, when using `curl`: curl -v -k -H X-Requested-By:MyClient -H Content-Type:application/json -H Accept:application/json -H "Authorization:Bearer ..." -d '{ "managedServerCount": 3 }' https://.../scaling ``` -If you omit the header, you'll get a `400 (bad request)` response without any details explaining why the request was bad. If you omit the Bearer Authentication header, then you'll get a `401 (Unauthorized)` response. +If you omit the header, you'll get a `400 (bad request)` response. If you omit the Bearer Authentication header, then you'll get a `401 (Unauthorized)` response. ##### Operator REST endpoints + The WebLogic Server Kubernetes Operator can expose both an internal and external REST HTTPS endpoint. The internal REST endpoint is only accessible from within the Kubernetes cluster. The external REST endpoint is accessible from outside the Kubernetes cluster. @@ -109,12 +109,12 @@ When the operator receives a scaling request, it will: * Perform an authentication and authorization check to verify that the specified user is allowed to perform the specified operation on the specified resource. * Validate that the specified domain, identified by `domainUID`, exists. * Validate that the WebLogic cluster, identified by `clusterName`, exists. -* Verify that the specified WebLogic cluster has a sufficient number of configured servers to satisfy the scaling request. -* Initiate scaling by setting the `replicas` property within the corresponding domain resource, which can be done in either: +* Verify that the specified WebLogic cluster has a sufficient number of configured servers or sufficient dynamic cluster size to satisfy the scaling request. +* Initiate scaling by setting the `replicas` field within the corresponding Domain, which can be done in either: * A `cluster` entry, if defined within its cluster list. * At the domain level, if not defined in a `cluster` entry. -In response to a change to either `replicas` property, in the domain resource, the operator will increase or decrease the number of pods (Managed Servers) to match the desired replica count. +In response to a change to either `replicas` field, in the Domain, the operator will increase or decrease the number of Managed Server instance Pods to match the desired replica count. #### Using a WLDF policy rule and script action to call the operator's REST scale API The WebLogic Diagnostics Framework (WLDF) is a suite of services and APIs that collect and surface metrics that provide visibility into server and application performance. @@ -141,7 +141,7 @@ The `scalingAction.sh` script requires access to the SSL certificate of the oper The operator’s SSL certificate can be found in the `internalOperatorCert` entry of the operator’s ConfigMap `weblogic-operator-cm`: For example: -``` +```none #> kubectl describe configmap weblogic-operator-cm -n weblogic-operator ... Data @@ -176,7 +176,7 @@ Set this to `https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}` when * `operator_namespace` – Namespace in which the operator is deployed, default=`weblogic-operator` -* `scaling_size` – Incremental number of WebLogic Server instances by which to scale up or down, default=`1` +* `scaling_size` – Incremental number of Managed Server instances by which to scale up or down, default=`1` You can use any of the following tools to configure policies for diagnostic system modules: @@ -191,9 +191,8 @@ A more in-depth description and example on using WLDF's Policies and Actions com * [WebLogic Dynamic Clusters on Kubernetes](https://blogs.oracle.com/weblogicserver/weblogic-dynamic-clusters-on-kubernetes) - ##### Create ClusterRoleBindings to allow a namespace user to query WLS Kubernetes cluster information -The script `scalingAction.sh`, specified in the WLDF script action above, needs the appropriate RBAC permissions granted for the service account user (in the namespace in which the WebLogic domain is deployed) in order to query the Kubernetes API server for both configuration and runtime information of the domain resource. +The script `scalingAction.sh`, specified in the WLDF script action above, needs the appropriate RBAC permissions granted for the service account user (in the namespace in which the WebLogic domain is deployed) in order to query the Kubernetes API server for both configuration and runtime information of the Domain. The following is an example YAML file for creating the appropriate Kubernetes ClusterRole bindings: {{% notice note %}} @@ -258,8 +257,8 @@ details about [Using Prometheus to Automatically Scale WebLogic Clusters on Kube #### Helpful Tips ##### Debugging scalingAction.sh -The [`scalingAction.sh`](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/src/scripts/scaling/scalingAction.sh) script was designed to be executed within the -Administration Server pod because the associated diagnostic module is targed to the Administration Server. +The [`scalingAction.sh`](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/src/scripts/scaling/scalingAction.sh) script was designed to be executed within a container of the +Administration Server Pod because the associated diagnostic module is targeted to the Administration Server. The easiest way to verify and debug the `scalingAction.sh` script is to open a shell on the running Administration Server pod and execute the script on the command line. @@ -285,14 +284,14 @@ an HTTPS scale request requires these mandatory header properties: * `X-Requested-By` header value The following shell script is an example of how to issue a scaling request, with the necessary HTTP request header values, using `curl`. -This example assumes the operator and domain resource are configured with the following properties in Kubernetes: +This example assumes the operator and Domain YAML file are configured with the following fields in Kubernetes: * Operator properties: * externalRestEnabled: `true` * externalRestHttpsPort: `31001` * operator's namespace: `weblogic-operator` * operator's hostname is the same as the host shell script is executed on. -* Domain resource properties: +* Domain fields: * WebLogic cluster name: `DockerCluster` * Domain UID: `domain1` diff --git a/docs-source/content/userguide/managing-domains/domain-lifecycle/startup.md b/docs-source/content/userguide/managing-domains/domain-lifecycle/startup.md index f4c3857c4e0..9154f966207 100644 --- a/docs-source/content/userguide/managing-domains/domain-lifecycle/startup.md +++ b/docs-source/content/userguide/managing-domains/domain-lifecycle/startup.md @@ -3,8 +3,8 @@ title: "Startup and shutdown" date: 2019-02-23T17:04:41-05:00 draft: false weight: 1 -description: "There are properties on the domain resource that specify which servers should be running -and which servers should be restarted. To start, stop, or restart servers, modify these properties on the domain resource." +description: "There are fields on the Domain that specify which WebLogic Server instances should be running, +started, or restarted. To start, stop, or restart servers, modify these fields on the Domain." --- #### Contents @@ -16,16 +16,16 @@ and which servers should be restarted. To start, stop, or restart servers, modif * [Rolling restarts](#rolling-restarts) * [Common restarting scenarios](#common-restarting-scenarios) -There are properties on the domain resource that specify which servers should be running, -which servers should be restarted and the desired initial state. To start, stop, or restart servers, modify these properties on the domain resource -(for example, by using `kubectl` or the Kubernetes REST API). The operator will notice the changes and apply them. Beginning, -with operator version 2.2, there are now properties to control server shutdown handling, such as whether the shutdown +There are fields on the Domain that specify which servers should be running, +which servers should be restarted, and the desired initial state. To start, stop, or restart servers, modify these fields on the Domain +(for example, by using `kubectl` or the Kubernetes REST API). The operator will detect the changes and apply them. Beginning +with operator version 2.2.0, there are now fields to control server shutdown handling, such as whether the shutdown will be graceful, the timeout, and if in-flight sessions are given the opportunity to complete. ### Starting and stopping servers -The `serverStartPolicy` property on the domain resource controls which servers should be running. -The operator runtime monitors this property and creates or deletes the corresponding server pods. +The `serverStartPolicy` and `replicas` fields of the Domain controls which servers should be running. +The operator monitors these fields and creates or deletes the corresponding WebLogic Server instance Pods. {{% notice note %}} Do not use the WebLogic Server Administration Console to start or stop servers. {{% /notice %}} @@ -69,14 +69,14 @@ Servers configured as `ALWAYS` count toward the cluster's `replicas` count. {{% /notice %}} {{% notice note %}} -If more servers are configured as `ALWAYS` than the cluster's `replicas` count, they will all be started and the `replicas` count will be ignored. +If more servers are configured as `ALWAYS` than the cluster's `replicas` count, they will all be started and the `replicas` count will be exceeded. {{% /notice %}} ### Server start state -For some use cases, such as an externally managed zero downtime patching (ZDP), it may be necessary to start WebLogic Server +For some use cases, such as an externally managed zero downtime patching (ZDP), it may be necessary to start WebLogic Server instances so that at the end of its startup process, the server is in an administrative state. This can be achieved using the `serverStartState` -property, which is available at domain, cluster, and server levels. When `serverStartState` is set to `ADMIN`, then servers will +field, which is available at domain, cluster, and server levels. When `serverStartState` is set to `ADMIN`, then servers will progress only to the administrative state. Then you could use the WebLogic Server Administration Console, REST API, or a WLST script to make any necessary updates before advancing the server to the running state. @@ -85,8 +85,8 @@ Changes to the `serverStartState` property do not affect already started servers ### Common starting and stopping scenarios #### Normal running state -Normally, the Administration Server, all of the standalone Managed Servers, and enough Managed Servers in each cluster to satisfy its `replicas` count, should be started. -In this case, the domain resource does not need to specify `serverStartPolicy`, or list any `clusters` or `servers`, but it does need to specify a `replicas` count. +Normally, the Administration Server, all of the standalone Managed Servers, and enough Managed Servers members in each cluster to satisfy its `replicas` count, should be started. +In this case, the Domain does not need to specify `serverStartPolicy`, or list any `clusters` or `servers`, but it does need to specify a `replicas` count. For example: ``` @@ -95,7 +95,7 @@ For example: name: domain1 spec: image: ... - replicas: 10 + replicas: 3 ``` #### Shut down all the servers @@ -110,7 +110,7 @@ Sometimes you need to completely shut down the domain (for example, take it out ``` #### Only start the Administration Server -Sometimes you want to start the Administration Server only, that is, take the domain out of service but leave the Administration Server running so that you can administer the domain. +Sometimes you want to start the Administration Server only, that is, take the Managed Servers out of service but leave the Administration Server running so that you can administer the domain. ``` kind: Domain metadata: @@ -121,7 +121,7 @@ Sometimes you want to start the Administration Server only, that is, take the do ``` #### Shut down a cluster -To shut down a cluster (for example, take it out of service), add it to the domain resource and set its `serverStartPolicy` to `NEVER`. +To shut down a cluster (for example, take it out of service), add it to the Domain and set its `serverStartPolicy` to `NEVER`. ``` kind: Domain metadata: @@ -134,7 +134,7 @@ To shut down a cluster (for example, take it out of service), add it to the doma ``` #### Shut down a specific standalone server -To shut down a specific standalone server, add it to the domain resource and set its `serverStartPolicy` to `NEVER`. +To shut down a specific standalone server, add it to the Domain and set its `serverStartPolicy` to `NEVER`. ``` kind: Domain metadata: @@ -147,10 +147,10 @@ To shut down a specific standalone server, add it to the domain resource and set ``` #### Force a specific clustered Managed Server to start -Normally, all of the Managed Servers in a cluster are identical and it doesn't matter which ones are running as long as the operator starts enough of them to get to the cluster's `replicas` count. +Normally, all of the Managed Servers members in a cluster are identical and it doesn't matter which ones are running as long as the operator starts enough of them to get to the cluster's `replicas` count. However, sometimes some of the Managed Servers are different (for example, support some extra services that the other servers in the cluster use) and need to always be started. -This is done by adding the server to the domain resource and setting its `serverStartPolicy` to `ALWAYS`. +This is done by adding the server to the Domain and setting its `serverStartPolicy` to `ALWAYS`. ``` kind: Domain metadata: @@ -168,21 +168,21 @@ The server will count toward the cluster's `replicas` count. Also, if you confi ### Shutdown options -The domain resource includes the element `serverPod` that is available under `spec`, `adminServer` and each entry of -`clusters` and `managedServers`. The `serverPod` element controls many details of how pods are created for server instances. +The Domain YAML file includes the field `serverPod` that is available under `spec`, `adminServer`, and each entry of +`clusters` and `managedServers`. The `serverPod` field controls many details of how Pods are generated for WebLogic Server instances. -The `shutdown` element of `serverPod` controls how servers will be shutdown. This element has three properties: -`shutdownType`, `timeoutSeconds`, and `ignoreSessions`. The `shutdownType` property can be set to either `Graceful`, the default, +The `shutdown` field of `serverPod` controls how servers will be shut down and has three fields: +`shutdownType`, `timeoutSeconds`, and `ignoreSessions`. The `shutdownType` field can be set to either `Graceful`, the default, or `Forced` specifying the type of shutdown. The `timeoutSeconds` property configures how long the server is given to complete shutdown before the server is killed. The `ignoreSessions` property, which is only applicable for graceful shutdown, when `false`, the default, allows the shutdown process to take longer to give time for any active sessions to complete up to the configured timeout. The operator runtime monitors this property but will not restart any server pods solely to adjust the shutdown options. Instead, server pods created or restarted because of another property change will be configured to shutdown, at the appropriate -time, using the shutdown options set when the server pod is created. +time, using the shutdown options set when the WebLogic Server instance Pod is created. #### Shutdown environment variables -The operator runtime configures shutdown behavior with the use of the following environment variables. Users may +The operator configures shutdown behavior with the use of the following environment variables. Users may instead simply configure these environment variables directly. When a user-configured environment variable is present, the operator will not override the environment variable based on the shutdown configuration. @@ -194,12 +194,12 @@ the operator will not override the environment variable based on the shutdown co #### `shutdown` rules -You can specify the `serverPod` element, including the `shutdown` element, at the domain, cluster, and server levels. If +You can specify the `serverPod` field, including the `shutdown` field, at the domain, cluster, and server levels. If `shutdown` is specified at multiple levels, such as for a cluster and for a member server that is part of that cluster, then the shutdown configuration for a specific server is the combination of all of the relevant values with each field -having the value from the `shutdown` element at the most specific scope. +having the value from the `shutdown` field at the most specific scope. -For instance, given the following domain resource: +For instance, given the following Domain YAML file: ``` kind: Domain metadata: @@ -229,18 +229,19 @@ instance will not ignore sessions and will have a longer timeout. ### Restarting servers -The operator runtime automatically recreates (restarts) server pods when properties on the domain resource that affect server pods change (such as `image`, `volumes`, and `env`). -The `restartVersion` property on the domain resource lets you force the operator to restart a set of server pods. +The operator automatically recreates (restarts) WebLogic Server instance Pods when fields on the Domain that affect Pod generation change (such as `image`, `volumes`, and `env`). +The `restartVersion` field on the Domain lets you force the operator to restart a set of WebLogic Server instance Pods. -The operator runtime does rolling restarts of clustered servers so that service is maintained. +The operator does rolling restarts of clustered servers so that service is maintained. -#### Properties that cause servers to be restarted -The operator will restart servers when any of the follow properties on the domain resource that affect the server are changed: +#### Fields that cause servers to be restarted + +The operator will restart servers when any of the follow fields on the Domain that affect the WebLogic Server instance Pod generation are changed: * `containerSecurityContext` * `domainHome` -* `domainHomeInImage` (in releases before 3.0.0-rc1) -* `domainHomeSourceType` (introduced in 3.0.0-rc1) +* `domainHomeInImage` +* `domainHomeSourceType` * `env` * `image` * `imagePullPolicy` @@ -257,23 +258,25 @@ The operator will restart servers when any of the follow properties on the domai * `volumes` * `volumeMounts` +For Model in Image, a change to the `introspectVersion` field, which causes the operator to initiate a new [introspection]({{< relref "/userguide/managing-domains/domain-lifecycle/introspection.md" >}}), will result in the restarting of servers if the introspection results in the generation of a modified WebLogic domain home. See the documentation on Model in Image [runtime updates]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates.md" >}}) for a description of changes to the model or associated resources, such as Secrets, that will cause the generation of a modified WebLogic domain home. + {{% notice note %}} -If the only change detected is the addition or modification of a domain-specified label or annotation, -the operator will *patch* the server's pod rather than restarting it. Removing a label or annotation from -the domain resource will cause neither a restart nor a patch. It is possible to force a restart to remove +If the only change detected is the addition or modification of a customer-specified label or annotation, +the operator will *patch* the Pod rather than restarting it. Removing a label or annotation from +the Domain will cause neither a restart nor a patch. It is possible to force a restart to remove such a label or annotation by modifying the `restartVersion`. {{% /notice %}} {{% notice note %}} -Prior to version 2.2, the operator incorrectly restarted servers when the `serverStartState` property was changed. Now, +Prior to version 2.2.0, the operator incorrectly restarted servers when the `serverStartState` field was changed. Now, this property has no affect on already running servers. {{% /notice %}} ### Rolling restarts -Clustered servers that need to be restarted are gradually restarted (for example, `rolling restarted`) so that the cluster is not taken out of service and in-flight work can be migrated to other servers in the cluster. +Clustered servers that need to be restarted are gradually restarted (for example, "rolling restarted") so that the cluster is not taken out of service and in-flight work can be migrated to other servers in the cluster. -The `maxUnavailable` property on the domain resource determines how many of the cluster's servers may be taken out of service at a time when doing a rolling restart. +The `maxUnavailable` field on the Domain determines how many of the cluster's servers may be taken out of service at a time when doing a rolling restart. It can be specified at the domain and cluster levels and defaults to 1 (that is, by default, clustered servers are restarted one at a time). When using in-memory session replication, Oracle WebLogic Server employs a primary-secondary session replication model to provide high availability of application session state (that is, HTTP and EJB sessions). @@ -291,17 +294,14 @@ If you are supplying updated models or secrets for a running Model in Image doma The `restartVersion` property lets you force the operator to restart servers. -It's basically a user-specified string that gets added to new server pods (as a label) so that the operator can tell which servers need to be restarted. -If the value is different, then the server pod is old and needs to be restarted. If the value matches, then the server pod has already been restarted. - -Each time you want to restart some servers, you need to set `restartVersion` to a different string (the particular value doesn't matter). +Each time you want to restart some servers, you need to set `restartVersion` to a different value. The specific value does not matter so most customers use whole number values. -The operator will notice the new value and restart the affected servers (using the same mechanisms as when other properties that affect the server pods are changed, including doing rolling restarts of clustered servers). +The operator will detect the new value and restart the affected servers (using the same mechanisms as when other fields that affect the WebLogic Server instance Pod generation are changed, including doing rolling restarts of clustered servers). The `restartVersion` property can be specified at the domain, cluster, and server levels. A server will be restarted if any of these three values change. {{% notice note %}} -The servers will also be restarted if `restartVersion` is removed from the domain resource (for example, if you had previously specified a value to cause a restart, then you remove that value after the previous restart has completed). +The servers will also be restarted if `restartVersion` is removed from the Domain (for example, if you had previously specified a value to cause a restart, then you remove that value after the previous restart has completed). {{% /notice %}} @@ -314,7 +314,7 @@ Set `restartVersion` at the domain level to a new value. metadata: name: domain1 spec: - restartVersion: "domainV1" + restartVersion: "5" ... ``` @@ -329,7 +329,7 @@ Set `restartVersion` at the cluster level to a new value. spec: clusters: - clusterName : "cluster1" - restartVersion: "cluster1V1" + restartVersion: "5" maxUnavailable: 2 ... ``` @@ -344,7 +344,7 @@ Set `restartVersion` at the `adminServer` level to a new value. name: domain1 spec: adminServer: - restartVersion: "adminV1" + restartVersion: "5" ... ``` @@ -359,19 +359,19 @@ Set `restartVersion` at the `managedServer` level to a new value. spec: managedServers: - serverName: "standalone_server1" - restartVersion: "v1" + restartVersion: "1" - serverName: "cluster1_server1" - restartVersion: "v1" + restartVersion: "2" ... ``` #### Full domain restarts -To do a full domain restart, first shut down all of the domain's servers (Administration Server and Managed Servers), taking the domain out of service, +To do a full domain restart, first shut down all servers (Administration Server and Managed Servers), taking the domain out of service, then restart them. Unlike rolling restarts, the operator cannot detect and initiate a full domain restart; you must always manually initiate it. To manually initiate a full domain restart: -1. Change the domain level `serverStartPolicy` on the domain resource to `NEVER`. +1. Change the domain-level `serverStartPolicy` on the Domain to `NEVER`. ``` kind: Domain metadata: diff --git a/docs-source/content/userguide/managing-domains/domain-resource.md b/docs-source/content/userguide/managing-domains/domain-resource.md index 68977868397..442d7dffb29 100644 --- a/docs-source/content/userguide/managing-domains/domain-resource.md +++ b/docs-source/content/userguide/managing-domains/domain-resource.md @@ -5,14 +5,9 @@ weight = 2 pre = " " +++ -{{% notice warning %}} -This document contains details for the current production release 2.6.0 first, and then -for the [3.0.0-rc1 release candidate](#details-for-300-rc1) below. -{{% /notice %}} +Use this document to create your own [Domain resource](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md), which can be used to configure the operation of your WebLogic Server domain. The Domain resource does not replace the traditional domain configuration files, but instead cooperates with those files to describe the Kubernetes artifacts of the corresponding domain. For instance, the domain configuration will still specify deployed applications, data sources, and most other details about the domain while the Domain resource will specify the number of cluster members currently running or the persistent volumes that will be mounted into the containers running WebLogic Server instances. -Use this document to set up and configure your own [domain resource](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md), which can be used to configure the operation of your WebLogic Server domain. The domain resource does not replace the traditional domain configuration files, but instead cooperates with those files to describe the Kubernetes artifacts of the corresponding domain. For instance, the domain configuration will still specify deployed applications, data sources, and most other details about the domain while the domain resource will specify the number of cluster members currently running or the persistent volumes that will be mounted into the containers running WebLogic Server instances. - -Many of the samples accompanying the operator project include scripts to generate an initial domain resource from a set of simplified inputs; however, the domain resource is the actual source of truth for how the operator will manage each WebLogic Server domain. You are encouraged to either start with the domain resource YAML files generated by the various samples or create domain resources manually or by using other tools based on the schema referenced here or this documentation. +Many of the samples accompanying the operator project include scripts to generate an initial Domain resource from a set of simplified inputs; however, the Domain resource is the actual source of truth for how the operator will manage each WebLogic Server domain. You are encouraged to either start with the Domain resource YAML files generated by the various samples or create Domain resources manually or by using other tools based on the schema referenced here or this documentation. Swagger documentation is available [here](https://oracle.github.io/weblogic-kubernetes-operator/swagger/index.html). @@ -20,343 +15,153 @@ Swagger documentation is available [here](https://oracle.github.io/weblogic-kube The following prerequisites must be fulfilled before proceeding with the creation of the resource: -* Make sure the WebLogic Kubernetes Operator is running. -* Create a Kubernetes Namespace for the domain resource unless the intention is to use the default namespace. -* Create the Kubernetes Secrets containing the `username` and `password` of the administrative account in the same Kubernetes Namespace as the domain resource. +* Make sure the WebLogic Server Kubernetes Operator is running. +* Create a Kubernetes Namespace for the Domain unless the intention is to use the default namespace. +* Create the Kubernetes Secrets containing the `username` and `password` of the administrative account in the same Kubernetes Namespace as the Domain. #### YAML files -Domain resources are defined using the domain resource YAML files. For each WebLogic Server domain you want to create and configure, you should create one domain resource YAML file and apply it. In the example referenced below, the sample script, `create-domain.sh`, generates a domain resource YAML file that you can use as a basis. Copy the file and override the default settings so that it matches all the WebLogic Server domain parameters that define your domain. +Domains are defined using YAML files. For each WebLogic Server domain you want to run, you should create one Domain resource YAML file and apply it. In the example referenced below, the sample scripts generate a Domain resource YAML file that you can use as a basis. Copy the file and override the default settings so that it matches all the WebLogic Server domain parameters that define your domain. -See the WebLogic Server sample [Domain home on a persistent volume]({{< relref "/samples/simple/domains/domain-home-on-pv/_index.md" >}}) README. +See the WebLogic Server samples, [Domain home on a PV]({{< relref "/samples/simple/domains/domain-home-on-pv/_index.md" >}}), +[Domain home in Image]({{< relref "/samples/simple/domains/domain-home-in-image/_index.md" >}}), and [Model in Image]({{< relref "/samples/simple/domains/model-in-image/_index.md" >}}). #### Kubernetes resources After you have written your YAML files, you use them to create your domain artifacts using the `kubectl apply -f` command. -``` +```none $ kubectl apply -f domain-resource.yaml ``` #### Verify the results -To confirm that the domain resource was created, use this command: +To confirm that the Domain was created, use this command: -``` +```none $ kubectl describe domain [domain name] -n [namespace] ``` #### Domain resource overview -The domain resource, like all [Kubernetes objects](https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/), is described by three sections: `metadata`, `spec`, and `status`. - -The `metadata` section names the domain resource and its namespace. The name of the domain resource is the default value for the `domain UID` which is used by the operator to distinguish domains running in the Kubernetes cluster that may have the same domain name. The domain resource name is required to be unique in the namespace and the domain UID should be unique across the cluster. The domain UID, domain resource name, and domain name (from the WebLogic domain configuration) may all be different. - -The `spec` section describes the intended running state of the domain, including intended runtime state of server instances, number of cluster members started, and details about Kubernetes Pod or Service generation, such as resource constraints, scheduling requirements, or volume mounts. - -The `status` section is updated by the operator and describes the actual running state of the domain, including WebLogic Server instance runtime states and current health. - -#### Domain resource spec elements - -The domain resource `spec` section contains elements for configuring the domain operation and sub-sections specific to the Administration Server, specific clusters, or specific Managed Servers. - -Elements related to domain identification, Docker image, and domain home: - -* `domainUID`: The domain unique identifier. Must be unique across the Kubernetes cluster. Not required. Defaults to the value of `metadata.name`. -* `image`: The WebLogic Docker image. Required when `domainHomeInImage` is true; otherwise, defaults to `container-registry.oracle.com/middleware/weblogic:12.2.1.3`. -* `imagePullPolicy`: The image pull policy for the WebLogic Docker image. Legal values are `Always`, `Never` and `IfNotPresent`. Defaults to `Always` if image ends in `:latest`; `IfNotPresent` otherwise. -* `imagePullSecrets`: A list of image pull secrets for the WebLogic Docker image. -* `domainHome`: The folder for the WebLogic domain. Not required. Defaults to `/shared/domains/domains/domainUID` if `domainHomeInImage` is false. Defaults to `/u01/oracle/user_projects/domains/` if `domainHomeInImage` is true. -* `domainHomeInImage`: True if this domain's home is defined in the Docker image for the domain. Defaults to true. - -Elements related to logging: - -* `includeServerOutInPodLog`: If true (the default), the server `.out` file will be included in the pod's stdout. -* `logHome`: The in-pod name of the directory in which to store the domain, Node Manager, server logs, and server `.out` files. -* `logHomeEnabled`: Specifies whether the log home folder is enabled. Not required. Defaults to true if `domainHomeInImage` is false. Defaults to false if `domainHomeInImage` is true. - -Elements related to security: - -* `webLogicCredentialsSecret`: The name of a pre-created Kubernetes Secret, in the domain resource's namespace, that holds the user name and password needed to boot WebLogic Server under the `username` and `password` fields. - -Elements related to domain [startup and shutdown]({{< relref "/userguide/managing-domains/domain-lifecycle/startup.md" >}}): - -* `serverStartPolicy`: The strategy for deciding whether to start a server. Legal values are `ADMIN_ONLY`, `NEVER`, or `IF_NEEDED`. -* `serverStartState`: The state in which the server is to be started. Use `ADMIN` if the server should start in the admin state. Defaults to `RUNNING`. -* `restartVersion`: If present, every time this value is updated, the operator will restart the required servers. -* `replicas`: The number of Managed Servers to run in any cluster that does not specify a `replicas` count. - -Elements related to overriding WebLogic domain configuration: +The Domain type is defined by a CustomResourceDefinition (CRD) and, like all [Kubernetes objects](https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/), is described by three sections: `metadata`, `spec`, and `status`. -* `configOverrides`: The name of the ConfigMap for optional WebLogic configuration overrides. -* `configOverrideSecrets`: A list of names of the secrets for optional WebLogic configuration overrides. +The operator installs the CRD for the Domain type when the operator first starts. Customers may also choose to install the CRD in advance by using one of the provided YAML files. Installing the CRD in advance allows you to run the operator without giving it privilege (through Kubernetes roles and bindings) to access or update the CRD or other cluster-scoped resources. This may be necessary in environments where the operator cannot have cluster-scoped privileges, such as OpenShift Dedicated. The operator's role based access control (RBAC) requirements are documented [here]({{< relref "/security/rbac.md" >}}). -Elements related to Kubernetes Pod and Service generation: - -* `serverPod`: Configuration affecting server pods for WebLogic Server instances. Most entries specify standard Kubernetes content for pods that you may want the operator to include in pods generated for WebLogic Server instances, such as labels, annotations, volumes, or scheduling constraints, including anti-affinity. -* `serverService`: Customization affecting ClusterIP Kubernetes services for WebLogic Server instances. - -Sub-sections related to the Administration Server, specific clusters, or specific Managed Servers: - -* `adminServer`: Configuration for the Administration Server. -* `clusters`: Configuration for specific clusters. -* `managedServers`: Configuration for specific Managed Servers. - -The elements `serverStartPolicy`, `serverStartState`, `serverPod` and `serverService` are repeated under `adminServer` and under each entry of `clusters` or `managedServers`. The values directly under `spec` set the defaults for the entire domain. The values under a specific entry under `clusters` set the defaults for cluster members of that cluster. The values under `adminServer` or an entry under `managedServers` set the values for that specific server. Values from the domain scope and values from the cluster (for cluster members) are merged with or overridden by the setting for the specific server depending on the element. See the [startup and shutdown]({{< relref "/userguide/managing-domains/domain-lifecycle/startup.md" >}}) documentation for details about `serverStartPolicy` combination. - -### JVM memory and Java option environment variables - -You can use the following environment variables to specify JVM memory and JVM option arguments to WebLogic Server Managed Server and Node Manager instances: - -* `JAVA_OPTIONS` : Java options for starting WebLogic Server. -* `USER_MEM_ARGS` : JVM memory arguments for starting WebLogic Server. -* `NODEMGR_JAVA_OPTIONS` : Java options for starting Node Manager instance. -* `NODEMGR_MEM_ARGS` : JVM memory arguments for starting Node Manager instance. +For Kubernetes 1.16 and later: -Note: The `USER_MEM_ARGS` environment variable defaults to `-Djava.security.egd=file:/dev/./urandom` in all WebLogic Server pods and the WebLogic introspection job. It can be explicitly set to another value in your domain resource YAML file using the `env` attribute under the `serverPod` configuration. - -The following behavior occurs depending on whether or not `NODEMGR_JAVA_OPTIONS` and `NODEMGR_MEM_ARGS` are defined: - -* If `NODEMGR_JAVA_OPTIONS` is not defined and `JAVA_OPTIONS` is defined, then the `JAVA_OPTIONS` value will be applied to the Node Manager instance. -* If `NODEMGR_MEM_ARGS` is not defined, then default memory and Java security property values (`-Xms64m -Xmx100m -Djava.security.egd=file:/dev/./urandom`) will be applied to the Node Manager instance. It can be explicitly set to another value in your domain resource YAML file using the `env` attribute under the `serverPod` configuration. - -Note: Defining `-Djava.security.egd=file:/dev/./urandom` in the `NODEMGR_MEM_ARGS` environment variable helps to speed up the Node Manager startup on systems with low entropy. - -This example snippet illustrates how to add the above environment variables using the `env` attribute under the `serverPod` configuration in your domain resource YAML file. +```none +$ kubectl create -f kubernetes/crd/domain-crd.yaml ``` -# Copyright 2017, 2019, Oracle Corporation and/or its affiliates. All rights reserved. -# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. -# -apiVersion: "weblogic.oracle/v7" -kind: Domain -metadata: - name: domain1 - namespace: domains23 - labels: - weblogic.resourceVersion: domain-v2 - weblogic.domainUID: domain1 -spec: - serverPod: - # an (optional) list of environment variable to be set on the servers - env: - - name: JAVA_OPTIONS - value: "-Dweblogic.StdoutDebugEnabled=false " - - name: USER_MEM_ARGS - value: "-Djava.security.egd=file:/dev/./urandom " - - name: NODEMGR_JAVA_OPTIONS - value: "-Dweblogic.StdoutDebugEnabled=false " - - name: NODEMGR_MEM_ARGS - value: "-Xms64m -Xmx100m -Djava.security.egd=file:/dev/./urandom " -``` - -### Pod generation - -The operator creates a Pod for each running WebLogic Server instance. This Pod will have a container, named `weblogic-server`, based on the Docker image specified by the `image` field. Additional Pod or container content can be specified using the elements under `serverPod`. This includes Kubernetes sidecar and init containers, labels, annotations, volumes, volume mounts, scheduling constraints, including anti-affinity, [resource requirements](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/), or [security context](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/). -Customer provided labels and annotations may not begin with "weblogic" and the operator will generate the following labels: - -* `weblogic.createdByOperator: "true"` -* `weblogic.domainName: `, where `` is the name of the WebLogic domain -* `weblogic.domainUID: `, where `` is the domain UID from the domain resource -* `weblogic.serverName: `, where `` is the name of the WebLogic Server instance -* `weblogic.clusterName: `, where `` is the name of the cluster of which this instance is a member, if any -* `weblogic.resourceVersion: `, where `` is the value of the `resourceVersion` field from the domain resource - -Prior to creating a Pod, the operator replaces variable references allowing the Pod content to be templates. The format of these variable references is `$(VARIABLE_NAME)` where `VARIABLE_NAME` is one of the variable names available in the container for the WebLogic Server instance. The default set of environment variables includes: - -* `DOMAIN_NAME`: The WebLogic Server domain name. -* `DOMAIN_UID`: The domain unique identifier. -* `DOMAIN_HOME`: The domain home location as a file system path within the container. -* `SERVER_NAME`: The WebLogic Server instance name. -* `CLUSTER_NAME`: The WebLogic cluster name, if this is a cluster member. -* `LOG_HOME`: The WebLogic log location as a file system path within the container. - -This example domain YAML file specifies that Pods for WebLogic Server instances in the `cluster-1` cluster will have a per-Managed Server volume and volume mount (similar to a Kubernetes `StatefulSet`), an `init` container to initialize some files in that volume, and anti-affinity scheduling so that the server instances are scheduled, as much as possible, on different Nodes: +For Kubernetes 1.15 and earlier: +```none +$ kubectl create -f kubernetes/crd/domain-v1beta1-crd.yaml ``` -# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. -# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. -# -apiVersion: "weblogic.oracle/v7" -kind: Domain -metadata: - name: domain1 - namespace: domains23 - labels: - weblogic.resourceVersion: domain-v2 - weblogic.domainUID: domain1 -spec: - domainHome: /u01/oracle/user_projects/domains/domain1 - domainHomeInImage: true - image: "phx.ocir.io/weblogick8s/my-domain-home-in-image:12.2.1.4" - imagePullPolicy: "IfNotPresent" - imagePullSecrets: - - name: ocirsecret - webLogicCredentialsSecret: - name: domain1-weblogic-credentials - includeServerOutInPodLog: true - serverStartPolicy: "IF_NEEDED" - serverPod: - env: - - name: JAVA_OPTIONS - value: "-Dweblogic.StdoutDebugEnabled=false" - - name: USER_MEM_ARGS - value: "-Djava.security.egd=file:/dev/./urandom " - adminServer: - serverStartState: "RUNNING" +After the CustomResourceDefinition is installed, either by the operator or using one of the `create` commands above, you can verify that the CRD is installed correctly using: - clusters: - - clusterName: cluster-1 - serverStartState: "RUNNING" - serverPod: - affinity: - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 100 - podAffinityTerm: - labelSelector: - matchExpressions: - - key: "weblogic.clusterName" - operator: In - values: - - $(CLUSTER_NAME) - topologyKey: "kubernetes.io/hostname" - volumes: - - name: $(SERVER_NAME)-volume - emptyDir: {} - volumeMounts: - - mountPath: /server-volume - name: $(SERVER_NAME)-volume - initContainers: - - name: volumeinit - image: "oraclelinux:7-slim" - imagePullPolicy: IfNotPresent - command: ["/usr/bin/sh"] - args: ["echo", "Replace with command to initialize files in /init-volume"] - volumeMounts: - - mountPath: /init-volume - name: $(SERVER_NAME)-volume - replicas: 2 +```none +$ kubectl get crd domains.weblogic.oracle ``` -The operator uses an "introspection" job to discover details about the WebLogic domain configuration, such as the list of clusters and network access points. The Job Pod for the introspector is generated using the `serverPod` entries for the Administration Server. Because the Administration Server name is not known until the introspection step is complete, the value of the `$(SERVER_NAME)` variable for the introspection job will be "introspector". - -{{% notice warning %}} -This document contains details for the current production release 2.6.0 above, and then -for the 3.0.0-rc1 release candidate below. -{{% /notice %}} - -## Details for 3.0.0-rc1 - -Use this document to set up and configure your own [domain resource](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md) which can be used to configure the operation of your WebLogic domain. The domain resource does not replace the traditional configuration of WebLogic domains found in the domain configuration files, but instead cooperates with those files to describe the Kubernetes artifacts of the corresponding domain. For instance, the WebLogic domain configuration will still specify deployed applications, data sources, and most other details about the domain while the domain resource will specify the number of cluster members currently running or the persistent volumes that will be mounted into the containers running WebLogic Server instances. - -Many of the samples accompanying the operator project include scripts to generate an initial domain resource from a set of simplified inputs; however, the domain resource is the actual source of truth for how the operator will manage each WebLogic domain. You are encouraged to either start with the domain resource YAML files generated by the various samples or create domain resources manually or by using other tools based on the schema referenced here or this documentation. - -Swagger documentation is available [here](https://oracle.github.io/weblogic-kubernetes-operator/swagger/index.html). - -#### Prerequisites - -The following prerequisites must be fulfilled before proceeding with the creation of the resource: +If you are using Kubernetes 1.16 or later, you can access the description of any field of the Domain using `kubectl explain`. For instance, the following command displays the description of the `domainUID` field: -* Make sure the WebLogic Server Kubernetes Operator is running. -* Create a Kubernetes Namespace for the domain resource unless the intention is to use the default namespace. -* Create the Kubernetes Secrets containing the `username` and `password` of the administrative account in the same Kubernetes Namespace as the domain resource. +```none +$ kubectl explain domains.spec.domainUID +KIND: Domain +VERSION: weblogic.oracle/v8 -#### YAML files - -Domain resources are defined using the domain resource YAML files. For each WLS domain you want to create and configure, you should create one domain resource YAML file and apply it. In the example referenced below, the sample scripts generate a domain resource YAML file that you can use as a basis. Copy the file and override the default settings so that it matches all the WLS domain parameters that define your WLS domain. - -See the WebLogic samples, [Domain home on a PV]({{< relref "/samples/simple/domains/domain-home-on-pv/_index.md" >}}), -[Domain home in Image]({{< relref "/samples/simple/domains/domain-home-in-image/_index.md" >}}), and [Model in Image]({{< relref "/samples/simple/domains/model-in-image/_index.md" >}}). - -#### Kubernetes resources +FIELD: domainUID -After you have written your YAML files, you use them to create your WLS domain artifacts using the `kubectl apply -f` command. - -``` -$ kubectl apply -f domain-resource.yaml +DESCRIPTION: + Domain unique identifier. It is recommended that this value be unique to + assist in future work to identify related domains in active-passive + scenarios across data centers; however, it is only required that this value + be unique within the namespace, similarly to the names of Kubernetes + resources. This value is distinct and need not match the domain name from + the WebLogic domain configuration. Defaults to the value of + `metadata.name`. ``` -#### Verify the results - -To confirm that the domain resource was created, use this command: - -``` -$ kubectl describe domain [domain name] -n [namespace] -``` - -#### Domain resource overview +The `metadata` section names the Domain and its namespace. The name of the Domain is the default value for the `domain UID` which is used by the operator to distinguish domains running in the Kubernetes cluster that may have the same domain name. The Domain name must be unique in the namespace and the domain UID should be unique across the cluster. The domain UID, Domain resource name, and domain name (from the WebLogic domain configuration) may all be different. -The domain resource, like all [Kubernetes objects](https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/), is described by three sections: `metadata`, `spec`, and `status`. +The `spec` section describes the intended running state of the domain, including intended runtime state of WebLogic Server instances, number of cluster members started, and details about Kubernetes Pod or Service generation, such as resource constraints, scheduling requirements, or volume mounts. -The `metadata` section names the domain resource and its namespace. The name of the domain resource is the default value for the `domain UID` which is used by the operator to distinguish domains running in the Kubernetes cluster that may have the same domain name. The domain resource name is required to be unique in the namespace and the domain UID should be unique across the cluster. The domain UID, domain resource name, and domain name (from the WebLogic domain configuration) may all be different. +The operator automatically updates the `status` section to describe the actual running state of the domain, including WebLogic Server instance runtime states and current health. -The `spec` section describes the intended running state of the domain, including intended runtime state of server instances, number of cluster members started, and details about Kubernetes Pod or Service generation, such as resource constraints, scheduling requirements, or volume mounts. +#### Domain spec elements -The `status` section is updated by the operator and describes the actual running state of the domain, including WebLogic Server instance runtime states and current health. +The Domain `spec` section contains elements for configuring the domain operation and sub-sections specific to the Administration Server, specific clusters, or specific Managed Servers. -#### Domain resource spec elements - -The domain resource `spec` section contains elements for configuring the domain operation and sub-sections specific to the Administration Server, specific clusters, or specific Managed Servers. - -Elements related to domain identification, Docker image, and domain home: - -* `domainUID`: The domain unique identifier. Must be unique across the Kubernetes cluster. Not required. Defaults to the value of `metadata.name`. -* `image`: The WebLogic Docker image. Required when `domainHomeSourceType` is `Image`; otherwise, defaults to `container-registry.oracle.com/middleware/weblogic:12.2.1.4`. -* `imagePullPolicy`: The image pull policy for the WebLogic Docker image. Legal values are `Always`, `Never`, and `IfNotPresent`. Defaults to `Always` if image ends in `:latest`; `IfNotPresent` otherwise. -* `imagePullSecrets`: A list of image pull secrets for the WebLogic Docker image. -* `domainHome`: The folder for the WebLogic domain. Not required. Defaults to `/shared/domains/domains/domainUID` if `domainHomeSourceType` is `PersistentVolume`. Defaults to `/u01/oracle/user_projects/domains/` if `domainHomeSourceType` is `Image`. Defaults to `/u01/domains/domainUID` if `domainHomeSourceType` is `FromModel`. -* `domainHomeSourceType`: The source for the domain home. Legal values are `Image` (for Domain in Image), `PersistentVolume` (for Domain in PV), and `FromModel` (for Model in Image). Defaults to `Image`. +Elements related to domain identification, container image, and domain home: +* `domainUID`: Domain unique identifier. It is recommended that this value be unique to assist in future work to identify related domains in active-passive scenarios across data centers; however, it is only required that this value be unique within the namespace, similarly to the names of Kubernetes resources. This value is distinct and need not match the domain name from the WebLogic domain configuration. Defaults to the value of `metadata.name`. +* `image`: The WebLogic container image; required when `domainHomeSourceType` is Image or FromModel; otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4. +* `imagePullPolicy`: The image pull policy for the WebLogic container image. Legal values are Always, Never, and IfNotPresent. Defaults to Always if image ends in :latest; IfNotPresent, otherwise. +* `imagePullSecrets`: A list of image pull Secrets for the WebLogic container image. +* `domainHome`: The directory containing the WebLogic domain configuration inside the container. Defaults to /shared/domains/domains/ if `domainHomeSourceType` is PersistentVolume. Defaults to /u01/oracle/user_projects/domains/ if `domainHomeSourceType` is Image. Defaults to /u01/domains/ if `domainHomeSourceType` is FromModel. +* `domainHomeSourceType`: Domain home file system source type: Legal values: Image, PersistentVolume, FromModel. Image indicates that the domain home file system is present in the container image specified by the `image` field. PersistentVolume indicates that the domain home file system is located on a persistent volume. FromModel indicates that the domain home file system will be created and managed by the operator based on a WDT domain model. If this field is specified, it overrides the value of `domainHomeInImage`. If both fields are unspecified, then `domainHomeSourceType` defaults to Image. +* `dataHome`: An optional directory in a server's container for data storage of default and custom file stores. If `dataHome` is not specified or its value is either not set or empty, then the data storage directories are determined from the WebLogic domain configuration. + Elements related to logging: -* `includeServerOutInPodLog`: If true (the default), the server `.out` file will be included in the pod's `stdout`. -* `logHome`: The in-pod name of the directory in which to store the domain, Node Manager, server logs, and server `.out` files. Defaults to `/shared/logs/`. Ignored if `logHomeEnabled` is `false`. -* `logHomeEnabled`: Specifies whether the log home folder is enabled. Not required. Defaults to true if `domainHomeSourceType` is `PersistentVolume`. Defaults to false if `domainHomeSourceType` is `Image` or `FromModel`. +* `includeServerOutInPodLog`: Specifies whether the server .out file will be included in the Pod's log. Defaults to true. +* `logHome`: The directory in a server's container in which to store the domain, Node Manager, server logs, server *.out, and optionally HTTP access log files if `httpAccessLogInLogHome` is true. Ignored if `logHomeEnabled` is false. +* `logHomeEnabled`: Specifies whether the log home folder is enabled. Defaults to true if `domainHomeSourceType` is PersistentVolume; false, otherwise. +* `httpAccessLogInLogHome`: Specifies whether the server HTTP access log files will be written to the same directory specified in `logHome`. Otherwise, server HTTP access log files will be written to the directory configured in the WebLogic domain configuration. Defaults to true. Elements related to security: -* `webLogicCredentialsSecret`: The name of a pre-created Kubernetes Secret, in the domain resource's namespace, that holds the user name and password needed to boot WebLogic Server under the `username` and `password` fields. +* `webLogicCredentialsSecret`: Reference to a Kubernetes Secret that contains the user name and password needed to boot a WebLogic Server under the `username` and `password` fields. * See also elements under `configuration` below. Elements related to domain [startup and shutdown]({{< relref "/userguide/managing-domains/domain-lifecycle/startup.md" >}}): -* `serverStartPolicy`: The strategy for deciding whether to start a server. Legal values are `ADMIN_ONLY`, `NEVER`, or `IF_NEEDED`. -* `serverStartState`: The state in which the server is to be started. Use `ADMIN` if the server should start in the admin state. Defaults to `RUNNING`. -* `restartVersion`: If present, every time this value is updated, the operator will restart the required servers. -* `replicas`: The number of Managed Servers to run in any cluster that does not specify a `replicas` count. +* `serverStartPolicy`: The strategy for [deciding whether to start]({{< relref "/userguide/managing-domains/domain-lifecycle/startup.md#starting-and-stopping-servers" >}}) a WebLogic Server instance. Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED. Defaults to IF_NEEDED. +* `serverStartState`: The WebLogic runtime state in which the server is to be started. Use ADMIN if the server should start in the admin state. Defaults to RUNNING. +* `restartVersion`: Changes to this field cause the [operator to restart]({{< relref "/userguide/managing-domains/domain-lifecycle/startup.md#restarting-servers" >}}) WebLogic Server instances. +* `replicas`: The default number of cluster member Managed Server instances to start for each WebLogic cluster in the domain configuration, unless `replicas` is specified for that cluster under the `clusters` field. For each cluster, the operator will sort cluster member Managed Server names from the WebLogic domain configuration by normalizing any numbers in the Managed Server name and then sorting alphabetically. This is done so that server names such as "managed-server10" come after "managed-server9". The operator will then start Managed Servers from the sorted list, up to the `replicas` count, unless specific Managed Servers are specified as starting in their entry under the `managedServers` field. In that case, the specified Managed Servers will be started and then additional cluster members will be started, up to the `replicas` count, by finding further cluster members in the sorted list that are not already started. If cluster members are started because of their entries under `managedServers`, then a cluster may have more cluster members running than its `replicas` count. Defaults to 0. +* `maxClusterConcurrentStartup`: The maximum number of cluster member Managed Server instances that the operator will start in parallel for a given cluster, if `maxConcurrentStartup` is not specified for a specific cluster under the `clusters` field. A value of 0 means there is no configured limit. Defaults to 0. +* `allowReplicasBelowMinDynClusterSize`: Whether to allow the number of running cluster member Managed Server instances to drop below the minimum dynamic cluster size configured in the WebLogic domain configuration, if this is not specified for a specific cluster under the `clusters` field. Defaults to true. +* `introspectVersion`: Changes to this field cause the operator to repeat its introspection of the WebLogic domain configuration. Repeating introspection is required for the operator to recognize changes to the domain configuration, such as adding a new WebLogic cluster or Managed Server instance, to regenerate configuration overrides, or to regenerate the WebLogic domain home when the `domainHomeSourceType` is FromModel. Introspection occurs automatically, without requiring change to this field, when servers are first started or restarted after a full domain shut down. For the FromModel `domainHomeSourceType`, introspection also occurs when a running server must be restarted because of changes to any of the fields [listed here]({{< relref "/userguide/managing-domains/domain-lifecycle/startup.md#properties-that-cause-servers-to-be-restarted" >}}). See also `overridesConfigurationStrategy`. Elements related to specifying and overriding WebLogic domain configuration: * These elements are under `configuration`. - * `overridesConfigMap`: The name of the ConfigMap for optional [Configuration overrides]({{< relref "/userguide/managing-domains/configoverrides/_index.md" >}}). The value only applies if the `domainHomeSourceType` is `Image` or `PersistentVolume`. Do not set this value if the `domainHomeSourceType` is `FromModel`. - * `secrets`: A list of secret names for optional [Configuration overrides]({{< relref "/userguide/managing-domains/configoverrides/_index.md" >}}) macros or Model in Image [Model files]({{< relref "/userguide/managing-domains/model-in-image/model-files.md" >}}) macros. Often used for specifying data source URLs, user names, and passwords. - * `introspectorJobActiveDeadlineSeconds`: Time in seconds before timing out the introspector job. Default is 120 seconds. - + * `overridesConfigMap`: The name of the ConfigMap for WebLogic [configuration overrides]({{< relref "/userguide/managing-domains/configoverrides/_index.md" >}}). If this field is specified, then the value of `spec.configOverrides` is ignored. + * `overrideDistributionStrategy`: Determines how updated configuration overrides are distributed to already running WebLogic Server instances following introspection when the `domainHomeSourceType` is PersistentVolume or Image. Configuration overrides are generated during introspection from Secrets, the `overrideConfigMap` field, and WebLogic domain topology. Legal values are DYNAMIC, which means that the operator will distribute updated configuration overrides dynamically to running servers, and ON_RESTART, which means that servers will use updated configuration overrides only after the server's next restart. The selection of ON_RESTART will not cause servers to restart when there are updated configuration overrides available. See also `introspectVersion`. Defaults to DYNAMIC. + * `secrets`: A list of names of the Secrets for WebLogic [configuration overrides]({{< relref "/userguide/managing-domains/configoverrides/_index.md" >}}) or model. If this field is specified, then the value of `spec.configOverrideSecrets` is ignored. + * `introspectorJobActiveDeadlineSeconds`: The introspector job timeout value in seconds. If this field is specified, then the operator's ConfigMap `data.introspectorJobActiveDeadlineSeconds` value is ignored. Defaults to 120 seconds. + * These elements are under `configuration.model`, only apply if the `domainHomeSourceType` is `FromModel`, and are discussed in [Model in Image]({{< relref "/userguide/managing-domains/model-in-image/_index.md" >}}). - * `configMap`: Optional configuration map for supplying [runtime model file updates]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates.md" >}}) to Model in Image model configuration. - * `domainType`: Must be one of `WLS`, `JRF`, or `RestrictedJRF`. Default is `WLS`. - * `runtimeEncryptionSecret`: Required. Expected field is `password`. This is used by Model in Image to encrypt data while the data is passed from the introspector job to WebLogic pods. The password can be arbitrary: the only requirement is that it must stay the same for the life of a domain resource. If a domain resource is deleted then redeployed, it's fine to change the password during the interim. - * `wdtEncryptionSecret`: Optional. Rarely used. See [Model in Image]({{< relref "/userguide/managing-domains/model-in-image/_index.md" >}}) for details. + * `configMap`: Name of a ConfigMap containing the WebLogic Deploy Tooling model. + * `domainType`: WebLogic Deploy Tooling domain type. Legal values: WLS, RestrictedJRF, JRF. Defaults to WLS. + * `runtimeEncryptionSecret`: Runtime encryption secret. Required when `domainHomeSourceType` is set to FromModel. * These elements are under `configuration.opss`, and only apply if the `domainHomeSourceType` is `FromModel` and the `domainType` is `JRF`. - * `walletPasswordSecret`: The expected secret field is `walletPassword`. Used to encrypt/decrypt the wallet that's used for accessing the domain's entries in its RCU database. - * `walletFileSecret`: Optional. The expected secret field is `walletFile`. Use this to allow a JRF domain to reuse its entries in the RCU database (specify a wallet file that was obtained from the domain home while the domain was booted for the first time). + * `walletPasswordSecret`: Name of a Secret containing the OPSS key passphrase, which must be in a field named `walletPassword`. Used to encrypt and decrypt the wallet that is used for accessing the domain's entries in its RCU database. + * `walletFileSecret`: Name of a Secret containing the OPSS key wallet file, which must be in a field named `walletFile`. Use this to allow a JRF domain to reuse its entries in the RCU database. This allows you to specify a wallet file that was obtained from the domain home after the domain was booted for the first time. + +* These elements are under `configuration.istio`. + + * `enabled`: True, if this domain is deployed under an Istio service mesh. Defaults to true when the `istio` field is specified. + * `readinessPort`: The operator will create a WebLogic network access point with this port that will then be exposed from the container running the WebLogic Server instance. The readiness probe will use this network access point to verify that the server instance is ready for application traffic. Defaults to 8888. Elements related to Kubernetes Pod and Service generation: -* `serverPod`: Configuration affecting server pods for WebLogic Server instances. Most entries specify standard Kubernetes content for pods that you may want the operator to include in pods generated for WebLogic Server instances, such as labels, annotations, volumes, or scheduling constraints, including anti-affinity. -* `serverService`: Customization affecting ClusterIP Kubernetes services for WebLogic Server instances. +* `serverPod`: Customization affecting the generation of Pods for WebLogic Server instances. +* `serverService`: Customization affecting the generation of Kubernetes Services for WebLogic Server instances. Sub-sections related to the Administration Server, specific clusters, or specific Managed Servers: -* `adminServer`: Configuration for the Administration Server. -* `clusters`: Configuration for specific clusters. -* `managedServers`: Configuration for specific Managed Servers. +* `adminServer`: Lifecycle options for the Administration Server, including Java options, environment variables, additional Pod content, and which channels or network access points should be exposed using a NodePort Service. +* `clusters`: Lifecycle options for all of the Managed Server members of a WebLogic cluster, including Java options, environment variables, additional Pod content, and the ability to explicitly start, stop, or restart cluster members. The `clusterName` field of each entry must match a cluster that already exists in the WebLogic domain configuration. +* `managedServers`: Lifecycle options for individual Managed Servers, including Java options, environment variables, additional Pod content, and the ability to explicitly start, stop, or restart a named server instance. The `serverName` field of each entry must match a Managed Server that already exists in the WebLogic domain configuration or that matches a dynamic cluster member based on the server template. The elements `serverStartPolicy`, `serverStartState`, `serverPod` and `serverService` are repeated under `adminServer` and under each entry of `clusters` or `managedServers`. The values directly under `spec`, set the defaults for the entire domain. The values under a specific entry under `clusters`, set the defaults for cluster members of that cluster. The values under `adminServer` or an entry under `managedServers`, set the values for that specific server. Values from the domain scope and values from the cluster (for cluster members) are merged with or overridden by the setting for the specific server depending on the element. See [Startup and shutdown]({{< relref "/userguide/managing-domains/domain-lifecycle/startup.md" >}}) for details about `serverStartPolicy` combinations. @@ -364,32 +169,33 @@ The elements `serverStartPolicy`, `serverStartState`, `serverPod` and `serverSer You can use the following environment variables to specify JVM memory and JVM option arguments to WebLogic Server Managed Server and Node Manager instances: -* `JAVA_OPTIONS` : Java options for starting WebLogic Server. -* `USER_MEM_ARGS` : JVM memory arguments for starting WebLogic Server. -* `NODEMGR_JAVA_OPTIONS` : Java options for starting a Node Manager instance. -* `NODEMGR_MEM_ARGS` : JVM memory arguments for starting a Node Manager instance. - -**Note**: The `USER_MEM_ARGS` environment variable defaults to `-Djava.security.egd=file:/dev/./urandom` in all WebLogic Server pods and the WebLogic introspection job. It can be explicitly set to another value in your domain resource YAML file using the `env` attribute under the `serverPod` configuration. - -The following behavior occurs depending on whether or not `NODEMGR_JAVA_OPTIONS` and `NODEMGR_MEM_ARGS` are defined: +* `JAVA_OPTIONS`: Java options for starting WebLogic Server. +* `USER_MEM_ARGS`: JVM memory arguments for starting WebLogic Server. +* `NODEMGR_JAVA_OPTIONS`: Java options for starting a Node Manager instance. +* `NODEMGR_MEM_ARGS`: JVM memory arguments for starting a Node Manager instance. +* `WLST_PROPERTIES`: System properties for WLST commands in introspector jobs or WebLogic Server instance containers. +* `WLSDEPLOY_PROPERTIES`: System properties for WebLogic Deploy Tool commands during Model in Image introspector jobs or WebLogic Server instance containers. -* If `NODEMGR_JAVA_OPTIONS` is not defined and `JAVA_OPTIONS` is defined, then the `JAVA_OPTIONS` value will be applied to the Node Manager instance. -* If `NODEMGR_MEM_ARGS` is not defined, then default memory and Java security property values (`-Xms64m -Xmx100m -Djava.security.egd=file:/dev/./urandom`) will be applied to the Node Manager instance. It can be explicitly set to another value in your domain resource YAML file using the `env` attribute under the `serverPod` configuration. +**Notes:** -**Note**: Defining `-Djava.security.egd=file:/dev/./urandom` in the `NODEMGR_MEM_ARGS` environment variable helps to speed up the Node Manager startup on systems with low entropy. +* The following behavior occurs depending on whether or not `NODEMGR_JAVA_OPTIONS` and `NODEMGR_MEM_ARGS` are defined: + * If `NODEMGR_JAVA_OPTIONS` is not defined and `JAVA_OPTIONS` is defined, then the `JAVA_OPTIONS` value will be applied to the Node Manager instance. + * If `NODEMGR_MEM_ARGS` is not defined, then default memory and Java security property values (`-Xms64m -Xmx100m -Djava.security.egd=file:/dev/./urandom`) will be applied to the Node Manager instance. It can be explicitly set to another value in your Domain YAML file using the `env` attribute under the `serverPod` configuration. +* The `USER_MEM_ARGS` environment variable defaults to `-Djava.security.egd=file:/dev/./urandom` in all WebLogic Server pods and the WebLogic introspection job. It can be explicitly set to another value in your Domain YAML file using the `env` attribute under the `serverPod` configuration. +* Notice that the `NODEMGR_MEM_ARGS` and `USER_MEM_ARGS` environment variables both set `-Djava.security.egd=file:/dev/./urandom` by default. This respectively helps to speed up the Node Manager and WebLogic Server startup on systems with low entropy. +* You can use `JAVA_OPTIONS` and `WLSDEPLOY_PROPERTIES` to disable Fast Application Notifications (FAN); see the [Disable Fast Application Notifications FAQ]({{}}) for details. -This example snippet illustrates how to add the above environment variables using the `env` attribute under the `serverPod` configuration in your domain resource YAML file. -``` +This example snippet illustrates how to add some of the above environment variables using the `env` attribute under the `serverPod` configuration in your Domain YAML file. +```yaml # Copyright (c) 2017, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # -apiVersion: "weblogic.oracle/v7" +apiVersion: "weblogic.oracle/v8" kind: Domain metadata: name: domain1 namespace: domains23 labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: domain1 spec: serverPod: @@ -407,16 +213,15 @@ spec: ### Pod generation -The operator creates a Pod for each running WebLogic Server instance. This Pod will have a container, named `weblogic-server`, based on the Docker image specified by the `image` field. Additional Pod or container content can be specified using the elements under `serverPod`. This includes Kubernetes sidecar and init containers, labels, annotations, volumes, volume mounts, scheduling constraints, including anti-affinity, [resource requirements](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/), or [security context](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/). +The operator creates a Pod for each running WebLogic Server instance. This Pod will have a container, named `weblogic-server`, based on the container image specified by the `image` field. Additional Pod or container content can be specified using the elements under `serverPod`. This includes Kubernetes sidecar and init containers, labels, annotations, volumes, volume mounts, scheduling constraints, including anti-affinity, [resource requirements](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/), or [security context](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/). Customer provided labels and annotations may not begin with "weblogic" and the operator will generate the following labels: * `weblogic.createdByOperator: "true"` * `weblogic.domainName: `, where `` is the name of the WebLogic domain -* `weblogic.domainUID: `, where `` is the domain UID from the domain resource +* `weblogic.domainUID: `, where `` is the domain UID from the Domain resource * `weblogic.serverName: `, where `` is the name of the WebLogic Server instance * `weblogic.clusterName: `, where `` is the name of the cluster of which this instance is a member, if any -* `weblogic.resourceVersion: `, where `` is the value of the `resourceVersion` field from the domain resource Prior to creating a Pod, the operator replaces variable references allowing the Pod content to be templates. The format of these variable references is `$(VARIABLE_NAME)` where `VARIABLE_NAME` is one of the variable names available in the container for the WebLogic Server instance. The default set of environment variables includes: @@ -427,19 +232,18 @@ Prior to creating a Pod, the operator replaces variable references allowing the * `CLUSTER_NAME`: The WebLogic cluster name, if this is a cluster member. * `LOG_HOME`: The WebLogic log location as a file system path within the container. -This example domain YAML file specifies that Pods for WebLogic Server instances in the `cluster-1` cluster will have a per-Managed Server volume and volume mount (similar to a Kubernetes `StatefulSet`), an `init` container to initialize some files in that volume, and anti-affinity scheduling so that the server instances are scheduled, as much as possible, on different Nodes: +This example domain YAML file specifies that Pods for WebLogic Server instances in the `cluster-1` cluster will have a per-Managed Server volume and volume mount (similar to a Kubernetes StatefulSet), an init container to initialize some files in that volume, and anti-affinity scheduling so that the server instances are scheduled, as much as possible, on different Nodes: -``` +```yaml # Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # -apiVersion: "weblogic.oracle/v7" +apiVersion: "weblogic.oracle/v8" kind: Domain metadata: name: domain1 namespace: domains23 labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: domain1 spec: domainHome: /u01/oracle/user_projects/domains/domain1 diff --git a/docs-source/content/userguide/managing-domains/ingress/_index.md b/docs-source/content/userguide/managing-domains/ingress/_index.md index 6b6d57a9b29..44be92ed7e3 100644 --- a/docs-source/content/userguide/managing-domains/ingress/_index.md +++ b/docs-source/content/userguide/managing-domains/ingress/_index.md @@ -70,7 +70,7 @@ Information about how to install and configure these to load balance WebLogic cl - [Voyager guide](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/kubernetes/samples/charts/voyager/README.md) {{% notice note %}} - Traefik is recommended for development and test environments only. For production environments, we recommend Apache or Voyager ingress controllers, or the load balancer provided by your cloud provider. + For production environments, we recommend Traefik (2.2.1 or later), Apache or Voyager ingress controllers, or the load balancer provided by your cloud provider. {{% /notice %}} Samples are also provided for these two ingress controllers, showing how to manage multiple WebLogic clusters as the backends, using different routing rules, host-routing and path-routing; and TLS termination: diff --git a/docs-source/content/userguide/managing-domains/model-in-image/debugging.md b/docs-source/content/userguide/managing-domains/model-in-image/debugging.md index 71130939ed1..9d1257d1614 100644 --- a/docs-source/content/userguide/managing-domains/model-in-image/debugging.md +++ b/docs-source/content/userguide/managing-domains/model-in-image/debugging.md @@ -6,29 +6,29 @@ pre = " " description = "Debugging a deployed Model in Image domain." +++ -{{% notice info %}} -This feature is supported only in 3.0.0-rc1. -{{% /notice %}} - -Here are some suggestions for debugging problems with Model in Image after your domain resource is deployed. +Here are some suggestions for debugging problems with Model in Image after your Domain YAML file is deployed. #### Contents - - [Check the domain resource status](#check-the-domain-resource-status) + - [Check the Domain status](#check-the-domain-status) - [Check the introspector job](#check-the-introspector-job) - [Check the WebLogic Server pods](#check-the-weblogic-server-pods) - - [Check an operator log](#check-an-operator-log) - + - [Check the operator log](#check-the-operator-log) + - [Check the FAQ](#check-the-faq) -#### Check the domain resource status +#### Check the Domain status -To check the domain resource status: `kubectl -n MY_NAMESPACE describe domain MY_DOMAINUID`. +To check the Domain status: `kubectl -n MY_NAMESPACE describe domain MY_DOMAINUID`. #### Check the introspector job If your introspector job failed, then examine the `kubectl describe` of the job and its pod, and also examine its log, if one exists. +{{% notice tip %}} +To prevent the introspector job from retrying while you are debugging a failure, set the operator's Helm `domainPresenceFailureRetryMaxCount` parameter to `0`. For more information, see [Manage operators -> Use the operator -> Use Helm]({{}}). +{{% /notice %}} + For example, assuming your domain UID is `sample-domain1` and your domain namespace is `sample-domain1-ns`: ``` @@ -68,13 +68,17 @@ For example, assuming your domain UID is `sample-domain1` and your domain namesp 1. WLSDPLY-05007: Model file /u01/wdt/models/model1.yaml,/weblogic-operator/wdt-config-map/..2020_03_19_15_43_05.993607882/datasource.yaml contains an unrecognized section: TYPOresources. The recognized sections are domainInfo, topology, resources, appDeployments, kubernetes ``` +{{% notice tip %}} +If a model file error references a model file in your `spec.configuration.model.configMap`, then you can correct the error by redeploying the ConfigMap with a corrected model file and then initiating a domain restart or roll. Similarly, if a model file error references a model file in your model image, then you can correct the error by deploying a corrected image, modifying your Domain YAML file to reference the new image, and then initiating a domain restart or roll. +{{% /notice %}} + #### Check the WebLogic Server pods -If your introspector job succeeded, then there will be no introspector job or pod, the operator will create a `MY_DOMAIN_UID-weblogic-domain-introspect-cm` ConfigMap for your domain, and the operator will then run the domain's WebLogic pods. +If your introspector job succeeded, then there will be no introspector job or pod, the operator will create a `MY_DOMAIN_UID-weblogic-domain-introspect-cm` ConfigMap for your domain, and the operator will then run the domain's WebLogic Server pods. -If `kubectl -n MY_NAMESPACE get pods` reveals that your WebLogic pods have errors, then use `kubectl -n MY_NAMESPACE describe pod POD_NAME` and `kubectl -n MY_NAMESPACE logs POD_NAME` to debug. +If `kubectl -n MY_NAMESPACE get pods` reveals that your WebLogic Server pods have errors, then use `kubectl -n MY_NAMESPACE describe pod POD_NAME` and `kubectl -n MY_NAMESPACE logs POD_NAME` to debug. -#### Check an operator log +#### Check the operator log Look for `SEVERE` and `ERROR` level messages in your operator logs. For example: @@ -99,3 +103,9 @@ Look for `SEVERE` and `ERROR` level messages in your operator logs. For example: | egrep -e "level...(SEVERE|WARNING)" \ | grep "domainUID...sample-domain1" ``` + +#### Check the FAQ + +Common issues that have corresponding FAQ entries include: +- When a Domain YAML file is deployed and no introspector or WebLogic Server pods start, plus the operator log contains no mention of the domain, then check to make sure that the Domain's namespace has been set up to be monitored by an operator. See the [Managing domain namespaces FAQ]({{}}). +- If a `describe` of an introspector job or WebLogic Server pod reveals image access errors, see the [Cannot pull image FAQ]({{}}). diff --git a/docs-source/content/userguide/managing-domains/model-in-image/model-files.md b/docs-source/content/userguide/managing-domains/model-in-image/model-files.md index d4c1becc6bd..4098431d375 100644 --- a/docs-source/content/userguide/managing-domains/model-in-image/model-files.md +++ b/docs-source/content/userguide/managing-domains/model-in-image/model-files.md @@ -6,10 +6,6 @@ pre = " " description = "Model file requirements, macros, and loading order." +++ -{{% notice info %}} -This feature is supported only in 3.0.0-rc1. -{{% /notice %}} - #### Contents - [Introduction](#introduction) @@ -66,23 +62,28 @@ For a description of model file macro references to secrets and environment vari #### Important notes about Model in Image model files - - You can use model macros to reference arbitrary secrets from model files. This is recommended for handling mutable values such as database user names, passwords, and URLs. See [Using secrets in model files](#using-secrets-in-model-files). + - Using model file macros + + - You can use model macros to reference arbitrary secrets from model files. This is recommended for handling mutable values such as database user names, passwords, and URLs. See [Using secrets in model files](#using-secrets-in-model-files). - - All password fields in a model should use a secret macro. Passwords should not be directly included in property or model files because the files may appear in logs or debugging. + - All password fields in a model should use a secret macro. Passwords should not be directly included in property or model files because the files may appear in logs or debugging. - - Model files encrypted with the WDT [Encrypt Model Tool](https://github.com/oracle/weblogic-deploy-tooling/blob/master/site/encrypt.md) are not supported. Use secrets instead. + - Model files encrypted with the WDT [Encrypt Model Tool](https://github.com/oracle/weblogic-deploy-tooling/blob/master/site/encrypt.md) are not supported. Use secrets instead. - - You can use model macros to reference arbitrary environment variables from model files. This is useful for handling plain text mutable values that you can define using an `env` stanza in your domain resource, and is also useful for accessing the built in `DOMAIN_UID` environment variable. See [Using environment variables in model files](#using-environment-variables-in-model-files). + - You can use model macros to reference arbitrary environment variables from model files. This is useful for handling plain text mutable values that you can define using an `env` stanza in your Domain YAML file, and is also useful for accessing the built in `DOMAIN_UID` environment variable. See [Using environment variables in model files](#using-environment-variables-in-model-files). - - For most models, it's useful to minimize or eliminate the usage of model variable files (also known as property files) and use secrets or environment variables instead. + - For most models, it's useful to minimize or eliminate the usage of model variable files (also known as property files) and use secrets or environment variables instead. -- A model __must__ contain a `domainInfo` stanza that references your WebLogic administrative credentials. You can use the `@@SECRET` macro with the reserved secret name `__weblogic-credentials__` to reference your domain resource's WebLogic credentials secret for this purpose. For example: +- A model __must__ contain a `domainInfo` stanza that references your WebLogic administrative credentials. You can use the `@@SECRET` macro with the reserved secret name `__weblogic-credentials__` to reference your Domain YAML file's WebLogic credentials secret for this purpose. For example: ``` domainInfo: AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' ``` + +- A JRF domain type model __must__ contain a `domainInfo.RCUDbInfo` stanza; see [Requirements for JRF domain types]({{< relref "/userguide/managing-domains/model-in-image/usage/_index.md#requirements-for-jrf-domain-types" >}}). + - You can control the order that WDT uses to load your model files, see [Model file naming and loading order](#model-file-naming-and-loading-order). #### Model file naming and loading order @@ -93,7 +94,8 @@ During domain home creation, model, and property files are first loaded from the The loading order within each of these locations is first determined using the convention `filename.##.yaml` and `filename.##.properties`, where `##` are digits that specify the desired order when sorted numerically. Additional details: - * Embedding a `.##.` in a filename is optional and can appear anywhere in the file name before the `properties` or `yaml` extension. + * Embedding a `.##.` in a file name is optional. + * When present, it must be placed just before the `properties` or `yaml` extension in order for it to take precedence over alphabetical precedence. * The precedence of file names that include more than one `.##.` is undefined. * The number can be any integer greater than or equal to zero. * File names that don't include `.##.` sort _before_ other files as if they implicitly have the lowest possible `.##.` @@ -137,9 +139,9 @@ You can use WDT model `@@SECRET` macros to reference the WebLogic administrator For example, you can reference the WebLogic credential user name using `@@SECRET:__weblogic-credentials__:username@@`, and you can reference a custom secret `mysecret` with key `mykey` using `@@SECRET:mysecret:mykey@@`. -Any secrets that are referenced by an `@@SECRET` macro must be deployed to the same namespace as your domain resource, and must be referenced in your domain resource using the `weblogicCredentialsSecret` and `configuration.secrets` fields. +Any secrets that are referenced by an `@@SECRET` macro must be deployed to the same namespace as your Domain, and must be referenced in your Domain YAML file using the `weblogicCredentialsSecret` and `configuration.secrets` fields. -Here's a sample snippet from a domain resource that sets a `webLogicCredentialsSecret` and two custom secrets `my-custom-secret1` and `my-custom-secret2`. +Here's a sample snippet from a Domain YAML file that sets a `webLogicCredentialsSecret` and two custom secrets `my-custom-secret1` and `my-custom-secret2`. ``` ... @@ -153,7 +155,7 @@ Here's a sample snippet from a domain resource that sets a `webLogicCredentialsS ##### Using environment variables in model files -You can reference operator environment variables in model files. This includes any that you define yourself in your domain resource, or the built-in `DOMAIN_UID` environment variable. +You can reference operator environment variables in model files. This includes any that you define yourself in your Domain YAML file, or the built-in `DOMAIN_UID` environment variable. For example, the `@@ENV:DOMAIN_UID@@` macro resolves to the current domain's domain UID. diff --git a/docs-source/content/userguide/managing-domains/model-in-image/overview.md b/docs-source/content/userguide/managing-domains/model-in-image/overview.md index 1d466c34327..6b2c995e3f0 100644 --- a/docs-source/content/userguide/managing-domains/model-in-image/overview.md +++ b/docs-source/content/userguide/managing-domains/model-in-image/overview.md @@ -6,15 +6,12 @@ pre = " " description = "Introduction to Model in Image, description of its runtime behavior, and references." +++ -{{% notice info %}} -This feature is supported only in 3.0.0-rc1. -{{% /notice %}} - #### Content - [Introduction](#introduction) - - [Runtime behavior overview](#runtime-behavior-overview) - - [Runtime updates overview](#runtime-updates-overview) + - [WebLogic Deploy Tool models](#weblogic-deploy-tool-models) + - [Runtime behavior](#runtime-behavior) + - [Runtime updates](#runtime-updates) - [Continuous integration and delivery (CI/CD)](#continuous-integration-and-delivery-cicd) - [References](#references) @@ -22,7 +19,7 @@ This feature is supported only in 3.0.0-rc1. Model in Image is an alternative to the operator's Domain in Image and Domain in PV domain types. See [Choose a domain home source type]({{< relref "/userguide/managing-domains/choosing-a-model/_index.md" >}}) for a comparison of operator domain types. -Unlike Domain in PV and Domain in Image, Model in Image eliminates the need to pre-create your WebLogic domain home prior to deploying your domain resource. +Unlike Domain in PV and Domain in Image, Model in Image eliminates the need to pre-create your WebLogic domain home prior to deploying your Domain YAML file. It enables: @@ -34,49 +31,39 @@ It enables: This feature is supported for standard WLS domains, Restricted JRF domains, and JRF domains. -WDT models are a convenient and simple alternative to WebLogic WLST configuration scripts and templates. They compactly define a WebLogic domain using YAML files and support including application archives in a ZIP file. The WDT model format is described in the open source, [WebLogic Deploy Tool](https://github.com/oracle/weblogic-deploy-tooling) GitHub project. +For JRF domains, Model in Image provides additional support for initializing the infrastructure database for a domain when a domain is started for the first time, supplying an database password, and obtaining an database wallet for re-use in subsequent restarts of the same domain. See [Requirements for JRF domain types]({{< relref "/userguide/managing-domains/model-in-image/usage/_index.md#requirements-for-jrf-domain-types" >}}). -For JRF domains, Model in Image provides additional support for initializing the infrastructure database for a domain, when a domain is started for the first time, supplying an database password, and obtaining an database wallet for re-use in subsequent restarts of the same domain. See [Prerequisites for JRF domain types]({{< relref "/userguide/managing-domains/model-in-image/usage/_index.md#prerequisites-for-jrf-domain-types" >}}). +#### WebLogic Deploy Tool models +WDT models are a convenient and simple alternative to WebLogic Scripting Tool (WLST) configuration scripts and templates. They compactly define a WebLogic domain using YAML files and support including application archives in a ZIP file. For a discussion of the model format and its integration with Model in Image, see [WebLogic Server image]({{< relref "/userguide/managing-domains/model-in-image/usage/_index.md#weblogic-server-image" >}}) and [Model files]({{< relref "/userguide/managing-domains/model-in-image/model-files.md" >}}). The WDT model format is fully described in the open source, [WebLogic Deploy Tool](https://github.com/oracle/weblogic-deploy-tooling) GitHub project. -#### Runtime behavior overview +#### Runtime behavior -When you deploy a Model in Image domain resource: +When you deploy a Model in Image Domain YAML file: - The operator will run a Kubernetes Job called the 'introspector job' that: - Merges your WDT artifacts. - Runs WDT tooling to generate a domain home. - Packages the domain home and passes it to the operator. + - After the introspector job completes: - The operator creates a ConfigMap named `DOMAIN_UID-weblogic-domain-introspect-cm` and puts the packaged domain home in it. - The operator subsequently boots your domain's WebLogic Server pods. - The pods will obtain their domain home from the ConfigMap. -#### Runtime updates overview +#### Runtime updates -Model updates can be applied at runtime by changing the image, secrets, or WDT model ConfigMap after initial deployment. If the image name changes, or the domain resource `restartVersion` changes, then this will cause the introspector job to rerun and generate a new domain home, and subsequently the changed domain home will be propagated to the domain's WebLogic pods using a rolling upgrade (each pod restarting one at a time). See [Runtime updates]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates.md" >}}). +Model updates can be applied at runtime by changing the image, secrets, or WDT model ConfigMap after initial deployment. If the image name changes, or the Domain `restartVersion` changes, then this will cause the introspector job to rerun and generate a new domain home, and subsequently the changed domain home will be propagated to the domain's WebLogic Server pods using a rolling upgrade (each pod restarting one at a time). See [Runtime updates]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates.md" >}}). #### Continuous integration and delivery (CI/CD) To understand how Model in Image works with CI/CD, see [CI/CD considerations]({{< relref "/userguide/cicd/_index.md" >}}). -#### Always use external state - -Regardless of the domain home source type, we recommend that you always keep -state outside the Docker image. This includes JDBC stores for leasing tables, JMS and transaction stores, -EJB timers, JMS queues, and so on. This ensures that data will not be lost when -a container is destroyed. - -We recommend that state be kept in a database to take advantage of built-in -database server high availability features, and the fact that disaster recovery of sites across all -but the shortest distances, almost always requires using a single database -server to consolidate and replicate data (DataGuard). - #### References - [Model in Image sample]({{< relref "/samples/simple/domains/model-in-image/_index.md" >}}) - [WebLogic Deploy Tool (WDT)](https://github.com/oracle/weblogic-deploy-tooling) - [WebLogic Image Tool (WIT)](https://github.com/oracle/weblogic-image-tool) - - Domain resource [schema](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md), [documentation]({{< relref "/userguide/managing-domains/domain-resource.md" >}}) + - Domain [schema](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md), [documentation]({{< relref "/userguide/managing-domains/domain-resource.md" >}}) - HTTP load balancers: Ingress [documentation]({{< relref "/userguide/managing-domains/ingress/_index.md" >}}), [sample]({{< relref "/samples/simple/ingress/_index.md" >}}) - [CI/CD considerations]({{< relref "/userguide/cicd/_index.md" >}}) diff --git a/docs-source/content/userguide/managing-domains/model-in-image/runtime-updates.md b/docs-source/content/userguide/managing-domains/model-in-image/runtime-updates.md index 7a625e9c8a4..dad3a1deb3b 100644 --- a/docs-source/content/userguide/managing-domains/model-in-image/runtime-updates.md +++ b/docs-source/content/userguide/managing-domains/model-in-image/runtime-updates.md @@ -6,31 +6,27 @@ pre = " " description = "Updating a running Model in Image domain's images and model files." +++ -{{% notice info %}} -This feature is supported only in 3.0.0-rc1. -{{% /notice %}} - #### Contents - [Overview](#overview) - [Important notes](#important-notes) - [Frequently asked questions](#frequently-asked-questions) - [Supported and unsupported updates](#supported-and-unsupported-updates) - - [Changing a domain resource `restartVersion`](#changing-a-domain-resource-restartversion) - - [Using the WDT Discover Domain Tool](#using-the-wdt-discover-domain-tool) + - [Changing a Domain `restartVersion`](#changing-a-domain-restartversion) + - [Using the WDT Discover and Compare Model Tools](#using-the-wdt-discover-domain-and-compare-model-tools) - [Example of adding a data source](#example-of-adding-a-data-source) #### Overview -If you want to make a configuration change to a running Model in Image domain, and you want the change to survive WebLogic pod restarts, then you can modify your existing model using one of the following approaches: +If you want to make a configuration change to a running Model in Image domain, and you want the change to survive WebLogic Server pod restarts, then you can modify your existing model using one of the following approaches: - Changing secrets or environment variables that are referenced by macros in your model files. - - Specifying a new or updated WDT ConfigMap that contains model files and use your domain resource `configuration.model.configMap` field to reference the map. + - Specifying a new or updated WDT ConfigMap that contains model files and use your Domain YAML file `configuration.model.configMap` field to reference the map. - Supplying a new image with new or changed model files. -After the changes are in place, you can tell the operator to apply the changes and propagate them to a running domain by altering the domain resource's `image` or `restartVersion` attribute. +After the changes are in place, you can tell the operator to apply the changes and propagate them to a running domain by altering the Domain YAML file's `image` or `restartVersion` attribute. #### Important notes @@ -38,9 +34,9 @@ After the changes are in place, you can tell the operator to apply the changes a - If you specify multiple model files in your image or WDT ConfigMap, the order in which they're loaded and merged is determined as described in [Model file naming and loading order]({{< relref "/userguide/managing-domains/model-in-image/model-files/_index.md#model-file-naming-and-loading-order" >}}). - - You can use the WDT Discover Domain Tool to help generate your model file updates. See [Using the WDT Discover Domain Tool](#using-the-wdt-discover-domain-tool). + - You can use the WDT Discover Domain and Compare Domain Tools to help generate your model file updates. See [Using the WDT Discover Domain and Compare Model Tools](#using-the-wdt-discover-domain-and-compare-model-tools). - - For simple ways to change `restartVersion`, see [Changing a domain resource `restartVersion`](#changing-a-domain-resource-restartversion). + - For simple ways to change `restartVersion`, see [Changing a Domain `restartVersion`](#changing-a-domain-restartversion). - For a sample of adding a data source to a running domain, see [Example of adding a data source](#example-of-adding-a-data-source). @@ -56,11 +52,11 @@ Similar to Domain in Image, if you make a direct runtime WebLogic configuration _How do Model in Image updates work during runtime?_ -After you make a change to your domain resource `restartVersion` or `image` attribute, the operator will rerun the domain's introspector job. This job will reload all of your secrets and environment variables, merge all of your model files, and generate a new domain home. If the job succeeds, then the operator will make the updated domain home available to pods using a ConfigMap named `DOMAIN_UID-weblogic-domain-introspect-cm`. Finally, the operator will subsequently roll (restart) each running WebLogic Server pod in the domain so that it can load the new configuration. A domain roll begins by restarting the domain's Administration Server and then proceeds to restart each Managed Server in the domain. +After you make a change to your Domain `restartVersion` or `image` attribute, the operator will rerun the domain's introspector job. This job will reload all of your secrets and environment variables, merge all of your model files, and generate a new domain home. If the job succeeds, then the operator will make the updated domain home available to pods using a ConfigMap named `DOMAIN_UID-weblogic-domain-introspect-cm`. Finally, the operator will subsequently roll (restart) each running WebLogic Server pod in the domain so that it can load the new configuration. A domain roll begins by restarting the domain's Administration Server and then proceeds to restart each Managed Server in the domain. _Can we use custom configuration overrides to do the updates instead?_ -No. Custom configuration overrides, which are WebLogic configuration overrides specified using a domain resource `configuration.overridesConfigMap`, as described in [Configuration overrides]({{< relref "/userguide/managing-domains/configoverrides/_index.md" >}}), aren't supported in combination with Model in Image. Model in Image will generate an error if custom overrides are specified. This should not be a concern because model file, secret, or model image updates are simpler and more flexible than custom configuration override updates. Unlike configuration overrides, the syntax for a model file update exactly matches the syntax for specifying your model file in the first place. +No. Custom configuration overrides, which are WebLogic configuration overrides specified using a Domain YAML file `configuration.overridesConfigMap`, as described in [Configuration overrides]({{< relref "/userguide/managing-domains/configoverrides/_index.md" >}}), aren't supported in combination with Model in Image. Model in Image will generate an error if custom overrides are specified. This should not be a concern because model file, secret, or model image updates are simpler and more flexible than custom configuration override updates. Unlike configuration overrides, the syntax for a model file update exactly matches the syntax for specifying your model file in the first place. #### Supported and unsupported updates @@ -71,7 +67,7 @@ No. Custom configuration overrides, which are WebLogic configuration overrides s - You can change or add environment variables that your model macros reference (macros that use the `@@ENV:myenvvar@@` syntax). - - You can remove a named MBean or resource by specifying a model file with an exclamation point (`!`) just before the bean or resource name. For example, if you have a data source named `mynewdatasource` defined in your model, it can be removed by specifying a small model file that loads after the model file that defines the data source, where the small model file looks like this: + - You can remove a named MBean, application deployment, or resource by specifying a model file with an exclamation point (`!`) just before its name. For example, if you have a data source named `mynewdatasource` defined in your model, it can be removed by specifying a small model file that loads after the model file that defines the data source, where the small model file looks like this: ``` resources: @@ -101,18 +97,16 @@ No. Custom configuration overrides, which are WebLogic configuration overrides s - You cannot change the domain name at runtime. - The following types of runtime update configuration are _not_ supported in this release of Model in Image. If you need to make these kinds of updates, shut down your domain entirely before making the change: - * Domain topology (cluster members) - * Network channel listen address, port, and enabled configuration + * Domain topology of an existing WebLogic cluster (cluster members) + * Network channel listen address, port, and enabled configuration of an existing cluster or server * Server and domain log locations * Node Manager related configuration * Changing any existing MBean name Specifically, do not apply runtime updates for: - * Adding or removing: - * Servers - * Clusters - * Network Access Points (custom channels) + * Adding WebLogic Servers to a cluster, or removing them + * Adding or removing Network Access Points (custom channels) for existing servers * Changing any of the following: * Dynamic cluster size * Default, SSL, and Admin channel `Enabled`, listen address, and port @@ -126,9 +120,9 @@ No. Custom configuration overrides, which are WebLogic configuration overrides s Due to security considerations, we strongly recommend that T3 or any RMI protocol should not be exposed outside the cluster. {{% /notice %}} -#### Changing a domain resource `restartVersion` +#### Changing a Domain `restartVersion` -As was mentioned in the [overview](#overview), one way to tell the operator to apply your configuration changes to a running domain is by altering the domain resource `restartVersion`. Here are some common ways to do this: +As was mentioned in the [overview](#overview), one way to tell the operator to apply your configuration changes to a running domain is by altering the Domain `restartVersion`. Here are some common ways to do this: - You can alter `restartVersion` interactively using `kubectl edit -n MY_NAMESPACE domain MY_DOMAINUID`. @@ -153,9 +147,9 @@ As was mentioned in the [overview](#overview), one way to tell the operator to a fi ``` -#### Using the WDT Discover Domain Tool +#### Using the WDT Discover Domain and Compare Model Tools -The WebLogic Deploy Tooling [Discover Domain Tool](https://github.com/oracle/weblogic-deploy-tooling/blob/master/site/discover.md) generates model files from an existing domain home. You can use this tool to help determine the model file contents you would need to supply to update an existing model. +The WebLogic Deploy Tooling [Discover Domain Tool](https://github.com/oracle/weblogic-deploy-tooling/blob/master/site/discover.md) generates model files from an existing domain home, and its [Compare Model Tool](https://github.com/oracle/weblogic-deploy-tooling/blob/master/site/compare.md) compares two domain models and generates the YAML file for updating the first domain to the second domain. You can use these tools in combination to help determine the model file contents you would need to supply to update an existing model. For example, assuming you've installed WDT in `/u01/wdt/weblogic-deploy` and assuming your domain type is `WLS`: @@ -173,7 +167,7 @@ For example, assuming you've installed WDT in `/u01/wdt/weblogic-deploy` and ass # (2) Now make some WebLogic config changes using the console or WLST. - # (3) Run discover for your existing domain home. + # (3) Run discover for your changed domain home. $ /u01/wdt/weblogic-deploy/bin/discoverDomain.sh \ -oracle_home $ORACLE_HOME \ @@ -183,12 +177,27 @@ For example, assuming you've installed WDT in `/u01/wdt/weblogic-deploy` and ass -model_file new.yaml \ -variable_file new.properties - # (4) Compare your old and new yaml to see what changed. + # (4) Compare your old and new yaml using diff $ diff new.yaml old.yaml + + # (5) Compare your old and new yaml using compareDomain to generate + # the YAML update file you can use for transforming the old to new. + + # /u01/wdt/weblogic-deploy/bin/compareModel.sh \ + -oracle_home $ORACLE_HOME \ + -output_dir /tmp \ + -variable_file old.properties \ + old.yaml \ + new.yaml + + # (6) The compareDomain will generate these files: + # /tmp/diffed_model.json + # /tmp/diffed_model.yaml, and + # /tmp/compare_model_stdout ``` -> **Note**: If your domain type isn't `WLS`, remember to change the domain type to `JRF` or `RestrictedJRF` in the above commands. +> **Note**: If your domain type isn't `WLS`, remember to change the domain type to `JRF` or `RestrictedJRF` in the above `discoverDomain.sh` commands. #### Example of adding a data source diff --git a/docs-source/content/userguide/managing-domains/model-in-image/usage.md b/docs-source/content/userguide/managing-domains/model-in-image/usage.md index d3e1e5a4ae0..2d6013623d4 100644 --- a/docs-source/content/userguide/managing-domains/model-in-image/usage.md +++ b/docs-source/content/userguide/managing-domains/model-in-image/usage.md @@ -3,34 +3,34 @@ title = "Usage" date = 2020-03-11T16:45:16-05:00 weight = 20 pre = " " -description = "Steps for creating and deploying Model in Image images and their associated domain resources." +description = "Steps for creating and deploying Model in Image images and their associated Domain YAML files." +++ -{{% notice info %}} -This feature is supported only in 3.0.0-rc1. -{{% /notice %}} - This document describes what's needed to create and deploy a typical Model in Image domain. -#### Contents +### Contents - [WebLogic Server Kubernetes Operator](#weblogic-server-kubernetes-operator) - [WebLogic Server image](#weblogic-server-image) - [Optional WDT model ConfigMap](#optional-wdt-model-configmap) - [Required runtime encryption secret](#required-runtime-encryption-secret) - [Secrets for model macros](#secrets-for-model-macros) - - [Domain resource attributes](#domain-resource-attributes) - - [Prerequisites for JRF domain types](#prerequisites-for-jrf-domain-types) + - [Domain fields](#domain-fields) + - [Always use external state](#always-use-external-state) + - [Requirements for JRF domain types](#requirements-for-jrf-domain-types) -#### WebLogic Server Kubernetes Operator +### WebLogic Server Kubernetes Operator Deploy the operator and ensure that it is monitoring the desired namespace for your Model in Image domain. See [Manage operators]({{< relref "/userguide/managing-operators/_index.md" >}}) and [Quick Start]({{< relref "/quickstart/_index.md" >}}). -#### WebLogic Server image +### WebLogic Server image Model in Image requires creating a Docker image that has WebLogic Server and WDT installed, plus optionally, your model and application files. -You can start with a WebLogic Server 12.2.1.3 or later pre-built base image obtained from [Docker Hub](https://github.com/oracle/docker-images/tree/master/OracleWebLogic) or similar, manually build your own base image as per [Preparing a Base Image]({{< relref "/userguide/managing-domains/domain-in-image/base-images/_index.md" >}}), or build a base image using the [WebLogic Image Tool](https://github.com/oracle/weblogic-image-tool). Note that any 12.2.1.3 image must also include patch 29135930 (the pre-built images already contain this patch). For an example of the first approach for both WLS and JRF domains, see the [Model in Image]({{< relref "/samples/simple/domains/model-in-image/_index.md" >}}) sample. +First, obtain a base image: + +- You can start with a WebLogic Server 12.2.1.3 or later Oracle Container Registry pre-built base image such as `container-registry.oracle.com/middleware/weblogic:12.2.1.3` for WLS domains or `container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.3` for JRF domains. For an example of this approach for both WLS and JRF domains, see the [Model in Image]({{< relref "/samples/simple/domains/model-in-image/_index.md" >}}) sample. For detailed instructions on how to log in to the Oracle Container Registry and accept the license agreement for an image (required to allow pulling an Oracle Container Registry image), see this [document]({{< relref "/userguide/managing-domains/domain-in-image/base-images/_index.md#obtaining-standard-images-from-the-oracle-container-registry" >}}). +- Or you can manually build your own base image as per [Preparing a Base Image]({{< relref "/userguide/managing-domains/domain-in-image/base-images/_index.md#creating-a-custom-image-with-patches-applied" >}}). This is useful if you want your base images to include additional patches. Note that any 12.2.1.3 image must also include patch 29135930 (the pre-built images already contain this patch). After you have a base image, Model in Image requires layering the following directory structure for its (optional) WDT model artifacts and (required) WDT binaries: @@ -41,19 +41,19 @@ After you have a base image, Model in Image requires layering the following dire | `/u01/wdt/models` | Application archives | `.zip` | | `/u01/wdt/weblogic-deploy`| Unzipped WebLogic deploy install | | -> **Note**: Model YAML and variable files are optional in a Model in Image image `/u01/wdt/models` directory because Model in Image also supports [supplying them dynamically]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates.md" >}}) using a ConfigMap referenced by the domain resource `spec.model.configMap` field. Application archives, if any, must be supplied in the Model in Image image. Application archives are not supported in a `spec.model.configMap`. +> **Note**: Model YAML and variable files are optional in a Model in Image image `/u01/wdt/models` directory because Model in Image also supports [supplying them dynamically]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates.md" >}}) using a ConfigMap referenced by the Domain YAML file `spec.model.configMap` field. Application archives, if any, must be supplied in the Model in Image image. Application archives are not supported in a `spec.model.configMap`. There are two methods for layering Model in Image artifacts on top of a base image: - Manual Image Creation: Use Docker commands to layer the WDT artifacts from the above table on top of your base image into a new image. - - WebLogic Image Tool: Use the [WebLogic Image Tool](https://github.com/oracle/weblogic-image-tool). The WebLogic Image Tool (WIT) has built-in options for embedding WDT model files, WDT binaries, WebLogic Server binaries, and WebLogic Server patches in an image. The [Model in Image]({{< relref "/samples/simple/domains/model-in-image/_index.md" >}}) sample uses the WIT approach. For an example, see the sample's `build_image_model.sh` file in the operator source's `kubernetes/samples/scripts/create-weblogic-domain/model-in-image` directory. + - WebLogic Image Tool: Use the [WebLogic Image Tool](https://github.com/oracle/weblogic-image-tool). The WebLogic Image Tool (WIT) has built-in options for embedding WDT model files, WDT binaries, WebLogic Server binaries, and WebLogic Server patches in an image. The [Model in Image]({{< relref "/samples/simple/domains/model-in-image/_index.md" >}}) sample uses the WIT approach. For more information about model file syntax, see [Model files]({{< relref "/userguide/managing-domains/model-in-image/model-files.md" >}}). -#### Optional WDT model ConfigMap +### Optional WDT model ConfigMap -You can create a WDT model ConfigMap that defines additional model `.yaml` and `.properties` files beyond what you've already supplied in your image, and then reference this ConfigMap using your domain resource's `configuration.model.configMap` attribute. This is optional if the supplied image already fully defines your model. +You can create a WDT model ConfigMap that defines additional model `.yaml` and `.properties` files beyond what you've already supplied in your image, and then reference this ConfigMap using your Domain YAML file's `configuration.model.configMap` attribute. This is optional if the supplied image already fully defines your model. WDT model ConfigMap files will be merged with the WDT files defined in your image at runtime before your domain home is created. The ConfigMap files can add to, remove from, or alter the model configuration that you supplied within your image. @@ -71,7 +71,7 @@ For example, place additional `.yaml` and `.properties` files in a directory cal See [Model files]({{< relref "/userguide/managing-domains/model-in-image/model-files.md" >}}) for a discussion of model file syntax and loading order, and see [Runtime updates]({{< relref "/userguide/managing-domains/model-in-image/runtime-updates.md" >}}) for a discussion of using WDT model ConfigMaps to update the model configuration of a running domain. -#### Required runtime encryption secret +### Required runtime encryption secret Model in Image requires a runtime encryption secret with a secure `password` key. This secret is used by the operator to encrypt model and domain home artifacts before it adds them to a runtime ConfigMap or log. You can safely change the `password`, at any time after you've fully shut down a domain, but it must remain the same for the life of a running domain. The runtime encryption secret that you create can be named anything, but note that it is a best practice to name and label secrets with their domain UID to help ensure that cleanup scripts can find and delete them. @@ -88,7 +88,7 @@ Example: weblogic.domainUID=MY-DOMAINUID ``` -Corresponding domain resource snippet: +Corresponding Domain YAML file snippet: ``` configuration: @@ -96,18 +96,18 @@ Corresponding domain resource snippet: runtimeEncryptionSecret: MY-DOMAINUID-runtime-encrypt-secret ``` -#### Secrets for model macros +### Secrets for model macros Create additional secrets as needed by macros in your model files. For example, these can store database URLs and credentials that are accessed using `@@SECRET` macros in your model that reference the secrets. For a discussion of model macros, see [Model files]({{< relref "/userguide/managing-domains/model-in-image/model-files.md" >}}). -#### Domain resource attributes +### Domain fields -The following domain resource attributes are specific to Model in Image domains. +The following Domain fields are specific to Model in Image domains. | Domain Resource Attribute | Notes | | ------------------------- | ------------------ | | `domainHomeSourceType` | Required. Set to `FromModel`. | -| `domainHome` | Must reference an empty or non-existent directory within your image. Do not include the mount path of any persistent volume. Note that Model in Image recreates the domain home for a WebLogic pod every time the pod restarts.| +| `domainHome` | Must reference an empty or non-existent directory within your image. Do not include the mount path of any persistent volume. Note that Model in Image recreates the domain home for a WebLogic Server pod every time the pod restarts.| | `configuration.model.configMap` | Optional. Set if you have stored additional models in a ConfigMap as per [Optional WDT model ConfigMap](#optional-wdt-model-configmap). | | `configuration.secrets` | Optional. Set this array if your image or ConfigMap models contain macros that reference custom Kubernetes Secrets. For example, if your macros depend on secrets `my-secret` and `my-other-secret`, then set to `[my-secret, my-other-secret]`.| | `configuration.model.runtimeEncryptionSecret`| Required. All Model in Image domains must specify a runtime encryption secret. See [Required runtime encryption secret](#required-runtime-encryption-secret). | @@ -115,13 +115,25 @@ The following domain resource attributes are specific to Model in Image domains. **Notes**: - - There are additional attributes that are common to all domain home source types, such as the `image` field. See the Domain Resource [schema](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md) and [documentation]({{< relref "/userguide/managing-domains/domain-resource.md" >}}) for a full list of domain resource fields. + - There are additional attributes that are common to all domain home source types, such as the `image` field. See the Domain Resource [schema](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md) and [documentation]({{< relref "/userguide/managing-domains/domain-resource.md" >}}) for a full list of Domain fields. + + - There are also additional fields that are specific to JRF domain types. For more information, see [Requirements for JRF domain types](#requirements-for-jrf-domain-types). + + - Sample Domain YAML file: For an example of a fully specified sample Domain YAML file, see the the operator source's `kubernetes/samples/scripts/create-weblogic-domain/model-in-image/k8s-domain.yaml.template` file for the [Model in Image]({{< relref "/samples/simple/domains/model-in-image/_index.md" >}}) sample. Note that the `@@` entries in this template are not processed by the operator; they need to replaced with actual values before the resource can be applied. - - There are also additional fields that are specific to JRF domain types. For more information, see [Prerequisites for JRF domain types](#prerequisites-for-jrf-domain-types). +### Always use external state - - Sample domain resource: For an example of a fully specified sample domain resource, see the the operator source's `kubernetes/samples/scripts/create-weblogic-domain/model-in-image/k8s-domain.yaml.template` file for the [Model in Image]({{< relref "/samples/simple/domains/model-in-image/_index.md" >}}) sample. Note that the `@@` entries in this template are not processed by the operator; they need to replaced with actual values before the resource can be applied. +Regardless of the domain home source type, we recommend that you always keep state outside the Docker image. This includes cluster database leasing tables, JMS and transaction stores, EJB timers, and so on. This ensures that data will not be lost when a container is destroyed. -#### Prerequisites for JRF domain types +We recommend that state be kept in a database to take advantage of built-in database server high availability features, and the fact that disaster recovery of sites across all but the shortest distances, almost always requires using a single database server to consolidate and replicate data (DataGuard). + +For more information see: +- [Tuning JDBC Stores](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/perfm/storetune.html#GUID-F868624F-2898-4330-AF96-FC0EAB3CFE0A) in _Tuning Performance of Oracle WebLogic Server_. +- [Using a JDBC Store](https://www.oracle.com/pls/topic/lookup?ctx=en/middleware/fusion-middleware/weblogic-server/12.2.1.4/perfm&id=STORE-GUID-328FD4C1-91C4-4901-B1C4-97B9D93B2ECE) in _Administering the WebLogic Persistent Store_. +- [High Availability Best Practices](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/jmsad/best_practice.html#GUID-FB97F9A2-E6FA-4C51-B74E-A2A5DDB43B8C) in _Administering JMS Resources for Oracle WebLogic Server_. +- [Leasing](https://docs.oracle.com/pls/topic/lookup?ctx=en/middleware/fusion-middleware/weblogic-server/12.2.1.4/jmsad&id=CLUST-GUID-8F7348E2-7C45-4A6B-A72C-D1FB51A8E83F) in _Administering Clusters for Oracle WebLogic Server_. + +### Requirements for JRF domain types {{% notice info %}} This section applies only for a `JRF` domain type. Skip it if your domain type is `WLS` or `RestrictedJRF`. {{% /notice %}} @@ -130,7 +142,9 @@ A JRF domain requires an infrastructure database, initializing this database usi Furthermore, if you want to safely ensure that a restarted JRF domain can access updates to the infrastructure database that the domain made at an earlier time, the original domain's wallet file must be safely saved as soon as practical, and the restarted domain must be supplied a wallet file that was obtained from a previous run of the domain. -Here are the required settings for Model in Image JRF domains: +#### JRF Domain YAML file and model YAML file settings + +Here are the required Domain YAML file and model YAML file settings for Model in Image JRF domains: - Set `configuration.model.domainType` to `JRF`. @@ -138,9 +152,9 @@ Here are the required settings for Model in Image JRF domains: - Set `configuration.opss.walletFileSecret` to reference a secret that contains your domain's OPSS wallet file in its `walletFile` key. This assumes you have an OPSS wallet file from a previous start of the same domain. It enables a restarted or migrated domain to access its database information. This is an optional field for JRF domains, but must always be set if you want a restarted or migrated domain to access its database information. -- Set the `configuration.introspectorJobActiveDeadlineSeconds` introspection job timeout to at least 300 seconds. This is in an optional field but is needed because domain home creation takes a considerable amount of time the first time a JRF domain is created (due to initializing the domain's database tables), and because Model in Image creates your domain home for you using the introspection job. +- Set the `configuration.introspectorJobActiveDeadlineSeconds` introspection job timeout to at least 600 seconds. This is in an optional field but is needed because domain home creation takes a considerable amount of time the first time a JRF domain is created (due to initializing the domain's database tables), and because Model in Image creates your domain home for you using the introspection job. -- Define an `RCUDbInfo` stanza in your model. Access to an database requires defining a `RCUDbInfo` stanza in your model's `domainInfo` stanza with the necessary information for accessing the domain's schema within the database. Usually this information should be supplied using a secret that you deploy and reference in your domain resource's `configuration.secrets` field. Here's an example `RCUDbInfo` stanza: +- Define an `RCUDbInfo` stanza in your model. Access to an database requires defining a `RCUDbInfo` stanza in your model's `domainInfo` stanza with the necessary information for accessing the domain's schema within the database. Usually this information should be supplied using a secret that you deploy and reference in your Domain YAML file's `configuration.secrets` field. Here's an example `RCUDbInfo` stanza: ``` domainInfo: @@ -151,9 +165,56 @@ Here are the required settings for Model in Image JRF domains: ``` -Important instructions when changing a database password: +#### Saving and restoring JRF wallets + +It is important to save a JRF domain's OPSS wallet password and wallet file so that you can restore them as needed. This ensures that a restart or migration of the domain can continue to access the domain's FMW infrastructure database. + +When you deploy a JRF domain for the first time, the domain will add itself to its RCU database tables, and also create a 'wallet' file in the domain's home directory that enables access to the domain's data in the RCU database. This wallet is encrypted using an OPSS key password that you supply to the domain using a Secret that is referenced by your Domain YAML file `configuration.opss.walletPasswordSecret` field. + +For a domain that has been started by Model in Image, the operator will copy the wallet file from the domain home of a new JRF domain and store it in the domain's introspector domain ConfigMap in file `ewallet.p12`. Here is how to export this wallet file from the introspector domain ConfigMap: + +- Option 1 + ``` + kubectl -n MY_DOMAIN_NAMESPACE \ + get configmap MY_DOMAIN_UID-weblogic-domain-introspect-cm \ + -o jsonpath='{.data.ewallet\.p12}' \ + > ewallet.p12 + ``` +- Option 2 + + Alternatively, you can use the `kubernetes/samples/scripts/create-weblogic-domain/model-in-image/opss_wallet_util.sh -s` command to export the wallet file (pass `-?` to this script's command-line arguments and defaults). + +{{% notice tip %}} +Always back up your wallet file to a safe location that can be retrieved later. In addition, save your OPSS key password. +{{% /notice %}} -- Shut down all domains that access the database schema. For example, set their `serverStartPolicy` to `NEVER`. +To reuse the wallet: + - Create a secret with a key named `walletPassword` that contains the same OPSS password that you specified in the original domain. For example, assuming the password is `welcome1`: + ``` + kubectl -n MY_DOMAIN_NAMESPACE \ + create secret generic MY_DOMAIN_UID-my-opss-wallet-password-secret \ + --from-literal=walletPassword=welcome1 + kubectl -n MY_DOMAIN_NAMESPACE \ + label secret MY_DOMAIN_UID-my-opss-wallet-password-secret \ + weblogic.domainUID=sample-domain1 + - Create a secret with a key named `walletFile` that contains the OPSS wallet file that you exported above. For example, assuming the file is `ewallet.p12`: + ``` + kubectl -n MY_DOMAIN_NAMESPACE \ + create secret generic MY_DOMAIN_UID-my-opss-wallet-file-secret \ + --from-file=walletFile=ewallet.p12 + kubectl -n sample-domain1-ns \ + label secret MY_DOMAIN_UID-my-opss-wallet-file-secret \ + weblogic.domainUID=sample-domain1 + ``` + Alternatively, you can use the `kubernetes/samples/scripts/create-weblogic-domain/model-in-image/opss_wallet_util.sh -r` command to deploy a local wallet file as a secret (pass `-?` to get this script's command-line arguments and defaults). + - Make sure that your Domain YAML file `configuration.opss.walletPasswordSecret` field names the OPSS password Secret, and make sure that your Domain YAML file `configuration.opss.walletFileSecret` field names the OPSS wallet file secret. + + +#### Instructions for changing a JRF domain's database password + +Follow these steps to ensure that a JRF domain can continue to access its RCU data after changing its database password. + +- Before changing the database password, shut down all domains that access the database schema. For example, set their `serverStartPolicy` to `NEVER`. - Update the password in the database. @@ -163,7 +224,7 @@ Important instructions when changing a database password: - Save your wallet files again, as changing your password generates a different wallet. -__References:__ +#### JRF references For an example of using JRF in combination with Model in Image, see the [Model in Image]({{< relref "/samples/simple/domains/model-in-image/_index.md" >}}) sample. diff --git a/docs-source/content/userguide/managing-domains/persistent-storage/_index.md b/docs-source/content/userguide/managing-domains/persistent-storage/_index.md index d9101573bf0..46efc456466 100644 --- a/docs-source/content/userguide/managing-domains/persistent-storage/_index.md +++ b/docs-source/content/userguide/managing-domains/persistent-storage/_index.md @@ -11,7 +11,7 @@ This document outlines how to set up a Kubernetes PersistentVolume and Persisten The following prerequisites must be fulfilled before proceeding with the creation of the volume: -* Create a Kubernetes Namespace for the PersistentVolumeClaim unless the intention is to use the default namespace. Note that a PersistentVolumeClaim has to be in the same namespace as the domain resource that uses it. +* Create a Kubernetes Namespace for the PersistentVolumeClaim unless the intention is to use the default namespace. Note that a PersistentVolumeClaim has to be in the same namespace as the Domain that uses it. * Make sure that all the servers in the WebLogic domain are able to reach the storage location. * Make sure that the host directory that will be used, already exists and has the appropriate file permissions set. diff --git a/docs-source/content/userguide/managing-fmw-domains/fmw-infra/_index.md b/docs-source/content/userguide/managing-fmw-domains/fmw-infra/_index.md index 7c4e5d2df12..39c8bad9a4f 100644 --- a/docs-source/content/userguide/managing-fmw-domains/fmw-infra/_index.md +++ b/docs-source/content/userguide/managing-fmw-domains/fmw-infra/_index.md @@ -17,6 +17,7 @@ the prerequisite for upper stack products like Oracle SOA Suite." * [Creating an FMW Infrastructure domain](#creating-an-fmw-infrastructure-domain) * [Patching the FMW Infrastructure image](#patching-the-fmw-infrastructure-image) * [Additional considerations for Coherence](#additional-considerations-for-coherence) +* [Additional considerations for Model in Image](#additional-considerations-for-model-in-image) Starting with the 2.2.0 release, the operator supports FMW Infrastructure domains, that is, @@ -32,8 +33,8 @@ listed here, FMW Infrastructure domains work in the same way as WebLogic Server The remainder of the documentation in this site applies equally to FMW Infrastructure domains and WebLogic Server domains. -FMW Infrastructure domains are supported using both Domain in PV -and Domain in Image [domain home source types]({{< relref "/userguide/managing-domains/choosing-a-model/_index.md" >}}). +FMW Infrastructure domains are supported using the Domain in PV, +Domain in Image, or Model in Image [domain home source types]({{< relref "/userguide/managing-domains/choosing-a-model/_index.md" >}}). If you plan to experiment with upper stack products (which are not officially supported by the operator yet), we strongly recommend using the domain on a persistent volume approach. @@ -166,7 +167,7 @@ Here is an example of a Kubernetes YAML file to define a deployment of the Oracl database: ```yaml -apiVersion: extensions/v1beta1 +apiVersion: apps/v1 kind: Deployment metadata: name: oracle-db @@ -442,3 +443,7 @@ that can not be applied dynamically. If you are running a domain which contains Coherence, please refer to [Coherence requirements]({{< relref "/faq/coherence-requirements.md" >}}) for more information. + +#### Additional considerations for Model in Image + +If you are using Model in Image, then see the [Model in Image sample]({{< relref "/samples/simple/domains/model-in-image/_index.md" >}}), which demonstrates a JRF model and its RCU schema setup, and see [Model in Image requirements for JRF domain types]({{< relref "/userguide/managing-domains/model-in-image/usage/_index.md#requirements-for-jrf-domain-types" >}}). diff --git a/docs-source/content/userguide/managing-operators/installation/_index.md b/docs-source/content/userguide/managing-operators/installation/_index.md index cf85cb88372..befc8668266 100644 --- a/docs-source/content/userguide/managing-operators/installation/_index.md +++ b/docs-source/content/userguide/managing-operators/installation/_index.md @@ -86,13 +86,37 @@ $ helm install weblogic-operator weblogic-operator/weblogic-operator #### Upgrade the operator +{{% notice note %}} +Because operator 3.0.0 introduces _non-backward compatible_ changes, you cannot use `helm upgrade` to upgrade +a 2.6.0 operator to a 3.x operator. Instead, you must delete the 2.6.0 operator and then install the +3.x operator. + +The deletion of the 2.6.0 operator will _not affect_ the Domain CustomResourceDefinition (CRD) and will _not stop_ any +WebLogic Server instances already running. + +When the 3.0.0 operator is installed, it will automatically roll any running WebLogic Server instances created by the 2.6.0 operator. +This rolling restart will preserve WebLogic cluster availability guarantees (for clustered members only) similarly to any other rolling restart. + +To delete the 2.6.0 operator: + +``` +$ helm delete weblogic-operator -n weblogic-operator-namespace +``` + +Then install the 3.0.0 operator using the [installation](#install-the-operator-helm-chart) instructions above. + +{{% /notice %}} + +The following instructions will be applicable to upgrade operators within the 3.x release family +as additional versions are released. + To upgrade the operator, use the `helm upgrade` command. When upgrading the operator, the `helm upgrade` command requires that you supply a new Helm chart and image. For example: ``` $ helm upgrade \ --reuse-values \ - --set image=oracle/weblogic-kubernetes-operator:2.6.0 \ + --set image=oracle/weblogic-kubernetes-operator:3.0.0 \ --namespace weblogic-operator-namespace \ --wait \ weblogic-operator \ @@ -104,7 +128,7 @@ $ helm upgrade \ The `helm delete` command is used to remove an operator release and its associated resources from the Kubernetes cluster. The release name used with the `helm delete` command is the same release name used with the `helm install` command (see [Install the Helm chart](#install-the-operator-helm-chart)). For example: ``` -$ helm uninstall weblogic-operator +$ helm delete weblogic-operator -n weblogic-operator-namespace ``` {{% notice note %}} diff --git a/docs-source/content/userguide/managing-operators/using-the-operator/using-helm.md b/docs-source/content/userguide/managing-operators/using-the-operator/using-helm.md index c0217aa16d5..f32737b1198 100644 --- a/docs-source/content/userguide/managing-operators/using-the-operator/using-helm.md +++ b/docs-source/content/userguide/managing-operators/using-the-operator/using-helm.md @@ -129,7 +129,7 @@ javaLoggingLevel: "FINE" Specifies the Docker image containing the operator code. -Defaults to `weblogic-kubernetes-operator:2.6.0`. +Defaults to `weblogic-kubernetes-operator:3.0.0`. Example: ``` @@ -188,6 +188,18 @@ This value is ignored if `dedicated` is set to `true`. Then, the operator will m For more information about managing `domainNamespaces`, see [Managing domain namespaces]({{< relref "/faq/namespace-management.md" >}}). +##### `domainPresenceFailureRetryMaxCount` and `domainPresenceFailureRetrySeconds` + +Specify the number of introspector job retries for a Domain and the interval in seconds between these retries. + +Defaults to 5 retries and 10 seconds between each retry. + +Example: +``` +domainPresenceFailureRetryMaxCount: 10 +domainPresenceFailureRetrySeconds: 30 +``` + #### Elastic Stack integration ##### `elkIntegrationEnabled` diff --git a/docs-source/content/userguide/overview/database.md b/docs-source/content/userguide/overview/database.md index cf87b24eb29..89528c5887b 100644 --- a/docs-source/content/userguide/overview/database.md +++ b/docs-source/content/userguide/overview/database.md @@ -30,8 +30,8 @@ kubectl create namespace database-namespace Next, create a file called `database.yml` with the following content. Make sure you update the password field with your chosen administrator password for the database. -``` -apiVersion: extensions/v1beta1 +```yaml +apiVersion: apps/v1 kind: Deployment metadata: name: database diff --git a/docs/apidocs/allclasses-index.html b/docs/apidocs/allclasses-index.html index b02cf041b1f..ef8f7c4dbe0 100644 --- a/docs/apidocs/allclasses-index.html +++ b/docs/apidocs/allclasses-index.html @@ -2,10 +2,10 @@ - -All Classes (weblogic-kubernetes-operator 2.6.0 API) + +All Classes (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + +

All Classes

@@ -366,1091 +361,1123 @@

All Classes

  -ConfigMapHelper.DomainTopology - -
Domain topology.
- - - -ConfigMapHelper.SitConfigMapContext +ConfigMapHelper.IntrospectorConfigMapContext   - + ConfigMapWatcher
This class handles ConfigMap watching.
- + Configuration   - + ConfigurationConstants   - + ConfigurationNotSupportedException
An exception to be thrown on an attempt to configure a field not supported by the domain model.
- + ConflictRetry<T>
Interface used by CallBuilder to obtain the latest version of the Kubernetes object for retrying synchronous API calls that previously failed with Conflict response code (409).
- + Container
Root of the SPI implemented by the container.
- + ContainerResolver
This class determines an instance of Container for the runtime.
- + CrdHelper
Helper class to ensure Domain CRD is created.
- + DefaultResponseStep<T>
A response step which treats a NOT_FOUND status as success with a null result.
- + DeleteDomainStep   - + DeleteServiceListStep
A step which will delete each entry in the specified collection.
- + Description
Supplies a description for a field to be inserted into the generated JSON schema.
- + Domain
Domain represents a WebLogic domain and how it will be realized in the Kubernetes cluster.
+ +DomainAction + +
Describes an action to the domain that the operation should take.
+ + -DomainCommonConfigurator +DomainActionType   +DomainCommonConfigurator +  + + DomainCondition
DomainCondition contains details for the current condition of this domain.
- + DomainConditionType   - + DomainConfig
DomainConfig describes the desired state of a domain.
- + DomainConfigurator
Configures a domain, adding settings independently of the version of the domain representation.
- + DomainConfiguratorFactory   - + DomainList
DomainList is a list of Domains.
- + DomainModel
DomainModel describes a WebLogic domain that has been registered with the WebLogic operator.
- + DomainPresence   - + DomainPresenceInfo
Operator's mapping between custom resource Domain and runtime details about that domain, including the scan and the Pods and Services for servers.
- + DomainPresenceInfo.ServerStartupInfo
Details about a specific managed server that will be started up.
- + DomainPresenceStep   - + DomainProcessor   - + DomainProcessorDelegate
A set of underlying services required during domain processing.
- + DomainProcessorImpl   - + DomainResource
DomainResource is a jaxrs resource that implements the REST api for the /operator/{version}/domains/{domainUID} path.
- + DomainSourceType   - + DomainSpec
DomainSpec is a description of a domain.
- + DomainsResource
DomainsResource is a jaxrs resource that implements the REST api for the /operator/{version}/domains path.
- + DomainStatus
DomainStatus represents information about the status of a domain.
- + DomainStatusPatch   - + DomainStatusUpdater
Updates for status of Domain.
- + +DomainTopology + +
Domain topology.
+ + + DomainValidationFailure
Describes a problem with a domain resource.
- + DomainValidationSteps   - + DomainWatcher
This class handles Domain watching.
- + EffectiveConfigurationFactory
The interface for the class used by the domain model to return effective configurations to the operator runtime.
- + Engine
Collection of Fibers.
- + EnumClass
Specifies an enum class whose values match the permitted values for the field.
- + ErrorBody   - + ErrorFilter
ErrorFilter reformats string entities from non-success responses into arrays of message entities.
- + ErrorModel
ErrorModel describes an error response from a WebLogic operator REST resource.
- + EventWatcher
This class handles Domain watching.
- + ExceptionMapper
ExceptionMapper converts non-WebApplicationExceptions into internal server errors and logs warnings for them.
- + FailureStatusSource   - + FailureStatusSourceException   - + Fiber
User-level thread. Represents the execution of one processing flow.
- + Fiber.CompletionCallback
Callback to be invoked when a Fiber finishes execution.
- + Fiber.ExitCallback
Callback invoked when a Thread exits processing this fiber.
- + FiberGate
Allows at most one running Fiber per key value.
- + FiberGateFactory   - + FilterPriorities
FilterPriorities orders the WebLogic operator REST api's jaxrs filters.
- + HealthCheckHelper
A Helper Class for checking the health of the WebLogic Operator.
- + Helpers
This class provides helper methods for getting Service Accounts and Secrets for authentication purposes.
- + HttpAsyncRequestStep
An asynchronous step to handle http requests.
- + HttpResponseStep   - + ImagePullPolicy   - + +IntrospectorConfigMapKeys + +
Keys in the generated introspector config map.
+ + + IntrospectorJobEnvVars
Environment variables used in the introspection job.
- + Istio   - + ItemModel
ItemModel is the base class for all singular resources (singletons and collection children).
- + JobHelper   - + JobStepContext   - + JobWatcher
Watches for Jobs to become Ready or leave Ready state.
- + JsonSchemaMojo   - + KubernetesConstants
Kubernetes constants.
- + KubernetesExec
A base class for an object which can execute a command in an Kubertenes containers.
- + KubernetesExecFactory
A factory for objects which can execute commands in Kubertenes containers.
- + KubernetesExecFactoryImpl
The live implementation of this factory, which uses the 'kubectl exec' command.
- + KubernetesExecFactoryImpl.KubernetesExecImpl   - + KubernetesResourceLookup
An object to check the presence of required Kubernetes resources.
- + KubernetesSchemaReference   - + KubernetesUtils   - + KubernetesVersion
Major and minor version of Kubernetes API Server.
- + LabelConstants   - + LastKnownStatus   - + LegalNames
A class to create DNS-1123 legal names for Kubernetes objects.
- + LinkContainerModel
LinkContainerModel is the base class of WebLogic operator model classes that support links to related REST endpoints.
- + LinkModel
LinkModel describes a link to a WebLogic operator REST resource.
- + +LoggingContext + +
Necessary additional context information for Operator log messages.
+ + + LoggingFacade
Centralized logging for the operator.
- + LoggingFactory
A factory to create Loggers.
- + LoggingFilter
A filter to control whether a log message should be logged.
- + LoggingFormatter
Custom log formatter to format log messages in JSON format.
- + MacroSubstitutor
Substitute macro specified in WLS server template.
- + Main   - + Main
A Kubernetes Operator for WebLogic.
- + MainImpl   - + +MakeRightDomainOperation + +
Defines the operation to bring a running domain into compliance with its domain resource and introspection result.
+ + + ManagedServer   - + ManagedServerSpecCommonImpl   - + ManagedServersUpStep   - + ManagedServerUpAfterStep   - + ManagedServerUpIteratorStep -  + +
A step which will bring up the specified managed servers in parallel.
+ - + MessageKeys
Message keys used to look up log messages from the resource bundle.
- + +Model +  + + +ModelInImageDomainType +  + + NamespaceStatus   - + NamespaceWatcher
This class handles Namespace watching.
- + NetworkAccessPoint
Contains configuration for a Network Access Point.
- + NetworkAccessPointConfigurator   - + NextAction
Indicates what shall happen after Step.apply(Packet) returns.
- + NextAction.Kind   - + NonClusteredServerConfig
NonClusteredServerConfig describes the desired state of a non-clustered server.
- + OncePerMessageLoggingFilter
A LoggingFilter that logs each log message, which are typically message keys, at most once.
- + OperatorLiveness
This task maintains the "liveness" indicator so that Kubernetes knows the Operator is still alive.
- + OperatorReady
This task creates the "readiness" indicator so that Kubernetes knows the Operator is ready.
- + OperatorServiceType
Describes the service types supported by the operator.
- + OperatorUtils   - -OtherUnrecoverableErrorBuilder - -
A builder for 'forbidden' and other unrecoverable async results.
- + +Opss +  - + +OverrideDistributionStrategy +  + + Packet
Context of a single processing flow.
- + Pair<L,​R>   - + PatchableComponent<T>   - + PatchUtils   - + Pattern
Supplies an ECMA 262 regular expression that the field must match.
- + PodAwaiterStepFactory   - + PodHelper   - + PodStepContext   - + PodWatcher
Watches for changes to pods.
- + Pool<T>
General-purpose object pool.
- + ProbeTuning   - + ProcessingConstants
Constants used in asynchronous processing.
- + Range
Specifies minimum and/or maximum permitted values for the field.
- + ReadHealthStep   - + RequestDebugLoggingFilter
RequestDebugLoggingFilter debug logs all the REST Requests.
- + RequestParams   - + ResourceVersion   - + ResponseDebugLoggingFilter
ResponseDebugLoggingFilter debug logs all the REST responses.
- + ResponseStep<T>
Step to receive response of Kubernetes API server call.
- + RestBackend
The RestBackend interface is to implement all of the WebLogic Operator REST resources that need to talk to Kubernetes and WebLogic to get their work done.
- + RestBackendImpl
RestBackendImpl implements the backend of the WebLogic operator REST api by making calls to Kubernetes and WebLogic.
- + RestConfig
The RestConfig interface is used to pass the WebLogic Operator's REST configuration to the RestServer.
- + RestConfigImpl
RestConfigImpl provides the WebLogic Operator REST api configuration.
- + RestServer
The RestServer runs the WebLogic operator's REST api.
- + RetryStrategy
Failed or timed-out call retry strategy.
- + RetryStrategyListener   - + RollingHelper
After the PodHelper identifies servers that are presently running, but that are using an out-of-date specification, it defers the processing of these servers to the RollingHelper.
- + ScaleClusterParamsModel
ScaleClusterParamsModel describes the input parameters to the WebLogic cluster scaling operation.
- + ScaleClusterResource
ScaleResource is a jaxrs resource that implements the REST api for the /operator/{version}/domains/{domainUID}/clusters/{cluster}/scale path.
- + Scan   - + ScanCache   - + SchemaGenerator   - + SecretHelper
A Helper Class for retrieving Kubernetes Secrets used by the WebLogic Operator.
- + SecretType
Types of secrets which can be configured on a domain.
- + +SemanticVersion + +
Major, minor and revision version specification for a product.
+ + + Server   - + ServerConfig
ServerConfig describes the desired state of a server.
- + ServerConfigurator
An interface for an object to configure a server in a test.
- + ServerDownIteratorStep   - + ServerDownStep   - + ServerEnvVars
Environment variables defined for the startup script at operator/src/main/resources/scripts/startServer.sh.
- + ServerHealth
ServerHealth describes the current status and health of a specific WebLogic Server.
- + ServerService   - + ServerSpec   - + ServerSpecBase
Represents the effective configuration for a server, as seen by the operator runtime.
- + ServerSpecCommonImpl
The effective configuration for a server configured by the version 2 domain model.
- + ServerStartPolicy   - + ServerStartState   - + ServerStatus
ServerStatus describes the current status of a specific WebLogic Server.
- + ServerStatusReader
Creates an asynchronous step to read the WebLogic server state from a particular pod.
- + ServiceConfigurator   - + ServiceHelper   - + ServiceWatcher
This class handles Service watching.
- + Shutdown   - + ShutdownType   - + Step
Individual step in a processing flow.
- + Step.MultiThrowable
Multi-exception.
- + Step.StepAndPacket   - + StepContextBase   - + StepContextConstants   - + SubsystemHealth
SubsystemHealth describes the current health of a specific subsystem.
- + SwaggerBuildHelper
A helper class that is used during the build process to update the Swagger HTML file with the latest version of the REST API documentation.
- + SwaggerResource
SwaggerResource is a jaxrs resource that implements the REST api for the /operator/{version}/swagger path.
- + SynchronousCallDispatcher   - + SynchronousCallFactory<R>   - + SystemClock
A wrapper for the system clock that facilitates unit testing of time.
- + ThreadFactorySingleton   - + ThreadLocalContainerResolver
ContainerResolver based on ThreadLocal.
- + TuningParameters   - + TuningParameters.CallBuilderTuning   - + TuningParameters.MainTuning   - + TuningParameters.PodTuning   - + TuningParameters.WatchTuning   - + TuningParametersImpl   - -UnprocessableEntityBuilder -  - - + UnrecoverableErrorBuilder   - -VersionConstants + +UnrecoverableErrorBuilderImpl   - -VersionHelper - -
Helper methods for managing versions.
- - - + VersionModel
VersionModel describes a version of the WebLogic operator REST api.
- + VersionResource
VersionResource is a jaxrs resource that implements the REST api for the /operator/{version} path.
- + VersionsResource
VersionsResource is a jaxrs resource that implements the REST api for the /operator path.
- + VersionUtils
VersionUtils contains utilities for managing the versions of the WebLogic operator REST api.
- + WatchBuilder   - + WatchBuilder.WatchFactory   - + WatchDomainIntrospectorJobReadyStep   - + WatchI<T>
An iterator over watch responses from the server.
- + WatchImpl<T>
A pass-through implementation of the Kubernetes Watch class which implements a facade interface.
- + WatchListener<T>
This interface is used for the final destination to deliver watch events.
- + WatchPodReadyAdminStep   - + WeblogicApi   - + WebLogicConstants   - + WlsClusterConfig
Contains configuration of a WLS cluster.
- + WlsDomain
Represents information from a WLS domain that is needed in order to validate an operator domain.
- + WlsDomainConfig
Contains a snapshot of configuration for a WebLogic Domain.
- -WlsDomainConfigSupport -  - - + WlsDynamicServerConfig
Contains configuration of a WLS server that belongs to a dynamic cluster.
- + WlsDynamicServersConfig
Contains values from a WLS dynamic servers configuration, which configures a WLS dynamic cluster.
- + WlsMachineConfig
Contains values from a WLS machine configuration.
- + WlsServerConfig
Contains configuration of a WebLogic server.
- + YamlDocGenerator   @@ -1488,5 +1515,7 @@

All Classes

Copyright © 2017–2020. All rights reserved.

+
+
diff --git a/docs/apidocs/allpackages-index.html b/docs/apidocs/allpackages-index.html index 702f5c6f8cc..980f7bfb5e1 100644 --- a/docs/apidocs/allpackages-index.html +++ b/docs/apidocs/allpackages-index.html @@ -2,10 +2,10 @@ - -All Packages (weblogic-kubernetes-operator 2.6.0 API) + +All Packages (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
+ - - +
+

All Packages

@@ -233,5 +228,7 @@

All Packages

Copyright © 2017–2020. All rights reserved.

+
+
diff --git a/docs/apidocs/constant-values.html b/docs/apidocs/constant-values.html index 49369c4aae2..aca83bec416 100644 --- a/docs/apidocs/constant-values.html +++ b/docs/apidocs/constant-values.html @@ -2,10 +2,10 @@ - -Constant Field Values (weblogic-kubernetes-operator 2.6.0 API) + +Constant Field Values (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
+ - - +
+

Constant Field Values

@@ -101,20 +96,41 @@

oracle.kubernetes.*

"AllServersStopped" + + +public static final java.lang.String +BAD_DOMAIN +"ErrBadDomain" + + + + +public static final java.lang.String +BAD_TOPOLOGY +"BadTopology" + + + + +public static final java.lang.String +ERR_INTROSPECTOR +"ErrIntrospector" + + public static final java.lang.String INSPECTING_DOMAIN_PROGRESS_REASON "InspectingDomainPresence" - + public static final java.lang.String MANAGED_SERVERS_STARTING_PROGRESS_REASON "ManagedServersStarting" - + public static final java.lang.String @@ -128,6 +144,64 @@

oracle.kubernetes.*

  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    oracle.kubernetes.operator.IntrospectorConfigMapKeys 
    Modifier and TypeConstant FieldValue
    + +public static final java.lang.StringDOMAIN_INPUTS_HASH"weblogic.domainInputsHash"
    + +public static final java.lang.StringDOMAIN_RESTART_VERSION"weblogic.domainRestartVersion"
    + +public static final java.lang.StringDOMAINZIP_HASH"domainzip_hash"
    + +public static final java.lang.StringSECRETS_MD_5"secrets.md5"
    + +public static final java.lang.StringSIT_CONFIG_FILE_PREFIX"Sit-Cfg"
    + +public static final java.lang.StringTOPOLOGY_YAML"topology.yaml"
    +
    +
  • +
  • +
    + @@ -138,47 +212,61 @@

    oracle.kubernetes.*

    + + + + + - + - + - + - + - + + + + + + - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + +
    oracle.kubernetes.operator.KubernetesConstants 
    + +public static final java.lang.StringAPI_VERSION_WEBLOGIC_ORACLE"weblogic.oracle/v8"
    public static final java.lang.String CONTAINER_NAME "weblogic-server"
    public static final java.lang.String CRD_NAME "domains.weblogic.oracle"
    public static final boolean DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE true
    public static final boolean DEFAULT_HTTP_ACCESS_LOG_IN_LOG_HOME true
    public static final java.lang.String DEFAULT_IMAGE "container-registry.oracle.com/middleware/weblogic:12.2.1.4"
    public static final boolean DEFAULT_INCLUDE_SERVER_OUT_IN_POD_LOG true
    + +public static final intDEFAULT_MAX_CLUSTER_CONCURRENT_START_UP0
    @@ -187,96 +275,96 @@

    oracle.kubernetes.*

    "Domain"
    - -public static final java.lang.StringDOMAIN_CONFIG_MAP_NAME"weblogic-domain-cm"
    public static final java.lang.String DOMAIN_DEBUG_CONFIG_MAP_SUFFIX "-weblogic-domain-debug-cm"
    public static final java.lang.String DOMAIN_GROUP "weblogic.oracle"
    public static final java.lang.String DOMAIN_PATH"/apis/weblogic.oracle/v7/namespaces/{namespace}/domains""/apis/weblogic.oracle/v8/namespaces/{namespace}/domains"
    public static final java.lang.String DOMAIN_PLURAL "domains"
    public static final java.lang.String DOMAIN_SCALE_PATH"/apis/weblogic.oracle/v7/namespaces/{namespace}/domains/{name}/scale""/apis/weblogic.oracle/v8/namespaces/{namespace}/domains/{name}/scale"
    public static final java.lang.String DOMAIN_SHORT "dom"
    public static final java.lang.String DOMAIN_SINGULAR "domain"
    public static final java.lang.String DOMAIN_SPECIFIC_PATH"/apis/weblogic.oracle/v7/namespaces/{namespace}/domains/{name}""/apis/weblogic.oracle/v8/namespaces/{namespace}/domains/{name}"
    public static final java.lang.String DOMAIN_STATUS_PATH"/apis/weblogic.oracle/v7/namespaces/{namespace}/domains/{name}/status""/apis/weblogic.oracle/v8/namespaces/{namespace}/domains/{name}/status"
    public static final java.lang.String DOMAIN_VERSION"v7""v8"
    public static final java.lang.String INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX "-weblogic-domain-introspect-cm"
    public static final java.lang.String LATEST_IMAGE_SUFFIX ":latest"
    + +public static final java.lang.StringSCRIPT_CONFIG_MAP_NAME"weblogic-scripts-cm"
    @@ -350,34 +438,55 @@

    oracle.kubernetes.*

    "weblogic.domainUID" + + +public static final java.lang.String +INTROSPECTION_STATE_LABEL +"weblogic.introspectVersion" + + public static final java.lang.String JOBNAME_LABEL "job-name" + + + +public static final java.lang.String +MODEL_IN_IMAGE_DOMAINZIP_HASH +"weblogic.modelInImageDomainZipHash" + - + public static final java.lang.String -OPERATORNAME_LABEL -"weblogic.operatorName" +MODEL_IN_IMAGE_MODEL_SECRETS_HASH +"weblogic.modelInImageModelSecretsHash" - + public static final java.lang.String -RESOURCE_VERSION_LABEL -"weblogic.resourceVersion" +OPERATOR_VERISON +"weblogic.operatorVersion" + + +public static final java.lang.String +OPERATORNAME_LABEL +"weblogic.operatorName" + + public static final java.lang.String SERVERNAME_LABEL "weblogic.serverName" - + public static final java.lang.String @@ -415,26 +524,26 @@

    oracle.kubernetes.*

    "domain" + + +public static final java.lang.String +DOMAIN_INTROSPECT_REQUESTED +"domainIntrospectRequested" + + public static final java.lang.String DOMAIN_INTROSPECTOR_JOB "domainIntrospectorJob" - + public static final java.lang.String DOMAIN_INTROSPECTOR_LOG_RESULT "domainIntrospectorLogResult" - - - -public static final java.lang.String -DOMAIN_RESTART_VERSION -"weblogic.domainRestartVersion" - @@ -443,26 +552,40 @@

    oracle.kubernetes.*

    "domainTopology" +
    + +public static final java.lang.String +DOMAIN_VALIDATION_ERRORS +"domainValidationErrors" + + public static final java.lang.String ENCODED_CREDENTIALS "encodedCredentials" - + public static final java.lang.String ENVVARS "envVars" - + public static final java.lang.String FIBER_COMPONENT_NAME "fiber" + + + +public static final java.lang.String +INTROSPECTOR_JOB_FAILURE_LOGGED +"introspectorJobfailureLogged" + @@ -478,118 +601,74 @@

    oracle.kubernetes.*

    "main" +
    + +public static final java.lang.String +MAKE_RIGHT_DOMAIN_OPERATION +"makeRightOp" + + public static final java.lang.String PODWATCHER_COMPONENT_NAME "podWatcher" - + public static final java.lang.String REMAINING_SERVERS_HEALTH_TO_READ "serverHealthRead" - + public static final java.lang.String SCRIPT_CONFIG_MAP "scriptConfigMap" - + public static final java.lang.String SERVER_HEALTH_MAP "serverHealthMap" - + public static final java.lang.String SERVER_NAME "serverName" - + public static final java.lang.String SERVER_SCAN "serverScan" - + public static final java.lang.String SERVER_STATE_MAP "serverStateMap" - + public static final java.lang.String SERVERS_TO_ROLL "roll" - - - -public static final java.lang.String -SIT_CONFIG_MAP -"sitConfigMap" - - - -
  • - -
  • -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
    oracle.kubernetes.operator.VersionConstants 
    Modifier and TypeConstant FieldValue
    - -public static final java.lang.StringDEFAULT_DOMAIN_VERSION"domain-v2"
    - -public static final java.lang.StringDOMAIN_V1"domain-v1"
    - -public static final java.lang.StringDOMAIN_V2"domain-v2"
    + public static final java.lang.StringOPERATOR_V1"operator-v1"
    - -public static final java.lang.StringOPERATOR_V2"operator-v2"WAIT_FOR_POD_READY"waitForPodReady"
    @@ -801,6 +880,13 @@

    oracle.kubernetes.*

    DNS_1123_FIELDS_PARAM "dns1123Fields" + + + +public static final java.lang.String +DOMAIN_INTROSPECTOR_JOB_SUFFIX +"-introspect-domain-job" +
    @@ -980,6 +1066,34 @@

    oracle.kubernetes.*

    "/u01/nodemanager" + + +public static final java.lang.String +OPSS_KEY_MOUNT_PATH +"/weblogic-operator/opss-walletkey-secret" + + + + +public static final java.lang.String +OPSS_KEYPASSPHRASE_VOLUME +"opss-keypass-volume" + + + + +public static final java.lang.String +OPSS_WALLETFILE_MOUNT_PATH +"/weblogic-operator/opss-walletfile-secret" + + + + +public static final java.lang.String +OPSS_WALLETFILE_VOLUME +"opss-walletfile-volume" + + public static final java.lang.String @@ -994,6 +1108,20 @@

    oracle.kubernetes.*

    "/weblogic-operator/config-overrides" + + +public static final java.lang.String +RUNTIME_ENCRYPTION_SECRET_MOUNT_PATH +"/weblogic-operator/model-runtime-secret" + + + + +public static final java.lang.String +RUNTIME_ENCRYPTION_SECRET_VOLUME +"weblogic-domain-runtime-encryption-volume" + + public static final java.lang.String @@ -1005,7 +1133,7 @@

    oracle.kubernetes.*

    public static final java.lang.String SCRIPTS_VOLUME -"weblogic-domain-cm-volume" +"weblogic-scripts-cm-volume" @@ -1028,6 +1156,41 @@

    oracle.kubernetes.*

    SIT_CONFIG_MAP_VOLUME "weblogic-domain-introspect-cm-volume" + + + +public static final java.lang.String +STORAGE_VOLUME +"weblogic-domain-storage-volume" + + + + +public static final java.lang.String +WDT_CONFIG_MAP_VOLUME +"weblogic-domain-introspect-wdt-cm-volume" + + + + +public static final java.lang.String +WDT_ENCRYPT_KEY_MOUNT_PATH +"/weblogic-operator/wdt-encrypt-key-passphrase" + + + + +public static final java.lang.String +WDT_ENCRYPT_PASSPHRASE_VOLUME +"wdt-encrypt-keypass-volume" + + + + +public static final java.lang.String +WDTCONFIGMAP_MOUNT_PATH +"/weblogic-operator/wdt-config-map" +
  • @@ -1037,6 +1200,29 @@

    oracle.kubernetes.*

  • + + + + + + + + + + + + + + + +
    oracle.kubernetes.operator.logging.LoggingContext 
    Modifier and TypeConstant FieldValue
    + +public static final java.lang.StringLOGGING_CONTEXT_KEY"LoggingContextComponent"
    +
    +
  • +
  • +
    + @@ -1289,19 +1475,33 @@

    oracle.kubernetes.*

    + + + + + - + + + + + + - - - - - - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + - + - + - + - + - + - + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2115,6 +2364,29 @@

    oracle.kubernetes.*

  • oracle.kubernetes.operator.logging.LoggingFacade 
    "WLSKO-0058"
    + +public static final java.lang.StringCM_PATCHED"WLSKO-0172"
    public static final java.lang.String CM_REPLACED "WLSKO-0057"
    public static final java.lang.String COULD_NOT_CREATE_LIVENESS_FILE "WLSKO-0035"
    + +public static final java.lang.StringCREATE_CRD_FAILED"WLSKO-0174"
    @@ -1345,250 +1545,278 @@

    oracle.kubernetes.*

    "WLSKO-0102"
    - -public static final java.lang.StringDOMAIN_STATUS_IGNORED"WLSKO-0013"
    public static final java.lang.String DOMAIN_UID_UNIQUENESS_FAILED "WLSKO-0076"
    public static final java.lang.String DOMAIN_VALIDATION_FAILED "WLSKO-0157"
    public static final java.lang.String DUPLICATE_CLUSTER_NAME_FOUND "WLSDO-0002"
    public static final java.lang.String DUPLICATE_SERVER_NAME_FOUND "WLSDO-0001"
    public static final java.lang.String EXCEPTION "WLSKO-0006"
    public static final java.lang.String EXTERNAL_CHANNEL_SERVICE_CREATED "WLSKO-0150"
    public static final java.lang.String EXTERNAL_CHANNEL_SERVICE_EXISTS "WLSKO-0152"
    public static final java.lang.String EXTERNAL_CHANNEL_SERVICE_REPLACED "WLSKO-0151"
    public static final java.lang.String HTTP_METHOD_FAILED "WLSKO-0081"
    public static final java.lang.String HTTP_REQUEST_TIMED_OUT "WLSKO-0170"
    public static final java.lang.String ILLEGAL_SECRET_NAMESPACE "WLSDO-0006"
    + +public static final java.lang.StringILLEGAL_SIT_CONFIG_MII"WLSDO-0007"
    + +public static final java.lang.StringINTROSPECTOR_JOB_FAILED"WLSKO-0175"
    + +public static final java.lang.StringINTROSPECTOR_JOB_FAILED_DETAIL"WLSKO-0176"
    + +public static final java.lang.StringINTROSPECTOR_POD_FAILED"WLSKO-0177"
    public static final java.lang.String INVALID_DOMAIN_UID "WLSKO-0107"
    public static final java.lang.String INVALID_MANAGE_SERVER_COUNT "WLSKO-0103"
    public static final java.lang.String JOB_CREATED "WLSK0-0139"
    public static final java.lang.String JOB_CREATION_TIMESTAMP_MESSAGE "WLSKO-0169"
    public static final java.lang.String JOB_DEADLINE_EXCEEDED_MESSAGE "WLSKO-0154"
    public static final java.lang.String JOB_DELETED "WLSKO-0137"
    public static final java.lang.String JOB_IS_COMPLETE "WLSKO-0140"
    public static final java.lang.String JOB_IS_FAILED "WLSKO-0136"
    public static final java.lang.String JSON_PARSING_FAILED "WLSKO-0026"
    public static final java.lang.String K8S_MASTER_URL "WLSKO-0002"
    public static final java.lang.String K8S_VERSION_CHECK "WLSKO-0079"
    public static final java.lang.String K8S_VERSION_CHECK_FAILURE "WLSKO-0080"
    public static final java.lang.String K8S_VERSION_TOO_LOW "WLSKO-0073"
    public static final java.lang.String LISTING_DOMAINS "WLSKO-0014"
    public static final java.lang.String LOG_HOME_NOT_MOUNTED "WLSDO-0003"
    public static final java.lang.String MANAGED_POD_CREATED "WLSKO-0047"
    public static final java.lang.String MANAGED_POD_EXISTS "WLSKO-0049"
    public static final java.lang.String MANAGED_POD_PATCHED "WLSKO-0121"
    public static final java.lang.String MANAGED_POD_REPLACED "WLSKO-0048"
    public static final java.lang.String MANAGED_SERVICE_CREATED "WLSKO-0050"
    public static final java.lang.String MANAGED_SERVICE_EXISTS "WLSKO-0052"
    public static final java.lang.String MANAGED_SERVICE_REPLACED "WLSKO-0051"
    public static final java.lang.String MATCHING_DOMAIN_NOT_FOUND "WLSKO-0106"
    + +public static final java.lang.StringMODEL_CONFIGMAP_NOT_FOUND"WLSDO-0008"
    @@ -1702,54 +1930,68 @@

    oracle.kubernetes.*

    "WLSKO-0000"
    + +public static final java.lang.StringOPSS_SECRET_NOT_SPECIFIED"WLSDO-0010"
    public static final java.lang.String POD_DELETED "WLSKO-0122"
    public static final java.lang.String POD_DUMP "WLSKO-0148"
    public static final java.lang.String POD_IS_FAILED "WLSKO-0089"
    public static final java.lang.String POD_IS_READY "WLSKO-0088"
    public static final java.lang.String PROCESSING_DOMAIN "WLSKO-0038"
    public static final java.lang.String PV_ACCESS_MODE_FAILED "WLSKO-0078"
    public static final java.lang.String PV_NOT_FOUND_FOR_DOMAIN_UID "WLSKO-0077"
    + +public static final java.lang.StringREPLACE_CRD_FAILED"WLSKO-0173"
    @@ -1856,139 +2098,146 @@

    oracle.kubernetes.*

    "WLSKO-0018"
    + +public static final java.lang.StringSECRET_NOT_SPECIFIED"WLSDO-0009"
    public static final java.lang.String SERVICE_URL "WLSKO-0027"
    public static final java.lang.String STARTING_LIVENESS_THREAD "WLSKO-0034"
    public static final java.lang.String TUNING_PARAMETERS "WLSKO-0126"
    public static final java.lang.String VERIFY_ACCESS_DENIED "WLSKO-0030"
    public static final java.lang.String VERIFY_ACCESS_DENIED_WITH_NS "WLSKO-0156"
    public static final java.lang.String VERIFY_ACCESS_START "WLSKO-0029"
    public static final java.lang.String VERIFY_K8S_MIN_VERSION "WLSKO-0074"
    public static final java.lang.String WAITING_FOR_JOB_READY "WLSKO-0138"
    public static final java.lang.String WAITING_FOR_POD_READY "WLSKO-0087"
    public static final java.lang.String WATCH_DOMAIN "WLSKO-0039"
    public static final java.lang.String WATCH_DOMAIN_DELETED "WLSKO-0040"
    public static final java.lang.String WATCH_EVENT "WLSKO-0101"
    public static final java.lang.String WLS_CLUSTER_SIZE_UPDATED "WLSKO-0132"
    public static final java.lang.String WLS_CONFIGURATION_READ "WLSKO-0021"
    public static final java.lang.String WLS_HEALTH_READ_FAILED "WLSKO-0127"
    public static final java.lang.String WLS_HEALTH_READ_FAILED_NO_HTTPCLIENT "WLSKO-0153"
    public static final java.lang.String WLS_SERVER_TEMPLATE_NOT_FOUND "WLSKO-0133"
    public static final java.lang.String WLS_UPDATE_CLUSTER_SIZE_FAILED "WLSKO-0129"
    public static final java.lang.String WLS_UPDATE_CLUSTER_SIZE_INVALID_CLUSTER "WLSKO-0131"
    public static final java.lang.String
    + + + + + + + + + + + + + + + +
    oracle.kubernetes.operator.rest.RestBackendImpl 
    Modifier and TypeConstant FieldValue
    + +public static final java.lang.StringINITIAL_VERSION"1"
    +
    +
  • +
  • +
    + @@ -2210,19 +2482,61 @@

    oracle.kubernetes.*

    + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + +
    oracle.kubernetes.operator.rest.RestConfig 
    "ISTIO_ENABLED"
    + +public static final java.lang.StringISTIO_POD_NAMESPACE"ISTIO_POD_NAMESPACE"
    public static final java.lang.String ISTIO_READINESS_PORT "ISTIO_READINESS_PORT"
    public static final java.lang.String NAMESPACE "NAMESPACE"
    + +public static final java.lang.StringOPSS_KEY_SECRET_NAME"OPSS_KEY_SECRET_NAME"
    + +public static final java.lang.StringOPSS_WALLETFILE_SECRET_NAME"OPSS_WALLETFILE_SECRET_NAME"
    + +public static final java.lang.StringRUNTIME_ENCRYPTION_SECRET_NAME"RUNTIME_ENCRYPTION_SECRET_NAME"
    + +public static final java.lang.StringWDT_DOMAIN_TYPE"WDT_DOMAIN_TYPE"
    + +public static final java.lang.StringWDT_ENCRYPTION_PASSPHRASE_NAME"WDT_ENCRYPTION_PASSPHRASE_NAME"
    @@ -2268,40 +2582,54 @@

    oracle.kubernetes.*

    "ADMIN_PORT_SECURE" + + +public static final java.lang.String +ADMIN_SERVER_PORT_SECURE +"ADMIN_SERVER_PORT_SECURE" + + public static final java.lang.String AS_SERVICE_NAME "AS_SERVICE_NAME" - + public static final java.lang.String DATA_HOME "DATA_HOME" - + public static final java.lang.String DOMAIN_HOME "DOMAIN_HOME" - + public static final java.lang.String DOMAIN_NAME "DOMAIN_NAME" - + public static final java.lang.String DOMAIN_UID "DOMAIN_UID" + + + +public static final java.lang.String +DYNAMIC_CONFIG_OVERRIDE +"DYNAMIC_CONFIG_OVERRIDE" + @@ -2373,5 +2701,7 @@

    oracle.kubernetes.*

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/deprecated-list.html b/docs/apidocs/deprecated-list.html index 7a8e615acf6..4df68392503 100644 --- a/docs/apidocs/deprecated-list.html +++ b/docs/apidocs/deprecated-list.html @@ -2,10 +2,10 @@ - -Deprecated List (weblogic-kubernetes-operator 2.6.0 API) + +Deprecated List (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Deprecated API

    @@ -99,5 +94,7 @@

    Contents

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/help-doc.html b/docs/apidocs/help-doc.html index 4f4c1f72e1e..995eaf89322 100644 --- a/docs/apidocs/help-doc.html +++ b/docs/apidocs/help-doc.html @@ -2,10 +2,10 @@ - -API Help (weblogic-kubernetes-operator 2.6.0 API) + +API Help (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    How This API Document Is Organized

    @@ -190,7 +185,13 @@

    Constant Field Values

  • Search

    -

    You can search for definitions of modules, packages, types, fields, methods and other terms defined in the API, using some or all of the name. "Camel-case" abbreviations are supported: for example, "InpStr" will find "InputStream" and "InputStreamReader".

    +

    You can search for definitions of modules, packages, types, fields, methods, system properties and other terms defined in the API, using some or all of the name, optionally using "camel-case" abbreviations. For example:

    +
      +
    • j.l.obj will match "java.lang.Object"
    • +
    • InpStr will match "java.io.InputStream"
    • +
    • HM.cK will match "java.util.HashMap.containsKey(Object)"
    • +
    +

    Refer to the Javadoc Search Specification for a full description of search features.

  • @@ -225,5 +226,7 @@

    Search

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/index-all.html b/docs/apidocs/index-all.html index 876f5fdcf06..ca8b98033b9 100644 --- a/docs/apidocs/index-all.html +++ b/docs/apidocs/index-all.html @@ -2,10 +2,10 @@ - -Index (weblogic-kubernetes-operator 2.6.0 API) + +Index (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Index

    -
    A B C D E F G H I J K L M N O P Q R S T U V W Y 
    All Classes All Packages +
    A B C D E F G H I J K L M N O P Q R S T U V W Y 
    All Classes|All Packages

    A

    @@ -100,15 +95,13 @@

    A

    Adds a condition to the status, replacing any existing conditions with the same type, and removing other conditions according to the domain rules.
    -
    addDefaultEnvVarIfMissing(List<V1EnvVar>, String, String) - Method in class oracle.kubernetes.operator.helpers.StepContextBase
    +
    addDefaultEnvVarIfMissing(List<V1EnvVar>, String, String) - Method in class oracle.kubernetes.operator.helpers.BasePodStepContext
     
    addDetails() - Method in class oracle.kubernetes.operator.calls.unprocessable.ErrorBody
     
    -
    addDynamicWlsCluster(String, String...) - Method in class oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    -
    -
    Adds a dynamic WLS cluster to the configuration, including its member servers.
    -
    -
    addEnvVar(List<V1EnvVar>, String, String) - Method in class oracle.kubernetes.operator.helpers.StepContextBase
    +
    addEnvVar(List<V1EnvVar>, String, String) - Method in class oracle.kubernetes.operator.helpers.BasePodStepContext
    +
     
    +
    addEnvVarIfTrue(boolean, List<V1EnvVar>, String) - Method in class oracle.kubernetes.operator.helpers.BasePodStepContext
     
    addExternalSchema(URL, URL) - Method in class oracle.kubernetes.json.SchemaGenerator
    @@ -134,8 +127,12 @@

    A

    Add a network access point (channel).
    -
    addOrReplaceEnvVar(List<V1EnvVar>, String, String) - Method in class oracle.kubernetes.operator.helpers.StepContextBase
    +
    addOrReplaceEnvVar(List<V1EnvVar>, String, String) - Method in class oracle.kubernetes.operator.helpers.BasePodStepContext
     
    +
    addPackageToSuppressDescriptions(String) - Method in class oracle.kubernetes.json.SchemaGenerator
    +
    +
    Suppress descriptions for fields from these packages.
    +
    addSelfAndParentLinks(String, String) - Method in class oracle.kubernetes.operator.rest.model.LinkContainerModel
    Add the standard self, canonical and parent links to the list of links.
    @@ -164,18 +161,6 @@

    A

    Add validation warnings.
    -
    addWlsCluster(String, String...) - Method in class oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    -
    -
    Adds a WLS cluster to the configuration, including its member servers.
    -
    -
    addWlsServer(String) - Method in class oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    -
    -
    Adds a WLS server to the configuration.
    -
    -
    addWlsServer(String, Integer) - Method in class oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    -
    -
    Adds a WLS server to the configuration.
    -
    addWlsServer(String, String, int) - Method in class oracle.kubernetes.operator.wlsconfig.WlsDomainConfig
     
    ADMIN - oracle.kubernetes.operator.ServerStartState
    @@ -206,6 +191,10 @@

    A

     
    ADMIN_SERVER_CREDENTIALS_USERNAME - Static variable in class oracle.kubernetes.operator.helpers.SecretHelper
     
    +
    ADMIN_SERVER_PORT_SECURE - Static variable in class oracle.kubernetes.weblogic.domain.model.ServerEnvVars
    +
    +
    If defined, WebLogic Server sets a secure protocol(https/t3s) in the "AdminURL" property in NM startup.properties.
    +
    ADMIN_SERVICE_CREATED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    ADMIN_SERVICE_EXISTS - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
    @@ -246,6 +235,8 @@

    A

    AnnotationHelper() - Constructor for class oracle.kubernetes.operator.helpers.AnnotationHelper
     
    +
    API_VERSION_WEBLOGIC_ORACLE - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
    +
     
    APIEXCEPTION_FROM_SUBJECT_ACCESS_REVIEW - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    APIEXCEPTION_FROM_TOKEN_REVIEW - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
    @@ -381,6 +372,10 @@

    A

    B

    +
    BAD_DOMAIN - Static variable in class oracle.kubernetes.operator.DomainStatusUpdater
    +
     
    +
    BAD_TOPOLOGY - Static variable in class oracle.kubernetes.operator.DomainStatusUpdater
    +
     
    BAD_VOLUME_MOUNT_PATH - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    BaseConfiguration - Class in oracle.kubernetes.weblogic.domain.model
    @@ -405,8 +400,6 @@

    B

     
    BasePodStepContext - Class in oracle.kubernetes.operator.helpers
     
    -
    BasePodStepContext() - Constructor for class oracle.kubernetes.operator.helpers.BasePodStepContext
    -
     
    BaseResource - Class in oracle.kubernetes.operator.rest.resource
    BaseResource is the base resource of all the WebLogic operator's REST resources.
    @@ -419,7 +412,7 @@

    B

     
    body - Variable in class oracle.kubernetes.operator.calls.RequestParams
     
    -
    build() - Method in class oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder
    +
    build() - Method in class oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl
     
    @@ -557,6 +550,8 @@

    C

    close() - Method in class oracle.kubernetes.operator.builders.WatchImpl
     
    +
    close() - Method in class oracle.kubernetes.operator.logging.LoggingContext
    +
     
    closeClient(ApiClient) - Method in class oracle.kubernetes.operator.authentication.Authenticator
    Close the ApiClient to make sure any open connection is cleaned up.
    @@ -663,6 +658,8 @@

    C

     
    CM_EXISTS - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    +
    CM_PATCHED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
    +
     
    CM_REPLACED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    CollectionModel<T extends ItemModel> - Class in oracle.kubernetes.operator.rest.model
    @@ -675,6 +672,8 @@

    C

    Compare the given 2 Strings using the sorted name as returned by OperatorUtils.getSortingString(String).
    +
    compareTo(SemanticVersion) - Method in class oracle.kubernetes.operator.helpers.SemanticVersion
    +
     
    compareTo(ResourceVersion) - Method in class oracle.kubernetes.operator.helpers.ResourceVersion
     
    compareTo(Channel) - Method in class oracle.kubernetes.weblogic.domain.model.Channel
    @@ -736,11 +735,7 @@

    C

    ConfigMapHelper - Class in oracle.kubernetes.operator.helpers
     
    -
    ConfigMapHelper.DomainTopology - Class in oracle.kubernetes.operator.helpers
    -
    -
    Domain topology.
    -
    -
    ConfigMapHelper.SitConfigMapContext - Class in oracle.kubernetes.operator.helpers
    +
    ConfigMapHelper.IntrospectorConfigMapContext - Class in oracle.kubernetes.operator.helpers
     
    CONFIGMAPS - oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource
     
    @@ -890,10 +885,16 @@

    C

    Create singleton instance of the WebLogic Operator's RestServer.
    +
    CREATE_CRD_FAILED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
    +
     
    createAdminPodStep(Step) - Static method in class oracle.kubernetes.operator.helpers.PodHelper
    Factory for Step that creates admin server pod.
    +
    createAdminServerPodModel(Packet) - Static method in class oracle.kubernetes.operator.helpers.PodHelper
    +
    +
    Creates an admin server pod resource, based on the specified packet.
    +
    createAdminService() - Method in class oracle.kubernetes.weblogic.domain.model.AdminServer
    Create the AdminService.
    @@ -936,23 +937,19 @@

    C

    Creates a web hook object to track config map calls.
    +
    createContainer(TuningParameters) - Method in class oracle.kubernetes.operator.helpers.BasePodStepContext
    +
     
    createContainer(TuningParameters) - Method in class oracle.kubernetes.operator.helpers.JobStepContext
     
    createContainer(TuningParameters) - Method in class oracle.kubernetes.operator.helpers.PodStepContext
     
    -
    createContainer(TuningParameters) - Method in class oracle.kubernetes.operator.helpers.StepContextBase
    -
     
    createCustomResourceDefinitionAsync(V1CustomResourceDefinition, ResponseStep<V1CustomResourceDefinition>) - Method in class oracle.kubernetes.operator.helpers.CallBuilder
    Asynchronous step for creating CRD.
    CREATEDBYOPERATOR_LABEL - Static variable in interface oracle.kubernetes.operator.LabelConstants
     
    -
    createDomainConfig() - Method in class oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    -
    -
    Creates a domain configuration, based on the defined servers and clusters.
    -
    -
    createDomainCrdStep(KubernetesVersion, Step) - Static method in class oracle.kubernetes.operator.helpers.CrdHelper
    +
    createDomainCrdStep(KubernetesVersion, SemanticVersion, Step) - Static method in class oracle.kubernetes.operator.helpers.CrdHelper
    Factory for Step that creates Domain CRD.
    @@ -1022,6 +1019,10 @@

    C

    Creates a step to send a GET request to a server.
    +
    createIntrospectorConfigMapStep(Step) - Static method in class oracle.kubernetes.operator.helpers.ConfigMapHelper
    +
    +
    Factory for a step that creates or updates the generated domain config map from introspection results.
    +
    createJobAsync(String, V1Job, ResponseStep<V1Job>) - Method in class oracle.kubernetes.operator.helpers.CallBuilder
    Asynchronous step for creating job.
    @@ -1030,10 +1031,22 @@

    C

    Creates a web hook object to track jobs.
    +
    createMakeRightOperation(DomainPresenceInfo) - Method in interface oracle.kubernetes.operator.DomainProcessor
    +
     
    +
    createMakeRightOperation(DomainPresenceInfo) - Method in class oracle.kubernetes.operator.DomainProcessorImpl
    +
     
    +
    createMakeRightOperation(Domain) - Method in interface oracle.kubernetes.operator.DomainProcessor
    +
     
    +
    createMakeRightOperation(Domain) - Method in class oracle.kubernetes.operator.DomainProcessorImpl
    +
     
    createManagedPodStep(Step) - Static method in class oracle.kubernetes.operator.helpers.PodHelper
    Factory for Step that creates managed server pod.
    +
    createManagedServerPodModel(Packet) - Static method in class oracle.kubernetes.operator.helpers.PodHelper
    +
    +
    Creates a managed server pod resource, based on the specified packet.
    +
    createMetadata() - Method in class oracle.kubernetes.operator.helpers.PodStepContext
     
    createNamespace(V1Namespace) - Method in class oracle.kubernetes.operator.helpers.CallBuilder
    @@ -1062,9 +1075,9 @@

    C

    Asynchronous step for creating pod.
    -
    createPodSpec(TuningParameters) - Method in class oracle.kubernetes.operator.helpers.JobStepContext
    +
    createPodSpec(TuningParameters) - Method in class oracle.kubernetes.operator.helpers.BasePodStepContext
     
    -
    createPodSpec(TuningParameters) - Method in class oracle.kubernetes.operator.helpers.StepContextBase
    +
    createPodSpec(TuningParameters) - Method in class oracle.kubernetes.operator.helpers.JobStepContext
     
    createPodWatch(String) - Method in class oracle.kubernetes.operator.builders.WatchBuilder
    @@ -1108,10 +1121,6 @@

    C

    Creates a web hook object to track service calls.
    -
    createSitConfigMapStep(Step) - Static method in class oracle.kubernetes.operator.helpers.ConfigMapHelper
    -
    -
    Factory for Step that creates config map containing sit config.
    -
    createSortedMap(Map<String, T>) - Static method in class oracle.kubernetes.utils.OperatorUtils
    Create a Map using the elements from the given map, with their keys sorted @@ -1123,6 +1132,10 @@

    C

    Creates an asynchronous step to update domain status from the topology in the current packet.
    +
    createSteps() - Method in interface oracle.kubernetes.operator.MakeRightDomainOperation
    +
     
    +
    createStepsToRerunWithIntrospection(Packet) - Static method in interface oracle.kubernetes.operator.MakeRightDomainOperation
    +
     
    createSubjectAccessReview(V1SubjectAccessReview) - Method in class oracle.kubernetes.operator.helpers.CallBuilder
    Create subject access review.
    @@ -1179,9 +1192,9 @@

    D

     
    DEBUG_CM_VOLUME - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
     
    -
    DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
    +
    DEFAULT - Static variable in enum oracle.kubernetes.operator.OverrideDistributionStrategy
     
    -
    DEFAULT_DOMAIN_VERSION - Static variable in interface oracle.kubernetes.operator.VersionConstants
    +
    DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
     
    DEFAULT_HTTP_ACCESS_LOG_IN_LOG_HOME - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
     
    @@ -1191,6 +1204,8 @@

    D

     
    DEFAULT_INCLUDE_SERVER_OUT_IN_POD_LOG - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
     
    +
    DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
    +
     
    DEFAULT_TIMEOUT - Static variable in class oracle.kubernetes.weblogic.domain.model.Shutdown
     
    DefaultResponseStep<T> - Class in oracle.kubernetes.operator.steps
    @@ -1232,10 +1247,6 @@

    D

    Asynchronous step for deleting config map.
    -
    deleteDomainIntrospectorConfigMapStep(String, String, Step) - Static method in class oracle.kubernetes.operator.helpers.ConfigMapHelper
    -
    -
    Factory for Step that deletes introspector config map.
    -
    deleteDomainIntrospectorJobStep(Step) - Static method in class oracle.kubernetes.operator.helpers.JobHelper
    Factory for Step that deletes WebLogic domain introspector job.
    @@ -1248,6 +1259,10 @@

    D

    deleteFromEvent(DomainPresenceInfo, V1Service) - Static method in class oracle.kubernetes.operator.helpers.ServiceHelper
     
    +
    deleteIntrospectorConfigMapStep(String, String, Step) - Static method in class oracle.kubernetes.operator.helpers.ConfigMapHelper
    +
    +
    Factory for a step that deletes the generated introspector config map.
    +
    deleteJobAsync(String, String, V1DeleteOptions, ResponseStep<V1Status>) - Method in class oracle.kubernetes.operator.helpers.CallBuilder
    Asynchronous step for deleting job.
    @@ -1334,6 +1349,10 @@

    D

    Dispatch service watch event.
    +
    distributeOverridesDynamically() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    +
    +
    Returns the strategy for applying changes to configuration overrides.
    +
    DNS_1123_FIELDS_PARAM - Static variable in class oracle.kubernetes.operator.helpers.LegalNames
     
    doContinueList(Packet) - Method in class oracle.kubernetes.operator.helpers.ResponseStep
    @@ -1378,8 +1397,6 @@

    D

     
    DOMAIN_COMPONENT_NAME - Static variable in interface oracle.kubernetes.operator.ProcessingConstants
     
    -
    DOMAIN_CONFIG_MAP_NAME - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
    -
     
    DOMAIN_DEBUG_CONFIG_MAP_SUFFIX - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
     
    DOMAIN_GROUP - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
    @@ -1388,8 +1405,16 @@

    D

    The path to the domain home, either in a PV or image.
    +
    DOMAIN_INPUTS_HASH - Static variable in interface oracle.kubernetes.operator.IntrospectorConfigMapKeys
    +
    +
    A hash of the Model-in-Image inputs.
    +
    +
    DOMAIN_INTROSPECT_REQUESTED - Static variable in interface oracle.kubernetes.operator.ProcessingConstants
    +
     
    DOMAIN_INTROSPECTOR_JOB - Static variable in interface oracle.kubernetes.operator.ProcessingConstants
     
    +
    DOMAIN_INTROSPECTOR_JOB_SUFFIX - Static variable in class oracle.kubernetes.operator.helpers.LegalNames
    +
     
    DOMAIN_INTROSPECTOR_LOG_RESULT - Static variable in interface oracle.kubernetes.operator.ProcessingConstants
     
    DOMAIN_NAME - Static variable in class oracle.kubernetes.weblogic.domain.model.ServerEnvVars
    @@ -1400,8 +1425,10 @@

    D

     
    DOMAIN_PLURAL - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
     
    -
    DOMAIN_RESTART_VERSION - Static variable in interface oracle.kubernetes.operator.ProcessingConstants
    -
     
    +
    DOMAIN_RESTART_VERSION - Static variable in interface oracle.kubernetes.operator.IntrospectorConfigMapKeys
    +
    +
    The last value of the restartVersion field from the domain resource.
    +
    DOMAIN_SCALE_PATH - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
     
    DOMAIN_SHORT - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
    @@ -1416,8 +1443,6 @@

    D

     
    DOMAIN_STATUS - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    -
    DOMAIN_STATUS_IGNORED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
    -
     
    DOMAIN_STATUS_PATH - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
     
    DOMAIN_TOPOLOGY - Static variable in interface oracle.kubernetes.operator.ProcessingConstants
    @@ -1426,14 +1451,20 @@

    D

     
    DOMAIN_UID_UNIQUENESS_FAILED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    -
    DOMAIN_V1 - Static variable in interface oracle.kubernetes.operator.VersionConstants
    -
     
    -
    DOMAIN_V2 - Static variable in interface oracle.kubernetes.operator.VersionConstants
    +
    DOMAIN_VALIDATION_ERRORS - Static variable in interface oracle.kubernetes.operator.ProcessingConstants
     
    DOMAIN_VALIDATION_FAILED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    DOMAIN_VERSION - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
     
    +
    DomainAction - Class in oracle.kubernetes.operator.rest.model
    +
    +
    Describes an action to the domain that the operation should take.
    +
    +
    DomainAction(DomainActionType) - Constructor for class oracle.kubernetes.operator.rest.model.DomainAction
    +
     
    +
    DomainActionType - Enum in oracle.kubernetes.operator.rest.model
    +
     
    DomainCommonConfigurator - Class in oracle.kubernetes.weblogic.domain.model
     
    DomainCommonConfigurator() - Constructor for class oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator
    @@ -1577,7 +1608,17 @@

    D

    Updates for status of Domain.
    -
    DomainTopology() - Constructor for class oracle.kubernetes.operator.helpers.ConfigMapHelper.DomainTopology
    +
    DomainTopology - Class in oracle.kubernetes.operator.helpers
    +
    +
    Domain topology.
    +
    +
    DomainTopology() - Constructor for class oracle.kubernetes.operator.helpers.DomainTopology
    +
     
    +
    DomainTopology(WlsDomainConfig) - Constructor for class oracle.kubernetes.operator.helpers.DomainTopology
    +
     
    +
    domainUid() - Method in class oracle.kubernetes.operator.logging.LoggingContext
    +
     
    +
    domainUid(String) - Method in class oracle.kubernetes.operator.logging.LoggingContext
     
    DOMAINUID_LABEL - Static variable in interface oracle.kubernetes.operator.LabelConstants
     
    @@ -1593,6 +1634,10 @@

    D

    This class handles Domain watching.
    +
    DOMAINZIP_HASH - Static variable in interface oracle.kubernetes.operator.IntrospectorConfigMapKeys
    +
    +
    A hash computed from the WebLogic domain.
    +
    doNext(Packet) - Method in class oracle.kubernetes.operator.work.Step
    Create NextAction that indicates that the next step be invoked with the given Packet.
    @@ -1627,6 +1672,12 @@

    D

     
    DUPLICATE_SERVER_NAME_FOUND - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    +
    DYNAMIC - oracle.kubernetes.operator.OverrideDistributionStrategy
    +
     
    +
    DYNAMIC_CONFIG_OVERRIDE - Static variable in class oracle.kubernetes.weblogic.domain.model.ServerEnvVars
    +
    +
    If present, pod scripts will watch for changes to override configurations and move them into place.
    +
    @@ -1692,6 +1743,8 @@

    E

    Check equality.
    +
    equals(Object) - Method in class oracle.kubernetes.operator.helpers.SemanticVersion
    +
     
    equals(Object) - Method in class oracle.kubernetes.operator.helpers.ServerConfig
     
    equals(Object) - Method in class oracle.kubernetes.operator.Pair
    @@ -1742,6 +1795,10 @@

    E

     
    equals(Object) - Method in class oracle.kubernetes.weblogic.domain.model.ManagedServer
     
    +
    equals(Object) - Method in class oracle.kubernetes.weblogic.domain.model.Model
    +
     
    +
    equals(Object) - Method in class oracle.kubernetes.weblogic.domain.model.Opss
    +
     
    equals(Object) - Method in class oracle.kubernetes.weblogic.domain.model.ProbeTuning
     
    equals(Object) - Method in class oracle.kubernetes.weblogic.domain.model.Server
    @@ -1760,6 +1817,8 @@

    E

     
    equals(Object) - Method in class oracle.kubernetes.weblogic.domain.model.SubsystemHealth
     
    +
    ERR_INTROSPECTOR - Static variable in class oracle.kubernetes.operator.DomainStatusUpdater
    +
     
    ERROR_FILTER_PRIORITY - Static variable in class oracle.kubernetes.operator.rest.FilterPriorities
    The error filter's priority.
    @@ -1815,6 +1874,8 @@

    E

     
    execute() - Method in class oracle.kubernetes.json.mojo.JsonSchemaMojo
     
    +
    execute() - Method in interface oracle.kubernetes.operator.MakeRightDomainOperation
    +
     
    execute(ApiClient, RequestParams) - Method in interface oracle.kubernetes.operator.calls.SynchronousCallFactory
     
    execute(SynchronousCallFactory<T>, RequestParams, Pool<ApiClient>) - Method in interface oracle.kubernetes.operator.calls.SynchronousCallDispatcher
    @@ -1857,7 +1918,7 @@

    F

     
    FailureStatusSourceException(FailureStatusSource) - Constructor for exception oracle.kubernetes.operator.calls.FailureStatusSourceException
     
    -
    FailureStatusSourceException(FailureStatusSource, Exception) - Constructor for exception oracle.kubernetes.operator.calls.FailureStatusSourceException
    +
    FailureStatusSourceException(FailureStatusSource, Throwable) - Constructor for exception oracle.kubernetes.operator.calls.FailureStatusSourceException
     
    Fiber - Class in oracle.kubernetes.operator.work
    @@ -1899,7 +1960,7 @@

    F

    FilterPriorities orders the WebLogic operator REST api's jaxrs filters.
    -
    findEnvVar(List<V1EnvVar>, String) - Method in class oracle.kubernetes.operator.helpers.StepContextBase
    +
    findEnvVar(List<V1EnvVar>, String) - Method in class oracle.kubernetes.operator.helpers.BasePodStepContext
     
    findServiceAccount(String, String) - Method in class oracle.kubernetes.operator.authentication.Helpers
    @@ -1951,6 +2012,10 @@

    F

     
    forCluster() - Method in enum oracle.kubernetes.operator.ServerStartPolicy
     
    +
    forDeletion() - Method in interface oracle.kubernetes.operator.MakeRightDomainOperation
    +
    +
    Defines the operation as pertaining to the deletion of a domain.
    +
    forDomain() - Method in enum oracle.kubernetes.operator.ServerStartPolicy
     
    forDomain(Domain) - Static method in class oracle.kubernetes.weblogic.domain.DomainConfiguratorFactory
    @@ -1969,18 +2034,18 @@

    F

     
    forServer() - Method in enum oracle.kubernetes.operator.ServerStartPolicy
     
    -
    fromFailedCall(CallResponse) - Static method in class oracle.kubernetes.operator.calls.OtherUnrecoverableErrorBuilder
    -
    -
    Create a ForbiddenErrorBuilder from the provided failed call.
    -
    -
    fromFailedCall(CallResponse) - Static method in class oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder
    +
    fromFailedCall(CallResponse) - Static method in class oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl
    -
    Create an UnprocessableEntityBuilder from the provided failed call.
    +
    Create an UnrecoverableErrorBuilder from the provided failed call.
    fromFailedCall(CallResponse) - Static method in class oracle.kubernetes.operator.calls.UnrecoverableErrorBuilder
    Populate FailureStatusSource from a failed call response.
    +
    FromModel - oracle.kubernetes.operator.DomainSourceType
    +
     
    +
    fromPacket(Packet) - Static method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo
    +
     
    @@ -2057,6 +2122,8 @@

    G

    get(Object) - Method in class oracle.kubernetes.operator.helpers.ConfigMapConsumer
     
    +
    getAction() - Method in class oracle.kubernetes.operator.rest.model.DomainAction
    +
     
    getAdditionalVolumeMounts() - Method in class oracle.kubernetes.weblogic.domain.model.BaseConfiguration
     
    getAdditionalVolumeMounts() - Method in interface oracle.kubernetes.weblogic.domain.model.ServerSpec
    @@ -2277,6 +2344,10 @@

    G

    Construct and return the 'clusters' jaxrs child resource.
    +
    getCompatibilityWith(String) - Method in class oracle.kubernetes.operator.helpers.SemanticVersion
    +
    +
    Compatibility check, similar to compare, but that reports more details on revision comparision.
    +
    getCompletionCallback() - Method in class oracle.kubernetes.operator.work.Fiber
    Returns completion callback associated with this Fiber.
    @@ -2295,8 +2366,6 @@

    G

    Current service state of domain.
    -
    getConfigMapName(String) - Static method in class oracle.kubernetes.operator.helpers.ConfigMapHelper.SitConfigMapContext
    -
     
    getConfigOverrides() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    Returns the name of the Kubernetes config map that contains optional configuration overrides.
    @@ -2307,6 +2376,8 @@

    G

    getConfiguration() - Method in class oracle.kubernetes.weblogic.domain.model.Cluster
     
    +
    getConfiguration() - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    +
     
    getConfiguration() - Method in class oracle.kubernetes.weblogic.domain.model.Server
     
    getConfiguredClusters() - Method in class oracle.kubernetes.operator.wlsconfig.WlsDomainConfig
    @@ -2379,6 +2450,8 @@

    G

    Returns the default container resolver which can be used to get Container.
    +
    getDefaultDomainHome(String) - Method in enum oracle.kubernetes.operator.DomainSourceType
    +
     
    getDefaultPolicy() - Static method in enum oracle.kubernetes.operator.ServerStartPolicy
     
    getDesiredState() - Method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo.ServerStartupInfo
    @@ -2409,12 +2482,12 @@

    G

     
    getDetails() - Method in class oracle.kubernetes.operator.calls.unprocessable.ErrorBody
     
    -
    getDomain() - Method in class oracle.kubernetes.operator.helpers.ConfigMapHelper.DomainTopology
    -
     
    getDomain() - Method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo
    Gets the domain.
    +
    getDomain() - Method in class oracle.kubernetes.operator.helpers.DomainTopology
    +
     
    getDomainHome() - Method in class oracle.kubernetes.operator.helpers.JobStepContext
     
    getDomainHome() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    @@ -2425,7 +2498,7 @@

    G

     
    getDomainHomeSourceType() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    -
    Get domain home source type.
    +
    Returns a description of how the domain is defined.
    getDomainResource(String) - Method in class oracle.kubernetes.operator.rest.resource.DomainsResource
    @@ -2441,6 +2514,8 @@

    G

    Construct and return the 'domains' jaxrs child resource.
    +
    getDomainType() - Method in class oracle.kubernetes.weblogic.domain.model.Model
    +
     
    getDomainUid() - Method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo
    Gets the Domain UID.
    @@ -2464,7 +2539,7 @@

    G

    getDomainUids() - Method in class oracle.kubernetes.operator.rest.RestBackendImpl
     
    -
    getDomainValid() - Method in class oracle.kubernetes.operator.helpers.ConfigMapHelper.DomainTopology
    +
    getDomainValid() - Method in class oracle.kubernetes.operator.helpers.DomainTopology
    check if domain is valid.
    @@ -2616,6 +2691,22 @@

    G

    getInternalHttpsPort() - Method in class oracle.kubernetes.operator.rest.RestConfigImpl
     
    +
    getIntrospectMD5VolumeSource() - Method in class oracle.kubernetes.operator.helpers.JobStepContext
    +
     
    +
    getIntrospectorConfigMapName(String) - Static method in class oracle.kubernetes.operator.helpers.ConfigMapHelper
    +
    +
    Returns the standard name for the generated domain config map.
    +
    +
    getIntrospectorJobActiveDeadlineSeconds() - Method in class oracle.kubernetes.weblogic.domain.model.Configuration
    +
     
    +
    getIntrospectorJobActiveDeadlineSeconds() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    +
    +
    Returns the value of the introspector job active deadline.
    +
    +
    getIntrospectVersion() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    +
     
    +
    getIntrospectVersion() - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    +
     
    getIstio() - Method in class oracle.kubernetes.weblogic.domain.model.Configuration
     
    getIstioReadinessPort() - Method in class oracle.kubernetes.operator.helpers.JobStepContext
    @@ -2754,14 +2845,24 @@

    G

     
    getMainTuning() - Method in class oracle.kubernetes.operator.TuningParametersImpl
     
    +
    getMajor() - Method in class oracle.kubernetes.operator.helpers.SemanticVersion
    +
     
    getManagedServerCount() - Method in class oracle.kubernetes.operator.rest.model.ScaleClusterParamsModel
    Get the desired number of managed servers in the WebLogic cluster.
    getManagedServers() - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
     
    +
    getMaxClusterConcurrentStartup() - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    +
     
    getMaxClusterSize() - Method in class oracle.kubernetes.operator.wlsconfig.WlsClusterConfig
     
    +
    getMaxConcurrentStartup() - Method in class oracle.kubernetes.weblogic.domain.model.Cluster
    +
     
    +
    getMaxConcurrentStartup(String) - Method in interface oracle.kubernetes.weblogic.domain.EffectiveConfigurationFactory
    +
     
    +
    getMaxConcurrentStartup(String) - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    +
     
    getMaxDynamicClusterSize() - Method in class oracle.kubernetes.operator.wlsconfig.WlsClusterConfig
    Returns the maximum size of the dynamic cluster.
    @@ -2782,13 +2883,11 @@

    G

    getMessage() - Method in interface oracle.kubernetes.operator.calls.FailureStatusSource
     
    -
    getMessage() - Method in class oracle.kubernetes.operator.calls.OtherUnrecoverableErrorBuilder
    -
     
    getMessage() - Method in class oracle.kubernetes.operator.calls.unprocessable.Cause
     
    getMessage() - Method in class oracle.kubernetes.operator.calls.unprocessable.ErrorBody
     
    -
    getMessage() - Method in class oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder
    +
    getMessage() - Method in class oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl
     
    getMessage() - Method in exception oracle.kubernetes.weblogic.domain.ConfigurationNotSupportedException
     
    @@ -2828,10 +2927,22 @@

    G

    Return minimum size of the dynamic cluster.
    +
    getMinor() - Method in class oracle.kubernetes.operator.helpers.SemanticVersion
    +
     
    getMinReplicas() - Method in class oracle.kubernetes.operator.helpers.ClusterConfig
    Gets the desired minimum number of managed servers running in this cluster.
    +
    getModel() - Method in class oracle.kubernetes.weblogic.domain.model.Configuration
    +
     
    +
    getModel() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    +
     
    +
    getModelInImageSpecHash(String) - Static method in class oracle.kubernetes.operator.helpers.ConfigMapHelper
    +
    +
    getModelInImageSpecHash returns the hash for the fields that should be compared for changes.
    +
    +
    getName() - Method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo.ServerStartupInfo
    +
     
    getName() - Method in class oracle.kubernetes.operator.logging.LoggingFacade
    Returns the name of the underlying logger.
    @@ -2860,10 +2971,24 @@

    G

    The name of the step.
    +
    getNamespace() - Method in class oracle.kubernetes.operator.ConfigMapWatcher
    +
     
    +
    getNamespace() - Method in class oracle.kubernetes.operator.DomainWatcher
    +
     
    +
    getNamespace() - Method in class oracle.kubernetes.operator.EventWatcher
    +
     
    getNamespace() - Method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo
    Gets the namespace.
    +
    getNamespace() - Method in class oracle.kubernetes.operator.JobWatcher
    +
     
    +
    getNamespace() - Method in class oracle.kubernetes.operator.NamespaceWatcher
    +
     
    +
    getNamespace() - Method in class oracle.kubernetes.operator.PodWatcher
    +
     
    +
    getNamespace() - Method in class oracle.kubernetes.operator.ServiceWatcher
    +
     
    getNamespace() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
     
    getNamespacedDomain(String, String) - Method in class oracle.kubernetes.weblogic.domain.api.WeblogicApi
    @@ -2947,6 +3072,8 @@

    G

     
    getNodeSelectors() - Method in class oracle.kubernetes.weblogic.domain.model.ServerSpecCommonImpl
     
    +
    getNumericPortion(String) - Static method in class oracle.kubernetes.operator.helpers.SemanticVersion
    +
     
    getOperatorExternalCertificateData() - Method in interface oracle.kubernetes.operator.rest.RestConfig
    Gets the external https port's certificate.
    @@ -3007,6 +3134,22 @@

    G

    Returns the namespace associated with the operator itself.
    +
    getOpss() - Method in class oracle.kubernetes.weblogic.domain.model.Configuration
    +
     
    +
    getOpssKeyWalletVolumeSource(String) - Method in class oracle.kubernetes.operator.helpers.JobStepContext
    +
     
    +
    getOpssWalletFileSecret() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    +
    +
    Returns the opss wallet file secret.
    +
    +
    getOpssWalletFileSecret() - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    +
    +
    Get OPSS wallet file secret.
    +
    +
    getOpssWalletPasswordSecret() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    +
    +
    Reference to secret opss key passphrase.
    +
    getOrCreateFor(Domain) - Static method in class oracle.kubernetes.operator.JobWatcher
    Returns a cached JobWatcher, if present; otherwise, creates a new one.
    @@ -3015,6 +3158,18 @@

    G

    Server health of this WebLogic server.
    +
    getOverrideDistributionStrategy() - Method in class oracle.kubernetes.weblogic.domain.model.Configuration
    +
     
    +
    getOverrideDistributionStrategy() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    +
    +
    Returns the strategy for applying changes to configuration overrides.
    +
    +
    getOverrideDistributionStrategy() - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    +
    +
    Returns the strategy used for distributing changed config overrides.
    +
    +
    getOverridesConfigMap() - Method in class oracle.kubernetes.weblogic.domain.model.Configuration
    +
     
    getPacket() - Method in class oracle.kubernetes.operator.work.Fiber
    Gets the current Packet associated with this fiber.
    @@ -3085,6 +3240,10 @@

    G

     
    getPriorityClassName() - Method in class oracle.kubernetes.weblogic.domain.model.ServerSpecCommonImpl
     
    +
    getProductVersion() - Method in interface oracle.kubernetes.operator.DomainProcessorDelegate
    +
    +
    Returns the version of the operator.
    +
    getProtocol() - Method in class oracle.kubernetes.operator.wlsconfig.NetworkAccessPoint
     
    getPublicPort() - Method in class oracle.kubernetes.operator.wlsconfig.NetworkAccessPoint
    @@ -3119,11 +3278,9 @@

    G

    getReason() - Method in interface oracle.kubernetes.operator.calls.FailureStatusSource
     
    -
    getReason() - Method in class oracle.kubernetes.operator.calls.OtherUnrecoverableErrorBuilder
    -
     
    getReason() - Method in class oracle.kubernetes.operator.calls.unprocessable.Cause
     
    -
    getReason() - Method in class oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder
    +
    getReason() - Method in class oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl
     
    getReason() - Method in class oracle.kubernetes.weblogic.domain.model.DomainCondition
    @@ -3201,6 +3358,14 @@

    G

    On a watch call: when specified, shows changes that occur after that particular version of a resource.
    +
    getResourceVersion(V1ObjectMeta) - Static method in class oracle.kubernetes.operator.helpers.KubernetesUtils
    +
    +
    Parse the resource version from the metadata.
    +
    +
    getResourceVersion(String) - Static method in class oracle.kubernetes.operator.helpers.KubernetesUtils
    +
    +
    Parse the resource version.
    +
    getRestartedLabel() - Method in class oracle.kubernetes.operator.helpers.ServerConfig
    Gets the label that indicates that a server has been restarted.
    @@ -3227,6 +3392,8 @@

    G

    getRetrieveServersSearchUrl() - Static method in class oracle.kubernetes.operator.wlsconfig.WlsDomainConfig
     
    +
    getRevision() - Method in class oracle.kubernetes.operator.helpers.SemanticVersion
    +
     
    getRight() - Method in class oracle.kubernetes.operator.Pair
     
    getRoot() - Method in class oracle.kubernetes.operator.rest.resource.BaseResource
    @@ -3247,6 +3414,10 @@

    G

     
    getRuntimeClassName() - Method in class oracle.kubernetes.weblogic.domain.model.ServerSpecCommonImpl
     
    +
    getRuntimeEncryptionSecret() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    +
    +
    Reference to runtime encryption secret.
    +
    getScaleClusterResource() - Method in class oracle.kubernetes.operator.rest.resource.ClusterResource
    Construct and return the 'scale' jaxrs child resource.
    @@ -3267,6 +3438,8 @@

    G

    Factory for Step that asynchronously acquires secret data.
    +
    getSecrets() - Method in class oracle.kubernetes.weblogic.domain.model.Configuration
    +
     
    getServer(String, String) - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    Returns the specification applicable to a particular server/cluster combination.
    @@ -3341,7 +3514,7 @@

    G

     
    getServers() - Method in class oracle.kubernetes.weblogic.domain.model.DomainStatus
    -
    Status of WebLogic servers in this domain.
    +
    Status of WebLogic Servers in this domain.
    getServerService(String) - Method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo
     
    @@ -3466,7 +3639,7 @@

    G

    getStatus() - Method in class oracle.kubernetes.weblogic.domain.model.DomainCondition
    -
    Status is the status of the condition.
    +
    The status of the condition.
    getStatusCode() - Method in class oracle.kubernetes.operator.calls.CallResponse
     
    @@ -3549,7 +3722,7 @@

    G

    getUriInfo() - Method in class oracle.kubernetes.operator.rest.resource.BaseResource
     
    -
    getValidationErrors() - Method in class oracle.kubernetes.operator.helpers.ConfigMapHelper.DomainTopology
    +
    getValidationErrors() - Method in class oracle.kubernetes.operator.helpers.DomainTopology
    Retrieve validation errors.
    @@ -3583,17 +3756,29 @@

    G

    Get the supported versions of the WebLogic operator REST api.
    +
    getWalletFileSecret() - Method in class oracle.kubernetes.weblogic.domain.model.Opss
    +
     
    +
    getWalletPasswordSecret() - Method in class oracle.kubernetes.weblogic.domain.model.Opss
    +
     
    getWatchTuning() - Method in interface oracle.kubernetes.operator.TuningParameters
     
    getWatchTuning() - Method in class oracle.kubernetes.operator.TuningParametersImpl
     
    -
    getWebLogicCredentialsSecretName() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    +
    getWdtConfigMap() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    +
     
    +
    getWdtConfigMap() - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    -
    Name of the secret containing WebLogic startup credentials username and password.
    +
    Get WDT config map.
    -
    getWlsCluster(String) - Method in class oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    +
    getWdtConfigMapVolumeSource(String) - Method in class oracle.kubernetes.operator.helpers.JobStepContext
    +
     
    +
    getWdtDomainType() - Method in class oracle.kubernetes.operator.helpers.JobStepContext
    +
     
    +
    getWdtDomainType() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    +
     
    +
    getWebLogicCredentialsSecretName() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    -
    Returns the configuration for the named cluster, if any has been defined.
    +
    Name of the secret containing WebLogic startup credentials user name and password.
    getWlsDomainConfig() - Method in class oracle.kubernetes.operator.rest.Scan
     
    @@ -3601,14 +3786,6 @@

    G

    Returns the WlsDomainConfig object for the WLS domain that this cluster belongs to.
    -
    getWlsServer(String) - Method in class oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    -
    -
    Returns the configuration for the named server, if any has been defined.
    -
    -
    getWlsServer(String, String) - Method in class oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    -
    -
    Returns the configuration for the named clustered server.
    -
    Graceful - oracle.kubernetes.operator.ShutdownType
     
    GRACEFUL_SHUTDOWNTYPE - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
    @@ -3627,7 +3804,7 @@

    H

    Whether the cluster contains any dynamic servers.
    -
    hasEnvVar(List<V1EnvVar>, String) - Method in class oracle.kubernetes.operator.helpers.StepContextBase
    +
    hasEnvVar(List<V1EnvVar>, String) - Method in class oracle.kubernetes.operator.helpers.BasePodStepContext
     
    hashCode() - Method in class oracle.kubernetes.operator.helpers.ClusterConfig
     
    @@ -3637,14 +3814,14 @@

    H

     
    hashCode() - Method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo.ServerStartupInfo
     
    -
    hashCode() - Method in class oracle.kubernetes.operator.helpers.KubernetesVersion
    -
     
    hashCode() - Method in class oracle.kubernetes.operator.helpers.LastKnownStatus
     
    hashCode() - Method in class oracle.kubernetes.operator.helpers.NonClusteredServerConfig
     
    hashCode() - Method in class oracle.kubernetes.operator.helpers.ResourceVersion
     
    +
    hashCode() - Method in class oracle.kubernetes.operator.helpers.SemanticVersion
    +
     
    hashCode() - Method in class oracle.kubernetes.operator.helpers.ServerConfig
     
    hashCode() - Method in class oracle.kubernetes.operator.Pair
    @@ -3695,6 +3872,10 @@

    H

     
    hashCode() - Method in class oracle.kubernetes.weblogic.domain.model.ManagedServer
     
    +
    hashCode() - Method in class oracle.kubernetes.weblogic.domain.model.Model
    +
     
    +
    hashCode() - Method in class oracle.kubernetes.weblogic.domain.model.Opss
    +
     
    hashCode() - Method in class oracle.kubernetes.weblogic.domain.model.ProbeTuning
     
    hashCode() - Method in class oracle.kubernetes.weblogic.domain.model.Server
    @@ -3713,6 +3894,8 @@

    H

     
    hashCode() - Method in class oracle.kubernetes.weblogic.domain.model.SubsystemHealth
     
    +
    hasLogHomeByDefault() - Method in enum oracle.kubernetes.operator.DomainSourceType
    +
     
    hasNamedServer(String) - Method in class oracle.kubernetes.operator.wlsconfig.WlsClusterConfig
    Returns true if one of the servers in the cluster has the specified name.
    @@ -3738,7 +3921,7 @@

    H

    Construct helpers.
    -
    hideAdminUserCredentials(List<V1EnvVar>) - Method in class oracle.kubernetes.operator.helpers.StepContextBase
    +
    hideAdminUserCredentials(List<V1EnvVar>) - Method in class oracle.kubernetes.operator.helpers.BasePodStepContext
     
    href(String...) - Method in class oracle.kubernetes.operator.rest.resource.BaseResource
     
    @@ -3770,6 +3953,8 @@

    I

     
    ILLEGAL_SECRET_NAMESPACE - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    +
    ILLEGAL_SIT_CONFIG_MII - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
    +
     
    Image - oracle.kubernetes.operator.DomainSourceType
     
    ImagePull - oracle.kubernetes.operator.helpers.SecretType
    @@ -3778,6 +3963,8 @@

    I

     
    incrementAndGetFailureCount() - Method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo
     
    +
    info - Variable in class oracle.kubernetes.operator.helpers.StepContextBase
    +
     
    info(String) - Method in class oracle.kubernetes.operator.logging.LoggingFacade
    Logs a message at the INFO level.
    @@ -3796,6 +3983,8 @@

    I

    INGRESSES - oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource
     
    +
    INITIAL_VERSION - Static variable in class oracle.kubernetes.operator.rest.RestBackendImpl
    +
     
    initialDelaySeconds(Integer) - Method in class oracle.kubernetes.weblogic.domain.model.ProbeTuning
     
    initialize(ThreadFactory) - Static method in class oracle.kubernetes.operator.helpers.ClientPool
    @@ -3822,12 +4011,30 @@

    I

     
    INSTANCE - Static variable in interface oracle.kubernetes.operator.rest.ScanCache
     
    +
    interrupt() - Method in interface oracle.kubernetes.operator.MakeRightDomainOperation
    +
     
    +
    INTROSPECT - oracle.kubernetes.operator.rest.model.DomainActionType
    +
     
    INTROSPECT_HOME - Static variable in class oracle.kubernetes.weblogic.domain.model.IntrospectorJobEnvVars
    The path to the home directory for the introspection job.
    +
    INTROSPECTION_STATE_LABEL - Static variable in interface oracle.kubernetes.operator.LabelConstants
    +
     
    INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
     
    +
    INTROSPECTOR_JOB_FAILED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
    +
     
    +
    INTROSPECTOR_JOB_FAILED_DETAIL - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
    +
     
    +
    INTROSPECTOR_JOB_FAILURE_LOGGED - Static variable in interface oracle.kubernetes.operator.ProcessingConstants
    +
     
    +
    INTROSPECTOR_POD_FAILED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
    +
     
    +
    IntrospectorConfigMapKeys - Interface in oracle.kubernetes.operator
    +
    +
    Keys in the generated introspector config map.
    +
    introspectorJobActiveDeadlineSeconds - Variable in class oracle.kubernetes.operator.TuningParameters.PodTuning
     
    IntrospectorJobEnvVars - Class in oracle.kubernetes.weblogic.domain.model
    @@ -3855,6 +4062,8 @@

    I

    Whether to allow number of replicas to drop below the minimum dynamic cluster size configured in the WebLogic domain home configuration.
    +
    isAllowReplicasBelowMinDynClusterSize() - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    +
     
    isAllowReplicasBelowMinDynClusterSize(String) - Method in interface oracle.kubernetes.weblogic.domain.EffectiveConfigurationFactory
     
    isAllowReplicasBelowMinDynClusterSize(String) - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    @@ -3866,7 +4075,7 @@

    I

     
    isAsyncCallFailure(CallResponse<T>) - Static method in class oracle.kubernetes.operator.calls.UnrecoverableErrorBuilder
    -
    Returns true if the specified call response indicates an unprocessable entity response from Kubernetes.
    +
    Returns true if the specified call response indicates an unrecoverable response from Kubernetes.
    isBeta() - Method in class oracle.kubernetes.operator.helpers.ResourceVersion
     
    @@ -3951,6 +4160,8 @@

    I

    Checks if a message at INFO level would actually be logged.
    +
    isInspectionRequired(Packet) - Static method in interface oracle.kubernetes.operator.MakeRightDomainOperation
    +
     
    isIstioEnabled() - Method in class oracle.kubernetes.operator.helpers.JobStepContext
     
    isIstioEnabled() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    @@ -3979,6 +4190,8 @@

    I

    isNamespaceStarting() - Method in class oracle.kubernetes.operator.NamespaceStatus
     
    +
    isNewIntrospectionRequiredForNewServers() - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    +
     
    isNotAuthorizedOrForbidden(CallResponse<T>) - Method in class oracle.kubernetes.operator.helpers.ResponseStep
     
    isNotDeleting() - Method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo
    @@ -4056,13 +4269,15 @@

    I

    Istio enabled.
    +
    ISTIO_POD_NAMESPACE - Static variable in class oracle.kubernetes.weblogic.domain.model.IntrospectorJobEnvVars
    +
    +
    Istio pod namespace.
    +
    ISTIO_READINESS_PORT - Static variable in class oracle.kubernetes.weblogic.domain.model.IntrospectorJobEnvVars
    Istio readiness port.
    -
    isUnprocessableEntity(ApiException) - Static method in class oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder
    -
     
    -
    isUnrecoverable(ApiException) - Static method in class oracle.kubernetes.operator.calls.OtherUnrecoverableErrorBuilder
    +
    isUnrecoverable(ApiException) - Static method in class oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl
     
    isVersion(String) - Static method in class oracle.kubernetes.operator.rest.backend.VersionUtils
    @@ -4118,6 +4333,8 @@

    J

    Converts a list of strings to a comma-separated list, using "and" for the last item.
    +
    JRF - oracle.kubernetes.operator.ModelInImageDomainType
    +
     
    JSON_PARSING_FAILED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    JsonSchemaMojo - Class in oracle.kubernetes.json.mojo
    @@ -4321,8 +4538,16 @@

    L

     
    LOGGER - Static variable in class oracle.kubernetes.operator.rest.BaseDebugLoggingFilter
     
    +
    LOGGING_CONTEXT_KEY - Static variable in class oracle.kubernetes.operator.logging.LoggingContext
    +
     
    LOGGING_FILTER_PACKET_KEY - Static variable in interface oracle.kubernetes.operator.logging.LoggingFilter
     
    +
    LoggingContext - Class in oracle.kubernetes.operator.logging
    +
    +
    Necessary additional context information for Operator log messages.
    +
    +
    LoggingContext() - Constructor for class oracle.kubernetes.operator.logging.LoggingContext
    +
     
    LoggingFacade - Class in oracle.kubernetes.operator.logging
    Centralized logging for the operator.
    @@ -4393,11 +4618,13 @@

    M

    create main tuning.
    -
    makeRightDomainPresence(DomainPresenceInfo, boolean, boolean, boolean) - Method in interface oracle.kubernetes.operator.DomainProcessor
    -
     
    -
    makeRightDomainPresence(DomainPresenceInfo, boolean, boolean, boolean) - Method in class oracle.kubernetes.operator.DomainProcessorImpl
    +
    MAKE_RIGHT_DOMAIN_OPERATION - Static variable in interface oracle.kubernetes.operator.ProcessingConstants
    +
    +
    Key to an object of type MakeRightDomainOperation.
    +
    +
    MakeRightDomainOperation - Interface in oracle.kubernetes.operator
    -
    Begin activity to align domain status with domain resource.
    +
    Defines the operation to bring a running domain into compliance with its domain resource and introspection result.
    MANAGED_POD_CREATED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    @@ -4434,13 +4661,11 @@

    M

    ManagedServerUpAfterStep(Step) - Constructor for class oracle.kubernetes.operator.steps.ManagedServerUpAfterStep
     
    ManagedServerUpIteratorStep - Class in oracle.kubernetes.operator.steps
    -
     
    -
    ManagedServerUpIteratorStep(Collection<DomainPresenceInfo.ServerStartupInfo>, Step) - Constructor for class oracle.kubernetes.operator.steps.ManagedServerUpIteratorStep
    -
     
    -
    matchesResourceVersion(V1ObjectMeta, String) - Static method in class oracle.kubernetes.operator.helpers.VersionHelper
    -
    Determines whether a resource matches a version.
    +
    A step which will bring up the specified managed servers in parallel.
    +
    ManagedServerUpIteratorStep(Collection<DomainPresenceInfo.ServerStartupInfo>, Step) - Constructor for class oracle.kubernetes.operator.steps.ManagedServerUpIteratorStep
    +
     
    MATCHING_DOMAIN_NOT_FOUND - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    maximum() - Method in annotation type oracle.kubernetes.json.Range
    @@ -4455,6 +4680,18 @@

    M

    Minimum value.
    +
    Model - Class in oracle.kubernetes.weblogic.domain.model
    +
     
    +
    Model() - Constructor for class oracle.kubernetes.weblogic.domain.model.Model
    +
     
    +
    MODEL_CONFIGMAP_NOT_FOUND - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
    +
     
    +
    MODEL_IN_IMAGE_DOMAINZIP_HASH - Static variable in interface oracle.kubernetes.operator.LabelConstants
    +
     
    +
    MODEL_IN_IMAGE_MODEL_SECRETS_HASH - Static variable in interface oracle.kubernetes.operator.LabelConstants
    +
     
    +
    ModelInImageDomainType - Enum in oracle.kubernetes.operator
    +
     
    @@ -4467,6 +4704,10 @@

    N

     
    namespace - Variable in class oracle.kubernetes.operator.calls.RequestParams
     
    +
    namespace() - Method in class oracle.kubernetes.operator.logging.LoggingContext
    +
     
    +
    namespace(String) - Method in class oracle.kubernetes.operator.logging.LoggingContext
    +
     
    NAMESPACE - Static variable in class oracle.kubernetes.weblogic.domain.model.IntrospectorJobEnvVars
    The namespace in which the introspection job will run.
    @@ -4569,6 +4810,8 @@

    N

    O

    +
    ON_RESTART - oracle.kubernetes.operator.OverrideDistributionStrategy
    +
     
    OncePerMessageLoggingFilter - Class in oracle.kubernetes.operator.logging
    A LoggingFilter that logs each log message, which are typically message keys, at most once.
    @@ -4625,9 +4868,7 @@

    O

     
    OPERATOR_STARTED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    -
    OPERATOR_V1 - Static variable in interface oracle.kubernetes.operator.VersionConstants
    -
     
    -
    OPERATOR_V2 - Static variable in interface oracle.kubernetes.operator.VersionConstants
    +
    OPERATOR_VERISON - Static variable in interface oracle.kubernetes.operator.LabelConstants
     
    OperatorLiveness - Class in oracle.kubernetes.operator
    @@ -4652,6 +4893,36 @@

    O

     
    OperatorUtils() - Constructor for class oracle.kubernetes.utils.OperatorUtils
     
    +
    Opss - Class in oracle.kubernetes.weblogic.domain.model
    +
     
    +
    Opss() - Constructor for class oracle.kubernetes.weblogic.domain.model.Opss
    +
     
    +
    OPSS_KEY_MOUNT_PATH - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
    +
     
    +
    OPSS_KEY_SECRET_NAME - Static variable in class oracle.kubernetes.weblogic.domain.model.IntrospectorJobEnvVars
    +
    +
    The credentials used by the introspection job - opss key passphrase.
    +
    +
    OPSS_KEYPASSPHRASE_VOLUME - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
    +
     
    +
    OPSS_SECRET_NOT_SPECIFIED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
    +
     
    +
    OPSS_WALLETFILE_MOUNT_PATH - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
    +
     
    +
    OPSS_WALLETFILE_SECRET_NAME - Static variable in class oracle.kubernetes.weblogic.domain.model.IntrospectorJobEnvVars
    +
    +
    The credentials used by the introspection job - opss wallet file.
    +
    +
    OPSS_WALLETFILE_VOLUME - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
    +
     
    +
    OpssWalletFile - oracle.kubernetes.operator.helpers.SecretType
    +
     
    +
    OpssWalletPassword - oracle.kubernetes.operator.helpers.SecretType
    +
     
    +
    optionalContext() - Static method in class oracle.kubernetes.operator.logging.LoggingContext
    +
    +
    Gets the current logging context on the thread.
    +
    oracle.kubernetes.json - package oracle.kubernetes.json
     
    oracle.kubernetes.json.mojo - package oracle.kubernetes.json.mojo
    @@ -4726,16 +4997,14 @@

    O

    Model classes that are part of the WebLogic Custom Resource extensions to the Kubernetes API.
    -
    OtherUnrecoverableErrorBuilder - Class in oracle.kubernetes.operator.calls
    -
    -
    A builder for 'forbidden' and other unrecoverable async results.
    -
    OVERALL_HEALTH_FOR_SERVER_OVERLOADED - Static variable in class oracle.kubernetes.operator.steps.ReadHealthStep
     
    OVERALL_HEALTH_NOT_AVAILABLE - Static variable in class oracle.kubernetes.operator.steps.ReadHealthStep
     
    OVERRIDE_SECRETS_MOUNT_PATH - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
     
    +
    OverrideDistributionStrategy - Enum in oracle.kubernetes.operator
    +
     
    OVERRIDES_CM_MOUNT_PATH - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
     
    owner - Variable in class oracle.kubernetes.operator.work.Fiber
    @@ -4758,14 +5027,22 @@

    P

     
    Pair(L, R) - Constructor for class oracle.kubernetes.operator.Pair
     
    -
    parseDomainTopologyYaml(String) - Static method in class oracle.kubernetes.operator.helpers.ConfigMapHelper
    +
    parseDomainTopologyYaml(String) - Static method in class oracle.kubernetes.operator.helpers.DomainTopology
    parse domain topology yaml.
    +
    parseDomainTopologyYaml(String, Consumer<List<String>>) - Static method in class oracle.kubernetes.operator.helpers.DomainTopology
    +
    +
    Parses a topology yaml.
    +
    patch - oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation
     
    PatchableComponent<T> - Interface in oracle.kubernetes.weblogic.domain.model
     
    +
    patchConfigMapAsync(String, String, V1Patch, ResponseStep<V1ConfigMap>) - Method in class oracle.kubernetes.operator.helpers.CallBuilder
    +
    +
    Asynchronous step for patching a config map.
    +
    patchDomain(String, String, V1Patch) - Method in class oracle.kubernetes.operator.helpers.CallBuilder
    Patch domain.
    @@ -4822,6 +5099,12 @@

    P

    Supplies an ECMA 262 regular expression that the field must match.
    +
    performDomainAction(String, DomainAction) - Method in interface oracle.kubernetes.operator.rest.backend.RestBackend
    +
    +
    Applies the specified command to the specified domain.
    +
    +
    performDomainAction(String, DomainAction) - Method in class oracle.kubernetes.operator.rest.RestBackendImpl
    +
     
    performK8sVersionCheck() - Static method in class oracle.kubernetes.operator.helpers.HealthCheckHelper
    Verify the k8s version.
    @@ -4876,6 +5159,10 @@

    P

    Pool() - Constructor for class oracle.kubernetes.operator.helpers.Pool
     
    +
    post(DomainAction) - Method in class oracle.kubernetes.operator.rest.resource.DomainResource
    +
    +
    Apply changes to this domain.
    +
    post(ScaleClusterParamsModel) - Method in class oracle.kubernetes.operator.rest.resource.ScaleClusterResource
    Scale this WebLogic cluster up or down.
    @@ -4966,8 +5253,15 @@

    R

    Asynchronous step for reading domain.
    -
    readExistingSituConfigMap(String, String) - Static method in class oracle.kubernetes.operator.helpers.ConfigMapHelper
    -
     
    +
    readExistingIntrospectorConfigMap(String, String) - Static method in class oracle.kubernetes.operator.helpers.ConfigMapHelper
    +
    +
    Reads the introspector config map for the specified domain, populating the following packet entries: + DOMAIN_TOPOLOGY the parsed topology + DOMAIN_HASH a hash of the topology + SECRETS_HASH a hash of the override secrets + DOMAIN_RESTART_VERSION a field from the domain to force rolling when changed + DOMAIN_INPUTS_HASH a hash of the image used in the domain.
    +
    ReadHealthStep - Class in oracle.kubernetes.operator.steps
     
    READINESS_PROBE_NOT_READY_STATE - Static variable in interface oracle.kubernetes.operator.WebLogicConstants
    @@ -4978,6 +5272,10 @@

    R

     
    readinessProbeTimeoutSeconds - Variable in class oracle.kubernetes.operator.TuningParameters.PodTuning
     
    +
    readIntrospectionVersionStep(String, String) - Static method in class oracle.kubernetes.operator.helpers.ConfigMapHelper
    +
    +
    Reads the introspector config map for the specified domain, populating the following packet entries.
    +
    readJobAsync(String, String, ResponseStep<V1Job>) - Method in class oracle.kubernetes.operator.helpers.CallBuilder
    Asynchronous step for reading job.
    @@ -5032,6 +5330,8 @@

    R

    Call back for any watch type.
    +
    recordInspection(Packet) - Static method in interface oracle.kubernetes.operator.MakeRightDomainOperation
    +
     
    recycle(T) - Method in class oracle.kubernetes.operator.helpers.Pool
    Returns an object back to the pool.
    @@ -5052,6 +5352,8 @@

    R

     
    replace - oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation
     
    +
    REPLACE_CRD_FAILED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
    +
     
    replaceBetaCustomResourceDefinitionAsync(String, V1beta1CustomResourceDefinition, ResponseStep<V1beta1CustomResourceDefinition>) - Method in class oracle.kubernetes.operator.helpers.CallBuilder
    Asynchronous step for replacing CRD.
    @@ -5124,6 +5426,8 @@

    R

    Report on currently suspended fibers.
    +
    reportTopologyErrorsAndStop() - Static method in class oracle.kubernetes.operator.helpers.ConfigMapHelper
    +
     
    REQUEST_DEBUG_LOGGING_FILTER_PRIORITY - Static variable in class oracle.kubernetes.operator.rest.FilterPriorities
    The request debug logging filter's priority.
    @@ -5165,8 +5469,6 @@

    R

    RESOURCE_BUNDLE_NOT_FOUND - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    -
    RESOURCE_VERSION_LABEL - Static variable in interface oracle.kubernetes.operator.LabelConstants
    -
     
    ResourceVersion - Class in oracle.kubernetes.operator.helpers
     
    ResourceVersion(String) - Constructor for class oracle.kubernetes.operator.helpers.ResourceVersion
    @@ -5212,6 +5514,8 @@

    R

    This constant is used internally to pass the RestConfig instance from the RestServer to the filters and resources so that they can access it.
    +
    RESTART - oracle.kubernetes.operator.rest.model.DomainActionType
    +
     
    RestBackend - Interface in oracle.kubernetes.operator.rest.backend
    The RestBackend interface is to implement all of the WebLogic Operator REST resources that need @@ -5235,6 +5539,8 @@

    R

    Constructs a RestConfigImpl.
    +
    RestrictedJRF - oracle.kubernetes.operator.ModelInImageDomainType
    +
     
    RestServer - Class in oracle.kubernetes.operator.rest
    The RestServer runs the WebLogic operator's REST api.
    @@ -5282,6 +5588,16 @@

    R

    Runs a chain of steps.
    +
    RUNTIME_ENCRYPTION_SECRET_MOUNT_PATH - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
    +
     
    +
    RUNTIME_ENCRYPTION_SECRET_NAME - Static variable in class oracle.kubernetes.weblogic.domain.model.IntrospectorJobEnvVars
    +
    +
    The credentials used by the introspection job - runtime encryption secret name.
    +
    +
    RUNTIME_ENCRYPTION_SECRET_VOLUME - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
    +
     
    +
    RuntimeEncryption - oracle.kubernetes.operator.helpers.SecretType
    +
     
    @@ -5335,6 +5651,8 @@

    S

     
    SCRIPT_CONFIG_MAP - Static variable in interface oracle.kubernetes.operator.ProcessingConstants
     
    +
    SCRIPT_CONFIG_MAP_NAME - Static variable in interface oracle.kubernetes.operator.KubernetesConstants
    +
     
    SCRIPT_LOADED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    SCRIPTS_MOUNTS_PATH - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
    @@ -5347,6 +5665,8 @@

    S

     
    SECRET_NOT_FOUND - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    +
    SECRET_NOT_SPECIFIED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
    +
     
    SecretHelper - Class in oracle.kubernetes.operator.helpers
    A Helper Class for retrieving Kubernetes Secrets used by the WebLogic Operator.
    @@ -5357,6 +5677,10 @@

    S

    SECRETS - oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource
     
    +
    SECRETS_MD_5 - Static variable in interface oracle.kubernetes.operator.IntrospectorConfigMapKeys
    +
    +
    An MD5 has of the Model-in-Image secrets.
    +
    SECRETS_MOUNT_PATH - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
     
    SECRETS_VOLUME - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
    @@ -5371,6 +5695,22 @@

    S

     
    SELFSUBJECTRULESREVIEWS - oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource
     
    +
    SemanticVersion - Class in oracle.kubernetes.operator.helpers
    +
    +
    Major, minor and revision version specification for a product.
    +
    +
    SemanticVersion(int, int) - Constructor for class oracle.kubernetes.operator.helpers.SemanticVersion
    +
    +
    Construct semantic version.
    +
    +
    SemanticVersion(int, int, int) - Constructor for class oracle.kubernetes.operator.helpers.SemanticVersion
    +
    +
    Construct semantic version.
    +
    +
    SemanticVersion(String) - Constructor for class oracle.kubernetes.operator.helpers.SemanticVersion
    +
    +
    Construct semantic version.
    +
    Server - Class in oracle.kubernetes.weblogic.domain.model
     
    Server() - Constructor for class oracle.kubernetes.weblogic.domain.model.Server
    @@ -5390,7 +5730,9 @@

    S

    'true' or 'false' to indicate whether the server output should be included in the pod log.
    SERVER_SCAN - Static variable in interface oracle.kubernetes.operator.ProcessingConstants
    -
     
    +
    +
    key to an object of type WlsServerConfig.
    +
    SERVER_START_POLICY_ALWAYS - Static variable in class oracle.kubernetes.operator.helpers.ServerConfig
     
    SERVER_START_POLICY_NEVER - Static variable in class oracle.kubernetes.operator.helpers.ServerConfig
    @@ -5491,10 +5833,12 @@

    S

     
    setAdminPort(Integer) - Method in class oracle.kubernetes.operator.wlsconfig.WlsServerConfig
     
    -
    setAdminServerName(String) - Method in class oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    -
     
    setAdminServerName(String) - Method in class oracle.kubernetes.operator.wlsconfig.WlsDomainConfig
     
    +
    setAllowReplicasBelowMinDynClusterSize(Boolean) - Method in class oracle.kubernetes.weblogic.domain.model.Cluster
    +
     
    +
    setAllowReplicasBelowMinDynClusterSize(Boolean) - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    +
     
    setApiClient(ApiClient) - Method in class oracle.kubernetes.weblogic.domain.api.WeblogicApi
     
    setApiVersion(String) - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    @@ -5553,6 +5897,8 @@

    S

     
    setConfigOverrideSecrets(List<String>) - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
     
    +
    setConfiguration(Configuration) - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    +
     
    setConfiguredClusters(List<WlsClusterConfig>) - Method in class oracle.kubernetes.operator.wlsconfig.WlsDomainConfig
     
    setContextClassLoader(ClassLoader) - Method in class oracle.kubernetes.operator.work.Fiber
    @@ -5571,7 +5917,7 @@

    S

    Set the details describing the error.
    -
    setDomain(WlsDomainConfig) - Method in class oracle.kubernetes.operator.helpers.ConfigMapHelper.DomainTopology
    +
    setDomain(WlsDomainConfig) - Method in class oracle.kubernetes.operator.helpers.DomainTopology
     
    setDomain(Domain) - Method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo
    @@ -5585,6 +5931,10 @@

    S

    Specifies whether the domain home is stored in the image.
    +
    setDomainHomeSourceType(DomainSourceType) - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    +
     
    +
    setDomainType(String) - Method in class oracle.kubernetes.weblogic.domain.model.Model
    +
     
    setDomainUid(String) - Method in class oracle.kubernetes.operator.rest.model.DomainModel
    Set the unique identifier that has been assigned to this WebLogic domain.
    @@ -5593,7 +5943,7 @@

    S

    Domain unique identifier.
    -
    setDomainValid(boolean) - Method in class oracle.kubernetes.operator.helpers.ConfigMapHelper.DomainTopology
    +
    setDomainValid(boolean) - Method in class oracle.kubernetes.operator.helpers.DomainTopology
     
    setDynamicClusterSize(Integer) - Method in class oracle.kubernetes.operator.wlsconfig.WlsDynamicServersConfig
     
    @@ -5618,6 +5968,8 @@

    S

    Set the link's hypertext reference.
    +
    setHttpAccessLogInLogHome(boolean) - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    +
     
    setImage(String) - Method in class oracle.kubernetes.operator.helpers.ServerConfig
    Sets the WebLogic Docker image.
    @@ -5655,10 +6007,16 @@

    S

    Specifies whether top-level schema reference is included.
    +
    setInspectionRun() - Method in interface oracle.kubernetes.operator.MakeRightDomainOperation
    +
     
    setInstance(ContainerResolver) - Static method in class oracle.kubernetes.operator.work.ContainerResolver
    Sets the custom container resolver which can be used to get client's Container.
    +
    setIntrospectorJobActiveDeadlineSeconds(Long) - Method in class oracle.kubernetes.weblogic.domain.model.Configuration
    +
     
    +
    setIntrospectVersion(String) - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    +
     
    setIsPrecreateService(Boolean) - Method in class oracle.kubernetes.weblogic.domain.model.ServerService
     
    setIstio(Istio) - Method in class oracle.kubernetes.weblogic.domain.model.Configuration
    @@ -5721,6 +6079,10 @@

    S

    Set the desired number of managed servers in the WebLogic cluster.
    +
    setMaxClusterConcurrentStartup(Integer) - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    +
     
    +
    setMaxConcurrentStartup(Integer) - Method in class oracle.kubernetes.weblogic.domain.model.Cluster
    +
     
    setMaxDynamicClusterSize(Integer) - Method in class oracle.kubernetes.operator.wlsconfig.WlsDynamicServersConfig
     
    setMaxReplicas(int) - Method in class oracle.kubernetes.operator.helpers.ClusterConfig
    @@ -5747,6 +6109,8 @@

    S

    Sets the desired minimum number of managed servers running in this cluster.
    +
    setModel(Model) - Method in class oracle.kubernetes.weblogic.domain.model.Configuration
    +
     
    setName(String) - Method in class oracle.kubernetes.operator.wlsconfig.WlsClusterConfig
     
    setName(String) - Method in class oracle.kubernetes.operator.wlsconfig.WlsDynamicServersConfig
    @@ -5761,6 +6125,12 @@

    S

    setNodePort(Integer) - Method in class oracle.kubernetes.weblogic.domain.model.Channel
     
    +
    setOpss(Opss) - Method in class oracle.kubernetes.weblogic.domain.model.Configuration
    +
     
    +
    setOverrideDistributionStrategy(OverrideDistributionStrategy) - Method in class oracle.kubernetes.weblogic.domain.model.Configuration
    +
     
    +
    setOverridesConfigMap(String) - Method in class oracle.kubernetes.weblogic.domain.model.Configuration
    +
     
    setPopulated(boolean) - Method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo
     
    setPrevious(AsyncRequestStep) - Method in class oracle.kubernetes.operator.helpers.ResponseStep
    @@ -5804,6 +6174,8 @@

    S

    Sets the label that indicates that a server has been restarted.
    +
    setSecrets(List<String>) - Method in class oracle.kubernetes.weblogic.domain.model.Configuration
    +
     
    setServer(String, ClusteredServerConfig) - Method in class oracle.kubernetes.operator.helpers.ClusterConfig
    Sets the configuration of a server in this cluster.
    @@ -5842,7 +6214,7 @@

    S

     
    setServers(List<ServerStatus>) - Method in class oracle.kubernetes.weblogic.domain.model.DomainStatus
    -
    Status of WebLogic servers in this domain.
    +
    Status of WebLogic Servers in this domain.
    setServers(Map<String, ClusteredServerConfig>) - Method in class oracle.kubernetes.operator.helpers.ClusterConfig
    @@ -5910,6 +6282,10 @@

    S

    Specifies whether object fields will be implemented as references to existing definitions.
    +
    setThreadContext() - Static method in class oracle.kubernetes.operator.logging.LoggingContext
    +
    +
    Creates a new LoggingContext and sets it as the current thread context.
    +
    setTitle(String) - Method in class oracle.kubernetes.operator.rest.model.ErrorModel
    Set the error's title.
    @@ -5924,12 +6300,16 @@

    S

    Set the error's type.
    -
    setValidationErrors(List<String>) - Method in class oracle.kubernetes.operator.helpers.ConfigMapHelper.DomainTopology
    +
    setValidationErrors(List<String>) - Method in class oracle.kubernetes.operator.helpers.DomainTopology
     
    setVersion(String) - Method in class oracle.kubernetes.operator.rest.model.VersionModel
    Set the name of this version of the WebLogic operator REST api.
    +
    setWalletFileSecret(String) - Method in class oracle.kubernetes.weblogic.domain.model.Opss
    +
     
    +
    setWalletPasswordSecret(String) - Method in class oracle.kubernetes.weblogic.domain.model.Opss
    +
     
    setWlsDomainConfig(WlsDomainConfig) - Method in class oracle.kubernetes.operator.wlsconfig.WlsClusterConfig
    Associate this cluster to the WlsDomainConfig object for the WLS domain that this cluster @@ -5975,8 +6355,10 @@

    S

     
    SHUTTING_DOWN_STATE - Static variable in interface oracle.kubernetes.operator.WebLogicConstants
     
    -
    SIT_CONFIG_MAP - Static variable in interface oracle.kubernetes.operator.ProcessingConstants
    -
     
    +
    SIT_CONFIG_FILE_PREFIX - Static variable in interface oracle.kubernetes.operator.IntrospectorConfigMapKeys
    +
    +
    The prefix for a number of keys which may appear in the introspector config map.
    +
    SIT_CONFIG_MAP_VOLUME - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
     
    size() - Method in class oracle.kubernetes.operator.helpers.ConfigMapConsumer
    @@ -6043,8 +6425,6 @@

    S

     
    StepContextBase - Class in oracle.kubernetes.operator.helpers
     
    -
    StepContextBase() - Constructor for class oracle.kubernetes.operator.helpers.StepContextBase
    -
     
    StepContextConstants - Interface in oracle.kubernetes.operator.helpers
     
    stop() - Method in class oracle.kubernetes.operator.rest.RestServer
    @@ -6057,6 +6437,8 @@

    S

    Stop namespace.
    +
    STORAGE_VOLUME - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
    +
     
    STORAGECLASSES - oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource
     
    SUBJECTACCESSREVIEWS - oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource
    @@ -6171,6 +6553,10 @@

    T

    toPodName(String, String) - Static method in class oracle.kubernetes.operator.helpers.LegalNames
     
    +
    TOPOLOGY_YAML - Static variable in interface oracle.kubernetes.operator.IntrospectorConfigMapKeys
    +
    +
    The topology generated from the WebLogic domain.
    +
    toResponse(Exception) - Method in class oracle.kubernetes.operator.rest.ExceptionMapper
     
    toServerServiceName(String, String) - Static method in class oracle.kubernetes.operator.helpers.LegalNames
    @@ -6181,16 +6567,16 @@

    T

     
    toString() - Method in class oracle.kubernetes.operator.helpers.ClusteredServerConfig
     
    -
    toString() - Method in class oracle.kubernetes.operator.helpers.ConfigMapHelper.DomainTopology
    -
    -
    to string.
    -
    toString() - Method in class oracle.kubernetes.operator.helpers.DomainConfig
     
    toString() - Method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo.ServerStartupInfo
     
    toString() - Method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo
     
    +
    toString() - Method in class oracle.kubernetes.operator.helpers.DomainTopology
    +
    +
    to string.
    +
    toString() - Method in class oracle.kubernetes.operator.helpers.KubernetesVersion
     
    toString() - Method in class oracle.kubernetes.operator.helpers.LastKnownStatus
    @@ -6199,6 +6585,8 @@

    T

     
    toString() - Method in class oracle.kubernetes.operator.helpers.ResourceVersion
     
    +
    toString() - Method in class oracle.kubernetes.operator.helpers.SemanticVersion
    +
     
    toString() - Method in class oracle.kubernetes.operator.helpers.ServerConfig
     
    toString() - Method in class oracle.kubernetes.operator.Pair
    @@ -6261,6 +6649,10 @@

    T

     
    toString() - Method in class oracle.kubernetes.weblogic.domain.model.ManagedServer
     
    +
    toString() - Method in class oracle.kubernetes.weblogic.domain.model.Model
    +
     
    +
    toString() - Method in class oracle.kubernetes.weblogic.domain.model.Opss
    +
     
    toString() - Method in class oracle.kubernetes.weblogic.domain.model.ProbeTuning
     
    toString() - Method in class oracle.kubernetes.weblogic.domain.model.Server
    @@ -6321,18 +6713,24 @@

    U

     
    UNKNOWN - oracle.kubernetes.operator.helpers.OperatorServiceType
     
    -
    UNKNOWN_STATE - Static variable in interface oracle.kubernetes.operator.WebLogicConstants
    -
     
    -
    UnprocessableEntityBuilder - Class in oracle.kubernetes.operator.calls.unprocessable
    +
    UNKNOWN - oracle.kubernetes.operator.rest.model.DomainActionType
     
    -
    UnprocessableEntityBuilder() - Constructor for class oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder
    +
    UNKNOWN_STATE - Static variable in interface oracle.kubernetes.operator.WebLogicConstants
     
    UnrecoverableErrorBuilder - Class in oracle.kubernetes.operator.calls
     
    UnrecoverableErrorBuilder() - Constructor for class oracle.kubernetes.operator.calls.UnrecoverableErrorBuilder
     
    +
    UnrecoverableErrorBuilderImpl - Class in oracle.kubernetes.operator.calls.unprocessable
    +
     
    +
    UnrecoverableErrorBuilderImpl() - Constructor for class oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl
    +
    +
    Create unrecoverable error builder.
    +
    update - oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation
     
    +
    updateForOwnerReference(V1ObjectMeta) - Method in class oracle.kubernetes.operator.helpers.StepContextBase
    +
     
    updateLastKnownServerStatus(String, String) - Method in class oracle.kubernetes.operator.helpers.DomainPresenceInfo
    Updates the last status reported for the specified server.
    @@ -6343,8 +6741,6 @@

    U

    Update the domain status synchronously.
    -
    useDomainStatusEndpoint - Static variable in class oracle.kubernetes.operator.Main
    -
     
    useKubernetesVersion(String) - Method in class oracle.kubernetes.json.SchemaGenerator
    Specifies the version of the Kubernetes schema to use.
    @@ -6399,6 +6795,18 @@

    V

    Returns the enum constant of this type with the specified name.
    +
    valueOf(String) - Static method in enum oracle.kubernetes.operator.ModelInImageDomainType
    +
    +
    Returns the enum constant of this type with the specified name.
    +
    +
    valueOf(String) - Static method in enum oracle.kubernetes.operator.OverrideDistributionStrategy
    +
    +
    Returns the enum constant of this type with the specified name.
    +
    +
    valueOf(String) - Static method in enum oracle.kubernetes.operator.rest.model.DomainActionType
    +
    +
    Returns the enum constant of this type with the specified name.
    +
    valueOf(String) - Static method in enum oracle.kubernetes.operator.ServerStartPolicy
    Returns the enum constant of this type with the specified name.
    @@ -6456,6 +6864,21 @@

    V

    Returns an array containing the constants of this enum type, in the order they are declared.
    +
    values() - Static method in enum oracle.kubernetes.operator.ModelInImageDomainType
    +
    +
    Returns an array containing the constants of this enum type, in +the order they are declared.
    +
    +
    values() - Static method in enum oracle.kubernetes.operator.OverrideDistributionStrategy
    +
    +
    Returns an array containing the constants of this enum type, in +the order they are declared.
    +
    +
    values() - Static method in enum oracle.kubernetes.operator.rest.model.DomainActionType
    +
    +
    Returns an array containing the constants of this enum type, in +the order they are declared.
    +
    values() - Static method in enum oracle.kubernetes.operator.ServerStartPolicy
    Returns an array containing the constants of this enum type, in @@ -6481,7 +6904,7 @@

    V

    Returns an array containing the constants of this enum type, in the order they are declared.
    -
    varsToSubVariables(List<V1EnvVar>) - Method in class oracle.kubernetes.operator.helpers.StepContextBase
    +
    varsToSubVariables(List<V1EnvVar>) - Method in class oracle.kubernetes.operator.helpers.BasePodStepContext
     
    VERIFY_ACCESS_DENIED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    @@ -6491,14 +6914,6 @@

    V

     
    VERIFY_K8S_MIN_VERSION - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    -
    VersionConstants - Interface in oracle.kubernetes.operator
    -
     
    -
    VersionHelper - Class in oracle.kubernetes.operator.helpers
    -
    -
    Helper methods for managing versions.
    -
    -
    VersionHelper() - Constructor for class oracle.kubernetes.operator.helpers.VersionHelper
    -
     
    VersionModel - Class in oracle.kubernetes.operator.rest.model
    VersionModel describes a version of the WebLogic operator REST api.
    @@ -6538,6 +6953,8 @@

    V

    W

    +
    WAIT_FOR_POD_READY - Static variable in interface oracle.kubernetes.operator.ProcessingConstants
    +
     
    waitForDelete(V1Pod, Step) - Method in interface oracle.kubernetes.operator.PodAwaiterStepFactory
    Waits until the Pod is deleted.
    @@ -6578,6 +6995,8 @@

    W

    Logs a message which requires parameters at the WARNING level with a logging filter applied.
    +
    wasInspectionRun() - Method in interface oracle.kubernetes.operator.MakeRightDomainOperation
    +
     
    watch - oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation
     
    WATCH_DOMAIN - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
    @@ -6586,6 +7005,8 @@

    W

     
    WATCH_EVENT - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    +
    watchBackstopRecheckDelay - Variable in class oracle.kubernetes.operator.TuningParameters.WatchTuning
    +
     
    WatchBuilder - Class in oracle.kubernetes.operator.builders
     
    WatchBuilder() - Constructor for class oracle.kubernetes.operator.builders.WatchBuilder
    @@ -6616,7 +7037,25 @@

    W

     
    WatchPodReadyAdminStep(PodAwaiterStepFactory, Step) - Constructor for class oracle.kubernetes.operator.steps.WatchPodReadyAdminStep
     
    -
    WatchTuning(int, int) - Constructor for class oracle.kubernetes.operator.TuningParameters.WatchTuning
    +
    WatchTuning(int, int, int) - Constructor for class oracle.kubernetes.operator.TuningParameters.WatchTuning
    +
    +
    Create watch tuning.
    +
    +
    WDT_CONFIG_MAP_VOLUME - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
    +
     
    +
    WDT_DOMAIN_TYPE - Static variable in class oracle.kubernetes.weblogic.domain.model.IntrospectorJobEnvVars
    +
    +
    The wdt domain type.
    +
    +
    WDT_ENCRYPT_KEY_MOUNT_PATH - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
    +
     
    +
    WDT_ENCRYPT_PASSPHRASE_VOLUME - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
    +
     
    +
    WDT_ENCRYPTION_PASSPHRASE_NAME - Static variable in class oracle.kubernetes.weblogic.domain.model.IntrospectorJobEnvVars
    +
    +
    The credentials used by the introspection job - wdt encryption passphrase.
    +
    +
    WDTCONFIGMAP_MOUNT_PATH - Static variable in interface oracle.kubernetes.operator.helpers.StepContextConstants
     
    WeblogicApi - Class in oracle.kubernetes.weblogic.domain.api
     
    @@ -6660,8 +7099,6 @@

    W

    Build with admin server.
    -
    withAdminServerName(String) - Method in class oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    -
     
    withAffinity(V1Affinity) - Method in interface oracle.kubernetes.weblogic.domain.ClusterConfigurator
     
    withAffinity(V1Affinity) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    @@ -6672,6 +7109,10 @@

    W

     
    withAffinity(V1Affinity) - Method in interface oracle.kubernetes.weblogic.domain.ServerConfigurator
     
    +
    withAllowReplicasBelowDynClusterSize(boolean) - Method in interface oracle.kubernetes.weblogic.domain.ClusterConfigurator
    +
     
    +
    withAllowReplicasBelowMinDynClusterSize(Boolean) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    +
     
    withAnnotation(String, String) - Method in interface oracle.kubernetes.weblogic.domain.NetworkAccessPointConfigurator
     
    withApiVersion(String) - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    @@ -6704,7 +7145,8 @@

    W

     
    withCluster(Cluster) - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    -
    Adds a Cluster to the DomainSpec.
    +
    /** + Adds a Cluster to the DomainSpec.
    withClusteredServerStartPolicy(String) - Method in class oracle.kubernetes.operator.helpers.ClusteredServerConfig
    @@ -6730,6 +7172,12 @@

    W

    Sets the configurations of the clusters in this domain.
    +
    withConfigMap(String) - Method in class oracle.kubernetes.weblogic.domain.model.Model
    +
     
    +
    withConfigOverrideDistributionStrategy(OverrideDistributionStrategy) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    +
     
    +
    withConfigOverrideDistributionStrategy(OverrideDistributionStrategy) - Method in class oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator
    +
     
    withConfigOverrides(String) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    Sets the WebLogic configuration overrides configmap name for the domain.
    @@ -6746,8 +7194,6 @@

    W

    withConfigOverrideSecrets(String...) - Method in class oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator
     
    -
    withConfiguration(Configuration) - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    -
     
    withContainer(V1Container) - Method in interface oracle.kubernetes.weblogic.domain.ClusterConfigurator
     
    withContainer(V1Container) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    @@ -6813,6 +7259,8 @@

    W

    withDefaultServerStartPolicy(String) - Method in class oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator
     
    +
    withDeleting(boolean) - Method in interface oracle.kubernetes.operator.MakeRightDomainOperation
    +
     
    withDesiredState(String) - Method in interface oracle.kubernetes.weblogic.domain.ClusterConfigurator
     
    withDesiredState(String) - Method in class oracle.kubernetes.weblogic.domain.model.ServerStatus
    @@ -6831,12 +7279,20 @@

    W

    withDomainHomeInImage(boolean) - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
     
    +
    withDomainHomeSourceType(DomainSourceType) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    +
     
    +
    withDomainType(String) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    +
    +
    Add domain type for the domain resource.
    +
    +
    withDomainType(String) - Method in class oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator
    +
     
    +
    withDomainType(String) - Method in class oracle.kubernetes.weblogic.domain.model.Model
    +
     
    withDomainUid(String) - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    Domain unique identifier.
    -
    withDynamicWlsCluster(String, String...) - Method in class oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    -
     
    withEnv(List<V1EnvVar>) - Method in class oracle.kubernetes.operator.helpers.ClusteredServerConfig
     
    withEnv(List<V1EnvVar>) - Method in class oracle.kubernetes.operator.helpers.NonClusteredServerConfig
    @@ -6863,6 +7319,8 @@

    W

     
    withEnvironmentVariable(String, String) - Method in interface oracle.kubernetes.weblogic.domain.ServerConfigurator
     
    +
    withExplicitRecheck() - Method in interface oracle.kubernetes.operator.MakeRightDomainOperation
    +
     
    withFieldSelector(String) - Method in class oracle.kubernetes.operator.builders.WatchBuilder
    Sets a value for the fieldSelector parameter for the call that will set up this watch.
    @@ -6877,6 +7335,11 @@

    W

    ServerHealth describes the current status and health of a specific WebLogic Server.
    +
    withHttpAccessLogInLogHome(boolean) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    +
    +
    Sets whether to write server HTTP access log files to the directory specified in + logHome.
    +
    withImage(String) - Method in class oracle.kubernetes.operator.helpers.ClusteredServerConfig
     
    withImage(String) - Method in class oracle.kubernetes.operator.helpers.NonClusteredServerConfig
    @@ -6914,6 +7377,18 @@

    W

     
    withInitContainer(V1Container) - Method in interface oracle.kubernetes.weblogic.domain.ServerConfigurator
     
    +
    withIntrospectorJobActiveDeadlineSeconds(long) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    +
    +
    Add the introspector job active deadline.
    +
    +
    withIntrospectorJobActiveDeadlineSeconds(long) - Method in class oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator
    +
     
    +
    withIntrospectVersion(String) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    +
    +
    Tells the operator to start the introspect domain job.
    +
    +
    withIntrospectVersion(String) - Method in class oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator
    +
     
    withIsAdminServer(boolean) - Method in class oracle.kubernetes.weblogic.domain.model.ServerStatus
    Boolean indication whether this server is the admin server.
    @@ -6986,6 +7461,10 @@

    W

    Sets the log home enabled flag.
    +
    withMaxConcurrentStartup(Integer) - Method in interface oracle.kubernetes.weblogic.domain.ClusterConfigurator
    +
     
    +
    withMaxConcurrentStartup(Integer) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    +
     
    withMaximumReplicas(Integer) - Method in class oracle.kubernetes.weblogic.domain.model.ClusterStatus
     
    withMaxReplicas(int) - Method in class oracle.kubernetes.operator.helpers.ClusterConfig
    @@ -6994,7 +7473,7 @@

    W

    withMaxUnavailable(int) - Method in interface oracle.kubernetes.weblogic.domain.ClusterConfigurator
     
    -
    withMessage(String) - Method in class oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder
    +
    withMessage(String) - Method in class oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl
     
    withMessage(String) - Method in class oracle.kubernetes.weblogic.domain.model.DomainCondition
    @@ -7018,6 +7497,12 @@

    W

    Sets the desired minimum number of managed servers running in this cluster.
    +
    withModelConfigMap(String) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    +
    +
    Add WDT model config map for the domain resource.
    +
    +
    withModelConfigMap(String) - Method in class oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator
    +
     
    withNodeName(String) - Method in interface oracle.kubernetes.weblogic.domain.ClusterConfigurator
     
    withNodeName(String) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    @@ -7058,6 +7543,22 @@

    W

    withOperatorLabels(String, V1ObjectMeta) - Static method in class oracle.kubernetes.operator.helpers.KubernetesUtils
     
    +
    withOpssKeyPassPhrase(V1SecretReference) - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    +
    +
    Reference to secret containing WebLogic startup credentials user name and password.
    +
    +
    withOpssWalletFileSecret(String) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    +
    +
    Add OPSS wallet file secret for the domain resource.
    +
    +
    withOpssWalletFileSecret(String) - Method in class oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator
    +
     
    +
    withOpssWalletPasswordSecret(String) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    +
    +
    Add OPSS wallet password secret for the domain resource.
    +
    +
    withOpssWalletPasswordSecret(String) - Method in class oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator
    +
     
    withOverallHealth(String) - Method in class oracle.kubernetes.weblogic.domain.model.ServerHealth
    Server health of this WebLogic server.
    @@ -7121,7 +7622,7 @@

    W

     
    withReason(String) - Method in class oracle.kubernetes.operator.calls.unprocessable.Cause
     
    -
    withReason(String) - Method in class oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder
    +
    withReason(String) - Method in class oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl
    Build with reason.
    @@ -7212,6 +7713,14 @@

    W

     
    withRuntimeClassName(String) - Method in interface oracle.kubernetes.weblogic.domain.ServerConfigurator
     
    +
    withRuntimeEncryptionSecret(String) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    +
    +
    Add model runtime encryption secret for the domain resource.
    +
    +
    withRuntimeEncryptionSecret(String) - Method in class oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator
    +
     
    +
    withRuntimeEncryptionSecret(String) - Method in class oracle.kubernetes.weblogic.domain.model.Model
    +
     
    withSchedulerName(String) - Method in interface oracle.kubernetes.weblogic.domain.ClusterConfigurator
     
    withSchedulerName(String) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    @@ -7246,7 +7755,7 @@

    W

    withServers(List<ServerStatus>) - Method in class oracle.kubernetes.weblogic.domain.model.DomainStatus
    -
    Status of WebLogic servers in this domain.
    +
    Status of WebLogic Servers in this domain.
    withServers(Map<String, ClusteredServerConfig>) - Method in class oracle.kubernetes.operator.helpers.ClusterConfig
    @@ -7304,7 +7813,7 @@

    W

    withStatus(String) - Method in class oracle.kubernetes.weblogic.domain.model.DomainCondition
    -
    Status is the status of the condition.
    +
    The status of the condition.
    withStatus(DomainStatus) - Method in class oracle.kubernetes.weblogic.domain.model.Domain
    @@ -7342,9 +7851,13 @@

    W

    build with type label.
    +
    withWalletFileSecret(String) - Method in class oracle.kubernetes.weblogic.domain.model.Opss
    +
     
    +
    withWalletPasswordSecret(String) - Method in class oracle.kubernetes.weblogic.domain.model.Opss
    +
     
    withWebLogicCredentialsSecret(V1SecretReference) - Method in class oracle.kubernetes.weblogic.domain.model.DomainSpec
    -
    Reference to secret containing WebLogic startup credentials username and password.
    +
    Reference to secret containing WebLogic startup credentials user name and password.
    withWebLogicCredentialsSecret(String, String) - Method in class oracle.kubernetes.weblogic.domain.DomainConfigurator
    @@ -7352,9 +7865,7 @@

    W

    withWebLogicCredentialsSecret(String, String) - Method in class oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator
     
    -
    withWlsCluster(String, String...) - Method in class oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    -
     
    -
    withWlsServer(String, Integer) - Method in class oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    +
    WLS - oracle.kubernetes.operator.ModelInImageDomainType
     
    WLS_CLUSTER_SIZE_UPDATED - Static variable in class oracle.kubernetes.operator.logging.MessageKeys
     
    @@ -7404,10 +7915,6 @@

    W

    Constructor.
    -
    WlsDomainConfigSupport - Class in oracle.kubernetes.operator.utils
    -
     
    -
    WlsDomainConfigSupport(String) - Constructor for class oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    -
     
    WlsDynamicServerConfig - Class in oracle.kubernetes.operator.wlsconfig
    Contains configuration of a WLS server that belongs to a dynamic cluster.
    @@ -7459,7 +7966,7 @@

    Y

    YamlDocGenerator(Map<String, Object>) - Constructor for class oracle.kubernetes.json.YamlDocGenerator
     
    -A B C D E F G H I J K L M N O P Q R S T U V W Y 
    All Classes All Packages
    +A B C D E F G H I J K L M N O P Q R S T U V W Y 
    All Classes|All Packages

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/index.html b/docs/apidocs/index.html index 970dde02d7b..2287f98ec86 100644 --- a/docs/apidocs/index.html +++ b/docs/apidocs/index.html @@ -2,10 +2,10 @@ - -Overview (weblogic-kubernetes-operator 2.6.0 API) + +Overview (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +
    -

    weblogic-kubernetes-operator 2.6.0 API

    +

    weblogic-kubernetes-operator 3.0.0 API

    @@ -233,5 +228,7 @@

    weblogic-kubernetes-operator 2.6.0 API

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/member-search-index.js b/docs/apidocs/member-search-index.js index fd6892770d5..5961051eef7 100644 --- a/docs/apidocs/member-search-index.js +++ b/docs/apidocs/member-search-index.js @@ -1 +1 @@ -memberSearchIndex = [{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"ACCESS_LOG_IN_LOG_HOME"},{"p":"oracle.kubernetes.operator.rest","c":"AuthenticationFilter","l":"ACCESS_TOKEN_PREFIX"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"addActionLink(LinkContainerModel, String)","url":"addActionLink(oracle.kubernetes.operator.rest.model.LinkContainerModel,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"addActionLink(String, String)","url":"addActionLink(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"addCluster(ClusterStatus)","url":"addCluster(oracle.kubernetes.weblogic.domain.model.ClusterStatus)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"addCondition(DomainCondition)","url":"addCondition(oracle.kubernetes.weblogic.domain.model.DomainCondition)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"addDefaultEnvVarIfMissing(List, String, String)","url":"addDefaultEnvVarIfMissing(java.util.List,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"ErrorBody","l":"addDetails()"},{"p":"oracle.kubernetes.operator.utils","c":"WlsDomainConfigSupport","l":"addDynamicWlsCluster(String, String...)","url":"addDynamicWlsCluster(java.lang.String,java.lang.String...)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"addEnvVar(List, String, String)","url":"addEnvVar(java.util.List,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"addExternalSchema(URL, URL)","url":"addExternalSchema(java.net.URL,java.net.URL)"},{"p":"oracle.kubernetes.operator.rest.model","c":"CollectionModel","l":"addItem(T)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"addLink(LinkContainerModel, String)","url":"addLink(oracle.kubernetes.operator.rest.model.LinkContainerModel,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"addLink(String, String)","url":"addLink(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"addLink(String, String, String)","url":"addLink(java.lang.String,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"addNetworkAccessPoint(NetworkAccessPoint)","url":"addNetworkAccessPoint(oracle.kubernetes.operator.wlsconfig.NetworkAccessPoint)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"addNetworkAccessPoint(String, int)","url":"addNetworkAccessPoint(java.lang.String,int)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"addOrReplaceEnvVar(List, String, String)","url":"addOrReplaceEnvVar(java.util.List,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"addSelfAndParentLinks(LinkContainerModel)","url":"addSelfAndParentLinks(oracle.kubernetes.operator.rest.model.LinkContainerModel)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"addSelfAndParentLinks(String, String)","url":"addSelfAndParentLinks(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"addSelfLinks(String)","url":"addSelfLinks(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"addServer(ServerStatus)","url":"addServer(oracle.kubernetes.weblogic.domain.model.ServerStatus)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"addServerConfig(WlsServerConfig)","url":"addServerConfig(oracle.kubernetes.operator.wlsconfig.WlsServerConfig)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"addSubsystem(SubsystemHealth)","url":"addSubsystem(oracle.kubernetes.weblogic.domain.model.SubsystemHealth)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"addToPresence(DomainPresenceInfo, V1Service)","url":"addToPresence(oracle.kubernetes.operator.helpers.DomainPresenceInfo,io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"addValidationWarning(String)","url":"addValidationWarning(java.lang.String)"},{"p":"oracle.kubernetes.operator.utils","c":"WlsDomainConfigSupport","l":"addWlsCluster(String, String...)","url":"addWlsCluster(java.lang.String,java.lang.String...)"},{"p":"oracle.kubernetes.operator.utils","c":"WlsDomainConfigSupport","l":"addWlsServer(String)","url":"addWlsServer(java.lang.String)"},{"p":"oracle.kubernetes.operator.utils","c":"WlsDomainConfigSupport","l":"addWlsServer(String, Integer)","url":"addWlsServer(java.lang.String,java.lang.Integer)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"addWlsServer(String, String, int)","url":"addWlsServer(java.lang.String,java.lang.String,int)"},{"p":"oracle.kubernetes.operator","c":"ServerStartState","l":"ADMIN"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"ADMIN_NAME"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"ADMIN_ONLY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ADMIN_POD_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ADMIN_POD_EXISTS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ADMIN_POD_PATCHED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ADMIN_POD_REPLACED"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"ADMIN_PORT"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"ADMIN_PORT_SECURE"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretHelper","l":"ADMIN_SERVER_CREDENTIALS_PASSWORD"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretHelper","l":"ADMIN_SERVER_CREDENTIALS_USERNAME"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ADMIN_SERVICE_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ADMIN_SERVICE_EXISTS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ADMIN_SERVICE_REPLACED"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"ADMIN_STATE"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"AdminServer()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"AdminService()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"ALL_READ_AND_EXECUTE"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"ALL_STOPPED_AVAILABLE_REASON"},{"p":"oracle.kubernetes.operator","c":"ImagePullPolicy","l":"Always"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"ALWAYS"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"ALWAYS_IMAGEPULLPOLICY"},{"p":"oracle.kubernetes.operator.helpers","c":"AnnotationHelper","l":"AnnotationHelper()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"APIEXCEPTION_FROM_SUBJECT_ACCESS_REVIEW"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"APIEXCEPTION_FROM_TOKEN_REVIEW"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"APP_LABEL"},{"p":"oracle.kubernetes.operator.calls","c":"AsyncRequestStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.http","c":"HttpAsyncRequestStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.http","c":"HttpResponseStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"AbstractListStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"BeforeAdminServiceStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ClusterServicesStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ConfigMapAfterStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"DeleteDomainStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"DomainPresenceStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServerUpAfterStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServerUpIteratorStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServersUpStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ReadHealthStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ServerDownIteratorStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ServerDownStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"WatchDomainIntrospectorJobReadyStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"WatchPodReadyAdminStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"AS_SERVICE_NAME"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ASYNC_FAILURE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ASYNC_NO_RETRY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ASYNC_REQUEST"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ASYNC_RETRY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ASYNC_SUCCESS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ASYNC_TIMEOUT"},{"p":"oracle.kubernetes.operator.calls","c":"AsyncRequestStep","l":"AsyncRequestStep(ResponseStep, RequestParams, CallFactory, ClientPool, int, int, String, String, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.helpers.ResponseStep,oracle.kubernetes.operator.calls.RequestParams,oracle.kubernetes.operator.calls.CallFactory,oracle.kubernetes.operator.helpers.ClientPool,int,int,java.lang.String,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"augmentSubVars(Map)","url":"augmentSubVars(java.util.Map)"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"augmentSubVars(Map)","url":"augmentSubVars(java.util.Map)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodStepContext","l":"augmentSubVars(Map)","url":"augmentSubVars(java.util.Map)"},{"p":"oracle.kubernetes.operator.rest","c":"FilterPriorities","l":"AUTHENTICATION_FILTER_PRIORITY"},{"p":"oracle.kubernetes.operator.rest","c":"AuthenticationFilter","l":"AuthenticationFilter()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthenticationProxy","l":"AuthenticationProxy()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"Authenticator()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"Authenticator(ApiClient)","url":"%3Cinit%3E(io.kubernetes.client.openapi.ApiClient)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy","l":"AuthorizationProxy()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainConditionType","l":"Available"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"BAD_VOLUME_MOUNT_PATH"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"BaseConfiguration()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest","c":"BaseDebugLoggingFilter","l":"BaseDebugLoggingFilter()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"BaseModel","l":"BaseModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"BasePodStepContext()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"BaseResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.operator.steps","c":"BeforeAdminServiceStep","l":"BeforeAdminServiceStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"body"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnprocessableEntityBuilder","l":"build()"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"call"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CALL_FAILED"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"CallBuilder()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilderFactory","l":"CallBuilderFactory()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.CallBuilderTuning","l":"CallBuilderTuning(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.CallBuilderTuning","l":"callMaxRetryCount"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.CallBuilderTuning","l":"callRequestLimit"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.CallBuilderTuning","l":"callTimeoutSeconds"},{"p":"oracle.kubernetes.operator.calls","c":"CallWrapper","l":"CallWrapper(Call)","url":"%3Cinit%3E(okhttp3.Call)"},{"p":"oracle.kubernetes.operator.calls","c":"CallWrapper","l":"cancel()"},{"p":"oracle.kubernetes.operator.calls","c":"CancellableCall","l":"cancel()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"cancel(boolean)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFilter","l":"canLog(LoggingFilter, String)","url":"canLog(oracle.kubernetes.operator.logging.LoggingFilter,java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFilter","l":"canLog(String)","url":"canLog(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"OncePerMessageLoggingFilter","l":"canLog(String)","url":"canLog(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CANNOT_CREATE_TOKEN_REVIEW"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CANNOT_EXPOSE_DEFAULT_CHANNEL_ISTIO"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CANNOT_PARSE_INTROSPECTOR_FILE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CANNOT_PARSE_INTROSPECTOR_RESULT"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CANNOT_PARSE_TOPOLOGY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CANNOT_START_DOMAIN_AFTER_MAX_RETRIES"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"Cause","l":"Cause()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.utils","c":"Certificates","l":"Certificates()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"chain(Step...)","url":"chain(oracle.kubernetes.operator.work.Step...)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"Channel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy","l":"check(AuthorizationProxy.Operation, AuthorizationProxy.Resource, String, AuthorizationProxy.Scope, String)","url":"check(oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation,oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource,java.lang.String,oracle.kubernetes.operator.helpers.AuthorizationProxy.Scope,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"HealthCheckHelper","l":"check(List, AuthorizationProxy.Resource, AuthorizationProxy.Operation)","url":"check(java.util.List,oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource,oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy","l":"check(String, AuthorizationProxy.Operation, AuthorizationProxy.Resource, String, AuthorizationProxy.Scope, String)","url":"check(java.lang.String,oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation,oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource,java.lang.String,oracle.kubernetes.operator.helpers.AuthorizationProxy.Scope,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy","l":"check(String, List, AuthorizationProxy.Operation, AuthorizationProxy.Resource, String, AuthorizationProxy.Scope, String)","url":"check(java.lang.String,java.util.List,oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation,oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource,java.lang.String,oracle.kubernetes.operator.helpers.AuthorizationProxy.Scope,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthenticationProxy","l":"check(String, String)","url":"check(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"CLASS"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"clear()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"clearValidationWarnings()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClientPool","l":"ClientPool()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"clone()"},{"p":"oracle.kubernetes.operator.builders","c":"WatchImpl","l":"close()"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"closeClient(ApiClient)","url":"closeClient(io.kubernetes.client.openapi.ApiClient)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Scope","l":"cluster"},{"p":"oracle.kubernetes.operator.helpers","c":"OperatorServiceType","l":"CLUSTER"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"CLUSTER_IP_TYPE"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"CLUSTER_NAME"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CLUSTER_SERVICE_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CLUSTER_SERVICE_EXISTS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CLUSTER_SERVICE_REPLACED"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"Cluster()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"ClusterConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"CLUSTERED_SERVER_START_POLICY_ALWAYS"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"CLUSTERED_SERVER_START_POLICY_IF_NEEDED"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"CLUSTERED_SERVER_START_POLICY_NEVER"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"ClusteredServerConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ClusterModel","l":"ClusterModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ClusterModel","l":"ClusterModel(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"CLUSTERNAME_LABEL"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ClusterResource","l":"ClusterResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"CLUSTERRESTARTVERSION_LABEL"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"clusters"},{"p":"oracle.kubernetes.operator.steps","c":"ClusterServicesStep","l":"ClusterServicesStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"ClusterSpec()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"ClusterSpecCommonImpl(DomainSpec, Cluster)","url":"%3Cinit%3E(oracle.kubernetes.weblogic.domain.model.DomainSpec,oracle.kubernetes.weblogic.domain.model.Cluster)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ClustersResource","l":"ClustersResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"ClusterStatus()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CM_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CM_EXISTS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CM_REPLACED"},{"p":"oracle.kubernetes.operator.rest.model","c":"CollectionModel","l":"CollectionModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.utils","c":"OperatorUtils","l":"compareSortingStrings(String, String)","url":"compareSortingStrings(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"compareTo(Channel)","url":"compareTo(oracle.kubernetes.weblogic.domain.model.Channel)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"compareTo(Cluster)","url":"compareTo(oracle.kubernetes.weblogic.domain.model.Cluster)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"compareTo(ClusterStatus)","url":"compareTo(oracle.kubernetes.weblogic.domain.model.ClusterStatus)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"compareTo(DomainCondition)","url":"compareTo(oracle.kubernetes.weblogic.domain.model.DomainCondition)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"compareTo(ManagedServer)","url":"compareTo(oracle.kubernetes.weblogic.domain.model.ManagedServer)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"compareTo(ResourceVersion)","url":"compareTo(oracle.kubernetes.operator.helpers.ResourceVersion)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"compareTo(ServerStatus)","url":"compareTo(oracle.kubernetes.weblogic.domain.model.ServerStatus)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"compareTo(SubsystemHealth)","url":"compareTo(oracle.kubernetes.weblogic.domain.model.SubsystemHealth)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"complete()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"config(String)","url":"config(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"config(String, Object...)","url":"config(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"config(String, Throwable)","url":"config(java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.steps","c":"ConfigMapAfterStep","l":"ConfigMapAfterStep(String, Map, TuningParameters.WatchTuning, AtomicBoolean, WatchListener)","url":"%3Cinit%3E(java.lang.String,java.util.Map,oracle.kubernetes.operator.TuningParameters.WatchTuning,java.util.concurrent.atomic.AtomicBoolean,oracle.kubernetes.operator.watcher.WatchListener)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"ConfigMapConsumer(ScheduledExecutorService, String, Runnable)","url":"%3Cinit%3E(java.util.concurrent.ScheduledExecutorService,java.lang.String,java.lang.Runnable)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"CONFIGMAPS"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretType","l":"ConfigOverride"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"Configuration()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain","c":"ConfigurationNotSupportedException","l":"ConfigurationNotSupportedException(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"configureAdminServer()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"configureAdminServer()"},{"p":"oracle.kubernetes.weblogic.domain","c":"AdminServerConfigurator","l":"configureAdminService()"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"configureCluster(String)","url":"configureCluster(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"configureCluster(String)","url":"configureCluster(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"configureServer(String)","url":"configureServer(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"configureServer(String)","url":"configureServer(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"CONTAINER_NAME"},{"p":"oracle.kubernetes.operator.work","c":"Container","l":"Container()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"ContainerResolver","l":"ContainerResolver()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"containsCluster(String)","url":"containsCluster(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"containsKey(Object)","url":"containsKey(java.lang.Object)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"containsServer(String)","url":"containsServer(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"containsValue(Object)","url":"containsValue(java.lang.Object)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"convertArraysForLogging(Object, boolean)","url":"convertArraysForLogging(java.lang.Object,boolean)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"COULD_NOT_CREATE_LIVENESS_FILE"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"CRD_NAME"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"CRDS"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"create"},{"p":"oracle.kubernetes.operator","c":"OperatorReady","l":"create()"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilderFactory","l":"create()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClientPool","l":"create()"},{"p":"oracle.kubernetes.operator.helpers","c":"Pool","l":"create()"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExecFactory","l":"create(ApiClient, V1Pod, String)","url":"create(io.kubernetes.client.openapi.ApiClient,io.kubernetes.client.openapi.models.V1Pod,java.lang.String)"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExecFactoryImpl","l":"create(ApiClient, V1Pod, String)","url":"create(io.kubernetes.client.openapi.ApiClient,io.kubernetes.client.openapi.models.V1Pod,java.lang.String)"},{"p":"oracle.kubernetes.operator.http","c":"HttpAsyncRequestStep","l":"create(HttpRequest, HttpResponseStep)","url":"create(java.net.http.HttpRequest,oracle.kubernetes.operator.http.HttpResponseStep)"},{"p":"oracle.kubernetes.operator.rest","c":"RestServer","l":"create(RestConfig)","url":"create(oracle.kubernetes.operator.rest.RestConfig)"},{"p":"oracle.kubernetes.json","c":"KubernetesSchemaReference","l":"create(String)","url":"create(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"create(String)","url":"create(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"EventWatcher","l":"create(ThreadFactory, String, String, String, TuningParameters.WatchTuning, WatchListener, AtomicBoolean)","url":"create(java.util.concurrent.ThreadFactory,java.lang.String,java.lang.String,java.lang.String,oracle.kubernetes.operator.TuningParameters.WatchTuning,oracle.kubernetes.operator.watcher.WatchListener,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"oracle.kubernetes.operator","c":"JobWatcher","l":"create(ThreadFactory, String, String, TuningParameters.WatchTuning, AtomicBoolean)","url":"create(java.util.concurrent.ThreadFactory,java.lang.String,java.lang.String,oracle.kubernetes.operator.TuningParameters.WatchTuning,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"oracle.kubernetes.operator","c":"DomainWatcher","l":"create(ThreadFactory, String, String, TuningParameters.WatchTuning, WatchListener, AtomicBoolean)","url":"create(java.util.concurrent.ThreadFactory,java.lang.String,java.lang.String,oracle.kubernetes.operator.TuningParameters.WatchTuning,oracle.kubernetes.operator.watcher.WatchListener,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"oracle.kubernetes.operator","c":"ConfigMapWatcher","l":"create(ThreadFactory, String, String, TuningParameters.WatchTuning, WatchListener, AtomicBoolean)","url":"create(java.util.concurrent.ThreadFactory,java.lang.String,java.lang.String,oracle.kubernetes.operator.TuningParameters.WatchTuning,oracle.kubernetes.operator.watcher.WatchListener,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"oracle.kubernetes.operator","c":"PodWatcher","l":"create(ThreadFactory, String, String, TuningParameters.WatchTuning, WatchListener, AtomicBoolean)","url":"create(java.util.concurrent.ThreadFactory,java.lang.String,java.lang.String,oracle.kubernetes.operator.TuningParameters.WatchTuning,oracle.kubernetes.operator.watcher.WatchListener,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"oracle.kubernetes.operator","c":"ServiceWatcher","l":"create(ThreadFactory, String, String, TuningParameters.WatchTuning, WatchListener, AtomicBoolean)","url":"create(java.util.concurrent.ThreadFactory,java.lang.String,java.lang.String,oracle.kubernetes.operator.TuningParameters.WatchTuning,oracle.kubernetes.operator.watcher.WatchListener,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"oracle.kubernetes.operator","c":"NamespaceWatcher","l":"create(ThreadFactory, String, TuningParameters.WatchTuning, WatchListener, AtomicBoolean)","url":"create(java.util.concurrent.ThreadFactory,java.lang.String,oracle.kubernetes.operator.TuningParameters.WatchTuning,oracle.kubernetes.operator.watcher.WatchListener,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"createAdminPodStep(Step)","url":"createAdminPodStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"createAdminService()"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"createAvailableStep(String, Step)","url":"createAvailableStep(java.lang.String,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createBetaCustomResourceDefinitionAsync(V1beta1CustomResourceDefinition, ResponseStep)","url":"createBetaCustomResourceDefinitionAsync(io.kubernetes.client.openapi.models.V1beta1CustomResourceDefinition,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.work","c":"AsyncFiber","l":"createChildFiber()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"createChildFiber()"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"createClientByServiceAccountName(String)","url":"createClientByServiceAccountName(java.lang.String)"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"createClientByServiceAccountName(String, String)","url":"createClientByServiceAccountName(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"createClientByToken(String)","url":"createClientByToken(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createConfigMapAsync(String, V1ConfigMap, ResponseStep)","url":"createConfigMapAsync(java.lang.String,io.kubernetes.client.openapi.models.V1ConfigMap,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"createConfigMapWatch(String)","url":"createConfigMapWatch(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"createContainer(TuningParameters)","url":"createContainer(oracle.kubernetes.operator.TuningParameters)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodStepContext","l":"createContainer(TuningParameters)","url":"createContainer(oracle.kubernetes.operator.TuningParameters)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"createContainer(TuningParameters)","url":"createContainer(oracle.kubernetes.operator.TuningParameters)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createCustomResourceDefinitionAsync(V1CustomResourceDefinition, ResponseStep)","url":"createCustomResourceDefinitionAsync(io.kubernetes.client.openapi.models.V1CustomResourceDefinition,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"CREATEDBYOPERATOR_LABEL"},{"p":"oracle.kubernetes.operator.utils","c":"WlsDomainConfigSupport","l":"createDomainConfig()"},{"p":"oracle.kubernetes.operator.helpers","c":"CrdHelper","l":"createDomainCrdStep(KubernetesVersion, Step)","url":"createDomainCrdStep(oracle.kubernetes.operator.helpers.KubernetesVersion,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"JobHelper","l":"createDomainIntrospectorJobStep(Step)","url":"createDomainIntrospectorJobStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.steps","c":"DomainPresenceStep","l":"createDomainPresenceStep(Domain, Step, Step)","url":"createDomainPresenceStep(oracle.kubernetes.weblogic.domain.model.Domain,oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainValidationSteps","l":"createDomainValidationSteps(String, Step)","url":"createDomainValidationSteps(java.lang.String,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"createDomainWatch(String)","url":"createDomainWatch(java.lang.String)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"createEventWatch(String)","url":"createEventWatch(java.lang.String)"},{"p":"oracle.kubernetes.operator.calls","c":"UnrecoverableErrorBuilder","l":"createExceptionFromFailedCall(CallResponse)","url":"createExceptionFromFailedCall(oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"createFailedStep(CallResponse, Step)","url":"createFailedStep(oracle.kubernetes.operator.calls.CallResponse,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"createFailedStep(String, String, Step)","url":"createFailedStep(java.lang.String,java.lang.String,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"createFailure(RequestParams, ApiException, int)","url":"createFailure(oracle.kubernetes.operator.calls.RequestParams,io.kubernetes.client.openapi.ApiException,int)"},{"p":"oracle.kubernetes.operator.work","c":"Engine","l":"createFiber()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"createFiberGate()"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"createFor(Domain)","url":"createFor(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"createFor(Domain)","url":"createFor(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.operator.work","c":"Component","l":"createFor(Object...)","url":"createFor(java.lang.Object...)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"createForClusterStep(Step)","url":"createForClusterStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"createForExternalServiceStep(Step)","url":"createForExternalServiceStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"createForServerStep(boolean, Step)","url":"createForServerStep(boolean,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"createForServerStep(Step)","url":"createForServerStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.http","c":"HttpAsyncRequestStep","l":"createGetRequest(String, HttpResponseStep)","url":"createGetRequest(java.lang.String,oracle.kubernetes.operator.http.HttpResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createJobAsync(String, V1Job, ResponseStep)","url":"createJobAsync(java.lang.String,io.kubernetes.client.openapi.models.V1Job,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"createJobWatch(String)","url":"createJobWatch(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"createManagedPodStep(Step)","url":"createManagedPodStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodStepContext","l":"createMetadata()"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createNamespace(V1Namespace)","url":"createNamespace(io.kubernetes.client.openapi.models.V1Namespace)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"createNamespacedDomain(String, Domain, String)","url":"createNamespacedDomain(java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"createNamespacedDomainAsync(String, Domain, String, ApiCallback)","url":"createNamespacedDomainAsync(java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"createNamespacedDomainCall(String, Domain, String, ApiCallback)","url":"createNamespacedDomainCall(java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"createNamespacedDomainWithHttpInfo(String, Domain, String)","url":"createNamespacedDomainWithHttpInfo(java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,java.lang.String)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"createNamespacesWatch()"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"createNull()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"createPatchFrom(JsonPatchBuilder, DomainStatus)","url":"createPatchFrom(javax.json.JsonPatchBuilder,oracle.kubernetes.weblogic.domain.model.DomainStatus)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createPodAsync(String, V1Pod, ResponseStep)","url":"createPodAsync(java.lang.String,io.kubernetes.client.openapi.models.V1Pod,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"createPodSpec(TuningParameters)","url":"createPodSpec(oracle.kubernetes.operator.TuningParameters)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"createPodSpec(TuningParameters)","url":"createPodSpec(oracle.kubernetes.operator.TuningParameters)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"createPodWatch(String)","url":"createPodWatch(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"createProgressingStep(String, boolean, Step)","url":"createProgressingStep(java.lang.String,boolean,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.steps","c":"ReadHealthStep","l":"createReadHealthStep(Step)","url":"createReadHealthStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"AsyncRequestStepFactory","l":"createRequestAsync(ResponseStep, RequestParams, CallFactory, ClientPool, int, int, String, String, String)","url":"createRequestAsync(oracle.kubernetes.operator.helpers.ResponseStep,oracle.kubernetes.operator.calls.RequestParams,oracle.kubernetes.operator.calls.CallFactory,oracle.kubernetes.operator.helpers.ClientPool,int,int,java.lang.String,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper","l":"createScriptConfigMapStep(String, String)","url":"createScriptConfigMapStep(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createSecret(String, V1Secret)","url":"createSecret(java.lang.String,io.kubernetes.client.openapi.models.V1Secret)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createSelfSubjectAccessReview(V1SelfSubjectAccessReview)","url":"createSelfSubjectAccessReview(io.kubernetes.client.openapi.models.V1SelfSubjectAccessReview)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createSelfSubjectRulesReview(V1SelfSubjectRulesReview)","url":"createSelfSubjectRulesReview(io.kubernetes.client.openapi.models.V1SelfSubjectRulesReview)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createSelfSubjectRulesReviewAsync(V1SelfSubjectRulesReview, ResponseStep)","url":"createSelfSubjectRulesReviewAsync(io.kubernetes.client.openapi.models.V1SelfSubjectRulesReview,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createServiceAsync(String, V1Service, ResponseStep)","url":"createServiceAsync(java.lang.String,io.kubernetes.client.openapi.models.V1Service,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"createServiceWatch(String)","url":"createServiceWatch(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper","l":"createSitConfigMapStep(Step)","url":"createSitConfigMapStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.utils","c":"OperatorUtils","l":"createSortedMap(Map)","url":"createSortedMap(java.util.Map)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodStepContext","l":"createSpec(TuningParameters)","url":"createSpec(oracle.kubernetes.operator.TuningParameters)"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"createStatusUpdateStep(Step)","url":"createStatusUpdateStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createSubjectAccessReview(V1SubjectAccessReview)","url":"createSubjectAccessReview(io.kubernetes.client.openapi.models.V1SubjectAccessReview)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createSubjectAccessReviewAsync(V1SubjectAccessReview, ResponseStep)","url":"createSubjectAccessReviewAsync(io.kubernetes.client.openapi.models.V1SubjectAccessReview,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"createSuccess(RequestParams, R, int)","url":"createSuccess(oracle.kubernetes.operator.calls.RequestParams,R,int)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createTokenReview(V1TokenReview)","url":"createTokenReview(io.kubernetes.client.openapi.models.V1TokenReview)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainValidationSteps","l":"createValidateDomainTopologyStep(Step)","url":"createValidateDomainTopologyStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder.WatchFactory","l":"createWatch(Pool, CallParams, Class, BiFunction)","url":"createWatch(oracle.kubernetes.operator.helpers.Pool,oracle.kubernetes.operator.builders.CallParams,java.lang.Class,java.util.function.BiFunction)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CREATING_API_CLIENT"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CREATING_CRD"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"CREDENTIALS_SECRET_NAME"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"CRONJOBS"},{"p":"oracle.kubernetes.operator.rest","c":"FilterPriorities","l":"CSRF_PROTECTION_FILTER_PRIORITY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CURRENT_STEPS"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"current()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CYCLING_POD"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CYCLING_SERVERS"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"DATA_HOME"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"DEBUG_CM_MOUNTS_PATH"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"DEBUG_CM_VOLUME"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE"},{"p":"oracle.kubernetes.operator","c":"VersionConstants","l":"DEFAULT_DOMAIN_VERSION"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DEFAULT_HTTP_ACCESS_LOG_IN_LOG_HOME"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"DEFAULT_IGNORESESSIONS"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DEFAULT_IMAGE"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DEFAULT_INCLUDE_SERVER_OUT_IN_POD_LOG"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"DEFAULT_TIMEOUT"},{"p":"oracle.kubernetes.operator.steps","c":"DefaultResponseStep","l":"DefaultResponseStep()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.steps","c":"DefaultResponseStep","l":"DefaultResponseStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.steps","c":"DefaultResponseStep","l":"DefaultResponseStep(Step, Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"defineClasspath(URL...)","url":"defineClasspath(java.net.URL...)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"defineClasspath(URL...)","url":"defineClasspath(java.net.URL...)"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"defineSchemaUrlAndContents(URL, URL)","url":"defineSchemaUrlAndContents(java.net.URL,java.net.URL)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"defineSchemaUrlAndContents(URL, URL)","url":"defineSchemaUrlAndContents(java.net.URL,java.net.URL)"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"delay(Step, Packet, long, TimeUnit)","url":"delay(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,long,java.util.concurrent.TimeUnit)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"delete"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"deletecollection"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"deleteCollectionPodAsync(String, ResponseStep)","url":"deleteCollectionPodAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"deleteConfigMapAsync(String, String, V1DeleteOptions, ResponseStep)","url":"deleteConfigMapAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper","l":"deleteDomainIntrospectorConfigMapStep(String, String, Step)","url":"deleteDomainIntrospectorConfigMapStep(java.lang.String,java.lang.String,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"JobHelper","l":"deleteDomainIntrospectorJobStep(Step)","url":"deleteDomainIntrospectorJobStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.steps","c":"DeleteDomainStep","l":"DeleteDomainStep(DomainPresenceInfo, String, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.helpers.DomainPresenceInfo,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"deleteFromEvent(DomainPresenceInfo, V1Service)","url":"deleteFromEvent(oracle.kubernetes.operator.helpers.DomainPresenceInfo,io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"deleteJobAsync(String, String, V1DeleteOptions, ResponseStep)","url":"deleteJobAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"deleteNamespacedDomain(String, String, V1DeleteOptions, Integer, Boolean, String)","url":"deleteNamespacedDomain(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,java.lang.Integer,java.lang.Boolean,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"deleteNamespacedDomainAsync(String, String, V1DeleteOptions, Integer, Boolean, String, ApiCallback)","url":"deleteNamespacedDomainAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,java.lang.Integer,java.lang.Boolean,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"deleteNamespacedDomainCall(String, String, V1DeleteOptions, Integer, Boolean, String, ApiCallback)","url":"deleteNamespacedDomainCall(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,java.lang.Integer,java.lang.Boolean,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"deleteNamespacedDomainWithHttpInfo(String, String, V1DeleteOptions, Integer, Boolean, String)","url":"deleteNamespacedDomainWithHttpInfo(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,java.lang.Integer,java.lang.Boolean,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"deletePodAsync(String, String, V1DeleteOptions, ResponseStep)","url":"deletePodAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"deletePodStep(String, Step)","url":"deletePodStep(java.lang.String,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"deleteSecret(String, String, V1DeleteOptions)","url":"deleteSecret(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"deleteServerPodFromEvent(String, V1Pod)","url":"deleteServerPodFromEvent(java.lang.String,io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"deleteService(String, String, V1DeleteOptions)","url":"deleteService(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"deleteServiceAsync(String, String, V1DeleteOptions, ResponseStep)","url":"deleteServiceAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"deleteServicesStep(String, Step)","url":"deleteServicesStep(java.lang.String,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.rest","c":"RestServer","l":"destroy()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"dispatchConfigMapWatch(Watch.Response)","url":"dispatchConfigMapWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"dispatchConfigMapWatch(Watch.Response)","url":"dispatchConfigMapWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"dispatchDomainWatch(Watch.Response)","url":"dispatchDomainWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"dispatchDomainWatch(Watch.Response)","url":"dispatchDomainWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"dispatchEventWatch(Watch.Response)","url":"dispatchEventWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"dispatchEventWatch(Watch.Response)","url":"dispatchEventWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"dispatchPodWatch(Watch.Response)","url":"dispatchPodWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"dispatchPodWatch(Watch.Response)","url":"dispatchPodWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"dispatchServiceWatch(Watch.Response)","url":"dispatchServiceWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"dispatchServiceWatch(Watch.Response)","url":"dispatchServiceWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"DNS_1123_FIELDS_PARAM"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"doContinueList(Packet)","url":"doContinueList(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"doDeepSubstitution(Map, T)","url":"doDeepSubstitution(java.util.Map,T)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"doDeepSubstitution(Map, T, boolean)","url":"doDeepSubstitution(java.util.Map,T,boolean)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doDelay(Packet, long, TimeUnit)","url":"doDelay(oracle.kubernetes.operator.work.Packet,long,java.util.concurrent.TimeUnit)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doDelay(Step, Packet, long, TimeUnit)","url":"doDelay(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,long,java.util.concurrent.TimeUnit)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doEnd(Packet)","url":"doEnd(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doForkAtLeastOne(Step, Packet, Collection)","url":"doForkAtLeastOne(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,java.util.Collection)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doForkJoin(Step, Packet, Collection)","url":"doForkJoin(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,java.util.Collection)"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"DOMAIN_COMPONENT_NAME"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_CONFIG_MAP_NAME"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_DEBUG_CONFIG_MAP_SUFFIX"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_GROUP"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"DOMAIN_HOME"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"DOMAIN_INTROSPECTOR_JOB"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"DOMAIN_INTROSPECTOR_LOG_RESULT"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"DOMAIN_NAME"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_PATH"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_PLURAL"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"DOMAIN_RESTART_VERSION"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_SCALE_PATH"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_SHORT"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_SINGULAR"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"DOMAIN_SOURCE_TYPE"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_SPECIFIC_PATH"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"DOMAIN_STATUS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"DOMAIN_STATUS_IGNORED"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_STATUS_PATH"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"DOMAIN_TOPOLOGY"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"DOMAIN_UID"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"DOMAIN_UID_UNIQUENESS_FAILED"},{"p":"oracle.kubernetes.operator","c":"VersionConstants","l":"DOMAIN_V1"},{"p":"oracle.kubernetes.operator","c":"VersionConstants","l":"DOMAIN_V2"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"DOMAIN_VALIDATION_FAILED"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_VERSION"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"Domain()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"DomainCommonConfigurator()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"DomainCondition(DomainConditionType)","url":"%3Cinit%3E(oracle.kubernetes.weblogic.domain.model.DomainConditionType)"},{"p":"oracle.kubernetes.operator.rest","c":"Scan","l":"domainConfig"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"DomainConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"DomainConfigurator()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"DomainConfigurator(Domain)","url":"%3Cinit%3E(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfiguratorFactory","l":"DomainConfiguratorFactory()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"DOMAINHOME_LABEL"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"DomainList()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainModel","l":"DomainModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainModel","l":"DomainModel(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"DOMAINNAME_LABEL"},{"p":"oracle.kubernetes.operator","c":"DomainPresence","l":"DomainPresence()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"domainPresenceFailureRetryMaxCount"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"domainPresenceFailureRetrySeconds"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"DomainPresenceInfo(Domain)","url":"%3Cinit%3E(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"DomainPresenceInfo(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"domainPresenceRecheckIntervalSeconds"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"DomainProcessorImpl(DomainProcessorDelegate)","url":"%3Cinit%3E(oracle.kubernetes.operator.DomainProcessorDelegate)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"DomainResource","l":"DomainResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"DOMAINRESTARTVERSION_LABEL"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"DOMAINS"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"domainSpec"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"DomainSpec()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"DomainsResource","l":"DomainsResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"DomainStatus()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"DomainStatus(DomainStatus)","url":"%3Cinit%3E(oracle.kubernetes.weblogic.domain.model.DomainStatus)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"DOMAINSTATUSES"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper.DomainTopology","l":"DomainTopology()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"DOMAINUID_LABEL"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainValidationSteps","l":"DomainValidationSteps()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doNext(Packet)","url":"doNext(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doNext(Step, Packet)","url":"doNext(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.calls","c":"RetryStrategy","l":"doPotentialRetry(Step, Packet, int)","url":"doPotentialRetry(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,int)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doRetry(Packet, long, TimeUnit)","url":"doRetry(oracle.kubernetes.operator.work.Packet,long,java.util.concurrent.TimeUnit)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doSuspend(Consumer)","url":"doSuspend(java.util.function.Consumer)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doSuspend(Step, Consumer)","url":"doSuspend(oracle.kubernetes.operator.work.Step,java.util.function.Consumer)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doTerminate(Throwable, Packet)","url":"doTerminate(java.lang.Throwable,oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"DUPLICATE_CLUSTER_NAME_FOUND"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"DUPLICATE_SERVER_NAME_FOUND"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"ENCODED_CREDENTIALS"},{"p":"oracle.kubernetes.operator.work","c":"Engine","l":"Engine(ScheduledExecutorService)","url":"%3Cinit%3E(java.util.concurrent.ScheduledExecutorService)"},{"p":"oracle.kubernetes.operator.work","c":"Engine","l":"Engine(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator.work","c":"ThreadLocalContainerResolver","l":"enterContainer(Container)","url":"enterContainer(oracle.kubernetes.operator.work.Container)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"entering()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"entering(Object...)","url":"entering(java.lang.Object...)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"entrySet()"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"entrySet()"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"ENVVARS"},{"p":"oracle.kubernetes.operator","c":"Pair","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.CallBuilderTuning","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.WatchTuning","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesVersion","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Server","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerService","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.rest","c":"FilterPriorities","l":"ERROR_FILTER_PRIORITY"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"ErrorBody","l":"ErrorBody()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest","c":"ErrorFilter","l":"ErrorFilter()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"ErrorModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"ErrorModel(int, String)","url":"%3Cinit%3E(int,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"EVENTS"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"eventualLongDelay"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"EXCEPTION"},{"p":"oracle.kubernetes.operator.rest","c":"ExceptionMapper","l":"ExceptionMapper()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"EXEC"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExec","l":"exec(String...)","url":"exec(java.lang.String...)"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExecFactoryImpl.KubernetesExecImpl","l":"exec(String...)","url":"exec(java.lang.String...)"},{"p":"oracle.kubernetes.json.mojo","c":"JsonSchemaMojo","l":"execute()"},{"p":"oracle.kubernetes.operator.calls","c":"SynchronousCallFactory","l":"execute(ApiClient, RequestParams)","url":"execute(io.kubernetes.client.openapi.ApiClient,oracle.kubernetes.operator.calls.RequestParams)"},{"p":"oracle.kubernetes.operator.calls","c":"SynchronousCallDispatcher","l":"execute(SynchronousCallFactory, RequestParams, Pool)","url":"execute(oracle.kubernetes.operator.calls.SynchronousCallFactory,oracle.kubernetes.operator.calls.RequestParams,oracle.kubernetes.operator.helpers.Pool)"},{"p":"oracle.kubernetes.operator.work","c":"ThreadLocalContainerResolver","l":"exitContainer(Container)","url":"exitContainer(oracle.kubernetes.operator.work.Container)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"exiting()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"exiting(Object)","url":"exiting(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"OperatorServiceType","l":"EXTERNAL"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"EXTERNAL_CHANNEL_SERVICE_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"EXTERNAL_CHANNEL_SERVICE_EXISTS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"EXTERNAL_CHANNEL_SERVICE_REPLACED"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainConditionType","l":"Failed"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"FAILED_NOT_RESTARTABLE_STATE"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"FAILURE_THRESHOLD"},{"p":"oracle.kubernetes.operator.calls","c":"FailureStatusSourceException","l":"FailureStatusSourceException(FailureStatusSource)","url":"%3Cinit%3E(oracle.kubernetes.operator.calls.FailureStatusSource)"},{"p":"oracle.kubernetes.operator.calls","c":"FailureStatusSourceException","l":"FailureStatusSourceException(FailureStatusSource, Exception)","url":"%3Cinit%3E(oracle.kubernetes.operator.calls.FailureStatusSource,java.lang.Exception)"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"FIBER_COMPONENT_NAME"},{"p":"oracle.kubernetes.operator.work","c":"FiberGate","l":"FiberGate(Engine)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Engine)"},{"p":"oracle.kubernetes.operator.rest","c":"BaseDebugLoggingFilter","l":"FILTER_REQUEST_ENTITY"},{"p":"oracle.kubernetes.operator.rest","c":"BaseDebugLoggingFilter","l":"FILTER_REQUEST_START_TIME"},{"p":"oracle.kubernetes.operator.rest","c":"AuthenticationFilter","l":"filter(ContainerRequestContext)","url":"filter(javax.ws.rs.container.ContainerRequestContext)"},{"p":"oracle.kubernetes.operator.rest","c":"RequestDebugLoggingFilter","l":"filter(ContainerRequestContext)","url":"filter(javax.ws.rs.container.ContainerRequestContext)"},{"p":"oracle.kubernetes.operator.rest","c":"ErrorFilter","l":"filter(ContainerRequestContext, ContainerResponseContext)","url":"filter(javax.ws.rs.container.ContainerRequestContext,javax.ws.rs.container.ContainerResponseContext)"},{"p":"oracle.kubernetes.operator.rest","c":"ResponseDebugLoggingFilter","l":"filter(ContainerRequestContext, ContainerResponseContext)","url":"filter(javax.ws.rs.container.ContainerRequestContext,javax.ws.rs.container.ContainerResponseContext)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"findEnvVar(List, String)","url":"findEnvVar(java.util.List,java.lang.String)"},{"p":"oracle.kubernetes.operator.authentication","c":"Helpers","l":"findServiceAccount(String, String)","url":"findServiceAccount(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.authentication","c":"Helpers","l":"findServiceAccountByToken(String)","url":"findServiceAccountByToken(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"fine(String)","url":"fine(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"fine(String, Object...)","url":"fine(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"fine(String, Throwable)","url":"fine(java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"finer(String)","url":"finer(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"finer(String, Object...)","url":"finer(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"finer(String, Throwable)","url":"finer(java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"finest(String)","url":"finest(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"finest(String, Object...)","url":"finest(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"finest(String, Throwable)","url":"finest(java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"FORCE_SUSPENDING_STATE"},{"p":"oracle.kubernetes.operator","c":"ShutdownType","l":"Forced"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"forCluster()"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"forDomain()"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfiguratorFactory","l":"forDomain(Domain)","url":"forDomain(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"forDomainUidSelector(String)","url":"forDomainUidSelector(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFormatter","l":"format(LogRecord)","url":"format(java.util.logging.LogRecord)"},{"p":"oracle.kubernetes.operator.rest","c":"BaseDebugLoggingFilter","l":"formatEntity(MediaType, String)","url":"formatEntity(javax.ws.rs.core.MediaType,java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"formatMessage(String, Object...)","url":"formatMessage(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.rest","c":"BaseDebugLoggingFilter","l":"formatTime(long)"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"forServer()"},{"p":"oracle.kubernetes.operator.calls","c":"OtherUnrecoverableErrorBuilder","l":"fromFailedCall(CallResponse)","url":"fromFailedCall(oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.calls","c":"UnrecoverableErrorBuilder","l":"fromFailedCall(CallResponse)","url":"fromFailedCall(oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnprocessableEntityBuilder","l":"fromFailedCall(CallResponse)","url":"fromFailedCall(oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"generate(Class)","url":"generate(java.lang.Class)"},{"p":"oracle.kubernetes.operator.calls","c":"CallFactory","l":"generate(RequestParams, ApiClient, String, ApiCallback)","url":"generate(oracle.kubernetes.operator.calls.RequestParams,io.kubernetes.client.openapi.ApiClient,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.json","c":"YamlDocGenerator","l":"generate(String)","url":"generate(java.lang.String)"},{"p":"oracle.kubernetes.json","c":"YamlDocGenerator","l":"generate(String, Map)","url":"generate(java.lang.String,java.util.Map)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"generateDynamicServerConfigs(WlsServerConfig, String, String)","url":"generateDynamicServerConfigs(oracle.kubernetes.operator.wlsconfig.WlsServerConfig,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"generateMarkdown(String, File, Map)","url":"generateMarkdown(java.lang.String,java.io.File,java.util.Map)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"generateMarkdown(String, File, Map)","url":"generateMarkdown(java.lang.String,java.io.File,java.util.Map)"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"generateSchema(String, File)","url":"generateSchema(java.lang.String,java.io.File)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"generateSchema(String, File)","url":"generateSchema(java.lang.String,java.io.File)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"get"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ClusterResource","l":"get()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ClustersResource","l":"get()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"DomainResource","l":"get()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"DomainsResource","l":"get()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"SwaggerResource","l":"get()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"VersionResource","l":"get()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"VersionsResource","l":"get()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"get()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"get(long, TimeUnit)","url":"get(long,java.util.concurrent.TimeUnit)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"get(Object)","url":"get(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getAdditionalVolumeMounts()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getAdditionalVolumeMounts()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getAdditionalVolumeMounts()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getAdditionalVolumes()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getAdditionalVolumes()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getAdditionalVolumes()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getAdminPort()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getAdminProtocolChannelName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getAdminServer()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"getAdminServerChannelNames()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getAdminServerName()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"getAdminServerSpec()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getAdminServerSpec()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"getAdminService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServerSpec","l":"getAdminService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServerSpecCommonImpl","l":"getAdminService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getAffinity()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getAffinity()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getAffinity()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getAffinity()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getAffinity()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getAffinity()"},{"p":"oracle.kubernetes.operator.authentication","c":"Helpers","l":"getAllServiceAccounts()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"getAnnotations()"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"getApiClient()"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getApiClient()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"getApiGroup()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getApiVersion()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"getApiVersion()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"getBackend()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getBackend(String)","url":"getBackend(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getBackend(String)","url":"getBackend(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getCalculatedListenPorts()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters","l":"getCallBuilderTuning()"},{"p":"oracle.kubernetes.operator","c":"TuningParametersImpl","l":"getCallBuilderTuning()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"getChannel(String)","url":"getChannel(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"getChannelName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"getChannelNames()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"getChannels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"getChannels()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ClusterModel","l":"getCluster()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getCluster(String)","url":"getCluster(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getClusterAnnotations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getClusterAnnotations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getClusterAnnotations()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getClusterConfig(String)","url":"getClusterConfig(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getClusterConfigs()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"getClusteredServerStartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getClusterLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getClusterLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getClusterLabels()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"getClusterName()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"getClusterName()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"getClusterName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getClusterName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getClusterName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getClusterName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"getClusterName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"getClusterName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getClusterName(String)","url":"getClusterName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"getClusterName(V1Service)","url":"getClusterName(io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getClusterNames()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"WlsDomain","l":"getClusterNames()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ClustersResource","l":"getClusterResource(String)","url":"getClusterResource(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getClusterRestartVersion()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getClusterRestartVersion()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"getClusters()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getClusters()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"getClusters()"},{"p":"oracle.kubernetes.operator.rest","c":"RestBackendImpl","l":"getClusters(String)","url":"getClusters(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.backend","c":"RestBackend","l":"getClusters(String)","url":"getClusters(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getClusterService()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getClusterService(String)","url":"getClusterService(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getClusterSize()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"getClusterSpec(String)","url":"getClusterSpec(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"DomainResource","l":"getClustersResource()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"getCompletionCallback()"},{"p":"oracle.kubernetes.operator.work","c":"ComponentRegistry","l":"getComponents()"},{"p":"oracle.kubernetes.operator.work","c":"Container","l":"getComponents()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"getComponents()"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"getComponents()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"getConditions()"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper.SitConfigMapContext","l":"getConfigMapName(String)","url":"getConfigMapName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getConfigOverrides()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getConfigOverrideSecrets()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getConfiguration()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Server","l":"getConfiguration()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getConfiguredClusters()"},{"p":"oracle.kubernetes.operator.work","c":"ContainerResolver","l":"getContainer()"},{"p":"oracle.kubernetes.operator.work","c":"ThreadLocalContainerResolver","l":"getContainer()"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"getContainer(V1Pod)","url":"getContainer(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"getContainer(V1PodSpec)","url":"getContainer(io.kubernetes.client.openapi.models.V1PodSpec)"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getContainerCommand()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodStepContext","l":"getContainerCommand()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getContainerName()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodStepContext","l":"getContainerName()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"getContainerRequestContext()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getContainers()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodStepContext","l":"getContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getContainerSecurityContext()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getContainerSecurityContext()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getContainerSecurityContext()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"getContextClassLoader()"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"getCreatedbyOperatorSelector()"},{"p":"oracle.kubernetes.operator.work","c":"FiberGate","l":"getCurrentFibers()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"getCurrentIfSet()"},{"p":"oracle.kubernetes.utils","c":"SystemClock","l":"getCurrentTime()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getDataHome()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getDataHome()"},{"p":"oracle.kubernetes.operator.work","c":"ContainerResolver","l":"getDefault()"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"getDefaultPolicy()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"getDesiredState()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getDesiredState()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getDesiredState()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"getDesiredState()"},{"p":"oracle.kubernetes.operator.calls","c":"AsyncRequestStep","l":"getDetail()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"getDetail()"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServerUpIteratorStep","l":"getDetail()"},{"p":"oracle.kubernetes.operator.steps","c":"ServerDownIteratorStep","l":"getDetail()"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"getDetail()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"ErrorBody","l":"getDetails()"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper.DomainTopology","l":"getDomain()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getDomain()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getDomainHome()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getDomainHome()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getDomainHomeSourceType()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getDomainHomeSourceType()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"DomainsResource","l":"getDomainResource(String)","url":"getDomainResource(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getDomainRestartVersion()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getDomainRestartVersion()"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"getDomainSpec()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"VersionResource","l":"getDomainsResource()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getDomainUid()"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainModel","l":"getDomainUid()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getDomainUid()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getDomainUid()"},{"p":"oracle.kubernetes.operator.rest","c":"RestBackendImpl","l":"getDomainUids()"},{"p":"oracle.kubernetes.operator.rest.backend","c":"RestBackend","l":"getDomainUids()"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper.DomainTopology","l":"getDomainValid()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getDynamicClusterSize()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getDynamicClusterSize()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getDynamicServersConfig()"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"getE()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getEffectiveLogHome()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"getEnabled()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"getEnv()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getEnv()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"getEnvironment()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getEnvironmentVariables()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getEnvironmentVariables()"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"getExceptionString()"},{"p":"oracle.kubernetes.operator.work","c":"Engine","l":"getExecutor()"},{"p":"oracle.kubernetes.operator.work","c":"FiberGate","l":"getExecutor()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getExternalHttpsPort()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getExternalHttpsPort()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getExternalService(String)","url":"getExternalService(java.lang.String)"},{"p":"oracle.kubernetes.operator.calls","c":"FailureStatusSourceException","l":"getFailureStatusSource()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"Cause","l":"getField()"},{"p":"oracle.kubernetes.operator.builders","c":"CallParams","l":"getFieldSelector()"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"getHeadersString()"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"getHelper()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getHost()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getHost()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"getHref()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"getIgnoreSessions()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"getImage()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getImage()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getImage()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getImage()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"getImagePullPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getImagePullPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getImagePullPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getImagePullPolicy()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"getImagePullSecrets()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getImagePullSecrets()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getImagePullSecrets()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getImagePullSecrets()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getInitContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getInitContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getInitContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getInitContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getInitContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"getInitialDelaySeconds()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters","l":"getInstance()"},{"p":"oracle.kubernetes.operator","c":"TuningParametersImpl","l":"getInstance()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClientPool","l":"getInstance()"},{"p":"oracle.kubernetes.operator.rest","c":"RestServer","l":"getInstance()"},{"p":"oracle.kubernetes.operator.work","c":"ContainerResolver","l":"getInstance()"},{"p":"oracle.kubernetes.operator.work","c":"ThreadFactorySingleton","l":"getInstance()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getInternalHttpsPort()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getInternalHttpsPort()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"getIstio()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getIstioReadinessPort()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getIstioReadinessPort()"},{"p":"oracle.kubernetes.operator.rest.model","c":"CollectionModel","l":"getItems()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"getItems()"},{"p":"oracle.kubernetes.operator.work","c":"Container","l":"getIterableSpi(Class)","url":"getIterableSpi(java.lang.Class)"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"getIterableSpi(Class)","url":"getIterableSpi(java.lang.Class)"},{"p":"oracle.kubernetes.operator.work","c":"ComponentEx","l":"getIterableSpi(Class)","url":"getIterableSpi(java.lang.Class)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFactory","l":"getJson()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getKind()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"getKind()"},{"p":"oracle.kubernetes.json","c":"KubernetesSchemaReference","l":"getKubernetesSchemaCacheUrl()"},{"p":"oracle.kubernetes.json","c":"YamlDocGenerator","l":"getKubernetesSchemaMarkdown()"},{"p":"oracle.kubernetes.json","c":"YamlDocGenerator","l":"getKubernetesSchemaMarkdownFile()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"getLabels()"},{"p":"oracle.kubernetes.operator.builders","c":"CallParams","l":"getLabelSelector()"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"getLabelSelector()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getLastKnownServerStatus(String)","url":"getLastKnownServerStatus(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"getLastProbeTime()"},{"p":"oracle.kubernetes.operator.rest","c":"Scan","l":"getLastScanTime()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"getLastTransitionTime()"},{"p":"oracle.kubernetes.operator","c":"Pair","l":"getLeft()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"getLevel()"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"getLifecycle()"},{"p":"oracle.kubernetes.operator.rest.backend","c":"VersionUtils","l":"getLifecycle(String)","url":"getLifecycle(java.lang.String)"},{"p":"oracle.kubernetes.operator.builders","c":"CallParams","l":"getLimit()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"getLinks()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getListenAddress()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"getListenPort()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getListenPort()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getLivenessProbe()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getLivenessProbe()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getLivenessProbe()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getLocalAdminProtocolChannelPort()"},{"p":"oracle.kubernetes.operator.rest","c":"BaseDebugLoggingFilter","l":"getLoggableHeaders(ContainerRequestContext)","url":"getLoggableHeaders(javax.ws.rs.container.ContainerRequestContext)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFactory","l":"getLogger(String, String)","url":"getLogger(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getMachineConfig(String)","url":"getMachineConfig(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getMachineConfigs()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getMachineName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getMachineNameMatchExpression()"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"getMainContainerName()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getMainContainerName()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters","l":"getMainTuning()"},{"p":"oracle.kubernetes.operator","c":"TuningParametersImpl","l":"getMainTuning()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ScaleClusterParamsModel","l":"getManagedServerCount()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getManagedServers()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getMaxClusterSize()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getMaxDynamicClusterSize()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getMaxDynamicClusterSize()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"getMaxReplicas()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"getMaxUnavailable(String)","url":"getMaxUnavailable(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getMaxUnavailable(String)","url":"getMaxUnavailable(java.lang.String)"},{"p":"oracle.kubernetes.operator.calls","c":"FailureStatusSource","l":"getMessage()"},{"p":"oracle.kubernetes.operator.calls","c":"OtherUnrecoverableErrorBuilder","l":"getMessage()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"Cause","l":"getMessage()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"ErrorBody","l":"getMessage()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnprocessableEntityBuilder","l":"getMessage()"},{"p":"oracle.kubernetes.weblogic.domain","c":"ConfigurationNotSupportedException","l":"getMessage()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"getMessage()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"getMessage()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainValidationFailure","l":"getMessage()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getMetadata()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"getMetadata()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getMinAvailable(String)","url":"getMinAvailable(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getMinClusterSize()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getMinDynamicClusterSize()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getMinDynamicClusterSize()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"getMinReplicas()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"getName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"getName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsMachineConfig","l":"getName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getName()"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"getName()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getNamespace()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getNamespace()"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomain(String, String)","url":"getNamespacedDomain(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainAsync(String, String, ApiCallback)","url":"getNamespacedDomainAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainCall(String, String, ApiCallback)","url":"getNamespacedDomainCall(java.lang.String,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainScale(String, String)","url":"getNamespacedDomainScale(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainScaleAsync(String, String, ApiCallback)","url":"getNamespacedDomainScaleAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainScaleCall(String, String, ApiCallback)","url":"getNamespacedDomainScaleCall(java.lang.String,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainScaleWithHttpInfo(String, String)","url":"getNamespacedDomainScaleWithHttpInfo(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainStatus(String, String)","url":"getNamespacedDomainStatus(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainStatusAsync(String, String, ApiCallback)","url":"getNamespacedDomainStatusAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainStatusCall(String, String, ApiCallback)","url":"getNamespacedDomainStatusCall(java.lang.String,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainStatusWithHttpInfo(String, String)","url":"getNamespacedDomainStatusWithHttpInfo(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainWithHttpInfo(String, String)","url":"getNamespacedDomainWithHttpInfo(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getNetworkAccessPoints()"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"getNext()"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"getNext()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsMachineConfig","l":"getNodeManagerListenAddress()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsMachineConfig","l":"getNodeManagerListenPort()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsMachineConfig","l":"getNodeManagerType()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getNodeName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getNodeName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getNodeName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getNodeName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getNodeName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getNodeName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"getNodeName()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"getNodePort()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"getNodePort()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getNodeSelectors()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getNodeSelectors()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getNodeSelectors()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorExternalCertificateData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorExternalCertificateData()"},{"p":"oracle.kubernetes.operator.utils","c":"Certificates","l":"getOperatorExternalCertificateData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorExternalCertificateFile()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorExternalCertificateFile()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorExternalKeyData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorExternalKeyData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorExternalKeyFile()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorExternalKeyFile()"},{"p":"oracle.kubernetes.operator.utils","c":"Certificates","l":"getOperatorExternalKeyFile()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorInternalCertificateData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorInternalCertificateData()"},{"p":"oracle.kubernetes.operator.utils","c":"Certificates","l":"getOperatorInternalCertificateData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorInternalCertificateFile()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorInternalCertificateFile()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorInternalKeyData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorInternalKeyData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorInternalKeyFile()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorInternalKeyFile()"},{"p":"oracle.kubernetes.operator.utils","c":"Certificates","l":"getOperatorInternalKeyFile()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"getOperatorNamespace()"},{"p":"oracle.kubernetes.operator","c":"JobWatcher","l":"getOrCreateFor(Domain)","url":"getOrCreateFor(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"getOverallHealth()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"getPacket()"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"getPacket()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"getParent()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"getPathSegment()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"getPeriodSeconds()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getPodAnnotations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getPodAnnotations()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"getPodAwaiterStepFactory(String)","url":"getPodAwaiterStepFactory(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"getPodDomainUid(V1Pod)","url":"getPodDomainUid(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getPodLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getPodLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getPodSecurityContext()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getPodSecurityContext()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getPodSecurityContext()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"getPodServerName(V1Pod)","url":"getPodServerName(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters","l":"getPodTuning()"},{"p":"oracle.kubernetes.operator","c":"TuningParametersImpl","l":"getPodTuning()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"getPrefix()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"getPrerelease()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"getPrereleaseVersion()"},{"p":"oracle.kubernetes.operator.builders","c":"CallParams","l":"getPretty()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getPriorityClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getPriorityClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getPriorityClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getPriorityClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getPriorityClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getPriorityClassName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"getProtocol()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"getPublicPort()"},{"p":"oracle.kubernetes.operator.helpers","c":"Pool","l":"getQueue()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getReadinessGates()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getReadinessGates()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getReadinessGates()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getReadinessGates()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getReadinessGates()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getReadinessGates()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"getReadinessPort()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getReadinessProbe()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getReadinessProbe()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getReadinessProbe()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"getReadyStatus(V1Pod)","url":"getReadyStatus(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator.calls","c":"FailureStatusSource","l":"getReason()"},{"p":"oracle.kubernetes.operator.calls","c":"OtherUnrecoverableErrorBuilder","l":"getReason()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"Cause","l":"getReason()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnprocessableEntityBuilder","l":"getReason()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"getReason()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"getReason()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainValidationFailure","l":"getReason()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"getRel()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"getReplicaCount(String)","url":"getReplicaCount(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getReplicaCount(String)","url":"getReplicaCount(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getReplicaLimit(String)","url":"getReplicaLimit(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"WlsDomain","l":"getReplicaLimit(String)","url":"getReplicaLimit(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"getReplicas()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getReplicas()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"getReplicas()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getReplicas()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"getReplicas()"},{"p":"oracle.kubernetes.operator.calls","c":"AsyncRequestStep","l":"getRequestParams()"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"getRequestParams()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"getResource()"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"getResource(String)","url":"getResource(java.lang.String)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"getResource(String)","url":"getResource(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"getResourceBundle()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getResources()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getResources()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getResources()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getResources()"},{"p":"oracle.kubernetes.operator.builders","c":"CallParams","l":"getResourceVersion()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"getRestartedLabel()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getRestartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getRestartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getRestartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getRestartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getRestartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getRestartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getRestartVersion()"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"getResult()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getRetrieveServersSearchPayload()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getRetrieveServersSearchUrl()"},{"p":"oracle.kubernetes.operator","c":"Pair","l":"getRight()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"getRoot()"},{"p":"oracle.kubernetes.operator","c":"NamespaceStatus","l":"getRulesReviewStatus()"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServersUpStep","l":"getRunningServers(DomainPresenceInfo)","url":"getRunningServers(oracle.kubernetes.operator.helpers.DomainPresenceInfo)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getRuntimeClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getRuntimeClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getRuntimeClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getRuntimeClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getRuntimeClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getRuntimeClassName()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ClusterResource","l":"getScaleClusterResource()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getSchedulerName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getSchedulerName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getSchedulerName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getSchedulerName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getSchedulerName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getSchedulerName()"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretHelper","l":"getSecretData(SecretType, String, String, Step)","url":"getSecretData(oracle.kubernetes.operator.helpers.SecretType,java.lang.String,java.lang.String,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getServer(String, String)","url":"getServer(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getServerConfig(String)","url":"getServerConfig(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getServerConfigs()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getServerConfigs()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getServerConfigs()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"getServerName()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"getServerName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"getServerName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"getServerName()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"getServerName(V1Service)","url":"getServerName(io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getServerNamePrefix()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getServerNames()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getServerPod(String)","url":"getServerPod(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getServerPods()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getServerRestartVersion()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getServerRestartVersion()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"getServers()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"getServers()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getServers()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getServers()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getServers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"getServers()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getServerService(String)","url":"getServerService(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"getServerSpec(String, String)","url":"getServerSpec(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getServerStartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getServerStartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getServerStartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Server","l":"getServerStartPolicy()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getServerStartupInfo()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getServerTemplate()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getServerTemplateName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getServerTemplates()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getServiceAccountName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getServiceAccountName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getServiceAccountName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getServiceAccountName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getServiceAccountName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getServiceAnnotations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getServiceAnnotations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getServiceAnnotations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getServiceAnnotations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getServiceAnnotations()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"getServiceDomainUid(V1Service)","url":"getServiceDomainUid(io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getServiceLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getServiceLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getServiceLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getServiceLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getServiceLabels()"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"getServiceToken()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getShutdown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getShutdown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getShutdown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getShutdown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getShutdown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"getShutdownType()"},{"p":"oracle.kubernetes.utils","c":"OperatorUtils","l":"getSortingString(String)","url":"getSortingString(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getSpec()"},{"p":"oracle.kubernetes.operator.work","c":"Component","l":"getSpi(Class)","url":"getSpi(java.lang.Class)"},{"p":"oracle.kubernetes.operator.work","c":"Container","l":"getSpi(Class)","url":"getSpi(java.lang.Class)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"getSpi(Class)","url":"getSpi(java.lang.Class)"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"getSpi(Class)","url":"getSpi(java.lang.Class)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getSslListenPort()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"getState()"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"getStatus()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"getStatus()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getStatus()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"getStatus()"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"getStatusCode()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"getSubjectRulesReviewStatus(String)","url":"getSubjectRulesReviewStatus(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"getSubResource()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"getSubsystems()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"getSuspendedStep()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"VersionResource","l":"getSwaggerResource()"},{"p":"oracle.kubernetes.operator.work","c":"Step.MultiThrowable","l":"getThrowables()"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"getTime()"},{"p":"oracle.kubernetes.operator.builders","c":"CallParams","l":"getTimeoutSeconds()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"getTimeoutSeconds()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"getTimeoutSeconds()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"getTitle()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"getTitle()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getTolerations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getTolerations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getTolerations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getTolerations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getTolerations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getTolerations()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"getType()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"getType()"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"getUnchangedCount()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"getUnderlyingLogger()"},{"p":"oracle.kubernetes.operator.helpers","c":"ConflictRetry","l":"getUpdatedObject()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getUpdateDynamicClusterSizePayload(int)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getUpdateDynamicClusterSizeUrl()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"getUriInfo()"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper.DomainTopology","l":"getValidationErrors()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getValidationFailures(KubernetesResourceLookup)","url":"getValidationFailures(oracle.kubernetes.weblogic.domain.model.KubernetesResourceLookup)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getValidationWarningsAsString()"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"getValue(String)","url":"getValue(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"getVersion()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"getVersion()"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"getVersion()"},{"p":"oracle.kubernetes.operator.rest.backend","c":"VersionUtils","l":"getVersion(String)","url":"getVersion(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"VersionsResource","l":"getVersionResource(String)","url":"getVersionResource(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.backend","c":"VersionUtils","l":"getVersions()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters","l":"getWatchTuning()"},{"p":"oracle.kubernetes.operator","c":"TuningParametersImpl","l":"getWatchTuning()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getWebLogicCredentialsSecretName()"},{"p":"oracle.kubernetes.operator.utils","c":"WlsDomainConfigSupport","l":"getWlsCluster(String)","url":"getWlsCluster(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest","c":"Scan","l":"getWlsDomainConfig()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getWlsDomainConfig()"},{"p":"oracle.kubernetes.operator.utils","c":"WlsDomainConfigSupport","l":"getWlsServer(String)","url":"getWlsServer(java.lang.String)"},{"p":"oracle.kubernetes.operator.utils","c":"WlsDomainConfigSupport","l":"getWlsServer(String, String)","url":"getWlsServer(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"ShutdownType","l":"Graceful"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"GRACEFUL_SHUTDOWNTYPE"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"hasConditionWith(Predicate)","url":"hasConditionWith(java.util.function.Predicate)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"hasDynamicServers()"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"hasEnvVar(List, String)","url":"hasEnvVar(java.util.List,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"Pair","l":"hashCode()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.CallBuilderTuning","l":"hashCode()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"hashCode()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"hashCode()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.WatchTuning","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesVersion","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"hashCode()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Server","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerService","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"hashCode()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"hasNamedServer(String)","url":"hasNamedServer(java.lang.String)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchImpl","l":"hasNext()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"hasStaticServers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"hasType(DomainConditionType)","url":"hasType(oracle.kubernetes.weblogic.domain.model.DomainConditionType)"},{"p":"oracle.kubernetes.operator.authentication","c":"Helpers","l":"Helpers(Authenticator)","url":"%3Cinit%3E(oracle.kubernetes.operator.authentication.Authenticator)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"hideAdminUserCredentials(List)","url":"hideAdminUserCredentials(java.util.List)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"href(String...)","url":"href(java.lang.String...)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"HTTP_METHOD_FAILED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"HTTP_REQUEST_TIMED_OUT"},{"p":"oracle.kubernetes.operator.http","c":"HttpResponseStep","l":"HttpResponseStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"IF_NEEDED"},{"p":"oracle.kubernetes.operator","c":"ImagePullPolicy","l":"IfNotPresent"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"IFNOTPRESENT_IMAGEPULLPOLICY"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"ignoreSessions(Boolean)","url":"ignoreSessions(java.lang.Boolean)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ILLEGAL_SECRET_NAMESPACE"},{"p":"oracle.kubernetes.operator","c":"DomainSourceType","l":"Image"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretType","l":"ImagePull"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"incrementAndGetFailureCount()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"info(LoggingFilter, String, Object...)","url":"info(oracle.kubernetes.operator.logging.LoggingFilter,java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"info(String)","url":"info(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"info(String, Object...)","url":"info(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"info(String, Throwable)","url":"info(java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"INGRESSES"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"initialDelaySeconds(Integer)","url":"initialDelaySeconds(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClientPool","l":"initialize(ThreadFactory)","url":"initialize(java.util.concurrent.ThreadFactory)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters","l":"initializeInstance(ScheduledExecutorService, String)","url":"initializeInstance(java.util.concurrent.ScheduledExecutorService,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"initialShortDelay"},{"p":"oracle.kubernetes.operator","c":"ConfigMapWatcher","l":"initiateWatch(WatchBuilder)","url":"initiateWatch(oracle.kubernetes.operator.builders.WatchBuilder)"},{"p":"oracle.kubernetes.operator","c":"DomainWatcher","l":"initiateWatch(WatchBuilder)","url":"initiateWatch(oracle.kubernetes.operator.builders.WatchBuilder)"},{"p":"oracle.kubernetes.operator","c":"EventWatcher","l":"initiateWatch(WatchBuilder)","url":"initiateWatch(oracle.kubernetes.operator.builders.WatchBuilder)"},{"p":"oracle.kubernetes.operator","c":"JobWatcher","l":"initiateWatch(WatchBuilder)","url":"initiateWatch(oracle.kubernetes.operator.builders.WatchBuilder)"},{"p":"oracle.kubernetes.operator","c":"NamespaceWatcher","l":"initiateWatch(WatchBuilder)","url":"initiateWatch(oracle.kubernetes.operator.builders.WatchBuilder)"},{"p":"oracle.kubernetes.operator","c":"PodWatcher","l":"initiateWatch(WatchBuilder)","url":"initiateWatch(oracle.kubernetes.operator.builders.WatchBuilder)"},{"p":"oracle.kubernetes.operator","c":"ServiceWatcher","l":"initiateWatch(WatchBuilder)","url":"initiateWatch(oracle.kubernetes.operator.builders.WatchBuilder)"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"INSPECTING_DOMAIN_PROGRESS_REASON"},{"p":"oracle.kubernetes.operator.rest","c":"ScanCache","l":"INSTANCE"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"INTROSPECT_HOME"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"introspectorJobActiveDeadlineSeconds"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"IntrospectorJobEnvVars()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"INVALID_DOMAIN_UID"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"INVALID_MANAGE_SERVER_COUNT"},{"p":"oracle.kubernetes.operator.work","c":"NextAction.Kind","l":"INVOKE"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"invoke(Step, Packet)","url":"invoke(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"isAdminPortEnabled()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"isAdminProtocol()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"isAllowReplicasBelowMinDynClusterSize()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"isAllowReplicasBelowMinDynClusterSize(String)","url":"isAllowReplicasBelowMinDynClusterSize(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"isAllowReplicasBelowMinDynClusterSize(String)","url":"isAllowReplicasBelowMinDynClusterSize(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"isAlpha()"},{"p":"oracle.kubernetes.operator.calls","c":"UnrecoverableErrorBuilder","l":"isAsyncCallFailure(CallResponse)","url":"isAsyncCallFailure(oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"isBeta()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"isCancelled()"},{"p":"oracle.kubernetes.operator.rest","c":"RestBackendImpl","l":"isCluster(String, String)","url":"isCluster(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.backend","c":"RestBackend","l":"isCluster(String, String)","url":"isCluster(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"JobWatcher","l":"isComplete(V1Job)","url":"isComplete(io.kubernetes.client.openapi.models.V1Job)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isConfigEnabled()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"KubernetesResourceLookup","l":"isConfigMapExists(String, String)","url":"isConfigMapExists(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"Main","l":"isDedicated()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"isDeleting(V1Pod)","url":"isDeleting(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"isDns1123Required(String)","url":"isDns1123Required(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest","c":"RestBackendImpl","l":"isDomainUid(String)","url":"isDomainUid(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.backend","c":"RestBackend","l":"isDomainUid(String)","url":"isDomainUid(java.lang.String)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"isDone()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServerConfig","l":"isDynamicServer()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"isDynamicServer()"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"isEmpty()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"isFailed(V1Pod)","url":"isFailed(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"isFailure()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isFineEnabled()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isFinerEnabled()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isFinestEnabled()"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesUtils","l":"isFirstNewer(V1ObjectMeta, V1ObjectMeta)","url":"isFirstNewer(io.kubernetes.client.openapi.models.V1ObjectMeta,io.kubernetes.client.openapi.models.V1ObjectMeta)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"isGA()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"isHttpAccessLogInLogHome()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"isIncludeServerOutInPodLog()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isInfoEnabled()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"isIstioEnabled()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"isIstioEnabled()"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"isK8sContainer(V1Container)","url":"isK8sContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"isLatest()"},{"p":"oracle.kubernetes.operator.rest.backend","c":"VersionUtils","l":"isLatest(String)","url":"isLatest(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"isLocalAdminProtocolChannelSecure()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isLoggable(Level)","url":"isLoggable(java.util.logging.Level)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"isNamespaceRunning(String)","url":"isNamespaceRunning(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"NamespaceStatus","l":"isNamespaceStarting()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"isNotAuthorizedOrForbidden(CallResponse)","url":"isNotAuthorizedOrForbidden(oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"isNotDeleting()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"isPatchableFrom(ClusterStatus)","url":"isPatchableFrom(oracle.kubernetes.weblogic.domain.model.ClusterStatus)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"isPatchableFrom(DomainCondition)","url":"isPatchableFrom(oracle.kubernetes.weblogic.domain.model.DomainCondition)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"isPatchableFrom(ServerStatus)","url":"isPatchableFrom(oracle.kubernetes.weblogic.domain.model.ServerStatus)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"isPatchableFrom(SubsystemHealth)","url":"isPatchableFrom(oracle.kubernetes.weblogic.domain.model.SubsystemHealth)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"PatchableComponent","l":"isPatchableFrom(T)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"isPopulated()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"isPrecreateServerService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"isPrecreateServerService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"isPrecreateServerService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"isPrecreateServerService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"isPrecreateServerService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerService","l":"isPrecreateService()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"isReady(V1Pod)","url":"isReady(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"KubernetesResourceLookup","l":"isSecretExists(String, String)","url":"isSecretExists(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"isServerPodBeingDeleted(String)","url":"isServerPodBeingDeleted(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"isServerService(V1Service)","url":"isServerService(io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"isServiceOnly()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isSevereEnabled()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"isShuttingDown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"isShuttingDown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"isShuttingDown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"isShuttingDown()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"isSslPortEnabled()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"ISTIO_ENABLED"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"ISTIO_READINESS_PORT"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"Istio()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnprocessableEntityBuilder","l":"isUnprocessableEntity(ApiException)","url":"isUnprocessableEntity(io.kubernetes.client.openapi.ApiException)"},{"p":"oracle.kubernetes.operator.calls","c":"OtherUnrecoverableErrorBuilder","l":"isUnrecoverable(ApiException)","url":"isUnrecoverable(io.kubernetes.client.openapi.ApiException)"},{"p":"oracle.kubernetes.operator.rest.backend","c":"VersionUtils","l":"isVersion(String)","url":"isVersion(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isWarningEnabled()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"isWellFormed()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ItemModel","l":"ItemModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.builders","c":"WatchImpl","l":"iterator()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"JOB_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"JOB_CREATION_TIMESTAMP_MESSAGE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"JOB_DEADLINE_EXCEEDED_MESSAGE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"JOB_DELETED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"JOB_IS_COMPLETE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"JOB_IS_FAILED"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"JOB_POD_NAME"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"JOBNAME_LABEL"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"JOBS"},{"p":"oracle.kubernetes.utils","c":"OperatorUtils","l":"joinListGrammatically(List)","url":"joinListGrammatically(java.util.List)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"JSON_PARSING_FAILED"},{"p":"oracle.kubernetes.json.mojo","c":"JsonSchemaMojo","l":"JsonSchemaMojo()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"K8S_MASTER_URL"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"K8S_VERSION_CHECK"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"K8S_VERSION_CHECK_FAILURE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"K8S_VERSION_TOO_LOW"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"keySet()"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExec","l":"KubernetesExec()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExecFactoryImpl","l":"KubernetesExecFactoryImpl()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesUtils","l":"KubernetesUtils()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesVersion","l":"KubernetesVersion(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"LastKnownStatus(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"LastKnownStatus(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"oracle.kubernetes.operator.rest","c":"Scan","l":"lastScanTime"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"LATEST_IMAGE_SUFFIX"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"LegalNames()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"LinkContainerModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"LinkModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"LinkModel(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"LinkModel(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"list"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listConfigMapsAsync(String, ResponseStep)","url":"listConfigMapsAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listDomain(String)","url":"listDomain(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listDomainAsync(String, ResponseStep)","url":"listDomainAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.calls","c":"AsyncRequestStep","l":"listenTimeoutDoubled()"},{"p":"oracle.kubernetes.operator.calls","c":"RetryStrategyListener","l":"listenTimeoutDoubled()"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listEventAsync(String, ResponseStep)","url":"listEventAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"LISTING_DOMAINS"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listNamespaceAsync(ResponseStep)","url":"listNamespaceAsync(oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"listNamespacedDomain(String, String, String, String, String, Integer, String, Integer, Boolean)","url":"listNamespacedDomain(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Integer,java.lang.String,java.lang.Integer,java.lang.Boolean)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"listNamespacedDomainAsync(String, String, String, String, String, Integer, String, Integer, Boolean, ApiCallback)","url":"listNamespacedDomainAsync(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Integer,java.lang.String,java.lang.Integer,java.lang.Boolean,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"listNamespacedDomainCall(String, String, String, String, String, Integer, String, Integer, Boolean, ApiCallback)","url":"listNamespacedDomainCall(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Integer,java.lang.String,java.lang.Integer,java.lang.Boolean,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"listNamespacedDomainWithHttpInfo(String, String, String, String, String, Integer, String, Integer, Boolean)","url":"listNamespacedDomainWithHttpInfo(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Integer,java.lang.String,java.lang.Integer,java.lang.Boolean)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listPodAsync(String, ResponseStep)","url":"listPodAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listSecretsAsync(String, ResponseStep)","url":"listSecretsAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listService(String)","url":"listService(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listServiceAsync(String, ResponseStep)","url":"listServiceAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"livenessProbeInitialDelaySeconds"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"livenessProbePeriodSeconds"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"livenessProbeTimeoutSeconds"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"LOCALSUBJECTACCESSREVIEWS"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"LOG_HOME"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"LOG_HOME_NOT_MOUNTED"},{"p":"oracle.kubernetes.operator.calls","c":"FailureStatusSourceException","l":"log()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"log(Level, String)","url":"log(java.util.logging.Level,java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"log(Level, String, Object...)","url":"log(java.util.logging.Level,java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"log(Level, String, Throwable)","url":"log(java.util.logging.Level,java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.rest","c":"BaseDebugLoggingFilter","l":"LOGGER"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFilter","l":"LOGGING_FILTER_PACKET_KEY"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"LoggingFacade(Logger)","url":"%3Cinit%3E(java.util.logging.Logger)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFormatter","l":"LoggingFormatter()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"LOGS"},{"p":"oracle.kubernetes.operator.rest","c":"ScanCache","l":"lookupScan(String, String)","url":"lookupScan(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"MacroSubstitutor","l":"MacroSubstitutor(int, String, String, String, String)","url":"%3Cinit%3E(int,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"MAIN_COMPONENT_NAME"},{"p":"oracle.kubernetes.operator","c":"Main","l":"Main()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"Main","l":"main(String[])","url":"main(java.lang.String[])"},{"p":"oracle.kubernetes.operator","c":"SwaggerBuildHelper","l":"main(String[])","url":"main(java.lang.String[])"},{"p":"oracle.kubernetes.operator.helpers","c":"CrdHelper","l":"main(String[])","url":"main(java.lang.String[])"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"MainImpl()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"MainTuning(int, int, int, int, int, int, long, long)","url":"%3Cinit%3E(int,int,int,int,int,int,long,long)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"makeRightDomainPresence(DomainPresenceInfo, boolean, boolean, boolean)","url":"makeRightDomainPresence(oracle.kubernetes.operator.helpers.DomainPresenceInfo,boolean,boolean,boolean)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"makeRightDomainPresence(DomainPresenceInfo, boolean, boolean, boolean)","url":"makeRightDomainPresence(oracle.kubernetes.operator.helpers.DomainPresenceInfo,boolean,boolean,boolean)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MANAGED_POD_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MANAGED_POD_EXISTS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MANAGED_POD_PATCHED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MANAGED_POD_REPLACED"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"MANAGED_SERVERS_STARTING_PROGRESS_REASON"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MANAGED_SERVICE_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MANAGED_SERVICE_EXISTS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MANAGED_SERVICE_REPLACED"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"ManagedServer()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServerSpecCommonImpl","l":"ManagedServerSpecCommonImpl(DomainSpec, Server, Cluster, Integer)","url":"%3Cinit%3E(oracle.kubernetes.weblogic.domain.model.DomainSpec,oracle.kubernetes.weblogic.domain.model.Server,oracle.kubernetes.weblogic.domain.model.Cluster,java.lang.Integer)"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServersUpStep","l":"ManagedServersUpStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServerUpAfterStep","l":"ManagedServerUpAfterStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServerUpIteratorStep","l":"ManagedServerUpIteratorStep(Collection, Step)","url":"%3Cinit%3E(java.util.Collection,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"VersionHelper","l":"matchesResourceVersion(V1ObjectMeta, String)","url":"matchesResourceVersion(io.kubernetes.client.openapi.models.V1ObjectMeta,java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MATCHING_DOMAIN_NOT_FOUND"},{"p":"oracle.kubernetes.json","c":"Range","l":"maximum()"},{"p":"oracle.kubernetes.json","c":"Range","l":"minimum()"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"name"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"namespace"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Scope","l":"namespace"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"NAMESPACE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NAMESPACE_IS_DEFAULT"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NAMESPACE_IS_MISSING"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"NAMESPACES"},{"p":"oracle.kubernetes.operator","c":"NamespaceStatus","l":"NamespaceStatus()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"NetworkAccessPoint()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"NetworkAccessPoint(String, String, Integer, Integer)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"NETWORKPOLICIES"},{"p":"oracle.kubernetes.operator","c":"ImagePullPolicy","l":"Never"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"NEVER"},{"p":"oracle.kubernetes.operator.builders","c":"WatchImpl","l":"next()"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"NextAction()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NO_CLUSTER_IN_DOMAIN"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NO_EXTERNAL_CERTIFICATE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NO_INTERNAL_CERTIFICATE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NO_MANAGED_SERVER_IN_DOMAIN"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NO_WLS_SERVER_IN_CLUSTER"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"NODE_PORT_TYPE"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"NODEMGR_HOME"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"NODEMGR_HOME"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"NON_CLUSTERED_SERVER_START_POLICY_ALWAYS"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"NON_CLUSTERED_SERVER_START_POLICY_NEVER"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"NonClusteredServerConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"Container","l":"NONE"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"NOT_FOUND"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NOT_STARTING_DOMAINUID_THREAD"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"notFound(String)","url":"notFound(java.lang.String)"},{"p":"oracle.kubernetes.utils","c":"SystemClock","l":"now()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NULL_DOMAIN_UID"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NULL_TOKEN_REVIEW_STATUS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NULL_USER_INFO"},{"p":"oracle.kubernetes.operator.logging","c":"OncePerMessageLoggingFilter","l":"OncePerMessageLoggingFilter()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber.CompletionCallback","l":"onCompletion(Packet)","url":"onCompletion(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber.ExitCallback","l":"onExit()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"onFailure(Packet, CallResponse)","url":"onFailure(oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.steps","c":"DefaultResponseStep","l":"onFailure(Packet, CallResponse)","url":"onFailure(oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.http","c":"HttpResponseStep","l":"onFailure(Packet, HttpResponse)","url":"onFailure(oracle.kubernetes.operator.work.Packet,java.net.http.HttpResponse)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"onFailure(Step, Packet, CallResponse)","url":"onFailure(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"onFailureNoRetry(Packet, CallResponse)","url":"onFailureNoRetry(oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.helpers","c":"Pool","l":"onRecycle(T)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"onSuccess(Packet, CallResponse)","url":"onSuccess(oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.steps","c":"DefaultResponseStep","l":"onSuccess(Packet, CallResponse)","url":"onSuccess(oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.http","c":"HttpResponseStep","l":"onSuccess(Packet, HttpResponse)","url":"onSuccess(oracle.kubernetes.operator.work.Packet,java.net.http.HttpResponse)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber.CompletionCallback","l":"onThrowable(Packet, Throwable)","url":"onThrowable(oracle.kubernetes.operator.work.Packet,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"OP_CONFIG_NAMESPACE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"OP_CONFIG_SERVICE_ACCOUNT"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"OP_CONFIG_TARGET_NAMESPACES"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"OPERATOR_SHUTTING_DOWN"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"OPERATOR_STARTED"},{"p":"oracle.kubernetes.operator","c":"VersionConstants","l":"OPERATOR_V1"},{"p":"oracle.kubernetes.operator","c":"VersionConstants","l":"OPERATOR_V2"},{"p":"oracle.kubernetes.operator","c":"OperatorLiveness","l":"OperatorLiveness()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"OPERATORNAME_LABEL"},{"p":"oracle.kubernetes.operator","c":"OperatorReady","l":"OperatorReady()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.utils","c":"OperatorUtils","l":"OperatorUtils()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.steps","c":"ReadHealthStep","l":"OVERALL_HEALTH_FOR_SERVER_OVERLOADED"},{"p":"oracle.kubernetes.operator.steps","c":"ReadHealthStep","l":"OVERALL_HEALTH_NOT_AVAILABLE"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"OVERRIDE_SECRETS_MOUNT_PATH"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"OVERRIDES_CM_MOUNT_PATH"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"owner"},{"p":"oracle.kubernetes.operator.work","c":"Step.StepAndPacket","l":"packet"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"Packet()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"Pair","l":"Pair(L, R)","url":"%3Cinit%3E(L,R)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper","l":"parseDomainTopologyYaml(String)","url":"parseDomainTopologyYaml(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"patch"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"patchDomain(String, String, V1Patch)","url":"patchDomain(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"patchDomainAsync(String, String, V1Patch, ResponseStep)","url":"patchDomainAsync(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomain(String, String, V1Patch)","url":"patchNamespacedDomain(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainAsync(String, String, V1Patch, ApiCallback)","url":"patchNamespacedDomainAsync(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainCall(String, String, V1Patch, ApiCallback)","url":"patchNamespacedDomainCall(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainScale(String, String, V1Patch)","url":"patchNamespacedDomainScale(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainScaleAsync(String, String, V1Patch, ApiCallback)","url":"patchNamespacedDomainScaleAsync(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainScaleCall(String, String, V1Patch, ApiCallback)","url":"patchNamespacedDomainScaleCall(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainScaleWithHttpInfo(String, String, V1Patch)","url":"patchNamespacedDomainScaleWithHttpInfo(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainStatus(String, String, V1Patch)","url":"patchNamespacedDomainStatus(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainStatusAsync(String, String, V1Patch, ApiCallback)","url":"patchNamespacedDomainStatusAsync(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainStatusCall(String, String, V1Patch, ApiCallback)","url":"patchNamespacedDomainStatusCall(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainStatusWithHttpInfo(String, String, V1Patch)","url":"patchNamespacedDomainStatusWithHttpInfo(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainWithHttpInfo(String, String, V1Patch)","url":"patchNamespacedDomainWithHttpInfo(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"patchPodAsync(String, String, V1Patch, ResponseStep)","url":"patchPodAsync(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.utils","c":"PatchUtils","l":"PatchUtils()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"HealthCheckHelper","l":"performK8sVersionCheck()"},{"p":"oracle.kubernetes.operator.helpers","c":"HealthCheckHelper","l":"performSecurityChecks(KubernetesVersion, String, String)","url":"performSecurityChecks(oracle.kubernetes.operator.helpers.KubernetesVersion,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"periodSeconds(Integer)","url":"periodSeconds(java.lang.Integer)"},{"p":"oracle.kubernetes.operator","c":"DomainSourceType","l":"PersistentVolume"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"PERSISTENTVOLUMECLAIMS"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"PERSISTENTVOLUMES"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"POD_DELETED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"POD_DUMP"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"POD_IS_FAILED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"POD_IS_READY"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"PODPRESETS"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"PODS"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"PODSECURITYPOLICIES"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"PODTEMPLATES"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"PodTuning(int, int, int, int, int, int, long)","url":"%3Cinit%3E(int,int,int,int,int,int,long)"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"PODWATCHER_COMPONENT_NAME"},{"p":"oracle.kubernetes.operator.helpers","c":"Pool","l":"Pool()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ScaleClusterResource","l":"post(ScaleClusterParamsModel)","url":"post(oracle.kubernetes.operator.rest.model.ScaleClusterParamsModel)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"prettyPrint(Object)","url":"prettyPrint(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"ProbeTuning()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"processDynamicClusters()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"PROCESSING_DOMAIN"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainConditionType","l":"Progressing"},{"p":"oracle.kubernetes.operator.rest.model","c":"BaseModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ClusterModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"CollectionModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ScaleClusterParamsModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"proxy"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"put(String, Object)","url":"put(java.lang.String,java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"put(String, String)","url":"put(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"putAll(Map)","url":"putAll(java.util.Map)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"PV_ACCESS_MODE_FAILED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"PV_NOT_FOUND_FOR_DOMAIN_UID"},{"p":"oracle.kubernetes.json","c":"EnumClass","l":"qualifier()"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readBetaCustomResourceDefinitionAsync(String, ResponseStep)","url":"readBetaCustomResourceDefinitionAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readConfigMapAsync(String, String, ResponseStep)","url":"readConfigMapAsync(java.lang.String,java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readCustomResourceDefinitionAsync(String, ResponseStep)","url":"readCustomResourceDefinitionAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readDomainAsync(String, String, ResponseStep)","url":"readDomainAsync(java.lang.String,java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper","l":"readExistingSituConfigMap(String, String)","url":"readExistingSituConfigMap(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"READINESS_PROBE_NOT_READY_STATE"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"readinessProbeInitialDelaySeconds"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"readinessProbePeriodSeconds"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"readinessProbeTimeoutSeconds"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readJobAsync(String, String, ResponseStep)","url":"readJobAsync(java.lang.String,java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readNamespace(String)","url":"readNamespace(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readPodAsync(String, String, ResponseStep)","url":"readPodAsync(java.lang.String,java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readPodLogAsync(String, String, ResponseStep)","url":"readPodLogAsync(java.lang.String,java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readSecret(String, String)","url":"readSecret(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readSecretAsync(String, String, ResponseStep)","url":"readSecretAsync(java.lang.String,java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.authentication","c":"Helpers","l":"readSecretByReference(V1ObjectReference, String)","url":"readSecretByReference(io.kubernetes.client.openapi.models.V1ObjectReference,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readService(String, String)","url":"readService(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readServiceAsync(String, String, ResponseStep)","url":"readServiceAsync(java.lang.String,java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"readTuningParameter(String, long)","url":"readTuningParameter(java.lang.String,long)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readVersionCode()"},{"p":"oracle.kubernetes.operator.watcher","c":"WatchListener","l":"receivedResponse(Watch.Response)","url":"receivedResponse(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"JobWatcher","l":"receivedResponse(Watch.Response)","url":"receivedResponse(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"PodWatcher","l":"receivedResponse(Watch.Response)","url":"receivedResponse(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator.helpers","c":"Pool","l":"recycle(T)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"redirect"},{"p":"oracle.kubernetes.operator.rest","c":"ScanCache","l":"registerScan(String, String, Scan)","url":"registerScan(java.lang.String,java.lang.String,oracle.kubernetes.operator.rest.Scan)"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"REMAINING_SERVERS_HEALTH_TO_READ"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"remove(Object)","url":"remove(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"removeConditionIf(Predicate)","url":"removeConditionIf(java.util.function.Predicate)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"removeServerService(String)","url":"removeServerService(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"replace"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"replaceBetaCustomResourceDefinitionAsync(String, V1beta1CustomResourceDefinition, ResponseStep)","url":"replaceBetaCustomResourceDefinitionAsync(java.lang.String,io.kubernetes.client.openapi.models.V1beta1CustomResourceDefinition,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"replaceConfigMapAsync(String, String, V1ConfigMap, ResponseStep)","url":"replaceConfigMapAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1ConfigMap,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"replaceCustomResourceDefinitionAsync(String, V1CustomResourceDefinition, ResponseStep)","url":"replaceCustomResourceDefinitionAsync(java.lang.String,io.kubernetes.client.openapi.models.V1CustomResourceDefinition,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"replaceDomain(String, String, Domain)","url":"replaceDomain(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"replaceDomainAsync(String, String, Domain, ResponseStep)","url":"replaceDomainAsync(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"replaceDomainStatusAsync(String, String, Domain, ResponseStep)","url":"replaceDomainStatusAsync(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomain(String, String, Domain)","url":"replaceNamespacedDomain(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainAsync(String, String, Domain, ApiCallback)","url":"replaceNamespacedDomainAsync(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainCall(String, String, Domain, ApiCallback)","url":"replaceNamespacedDomainCall(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainScale(String, String, Domain)","url":"replaceNamespacedDomainScale(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainScaleAsync(String, String, Domain, ApiCallback)","url":"replaceNamespacedDomainScaleAsync(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainScaleCall(String, String, Domain, ApiCallback)","url":"replaceNamespacedDomainScaleCall(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainScaleWithHttpInfo(String, String, Domain)","url":"replaceNamespacedDomainScaleWithHttpInfo(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainStatus(String, String, Domain)","url":"replaceNamespacedDomainStatus(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainStatusAsync(String, String, Domain, ApiCallback)","url":"replaceNamespacedDomainStatusAsync(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainStatusCall(String, String, Domain, ApiCallback)","url":"replaceNamespacedDomainStatusCall(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainStatusWithHttpInfo(String, String, Domain)","url":"replaceNamespacedDomainStatusWithHttpInfo(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainWithHttpInfo(String, String, Domain)","url":"replaceNamespacedDomainWithHttpInfo(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REPLICA_MORE_THAN_WLS_SERVERS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REPLICAS_EXCEEDS_TOTAL_CLUSTER_SERVER_COUNT"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REPLICAS_LESS_THAN_TOTAL_CLUSTER_SERVER_COUNT"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"reportSuspendedFibers()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"reportSuspendedFibers()"},{"p":"oracle.kubernetes.operator.rest","c":"FilterPriorities","l":"REQUEST_DEBUG_LOGGING_FILTER_PRIORITY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REQUEST_PARAMS_FOR_NAME"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REQUEST_PARAMS_IN_NS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REQUEST_PARAMS_WITH"},{"p":"oracle.kubernetes.operator.rest","c":"RequestDebugLoggingFilter","l":"RequestDebugLoggingFilter()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"RequestParams(String, String, String, Object)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.lang.Object)"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"RequestParams(String, String, String, Object, CallParams)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.lang.Object,oracle.kubernetes.operator.builders.CallParams)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"RESERVED_ENVIRONMENT_VARIABLES"},{"p":"oracle.kubernetes.operator.calls","c":"RetryStrategy","l":"reset()"},{"p":"oracle.kubernetes.operator.logging","c":"OncePerMessageLoggingFilter","l":"resetLogHistory()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"RESOURCE_BUNDLE_NOT_FOUND"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"RESOURCE_VERSION_LABEL"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"ResourceVersion(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator.calls","c":"AsyncRequestStep","l":"RESPONSE_COMPONENT_NAME"},{"p":"oracle.kubernetes.operator.rest","c":"FilterPriorities","l":"RESPONSE_DEBUG_LOGGING_FILTER_PRIORITY"},{"p":"oracle.kubernetes.operator.rest","c":"ResponseDebugLoggingFilter","l":"ResponseDebugLoggingFilter()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"ResponseStep()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"ResponseStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"ResponseStep(Step, Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REST_AUTHENTICATION_MISSING_ACCESS_TOKEN"},{"p":"oracle.kubernetes.operator.rest","c":"AuthenticationFilter","l":"REST_BACKEND_PROPERTY"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"REST_CONFIG_PROPERTY"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"RestConfigImpl(String, Collection)","url":"%3Cinit%3E(java.lang.String,java.util.Collection)"},{"p":"oracle.kubernetes.operator.work","c":"AsyncFiber","l":"resume(Packet)","url":"resume(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"resume(Packet)","url":"resume(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"RESUMING_STATE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"RETRIEVING_SECRET"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ROLLING_SERVERS"},{"p":"oracle.kubernetes.operator.helpers","c":"RollingHelper","l":"rollServers(Map, Step)","url":"rollServers(java.util.Map,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"OperatorLiveness","l":"run()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"run()"},{"p":"oracle.kubernetes.operator","c":"ServerStartState","l":"RUNNING"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"RUNNING_STATE"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"runSteps(Step)","url":"runSteps(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"SCALE_COUNT_GREATER_THAN_CONFIGURED"},{"p":"oracle.kubernetes.operator.rest","c":"RestBackendImpl","l":"scaleCluster(String, String, int)","url":"scaleCluster(java.lang.String,java.lang.String,int)"},{"p":"oracle.kubernetes.operator.rest.backend","c":"RestBackend","l":"scaleCluster(String, String, int)","url":"scaleCluster(java.lang.String,java.lang.String,int)"},{"p":"oracle.kubernetes.operator.rest.model","c":"ScaleClusterParamsModel","l":"ScaleClusterParamsModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ScaleClusterResource","l":"ScaleClusterResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest","c":"Scan","l":"Scan(WlsDomainConfig, DateTime)","url":"%3Cinit%3E(oracle.kubernetes.operator.wlsconfig.WlsDomainConfig,org.joda.time.DateTime)"},{"p":"oracle.kubernetes.operator.work","c":"AsyncFiber","l":"scheduleOnce(long, TimeUnit, Runnable)","url":"scheduleOnce(long,java.util.concurrent.TimeUnit,java.lang.Runnable)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"scheduleOnce(long, TimeUnit, Runnable)","url":"scheduleOnce(long,java.util.concurrent.TimeUnit,java.lang.Runnable)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"scheduleWithFixedDelay(Runnable, long, long, TimeUnit)","url":"scheduleWithFixedDelay(java.lang.Runnable,long,long,java.util.concurrent.TimeUnit)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"SchemaGenerator()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"SCRIPT_CONFIG_MAP"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"SCRIPT_LOADED"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"SCRIPTS_MOUNTS_PATH"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"SCRIPTS_VOLUME"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretHelper","l":"SECRET_DATA_KEY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"SECRET_DATA_NOT_FOUND"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"SECRET_NOT_FOUND"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretHelper","l":"SecretHelper()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"SECRETS"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"SECRETS_MOUNT_PATH"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"SECRETS_VOLUME"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfiguratorFactory","l":"selectCommonDomainModel()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"SELFSUBJECTACCESSREVIEWS"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"SELFSUBJECTRULESREVIEWS"},{"p":"oracle.kubernetes.operator.helpers","c":"OperatorServiceType","l":"SERVER"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"SERVER_HEALTH_MAP"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"SERVER_NAME"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"SERVER_NAME"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"SERVER_OUT_IN_POD_LOG"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"SERVER_SCAN"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"SERVER_START_POLICY_ALWAYS"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"SERVER_START_POLICY_NEVER"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"SERVER_STATE_MAP"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Server","l":"Server()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"serverConfig"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"ServerConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"ServerEnvVars()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"ServerHealth()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"SERVERNAME_LABEL"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"SERVERRESTARTVERSION_LABEL"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"SERVERS_READY_REASON"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"SERVERS_TO_ROLL"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerService","l":"ServerService()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"ServerSpecBase(DomainSpec)","url":"%3Cinit%3E(oracle.kubernetes.weblogic.domain.model.DomainSpec)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"ServerStartupInfo(WlsServerConfig, String, ServerSpec)","url":"%3Cinit%3E(oracle.kubernetes.operator.wlsconfig.WlsServerConfig,java.lang.String,oracle.kubernetes.weblogic.domain.model.ServerSpec)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"ServerStartupInfo(WlsServerConfig, String, ServerSpec, boolean)","url":"%3Cinit%3E(oracle.kubernetes.operator.wlsconfig.WlsServerConfig,java.lang.String,oracle.kubernetes.weblogic.domain.model.ServerSpec,boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"ServerStatus()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"SERVICE_NAME"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"SERVICE_URL"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"SERVICES"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"setAdminPort(int)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"setAdminPort(Integer)","url":"setAdminPort(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.utils","c":"WlsDomainConfigSupport","l":"setAdminServerName(String)","url":"setAdminServerName(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"setAdminServerName(String)","url":"setAdminServerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"setApiClient(ApiClient)","url":"setApiClient(io.kubernetes.client.openapi.ApiClient)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"setApiVersion(String)","url":"setApiVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"setApiVersion(String)","url":"setApiVersion(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setCalculatedListenPorts(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"setChannelName(String)","url":"setChannelName(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"ClusterModel","l":"setCluster(String)","url":"setCluster(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"setCluster(String, ClusterConfig)","url":"setCluster(java.lang.String,oracle.kubernetes.operator.helpers.ClusterConfig)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"setClusteredServerStartPolicy(String)","url":"setClusteredServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"setClusterName(String)","url":"setClusterName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"setClusterName(String)","url":"setClusterName(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"setClusterName(String)","url":"setClusterName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"setClusterName(String)","url":"setClusterName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"setClusterName(String)","url":"setClusterName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"setClusterName(String)","url":"setClusterName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"setClusters(List)","url":"setClusters(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"setClusters(Map)","url":"setClusters(java.util.Map)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"setClusterService(KubernetesResource)","url":"setClusterService(oracle.kubernetes.weblogic.domain.model.KubernetesResource)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setConfigOverrideSecrets(List)","url":"setConfigOverrideSecrets(java.util.List)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"setConfiguredClusters(List)","url":"setConfiguredClusters(java.util.List)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"setContextClassLoader(ClassLoader)","url":"setContextClassLoader(java.lang.ClassLoader)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setDataHome(String)","url":"setDataHome(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setDeleting(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"setDesiredState(String)","url":"setDesiredState(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"setDetail(String)","url":"setDetail(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setDomain(Domain)","url":"setDomain(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper.DomainTopology","l":"setDomain(WlsDomainConfig)","url":"setDomain(oracle.kubernetes.operator.wlsconfig.WlsDomainConfig)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setDomainHome(String)","url":"setDomainHome(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setDomainHomeInImage(boolean)"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainModel","l":"setDomainUid(String)","url":"setDomainUid(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setDomainUid(String)","url":"setDomainUid(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper.DomainTopology","l":"setDomainValid(boolean)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setDynamicClusterSize(Integer)","url":"setDynamicClusterSize(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"setDynamicServersConfig(WlsDynamicServersConfig)","url":"setDynamicServersConfig(oracle.kubernetes.operator.wlsconfig.WlsDynamicServersConfig)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"setEnabled(Boolean)","url":"setEnabled(java.lang.Boolean)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"setEnv(List)","url":"setEnv(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"setEnv(List)","url":"setEnv(java.util.List)"},{"p":"oracle.kubernetes.operator.logging","c":"OncePerMessageLoggingFilter","l":"setFiltering(boolean)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"setHref(String)","url":"setHref(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"setImage(String)","url":"setImage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setImage(String)","url":"setImage(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"setImagePullPolicy(String)","url":"setImagePullPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setImagePullPolicy(String)","url":"setImagePullPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setImagePullSecret(V1LocalObjectReference)","url":"setImagePullSecret(io.kubernetes.client.openapi.models.V1LocalObjectReference)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"setImagePullSecrets(List)","url":"setImagePullSecrets(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setImagePullSecrets(List)","url":"setImagePullSecrets(java.util.List)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"setIncludeAdditionalProperties(boolean)"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"setIncludeAdditionalProperties(boolean)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"setIncludeAdditionalProperties(boolean)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"setIncludeSchemaReference(boolean)"},{"p":"oracle.kubernetes.operator.work","c":"ContainerResolver","l":"setInstance(ContainerResolver)","url":"setInstance(oracle.kubernetes.operator.work.ContainerResolver)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerService","l":"setIsPrecreateService(Boolean)","url":"setIsPrecreateService(java.lang.Boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"setIstio(Istio)","url":"setIstio(oracle.kubernetes.weblogic.domain.model.Istio)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"setItems(List)","url":"setItems(java.util.List)"},{"p":"oracle.kubernetes.operator.rest.model","c":"CollectionModel","l":"setItems(List)","url":"setItems(java.util.List)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFactory","l":"setJson(JSON)","url":"setJson(io.kubernetes.client.openapi.JSON)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"setKind(String)","url":"setKind(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"setKind(String)","url":"setKind(java.lang.String)"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"setKubernetesVersion(String)","url":"setKubernetesVersion(java.lang.String)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"setKubernetesVersion(String)","url":"setKubernetesVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"setLastProbeTime(DateTime)","url":"setLastProbeTime(org.joda.time.DateTime)"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"setLatest(boolean)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"setLevel(Level)","url":"setLevel(java.util.logging.Level)"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"setLifecycle(String)","url":"setLifecycle(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"setLinks(List)","url":"setLinks(java.util.List)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"setListenPort(Integer)","url":"setListenPort(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setLogHome(String)","url":"setLogHome(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setLogHomeEnabled(Boolean)","url":"setLogHomeEnabled(java.lang.Boolean)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setMachineNameMatchExpression(String)","url":"setMachineNameMatchExpression(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"ScaleClusterParamsModel","l":"setManagedServerCount(int)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setMaxDynamicClusterSize(Integer)","url":"setMaxDynamicClusterSize(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"setMaxReplicas(int)"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"ErrorBody","l":"setMessage(String)","url":"setMessage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"setMessage(String)","url":"setMessage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"setMetadata(V1ListMeta)","url":"setMetadata(io.kubernetes.client.openapi.models.V1ListMeta)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"setMetadata(V1ObjectMeta)","url":"setMetadata(io.kubernetes.client.openapi.models.V1ObjectMeta)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setMinDynamicClusterSize(Integer)","url":"setMinDynamicClusterSize(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"setMinReplicas(int)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"setName(String)","url":"setName(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setName(String)","url":"setName(java.lang.String)"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"setNext(Step)","url":"setNext(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"setNodePort(int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"setNodePort(Integer)","url":"setNodePort(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setPopulated(boolean)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"setPrevious(AsyncRequestStep)","url":"setPrevious(oracle.kubernetes.operator.calls.AsyncRequestStep)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"setReadinessPort(Integer)","url":"setReadinessPort(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"setReason(String)","url":"setReason(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"setRel(String)","url":"setRel(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"setReplicaCount(String, int)","url":"setReplicaCount(java.lang.String,int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"setReplicaCount(String, int)","url":"setReplicaCount(java.lang.String,int)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"setReplicas(int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"setReplicas(Integer)","url":"setReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"setReplicas(Integer)","url":"setReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setReplicas(Integer)","url":"setReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"setReplicas(Integer)","url":"setReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"setRestartedLabel(String)","url":"setRestartedLabel(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"setServer(String, ClusteredServerConfig)","url":"setServer(java.lang.String,oracle.kubernetes.operator.helpers.ClusteredServerConfig)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"setServer(String, NonClusteredServerConfig)","url":"setServer(java.lang.String,oracle.kubernetes.operator.helpers.NonClusteredServerConfig)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setServerConfigs(List)","url":"setServerConfigs(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"setServerName(String)","url":"setServerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"setServerName(String)","url":"setServerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"setServerName(String)","url":"setServerName(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setServerNamePrefix(String)","url":"setServerNamePrefix(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setServerPod(String, V1Pod)","url":"setServerPod(java.lang.String,io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setServerPodBeingDeleted(String, Boolean)","url":"setServerPodBeingDeleted(java.lang.String,java.lang.Boolean)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setServerPodFromEvent(String, V1Pod)","url":"setServerPodFromEvent(java.lang.String,io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"setServers(List)","url":"setServers(java.util.List)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"setServers(List)","url":"setServers(java.util.List)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"setServers(List)","url":"setServers(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"setServers(Map)","url":"setServers(java.util.Map)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"setServers(Map)","url":"setServers(java.util.Map)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setServerService(String, V1Service)","url":"setServerService(java.lang.String,io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"setServerStartPolicy(String)","url":"setServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"setServerStartPolicy(String)","url":"setServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setServerStartPolicy(String)","url":"setServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Server","l":"setServerStartPolicy(String)","url":"setServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setServerStartupInfo(Collection)","url":"setServerStartupInfo(java.util.Collection)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setServerTemplate(WlsServerConfig)","url":"setServerTemplate(oracle.kubernetes.operator.wlsconfig.WlsServerConfig)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setServerTemplateName(String)","url":"setServerTemplateName(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"setServerTemplates(List)","url":"setServerTemplates(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"setShuttingDown(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"setShuttingDown(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"setSpec(DomainSpec)","url":"setSpec(oracle.kubernetes.weblogic.domain.model.DomainSpec)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"setSslListenPort(Integer)","url":"setSslListenPort(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"setState(String)","url":"setState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"setStatus(DomainStatus)","url":"setStatus(oracle.kubernetes.weblogic.domain.model.DomainStatus)"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"setStatus(int)"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExec","l":"setStdin(boolean)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"setSupportObjectReferences(boolean)"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"setSupportObjectReferences(boolean)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"setSupportObjectReferences(boolean)"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"setTitle(String)","url":"setTitle(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"setTitle(String)","url":"setTitle(java.lang.String)"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExec","l":"setTty(boolean)"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"setType(String)","url":"setType(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper.DomainTopology","l":"setValidationErrors(List)","url":"setValidationErrors(java.util.List)"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"setVersion(String)","url":"setVersion(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"setWlsDomainConfig(WlsDomainConfig)","url":"setWlsDomainConfig(oracle.kubernetes.operator.wlsconfig.WlsDomainConfig)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"severe(LoggingFilter, String, Object...)","url":"severe(oracle.kubernetes.operator.logging.LoggingFilter,java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"severe(LoggingFilter, String, Throwable)","url":"severe(oracle.kubernetes.operator.logging.LoggingFilter,java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"severe(String)","url":"severe(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"severe(String, Object...)","url":"severe(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"severe(String, Throwable)","url":"severe(java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServerSpecCommonImpl","l":"shouldStart(int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"shouldStart(int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"shouldStart(int)"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"SHUTDOWN_STATE"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"Shutdown()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"shutdownType(String)","url":"shutdownType(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"SHUTTING_DOWN_STATE"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"SIT_CONFIG_MAP"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"SIT_CONFIG_MAP_VOLUME"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"size()"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"STANDBY_STATE"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ConfigurationConstants","l":"START_ADMIN_ONLY"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ConfigurationConstants","l":"START_ALWAYS"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ConfigurationConstants","l":"START_IF_NEEDED"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ConfigurationConstants","l":"START_NEVER"},{"p":"oracle.kubernetes.operator.rest","c":"RestServer","l":"start(Container)","url":"start(oracle.kubernetes.operator.work.Container)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"start(Step, Packet, Fiber.CompletionCallback)","url":"start(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.work.Fiber.CompletionCallback)"},{"p":"oracle.kubernetes.operator.work","c":"FiberGate","l":"startFiber(String, Step, Packet, Fiber.CompletionCallback)","url":"startFiber(java.lang.String,oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.work.Fiber.CompletionCallback)"},{"p":"oracle.kubernetes.operator.work","c":"FiberGate","l":"startFiberIfLastFiberMatches(String, Fiber, Step, Packet, Fiber.CompletionCallback)","url":"startFiberIfLastFiberMatches(java.lang.String,oracle.kubernetes.operator.work.Fiber,oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.work.Fiber.CompletionCallback)"},{"p":"oracle.kubernetes.operator.work","c":"FiberGate","l":"startFiberIfNoCurrentFiber(String, Step, Packet, Fiber.CompletionCallback)","url":"startFiberIfNoCurrentFiber(java.lang.String,oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.work.Fiber.CompletionCallback)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"STARTING_LIVENESS_THREAD"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"STARTING_STATE"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"STATES_SUPPORTING_REST"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"statusUpdateTimeoutSeconds"},{"p":"oracle.kubernetes.operator.work","c":"Step.StepAndPacket","l":"step"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"Step()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"Step(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.work","c":"Step.StepAndPacket","l":"StepAndPacket(Step, Packet)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"StepContextBase()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest","c":"RestServer","l":"stop()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"stopNamespace(String)","url":"stopNamespace(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"stopNamespace(String)","url":"stopNamespace(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"STORAGECLASSES"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"SUBJECTACCESSREVIEWS"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"SubsystemHealth()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"NextAction.Kind","l":"SUSPEND"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"suspend(Consumer)","url":"suspend(java.util.function.Consumer)"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"suspend(Step, Consumer)","url":"suspend(oracle.kubernetes.operator.work.Step,java.util.function.Consumer)"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"SUSPENDING_STATE"},{"p":"oracle.kubernetes.operator","c":"SwaggerBuildHelper","l":"SwaggerBuildHelper()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"SwaggerResource","l":"SwaggerResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.utils","c":"SystemClock","l":"SystemClock()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"Pool","l":"take()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"targetNamespaceRecheckIntervalSeconds"},{"p":"oracle.kubernetes.operator.work","c":"AsyncFiber","l":"terminate(Throwable, Packet)","url":"terminate(java.lang.Throwable,oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"terminate(Throwable, Packet)","url":"terminate(java.lang.Throwable,oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"terminate(Throwable, Packet)","url":"terminate(java.lang.Throwable,oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesVersion","l":"TEST_VERSION"},{"p":"oracle.kubernetes.operator.work","c":"ThreadFactorySingleton","l":"ThreadFactorySingleton()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"ThreadLocalContainerResolver","l":"ThreadLocalContainerResolver()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"NextAction.Kind","l":"THROW"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"throwing(Throwable)","url":"throwing(java.lang.Throwable)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"timeoutSeconds(Integer)","url":"timeoutSeconds(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"timeoutSeconds(Long)","url":"timeoutSeconds(java.lang.Long)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"toClusterServiceName(String, String)","url":"toClusterServiceName(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"toDns1123LegalName(String)","url":"toDns1123LegalName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"toEventName(String, String)","url":"toEventName(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"toExternalServiceName(String, String)","url":"toExternalServiceName(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"toJobIntrospectorName(String)","url":"toJobIntrospectorName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"TOKENREVIEWS"},{"p":"oracle.kubernetes.operator.utils","c":"PatchUtils","l":"toKubernetesPatch(JsonPatch)","url":"toKubernetesPatch(javax.json.JsonPatch)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"toPodName(String, String)","url":"toPodName(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest","c":"ExceptionMapper","l":"toResponse(Exception)","url":"toResponse(java.lang.Exception)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"toServerServiceName(String, String)","url":"toServerServiceName(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"Pair","l":"toString()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.CallBuilderTuning","l":"toString()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"toString()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"toString()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.WatchTuning","l":"toString()"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper.DomainTopology","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesVersion","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"BaseModel","l":"toString()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"toString()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsMachineConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"toString()"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"toString()"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Server","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerService","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"toString()"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"toString(boolean)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"toTopology()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"TRACE"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"trace(String)","url":"trace(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"trace(String, Object...)","url":"trace(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"TUNING_PARAMETERS"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"unchangedCountToDelayStatusRecheck"},{"p":"oracle.kubernetes.operator.helpers","c":"OperatorServiceType","l":"UNKNOWN"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"UNKNOWN_STATE"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnprocessableEntityBuilder","l":"UnprocessableEntityBuilder()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.calls","c":"UnrecoverableErrorBuilder","l":"UnrecoverableErrorBuilder()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"update"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"updateLastKnownServerStatus(String, String)","url":"updateLastKnownServerStatus(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"updatePresenceFromEvent(DomainPresenceInfo, V1Service)","url":"updatePresenceFromEvent(oracle.kubernetes.operator.helpers.DomainPresenceInfo,io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainStatusPatch","l":"updateSynchronously(Domain, String, String)","url":"updateSynchronously(oracle.kubernetes.weblogic.domain.model.Domain,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"Main","l":"useDomainStatusEndpoint"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"useKubernetesVersion(String)","url":"useKubernetesVersion(java.lang.String)"},{"p":"oracle.kubernetes.json","c":"YamlDocGenerator","l":"useKubernetesVersion(String)","url":"useKubernetesVersion(java.lang.String)"},{"p":"oracle.kubernetes.json","c":"Description","l":"value()"},{"p":"oracle.kubernetes.json","c":"EnumClass","l":"value()"},{"p":"oracle.kubernetes.json","c":"Pattern","l":"value()"},{"p":"oracle.kubernetes.operator","c":"DomainSourceType","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"ImagePullPolicy","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"ServerStartState","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"ShutdownType","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Scope","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"OperatorServiceType","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretType","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator.work","c":"NextAction.Kind","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainConditionType","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"DomainSourceType","l":"values()"},{"p":"oracle.kubernetes.operator","c":"ImagePullPolicy","l":"values()"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"values()"},{"p":"oracle.kubernetes.operator","c":"ServerStartState","l":"values()"},{"p":"oracle.kubernetes.operator","c":"ShutdownType","l":"values()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"values()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"values()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Scope","l":"values()"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"values()"},{"p":"oracle.kubernetes.operator.helpers","c":"OperatorServiceType","l":"values()"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretType","l":"values()"},{"p":"oracle.kubernetes.operator.work","c":"NextAction.Kind","l":"values()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainConditionType","l":"values()"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"varsToSubVariables(List)","url":"varsToSubVariables(java.util.List)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"VERIFY_ACCESS_DENIED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"VERIFY_ACCESS_DENIED_WITH_NS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"VERIFY_ACCESS_START"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"VERIFY_K8S_MIN_VERSION"},{"p":"oracle.kubernetes.operator.helpers","c":"VersionHelper","l":"VersionHelper()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"VersionModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"VersionModel(String, boolean, String)","url":"%3Cinit%3E(java.lang.String,boolean,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"VersionResource","l":"VersionResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"VersionsResource","l":"VersionsResource()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"PodAwaiterStepFactory","l":"waitForDelete(V1Pod, Step)","url":"waitForDelete(io.kubernetes.client.openapi.models.V1Pod,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"PodWatcher","l":"waitForDelete(V1Pod, Step)","url":"waitForDelete(io.kubernetes.client.openapi.models.V1Pod,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"JobWatcher","l":"waitForReady(V1Job, Step)","url":"waitForReady(io.kubernetes.client.openapi.models.V1Job,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"PodAwaiterStepFactory","l":"waitForReady(V1Pod, Step)","url":"waitForReady(io.kubernetes.client.openapi.models.V1Pod,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"PodWatcher","l":"waitForReady(V1Pod, Step)","url":"waitForReady(io.kubernetes.client.openapi.models.V1Pod,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WAITING_FOR_JOB_READY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WAITING_FOR_POD_READY"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"warning(LoggingFilter, String, Object...)","url":"warning(oracle.kubernetes.operator.logging.LoggingFilter,java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"warning(String)","url":"warning(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"warning(String, Object...)","url":"warning(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"warning(String, Throwable)","url":"warning(java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"watch"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WATCH_DOMAIN"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WATCH_DOMAIN_DELETED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WATCH_EVENT"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"WatchBuilder()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.steps","c":"WatchDomainIntrospectorJobReadyStep","l":"WatchDomainIntrospectorJobReadyStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.WatchTuning","l":"watchLifetime"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.WatchTuning","l":"watchMinimumDelay"},{"p":"oracle.kubernetes.operator.steps","c":"WatchPodReadyAdminStep","l":"WatchPodReadyAdminStep(PodAwaiterStepFactory, Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.PodAwaiterStepFactory,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.WatchTuning","l":"WatchTuning(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"WeblogicApi()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"WeblogicApi(ApiClient)","url":"%3Cinit%3E(io.kubernetes.client.openapi.ApiClient)"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretType","l":"WebLogicCredentials"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"with(Consumer)","url":"with(java.util.function.Consumer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"withActivationTime(DateTime)","url":"withActivationTime(org.joda.time.DateTime)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withAdditionalPvClaimVolume(String, String)","url":"withAdditionalPvClaimVolume(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withAdditionalPvClaimVolume(String, String)","url":"withAdditionalPvClaimVolume(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withAdditionalVolume(String, String)","url":"withAdditionalVolume(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withAdditionalVolume(String, String)","url":"withAdditionalVolume(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withAdditionalVolume(String, String)","url":"withAdditionalVolume(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withAdditionalVolume(String, String)","url":"withAdditionalVolume(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withAdditionalVolumeMount(String, String)","url":"withAdditionalVolumeMount(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withAdditionalVolumeMount(String, String)","url":"withAdditionalVolumeMount(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withAdditionalVolumeMount(String, String)","url":"withAdditionalVolumeMount(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withAdditionalVolumeMount(String, String)","url":"withAdditionalVolumeMount(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"withAdminServer(String, String, int)","url":"withAdminServer(java.lang.String,java.lang.String,int)"},{"p":"oracle.kubernetes.operator.utils","c":"WlsDomainConfigSupport","l":"withAdminServerName(String)","url":"withAdminServerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withAffinity(V1Affinity)","url":"withAffinity(io.kubernetes.client.openapi.models.V1Affinity)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withAffinity(V1Affinity)","url":"withAffinity(io.kubernetes.client.openapi.models.V1Affinity)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withAffinity(V1Affinity)","url":"withAffinity(io.kubernetes.client.openapi.models.V1Affinity)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withAffinity(V1Affinity)","url":"withAffinity(io.kubernetes.client.openapi.models.V1Affinity)"},{"p":"oracle.kubernetes.weblogic.domain","c":"NetworkAccessPointConfigurator","l":"withAnnotation(String, String)","url":"withAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"withApiVersion(String)","url":"withApiVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"withApiVersion(String)","url":"withApiVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"withChannel(String)","url":"withChannel(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"withChannel(String, int)","url":"withChannel(java.lang.String,int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"withChannel(String, int)","url":"withChannel(java.lang.String,int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"withChannelName(String)","url":"withChannelName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withCluster(Cluster)","url":"withCluster(oracle.kubernetes.weblogic.domain.model.Cluster)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"withCluster(String, ClusterConfig)","url":"withCluster(java.lang.String,oracle.kubernetes.operator.helpers.ClusterConfig)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"withCluster(WlsClusterConfig)","url":"withCluster(oracle.kubernetes.operator.wlsconfig.WlsClusterConfig)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withClusteredServerStartPolicy(String)","url":"withClusteredServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"withClusterName(String)","url":"withClusterName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withClusterName(String)","url":"withClusterName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"withClusterName(String)","url":"withClusterName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"withClusterName(String)","url":"withClusterName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"withClusters(Map)","url":"withClusters(java.util.Map)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withConfigOverrides(String)","url":"withConfigOverrides(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withConfigOverrides(String)","url":"withConfigOverrides(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withConfigOverrides(String)","url":"withConfigOverrides(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withConfigOverrideSecrets(String...)","url":"withConfigOverrideSecrets(java.lang.String...)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withConfigOverrideSecrets(String...)","url":"withConfigOverrideSecrets(java.lang.String...)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withConfiguration(Configuration)","url":"withConfiguration(oracle.kubernetes.weblogic.domain.model.Configuration)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withContainer(V1Container)","url":"withContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withContainer(V1Container)","url":"withContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withContainer(V1Container)","url":"withContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withContainer(V1Container)","url":"withContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withContainerSecurityContext(V1SecurityContext)","url":"withContainerSecurityContext(io.kubernetes.client.openapi.models.V1SecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withContainerSecurityContext(V1SecurityContext)","url":"withContainerSecurityContext(io.kubernetes.client.openapi.models.V1SecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withContainerSecurityContext(V1SecurityContext)","url":"withContainerSecurityContext(io.kubernetes.client.openapi.models.V1SecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withContainerSecurityContext(V1SecurityContext)","url":"withContainerSecurityContext(io.kubernetes.client.openapi.models.V1SecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDataHome(String)","url":"withDataHome(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultImage(String)","url":"withDefaultImage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultImagePullPolicy(String)","url":"withDefaultImagePullPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultImagePullSecret(V1LocalObjectReference)","url":"withDefaultImagePullSecret(io.kubernetes.client.openapi.models.V1LocalObjectReference)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultImagePullSecrets(V1LocalObjectReference...)","url":"withDefaultImagePullSecrets(io.kubernetes.client.openapi.models.V1LocalObjectReference...)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultLivenessProbeSettings(Integer, Integer, Integer)","url":"withDefaultLivenessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withDefaultLivenessProbeSettings(Integer, Integer, Integer)","url":"withDefaultLivenessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultReadinessProbeSettings(Integer, Integer, Integer)","url":"withDefaultReadinessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withDefaultReadinessProbeSettings(Integer, Integer, Integer)","url":"withDefaultReadinessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultReplicaCount(int)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultServerStartPolicy(String)","url":"withDefaultServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withDefaultServerStartPolicy(String)","url":"withDefaultServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withDesiredState(String)","url":"withDesiredState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withDesiredState(String)","url":"withDesiredState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"withDesiredState(String)","url":"withDesiredState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDomainHome(String)","url":"withDomainHome(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDomainHomeInImage(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withDomainHomeInImage(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withDomainUid(String)","url":"withDomainUid(java.lang.String)"},{"p":"oracle.kubernetes.operator.utils","c":"WlsDomainConfigSupport","l":"withDynamicWlsCluster(String, String...)","url":"withDynamicWlsCluster(java.lang.String,java.lang.String...)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withEnv(List)","url":"withEnv(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"withEnv(List)","url":"withEnv(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"withEnv(List)","url":"withEnv(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withEnvironmentVariable(String, String)","url":"withEnvironmentVariable(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withEnvironmentVariable(String, String)","url":"withEnvironmentVariable(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withEnvironmentVariable(String, String)","url":"withEnvironmentVariable(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withEnvironmentVariable(String, String)","url":"withEnvironmentVariable(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withEnvironmentVariable(V1EnvVar)","url":"withEnvironmentVariable(io.kubernetes.client.openapi.models.V1EnvVar)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withEnvironmentVariable(V1EnvVar)","url":"withEnvironmentVariable(io.kubernetes.client.openapi.models.V1EnvVar)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withEnvironmentVariable(V1EnvVar)","url":"withEnvironmentVariable(io.kubernetes.client.openapi.models.V1EnvVar)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"withFieldSelector(String)","url":"withFieldSelector(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"withFieldSelector(String)","url":"withFieldSelector(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"withHealth(ServerHealth)","url":"withHealth(oracle.kubernetes.weblogic.domain.model.ServerHealth)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"withHealth(String)","url":"withHealth(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withImage(String)","url":"withImage(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"withImage(String)","url":"withImage(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"withImage(String)","url":"withImage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withImage(String)","url":"withImage(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withImagePullPolicy(String)","url":"withImagePullPolicy(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"withImagePullPolicy(String)","url":"withImagePullPolicy(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"withImagePullPolicy(String)","url":"withImagePullPolicy(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withImagePullSecrets(List)","url":"withImagePullSecrets(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"withImagePullSecrets(List)","url":"withImagePullSecrets(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"withImagePullSecrets(List)","url":"withImagePullSecrets(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withIncludeServerOutInPodLog(boolean)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withInitContainer(V1Container)","url":"withInitContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withInitContainer(V1Container)","url":"withInitContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withInitContainer(V1Container)","url":"withInitContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withInitContainer(V1Container)","url":"withInitContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"withIsAdminServer(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerService","l":"withIsPrecreateService(Boolean)","url":"withIsPrecreateService(java.lang.Boolean)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withIstio()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withIstio()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"withIstio(Istio)","url":"withIstio(oracle.kubernetes.weblogic.domain.model.Istio)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"withIstioEnabled(Boolean)","url":"withIstioEnabled(java.lang.Boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"withItems(List)","url":"withItems(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"withKind(String)","url":"withKind(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"withKind(String)","url":"withKind(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"NetworkAccessPointConfigurator","l":"withLabel(String, String)","url":"withLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"withLabelSelector(String)","url":"withLabelSelector(java.lang.String)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"withLabelSelectors(String...)","url":"withLabelSelectors(java.lang.String...)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"withLabelSelectors(String...)","url":"withLabelSelectors(java.lang.String...)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"withLastProbeTime(DateTime)","url":"withLastProbeTime(org.joda.time.DateTime)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withLimitRequirement(String, String)","url":"withLimitRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withLimitRequirement(String, String)","url":"withLimitRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withLimitRequirement(String, String)","url":"withLimitRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withLimitRequirement(String, String)","url":"withLimitRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"withListenAddress(String)","url":"withListenAddress(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withLivenessProbeSettings(Integer, Integer, Integer)","url":"withLivenessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withLivenessProbeSettings(Integer, Integer, Integer)","url":"withLivenessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withLogHome(String)","url":"withLogHome(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withLogHomeEnabled(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"withMaximumReplicas(Integer)","url":"withMaximumReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"withMaxReplicas(int)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withMaxUnavailable(int)"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnprocessableEntityBuilder","l":"withMessage(String)","url":"withMessage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"withMessage(String)","url":"withMessage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"withMessage(String)","url":"withMessage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"withMetadata(V1ListMeta)","url":"withMetadata(io.kubernetes.client.openapi.models.V1ListMeta)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"withMetadata(V1ObjectMeta)","url":"withMetadata(io.kubernetes.client.openapi.models.V1ObjectMeta)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"withMinimumReplicas(Integer)","url":"withMinimumReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"withMinReplicas(int)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withNodeName(String)","url":"withNodeName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withNodeName(String)","url":"withNodeName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withNodeName(String)","url":"withNodeName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withNodeName(String)","url":"withNodeName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"withNodeName(String)","url":"withNodeName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withNodePort(int)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"withNodePort(int)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"withNodePort(int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"withNodePort(Integer)","url":"withNodePort(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withNodeSelector(String, String)","url":"withNodeSelector(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withNodeSelector(String, String)","url":"withNodeSelector(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withNodeSelector(String, String)","url":"withNodeSelector(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withNodeSelector(String, String)","url":"withNodeSelector(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesUtils","l":"withOperatorLabels(String, V1ObjectMeta)","url":"withOperatorLabels(java.lang.String,io.kubernetes.client.openapi.models.V1ObjectMeta)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"withOverallHealth(String)","url":"withOverallHealth(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withPodAnnotation(String, String)","url":"withPodAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withPodAnnotation(String, String)","url":"withPodAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withPodAnnotation(String, String)","url":"withPodAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withPodAnnotation(String, String)","url":"withPodAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withPodLabel(String, String)","url":"withPodLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withPodLabel(String, String)","url":"withPodLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withPodLabel(String, String)","url":"withPodLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withPodLabel(String, String)","url":"withPodLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withPodSecurityContext(V1PodSecurityContext)","url":"withPodSecurityContext(io.kubernetes.client.openapi.models.V1PodSecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withPodSecurityContext(V1PodSecurityContext)","url":"withPodSecurityContext(io.kubernetes.client.openapi.models.V1PodSecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withPodSecurityContext(V1PodSecurityContext)","url":"withPodSecurityContext(io.kubernetes.client.openapi.models.V1PodSecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withPodSecurityContext(V1PodSecurityContext)","url":"withPodSecurityContext(io.kubernetes.client.openapi.models.V1PodSecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withPrecreateServerService(boolean)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withPriorityClassName(String)","url":"withPriorityClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withPriorityClassName(String)","url":"withPriorityClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withPriorityClassName(String)","url":"withPriorityClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withPriorityClassName(String)","url":"withPriorityClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withReadinessGate(V1PodReadinessGate)","url":"withReadinessGate(io.kubernetes.client.openapi.models.V1PodReadinessGate)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withReadinessGate(V1PodReadinessGate)","url":"withReadinessGate(io.kubernetes.client.openapi.models.V1PodReadinessGate)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withReadinessProbeSettings(Integer, Integer, Integer)","url":"withReadinessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withReadinessProbeSettings(Integer, Integer, Integer)","url":"withReadinessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"withReadyReplicas(Integer)","url":"withReadyReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"Cause","l":"withReason(String)","url":"withReason(java.lang.String)"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnprocessableEntityBuilder","l":"withReason(String)","url":"withReason(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"withReason(String)","url":"withReason(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"withReason(String)","url":"withReason(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"withReplicas(int)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withReplicas(int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"withReplicas(Integer)","url":"withReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withReplicas(Integer)","url":"withReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"withReplicas(Integer)","url":"withReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"withReplicasGoal(Integer)","url":"withReplicasGoal(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withRequestRequirement(String, String)","url":"withRequestRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withRequestRequirement(String, String)","url":"withRequestRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withRequestRequirement(String, String)","url":"withRequestRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withRequestRequirement(String, String)","url":"withRequestRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"withResourceVersion(String)","url":"withResourceVersion(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withRestartedLabel(String)","url":"withRestartedLabel(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"withRestartedLabel(String)","url":"withRestartedLabel(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"withRestartedLabel(String)","url":"withRestartedLabel(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withRestartPolicy(String)","url":"withRestartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withRestartPolicy(String)","url":"withRestartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withRestartPolicy(String)","url":"withRestartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withRestartPolicy(String)","url":"withRestartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withRestartVersion(String)","url":"withRestartVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withRestartVersion(String)","url":"withRestartVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withRestartVersion(String)","url":"withRestartVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withRestartVersion(String)","url":"withRestartVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withRuntimeClassName(String)","url":"withRuntimeClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withRuntimeClassName(String)","url":"withRuntimeClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withRuntimeClassName(String)","url":"withRuntimeClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withRuntimeClassName(String)","url":"withRuntimeClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withSchedulerName(String)","url":"withSchedulerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withSchedulerName(String)","url":"withSchedulerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withSchedulerName(String)","url":"withSchedulerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withSchedulerName(String)","url":"withSchedulerName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"withServer(String, ClusteredServerConfig)","url":"withServer(java.lang.String,oracle.kubernetes.operator.helpers.ClusteredServerConfig)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"withServer(String, NonClusteredServerConfig)","url":"withServer(java.lang.String,oracle.kubernetes.operator.helpers.NonClusteredServerConfig)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withServerName(String)","url":"withServerName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"withServerName(String)","url":"withServerName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"withServerName(String)","url":"withServerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"withServerName(String)","url":"withServerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"withServerName(String)","url":"withServerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"withServers(List)","url":"withServers(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"withServers(Map)","url":"withServers(java.util.Map)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"withServers(Map)","url":"withServers(java.util.Map)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withServerStartPolicy(String)","url":"withServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withServerStartPolicy(String)","url":"withServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withServerStartState(String)","url":"withServerStartState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withServerStartState(String)","url":"withServerStartState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withServerStartState(String)","url":"withServerStartState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withServerStartState(String)","url":"withServerStartState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withServiceAnnotation(String, String)","url":"withServiceAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withServiceAnnotation(String, String)","url":"withServiceAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServiceConfigurator","l":"withServiceAnnotation(String, String)","url":"withServiceAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"withServiceAnnotation(String, String)","url":"withServiceAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withServiceLabel(String, String)","url":"withServiceLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withServiceLabel(String, String)","url":"withServiceLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServiceConfigurator","l":"withServiceLabel(String, String)","url":"withServiceLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"withServiceLabel(String, String)","url":"withServiceLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AnnotationHelper","l":"withSha256Hash(V1Pod)","url":"withSha256Hash(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator.helpers","c":"AnnotationHelper","l":"withSha256Hash(V1Service)","url":"withSha256Hash(io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"withSpec(DomainSpec)","url":"withSpec(oracle.kubernetes.weblogic.domain.model.DomainSpec)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"withState(String)","url":"withState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"withStatus(DomainStatus)","url":"withStatus(oracle.kubernetes.weblogic.domain.model.DomainStatus)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"withStatus(String)","url":"withStatus(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"withSubsystemName(String)","url":"withSubsystemName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"withSymptoms(List)","url":"withSymptoms(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"withSymptoms(String...)","url":"withSymptoms(java.lang.String...)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"withTimeoutSeconds(Integer)","url":"withTimeoutSeconds(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.http","c":"HttpAsyncRequestStep","l":"withTimeoutSeconds(long)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withToleration(V1Toleration)","url":"withToleration(io.kubernetes.client.openapi.models.V1Toleration)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withToleration(V1Toleration)","url":"withToleration(io.kubernetes.client.openapi.models.V1Toleration)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withToleration(V1Toleration)","url":"withToleration(io.kubernetes.client.openapi.models.V1Toleration)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withToleration(V1Toleration)","url":"withToleration(io.kubernetes.client.openapi.models.V1Toleration)"},{"p":"oracle.kubernetes.operator.helpers","c":"OperatorServiceType","l":"withTypeLabel(V1Service)","url":"withTypeLabel(io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withWebLogicCredentialsSecret(String, String)","url":"withWebLogicCredentialsSecret(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withWebLogicCredentialsSecret(String, String)","url":"withWebLogicCredentialsSecret(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withWebLogicCredentialsSecret(V1SecretReference)","url":"withWebLogicCredentialsSecret(io.kubernetes.client.openapi.models.V1SecretReference)"},{"p":"oracle.kubernetes.operator.utils","c":"WlsDomainConfigSupport","l":"withWlsCluster(String, String...)","url":"withWlsCluster(java.lang.String,java.lang.String...)"},{"p":"oracle.kubernetes.operator.utils","c":"WlsDomainConfigSupport","l":"withWlsServer(String, Integer)","url":"withWlsServer(java.lang.String,java.lang.Integer)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_CLUSTER_SIZE_UPDATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_CONFIGURATION_READ"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_HEALTH_READ_FAILED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_HEALTH_READ_FAILED_NO_HTTPCLIENT"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_SERVER_TEMPLATE_NOT_FOUND"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_UPDATE_CLUSTER_SIZE_FAILED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_UPDATE_CLUSTER_SIZE_INVALID_CLUSTER"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_UPDATE_CLUSTER_SIZE_STARTING"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"WlsClusterConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"WlsClusterConfig(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"WlsClusterConfig(String, WlsDynamicServersConfig)","url":"%3Cinit%3E(java.lang.String,oracle.kubernetes.operator.wlsconfig.WlsDynamicServersConfig)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"WlsDomainConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"WlsDomainConfig(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"WlsDomainConfig(String, String, Map, Map, Map, Map)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.util.Map,java.util.Map,java.util.Map,java.util.Map)"},{"p":"oracle.kubernetes.operator.utils","c":"WlsDomainConfigSupport","l":"WlsDomainConfigSupport(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"WlsDynamicServersConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"WlsDynamicServersConfig(Integer, Integer, Integer, String, boolean, String, WlsServerConfig, List)","url":"%3Cinit%3E(java.lang.Integer,java.lang.Integer,java.lang.Integer,java.lang.String,boolean,java.lang.String,oracle.kubernetes.operator.wlsconfig.WlsServerConfig,java.util.List)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsMachineConfig","l":"WlsMachineConfig(String, Integer, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.Integer,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"WlsServerConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"WlsServerConfig(String, String, int)","url":"%3Cinit%3E(java.lang.String,java.lang.String,int)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"WlsServerConfig(String, String, String, Integer, Integer, Integer, List)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.lang.Integer,java.lang.Integer,java.lang.Integer,java.util.List)"},{"p":"oracle.kubernetes.operator.work","c":"Engine","l":"wrappedExecutorService(String, Container)","url":"wrappedExecutorService(java.lang.String,oracle.kubernetes.operator.work.Container)"},{"p":"oracle.kubernetes.json","c":"YamlDocGenerator","l":"YamlDocGenerator(Map)","url":"%3Cinit%3E(java.util.Map)"}] \ No newline at end of file +memberSearchIndex = [{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"ACCESS_LOG_IN_LOG_HOME"},{"p":"oracle.kubernetes.operator.rest","c":"AuthenticationFilter","l":"ACCESS_TOKEN_PREFIX"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"addActionLink(LinkContainerModel, String)","url":"addActionLink(oracle.kubernetes.operator.rest.model.LinkContainerModel,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"addActionLink(String, String)","url":"addActionLink(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"addCluster(ClusterStatus)","url":"addCluster(oracle.kubernetes.weblogic.domain.model.ClusterStatus)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"addCondition(DomainCondition)","url":"addCondition(oracle.kubernetes.weblogic.domain.model.DomainCondition)"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"addDefaultEnvVarIfMissing(List, String, String)","url":"addDefaultEnvVarIfMissing(java.util.List,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"ErrorBody","l":"addDetails()"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"addEnvVar(List, String, String)","url":"addEnvVar(java.util.List,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"addEnvVarIfTrue(boolean, List, String)","url":"addEnvVarIfTrue(boolean,java.util.List,java.lang.String)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"addExternalSchema(URL, URL)","url":"addExternalSchema(java.net.URL,java.net.URL)"},{"p":"oracle.kubernetes.operator.rest.model","c":"CollectionModel","l":"addItem(T)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"addLink(LinkContainerModel, String)","url":"addLink(oracle.kubernetes.operator.rest.model.LinkContainerModel,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"addLink(String, String)","url":"addLink(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"addLink(String, String, String)","url":"addLink(java.lang.String,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"addNetworkAccessPoint(NetworkAccessPoint)","url":"addNetworkAccessPoint(oracle.kubernetes.operator.wlsconfig.NetworkAccessPoint)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"addNetworkAccessPoint(String, int)","url":"addNetworkAccessPoint(java.lang.String,int)"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"addOrReplaceEnvVar(List, String, String)","url":"addOrReplaceEnvVar(java.util.List,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"addPackageToSuppressDescriptions(String)","url":"addPackageToSuppressDescriptions(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"addSelfAndParentLinks(LinkContainerModel)","url":"addSelfAndParentLinks(oracle.kubernetes.operator.rest.model.LinkContainerModel)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"addSelfAndParentLinks(String, String)","url":"addSelfAndParentLinks(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"addSelfLinks(String)","url":"addSelfLinks(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"addServer(ServerStatus)","url":"addServer(oracle.kubernetes.weblogic.domain.model.ServerStatus)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"addServerConfig(WlsServerConfig)","url":"addServerConfig(oracle.kubernetes.operator.wlsconfig.WlsServerConfig)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"addSubsystem(SubsystemHealth)","url":"addSubsystem(oracle.kubernetes.weblogic.domain.model.SubsystemHealth)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"addToPresence(DomainPresenceInfo, V1Service)","url":"addToPresence(oracle.kubernetes.operator.helpers.DomainPresenceInfo,io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"addValidationWarning(String)","url":"addValidationWarning(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"addWlsServer(String, String, int)","url":"addWlsServer(java.lang.String,java.lang.String,int)"},{"p":"oracle.kubernetes.operator","c":"ServerStartState","l":"ADMIN"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"ADMIN_NAME"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"ADMIN_ONLY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ADMIN_POD_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ADMIN_POD_EXISTS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ADMIN_POD_PATCHED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ADMIN_POD_REPLACED"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"ADMIN_PORT"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"ADMIN_PORT_SECURE"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretHelper","l":"ADMIN_SERVER_CREDENTIALS_PASSWORD"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretHelper","l":"ADMIN_SERVER_CREDENTIALS_USERNAME"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"ADMIN_SERVER_PORT_SECURE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ADMIN_SERVICE_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ADMIN_SERVICE_EXISTS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ADMIN_SERVICE_REPLACED"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"ADMIN_STATE"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"AdminServer()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"AdminService()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"ALL_READ_AND_EXECUTE"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"ALL_STOPPED_AVAILABLE_REASON"},{"p":"oracle.kubernetes.operator","c":"ImagePullPolicy","l":"Always"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"ALWAYS"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"ALWAYS_IMAGEPULLPOLICY"},{"p":"oracle.kubernetes.operator.helpers","c":"AnnotationHelper","l":"AnnotationHelper()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"API_VERSION_WEBLOGIC_ORACLE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"APIEXCEPTION_FROM_SUBJECT_ACCESS_REVIEW"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"APIEXCEPTION_FROM_TOKEN_REVIEW"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"APP_LABEL"},{"p":"oracle.kubernetes.operator.calls","c":"AsyncRequestStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.http","c":"HttpAsyncRequestStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.http","c":"HttpResponseStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"AbstractListStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"BeforeAdminServiceStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ClusterServicesStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ConfigMapAfterStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"DeleteDomainStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"DomainPresenceStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServerUpAfterStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServerUpIteratorStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServersUpStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ReadHealthStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ServerDownIteratorStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"ServerDownStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"WatchDomainIntrospectorJobReadyStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.steps","c":"WatchPodReadyAdminStep","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"apply(Packet)","url":"apply(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"AS_SERVICE_NAME"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ASYNC_FAILURE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ASYNC_NO_RETRY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ASYNC_REQUEST"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ASYNC_RETRY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ASYNC_SUCCESS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ASYNC_TIMEOUT"},{"p":"oracle.kubernetes.operator.calls","c":"AsyncRequestStep","l":"AsyncRequestStep(ResponseStep, RequestParams, CallFactory, ClientPool, int, int, String, String, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.helpers.ResponseStep,oracle.kubernetes.operator.calls.RequestParams,oracle.kubernetes.operator.calls.CallFactory,oracle.kubernetes.operator.helpers.ClientPool,int,int,java.lang.String,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"augmentSubVars(Map)","url":"augmentSubVars(java.util.Map)"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"augmentSubVars(Map)","url":"augmentSubVars(java.util.Map)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodStepContext","l":"augmentSubVars(Map)","url":"augmentSubVars(java.util.Map)"},{"p":"oracle.kubernetes.operator.rest","c":"FilterPriorities","l":"AUTHENTICATION_FILTER_PRIORITY"},{"p":"oracle.kubernetes.operator.rest","c":"AuthenticationFilter","l":"AuthenticationFilter()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthenticationProxy","l":"AuthenticationProxy()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"Authenticator()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"Authenticator(ApiClient)","url":"%3Cinit%3E(io.kubernetes.client.openapi.ApiClient)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy","l":"AuthorizationProxy()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainConditionType","l":"Available"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"BAD_DOMAIN"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"BAD_TOPOLOGY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"BAD_VOLUME_MOUNT_PATH"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"BaseConfiguration()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest","c":"BaseDebugLoggingFilter","l":"BaseDebugLoggingFilter()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"BaseModel","l":"BaseModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"BaseResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.operator.steps","c":"BeforeAdminServiceStep","l":"BeforeAdminServiceStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"body"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnrecoverableErrorBuilderImpl","l":"build()"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"call"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CALL_FAILED"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"CallBuilder()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilderFactory","l":"CallBuilderFactory()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.CallBuilderTuning","l":"CallBuilderTuning(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.CallBuilderTuning","l":"callMaxRetryCount"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.CallBuilderTuning","l":"callRequestLimit"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.CallBuilderTuning","l":"callTimeoutSeconds"},{"p":"oracle.kubernetes.operator.calls","c":"CallWrapper","l":"CallWrapper(Call)","url":"%3Cinit%3E(okhttp3.Call)"},{"p":"oracle.kubernetes.operator.calls","c":"CallWrapper","l":"cancel()"},{"p":"oracle.kubernetes.operator.calls","c":"CancellableCall","l":"cancel()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"cancel(boolean)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFilter","l":"canLog(LoggingFilter, String)","url":"canLog(oracle.kubernetes.operator.logging.LoggingFilter,java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFilter","l":"canLog(String)","url":"canLog(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"OncePerMessageLoggingFilter","l":"canLog(String)","url":"canLog(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CANNOT_CREATE_TOKEN_REVIEW"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CANNOT_EXPOSE_DEFAULT_CHANNEL_ISTIO"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CANNOT_PARSE_INTROSPECTOR_FILE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CANNOT_PARSE_INTROSPECTOR_RESULT"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CANNOT_PARSE_TOPOLOGY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CANNOT_START_DOMAIN_AFTER_MAX_RETRIES"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"Cause","l":"Cause()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.utils","c":"Certificates","l":"Certificates()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"chain(Step...)","url":"chain(oracle.kubernetes.operator.work.Step...)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"Channel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy","l":"check(AuthorizationProxy.Operation, AuthorizationProxy.Resource, String, AuthorizationProxy.Scope, String)","url":"check(oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation,oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource,java.lang.String,oracle.kubernetes.operator.helpers.AuthorizationProxy.Scope,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"HealthCheckHelper","l":"check(List, AuthorizationProxy.Resource, AuthorizationProxy.Operation)","url":"check(java.util.List,oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource,oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy","l":"check(String, AuthorizationProxy.Operation, AuthorizationProxy.Resource, String, AuthorizationProxy.Scope, String)","url":"check(java.lang.String,oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation,oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource,java.lang.String,oracle.kubernetes.operator.helpers.AuthorizationProxy.Scope,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy","l":"check(String, List, AuthorizationProxy.Operation, AuthorizationProxy.Resource, String, AuthorizationProxy.Scope, String)","url":"check(java.lang.String,java.util.List,oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation,oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource,java.lang.String,oracle.kubernetes.operator.helpers.AuthorizationProxy.Scope,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthenticationProxy","l":"check(String, String)","url":"check(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"CLASS"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"clear()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"clearValidationWarnings()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClientPool","l":"ClientPool()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"clone()"},{"p":"oracle.kubernetes.operator.builders","c":"WatchImpl","l":"close()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingContext","l":"close()"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"closeClient(ApiClient)","url":"closeClient(io.kubernetes.client.openapi.ApiClient)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Scope","l":"cluster"},{"p":"oracle.kubernetes.operator.helpers","c":"OperatorServiceType","l":"CLUSTER"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"CLUSTER_IP_TYPE"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"CLUSTER_NAME"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CLUSTER_SERVICE_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CLUSTER_SERVICE_EXISTS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CLUSTER_SERVICE_REPLACED"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"Cluster()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"ClusterConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"CLUSTERED_SERVER_START_POLICY_ALWAYS"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"CLUSTERED_SERVER_START_POLICY_IF_NEEDED"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"CLUSTERED_SERVER_START_POLICY_NEVER"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"ClusteredServerConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ClusterModel","l":"ClusterModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ClusterModel","l":"ClusterModel(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"CLUSTERNAME_LABEL"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ClusterResource","l":"ClusterResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"CLUSTERRESTARTVERSION_LABEL"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"clusters"},{"p":"oracle.kubernetes.operator.steps","c":"ClusterServicesStep","l":"ClusterServicesStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"ClusterSpec()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"ClusterSpecCommonImpl(DomainSpec, Cluster)","url":"%3Cinit%3E(oracle.kubernetes.weblogic.domain.model.DomainSpec,oracle.kubernetes.weblogic.domain.model.Cluster)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ClustersResource","l":"ClustersResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"ClusterStatus()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CM_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CM_EXISTS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CM_PATCHED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CM_REPLACED"},{"p":"oracle.kubernetes.operator.rest.model","c":"CollectionModel","l":"CollectionModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.utils","c":"OperatorUtils","l":"compareSortingStrings(String, String)","url":"compareSortingStrings(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"compareTo(Channel)","url":"compareTo(oracle.kubernetes.weblogic.domain.model.Channel)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"compareTo(Cluster)","url":"compareTo(oracle.kubernetes.weblogic.domain.model.Cluster)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"compareTo(ClusterStatus)","url":"compareTo(oracle.kubernetes.weblogic.domain.model.ClusterStatus)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"compareTo(DomainCondition)","url":"compareTo(oracle.kubernetes.weblogic.domain.model.DomainCondition)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"compareTo(ManagedServer)","url":"compareTo(oracle.kubernetes.weblogic.domain.model.ManagedServer)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"compareTo(ResourceVersion)","url":"compareTo(oracle.kubernetes.operator.helpers.ResourceVersion)"},{"p":"oracle.kubernetes.operator.helpers","c":"SemanticVersion","l":"compareTo(SemanticVersion)","url":"compareTo(oracle.kubernetes.operator.helpers.SemanticVersion)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"compareTo(ServerStatus)","url":"compareTo(oracle.kubernetes.weblogic.domain.model.ServerStatus)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"compareTo(SubsystemHealth)","url":"compareTo(oracle.kubernetes.weblogic.domain.model.SubsystemHealth)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"complete()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"config(String)","url":"config(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"config(String, Object...)","url":"config(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"config(String, Throwable)","url":"config(java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.steps","c":"ConfigMapAfterStep","l":"ConfigMapAfterStep(String, Map, TuningParameters.WatchTuning, AtomicBoolean, WatchListener)","url":"%3Cinit%3E(java.lang.String,java.util.Map,oracle.kubernetes.operator.TuningParameters.WatchTuning,java.util.concurrent.atomic.AtomicBoolean,oracle.kubernetes.operator.watcher.WatchListener)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"ConfigMapConsumer(ScheduledExecutorService, String, Runnable)","url":"%3Cinit%3E(java.util.concurrent.ScheduledExecutorService,java.lang.String,java.lang.Runnable)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"CONFIGMAPS"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretType","l":"ConfigOverride"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"Configuration()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain","c":"ConfigurationNotSupportedException","l":"ConfigurationNotSupportedException(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"configureAdminServer()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"configureAdminServer()"},{"p":"oracle.kubernetes.weblogic.domain","c":"AdminServerConfigurator","l":"configureAdminService()"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"configureCluster(String)","url":"configureCluster(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"configureCluster(String)","url":"configureCluster(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"configureServer(String)","url":"configureServer(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"configureServer(String)","url":"configureServer(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"CONTAINER_NAME"},{"p":"oracle.kubernetes.operator.work","c":"Container","l":"Container()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"ContainerResolver","l":"ContainerResolver()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"containsCluster(String)","url":"containsCluster(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"containsKey(Object)","url":"containsKey(java.lang.Object)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"containsServer(String)","url":"containsServer(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"containsValue(Object)","url":"containsValue(java.lang.Object)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"convertArraysForLogging(Object, boolean)","url":"convertArraysForLogging(java.lang.Object,boolean)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"COULD_NOT_CREATE_LIVENESS_FILE"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"CRD_NAME"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"CRDS"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"create"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CREATE_CRD_FAILED"},{"p":"oracle.kubernetes.operator","c":"OperatorReady","l":"create()"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilderFactory","l":"create()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClientPool","l":"create()"},{"p":"oracle.kubernetes.operator.helpers","c":"Pool","l":"create()"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExecFactory","l":"create(ApiClient, V1Pod, String)","url":"create(io.kubernetes.client.openapi.ApiClient,io.kubernetes.client.openapi.models.V1Pod,java.lang.String)"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExecFactoryImpl","l":"create(ApiClient, V1Pod, String)","url":"create(io.kubernetes.client.openapi.ApiClient,io.kubernetes.client.openapi.models.V1Pod,java.lang.String)"},{"p":"oracle.kubernetes.operator.http","c":"HttpAsyncRequestStep","l":"create(HttpRequest, HttpResponseStep)","url":"create(java.net.http.HttpRequest,oracle.kubernetes.operator.http.HttpResponseStep)"},{"p":"oracle.kubernetes.operator.rest","c":"RestServer","l":"create(RestConfig)","url":"create(oracle.kubernetes.operator.rest.RestConfig)"},{"p":"oracle.kubernetes.json","c":"KubernetesSchemaReference","l":"create(String)","url":"create(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"create(String)","url":"create(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"EventWatcher","l":"create(ThreadFactory, String, String, String, TuningParameters.WatchTuning, WatchListener, AtomicBoolean)","url":"create(java.util.concurrent.ThreadFactory,java.lang.String,java.lang.String,java.lang.String,oracle.kubernetes.operator.TuningParameters.WatchTuning,oracle.kubernetes.operator.watcher.WatchListener,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"oracle.kubernetes.operator","c":"JobWatcher","l":"create(ThreadFactory, String, String, TuningParameters.WatchTuning, AtomicBoolean)","url":"create(java.util.concurrent.ThreadFactory,java.lang.String,java.lang.String,oracle.kubernetes.operator.TuningParameters.WatchTuning,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"oracle.kubernetes.operator","c":"DomainWatcher","l":"create(ThreadFactory, String, String, TuningParameters.WatchTuning, WatchListener, AtomicBoolean)","url":"create(java.util.concurrent.ThreadFactory,java.lang.String,java.lang.String,oracle.kubernetes.operator.TuningParameters.WatchTuning,oracle.kubernetes.operator.watcher.WatchListener,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"oracle.kubernetes.operator","c":"ConfigMapWatcher","l":"create(ThreadFactory, String, String, TuningParameters.WatchTuning, WatchListener, AtomicBoolean)","url":"create(java.util.concurrent.ThreadFactory,java.lang.String,java.lang.String,oracle.kubernetes.operator.TuningParameters.WatchTuning,oracle.kubernetes.operator.watcher.WatchListener,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"oracle.kubernetes.operator","c":"PodWatcher","l":"create(ThreadFactory, String, String, TuningParameters.WatchTuning, WatchListener, AtomicBoolean)","url":"create(java.util.concurrent.ThreadFactory,java.lang.String,java.lang.String,oracle.kubernetes.operator.TuningParameters.WatchTuning,oracle.kubernetes.operator.watcher.WatchListener,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"oracle.kubernetes.operator","c":"ServiceWatcher","l":"create(ThreadFactory, String, String, TuningParameters.WatchTuning, WatchListener, AtomicBoolean)","url":"create(java.util.concurrent.ThreadFactory,java.lang.String,java.lang.String,oracle.kubernetes.operator.TuningParameters.WatchTuning,oracle.kubernetes.operator.watcher.WatchListener,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"oracle.kubernetes.operator","c":"NamespaceWatcher","l":"create(ThreadFactory, String, TuningParameters.WatchTuning, WatchListener, AtomicBoolean)","url":"create(java.util.concurrent.ThreadFactory,java.lang.String,oracle.kubernetes.operator.TuningParameters.WatchTuning,oracle.kubernetes.operator.watcher.WatchListener,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"createAdminPodStep(Step)","url":"createAdminPodStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"createAdminServerPodModel(Packet)","url":"createAdminServerPodModel(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"createAdminService()"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"createAvailableStep(String, Step)","url":"createAvailableStep(java.lang.String,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createBetaCustomResourceDefinitionAsync(V1beta1CustomResourceDefinition, ResponseStep)","url":"createBetaCustomResourceDefinitionAsync(io.kubernetes.client.openapi.models.V1beta1CustomResourceDefinition,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.work","c":"AsyncFiber","l":"createChildFiber()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"createChildFiber()"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"createClientByServiceAccountName(String)","url":"createClientByServiceAccountName(java.lang.String)"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"createClientByServiceAccountName(String, String)","url":"createClientByServiceAccountName(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"createClientByToken(String)","url":"createClientByToken(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createConfigMapAsync(String, V1ConfigMap, ResponseStep)","url":"createConfigMapAsync(java.lang.String,io.kubernetes.client.openapi.models.V1ConfigMap,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"createConfigMapWatch(String)","url":"createConfigMapWatch(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"createContainer(TuningParameters)","url":"createContainer(oracle.kubernetes.operator.TuningParameters)"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"createContainer(TuningParameters)","url":"createContainer(oracle.kubernetes.operator.TuningParameters)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodStepContext","l":"createContainer(TuningParameters)","url":"createContainer(oracle.kubernetes.operator.TuningParameters)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createCustomResourceDefinitionAsync(V1CustomResourceDefinition, ResponseStep)","url":"createCustomResourceDefinitionAsync(io.kubernetes.client.openapi.models.V1CustomResourceDefinition,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"CREATEDBYOPERATOR_LABEL"},{"p":"oracle.kubernetes.operator.helpers","c":"CrdHelper","l":"createDomainCrdStep(KubernetesVersion, SemanticVersion, Step)","url":"createDomainCrdStep(oracle.kubernetes.operator.helpers.KubernetesVersion,oracle.kubernetes.operator.helpers.SemanticVersion,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"JobHelper","l":"createDomainIntrospectorJobStep(Step)","url":"createDomainIntrospectorJobStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.steps","c":"DomainPresenceStep","l":"createDomainPresenceStep(Domain, Step, Step)","url":"createDomainPresenceStep(oracle.kubernetes.weblogic.domain.model.Domain,oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainValidationSteps","l":"createDomainValidationSteps(String, Step)","url":"createDomainValidationSteps(java.lang.String,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"createDomainWatch(String)","url":"createDomainWatch(java.lang.String)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"createEventWatch(String)","url":"createEventWatch(java.lang.String)"},{"p":"oracle.kubernetes.operator.calls","c":"UnrecoverableErrorBuilder","l":"createExceptionFromFailedCall(CallResponse)","url":"createExceptionFromFailedCall(oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"createFailedStep(CallResponse, Step)","url":"createFailedStep(oracle.kubernetes.operator.calls.CallResponse,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"createFailedStep(String, String, Step)","url":"createFailedStep(java.lang.String,java.lang.String,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"createFailure(RequestParams, ApiException, int)","url":"createFailure(oracle.kubernetes.operator.calls.RequestParams,io.kubernetes.client.openapi.ApiException,int)"},{"p":"oracle.kubernetes.operator.work","c":"Engine","l":"createFiber()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"createFiberGate()"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"createFor(Domain)","url":"createFor(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"createFor(Domain)","url":"createFor(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.operator.work","c":"Component","l":"createFor(Object...)","url":"createFor(java.lang.Object...)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"createForClusterStep(Step)","url":"createForClusterStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"createForExternalServiceStep(Step)","url":"createForExternalServiceStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"createForServerStep(boolean, Step)","url":"createForServerStep(boolean,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"createForServerStep(Step)","url":"createForServerStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.http","c":"HttpAsyncRequestStep","l":"createGetRequest(String, HttpResponseStep)","url":"createGetRequest(java.lang.String,oracle.kubernetes.operator.http.HttpResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper","l":"createIntrospectorConfigMapStep(Step)","url":"createIntrospectorConfigMapStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createJobAsync(String, V1Job, ResponseStep)","url":"createJobAsync(java.lang.String,io.kubernetes.client.openapi.models.V1Job,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"createJobWatch(String)","url":"createJobWatch(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"createMakeRightOperation(Domain)","url":"createMakeRightOperation(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"createMakeRightOperation(Domain)","url":"createMakeRightOperation(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"createMakeRightOperation(DomainPresenceInfo)","url":"createMakeRightOperation(oracle.kubernetes.operator.helpers.DomainPresenceInfo)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"createMakeRightOperation(DomainPresenceInfo)","url":"createMakeRightOperation(oracle.kubernetes.operator.helpers.DomainPresenceInfo)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"createManagedPodStep(Step)","url":"createManagedPodStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"createManagedServerPodModel(Packet)","url":"createManagedServerPodModel(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodStepContext","l":"createMetadata()"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createNamespace(V1Namespace)","url":"createNamespace(io.kubernetes.client.openapi.models.V1Namespace)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"createNamespacedDomain(String, Domain, String)","url":"createNamespacedDomain(java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"createNamespacedDomainAsync(String, Domain, String, ApiCallback)","url":"createNamespacedDomainAsync(java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"createNamespacedDomainCall(String, Domain, String, ApiCallback)","url":"createNamespacedDomainCall(java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"createNamespacedDomainWithHttpInfo(String, Domain, String)","url":"createNamespacedDomainWithHttpInfo(java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,java.lang.String)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"createNamespacesWatch()"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"createNull()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"createPatchFrom(JsonPatchBuilder, DomainStatus)","url":"createPatchFrom(javax.json.JsonPatchBuilder,oracle.kubernetes.weblogic.domain.model.DomainStatus)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createPodAsync(String, V1Pod, ResponseStep)","url":"createPodAsync(java.lang.String,io.kubernetes.client.openapi.models.V1Pod,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"createPodSpec(TuningParameters)","url":"createPodSpec(oracle.kubernetes.operator.TuningParameters)"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"createPodSpec(TuningParameters)","url":"createPodSpec(oracle.kubernetes.operator.TuningParameters)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"createPodWatch(String)","url":"createPodWatch(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"createProgressingStep(String, boolean, Step)","url":"createProgressingStep(java.lang.String,boolean,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.steps","c":"ReadHealthStep","l":"createReadHealthStep(Step)","url":"createReadHealthStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"AsyncRequestStepFactory","l":"createRequestAsync(ResponseStep, RequestParams, CallFactory, ClientPool, int, int, String, String, String)","url":"createRequestAsync(oracle.kubernetes.operator.helpers.ResponseStep,oracle.kubernetes.operator.calls.RequestParams,oracle.kubernetes.operator.calls.CallFactory,oracle.kubernetes.operator.helpers.ClientPool,int,int,java.lang.String,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper","l":"createScriptConfigMapStep(String, String)","url":"createScriptConfigMapStep(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createSecret(String, V1Secret)","url":"createSecret(java.lang.String,io.kubernetes.client.openapi.models.V1Secret)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createSelfSubjectAccessReview(V1SelfSubjectAccessReview)","url":"createSelfSubjectAccessReview(io.kubernetes.client.openapi.models.V1SelfSubjectAccessReview)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createSelfSubjectRulesReview(V1SelfSubjectRulesReview)","url":"createSelfSubjectRulesReview(io.kubernetes.client.openapi.models.V1SelfSubjectRulesReview)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createSelfSubjectRulesReviewAsync(V1SelfSubjectRulesReview, ResponseStep)","url":"createSelfSubjectRulesReviewAsync(io.kubernetes.client.openapi.models.V1SelfSubjectRulesReview,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createServiceAsync(String, V1Service, ResponseStep)","url":"createServiceAsync(java.lang.String,io.kubernetes.client.openapi.models.V1Service,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"createServiceWatch(String)","url":"createServiceWatch(java.lang.String)"},{"p":"oracle.kubernetes.utils","c":"OperatorUtils","l":"createSortedMap(Map)","url":"createSortedMap(java.util.Map)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodStepContext","l":"createSpec(TuningParameters)","url":"createSpec(oracle.kubernetes.operator.TuningParameters)"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"createStatusUpdateStep(Step)","url":"createStatusUpdateStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"MakeRightDomainOperation","l":"createSteps()"},{"p":"oracle.kubernetes.operator","c":"MakeRightDomainOperation","l":"createStepsToRerunWithIntrospection(Packet)","url":"createStepsToRerunWithIntrospection(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createSubjectAccessReview(V1SubjectAccessReview)","url":"createSubjectAccessReview(io.kubernetes.client.openapi.models.V1SubjectAccessReview)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createSubjectAccessReviewAsync(V1SubjectAccessReview, ResponseStep)","url":"createSubjectAccessReviewAsync(io.kubernetes.client.openapi.models.V1SubjectAccessReview,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"createSuccess(RequestParams, R, int)","url":"createSuccess(oracle.kubernetes.operator.calls.RequestParams,R,int)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"createTokenReview(V1TokenReview)","url":"createTokenReview(io.kubernetes.client.openapi.models.V1TokenReview)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainValidationSteps","l":"createValidateDomainTopologyStep(Step)","url":"createValidateDomainTopologyStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder.WatchFactory","l":"createWatch(Pool, CallParams, Class, BiFunction)","url":"createWatch(oracle.kubernetes.operator.helpers.Pool,oracle.kubernetes.operator.builders.CallParams,java.lang.Class,java.util.function.BiFunction)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CREATING_API_CLIENT"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CREATING_CRD"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"CREDENTIALS_SECRET_NAME"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"CRONJOBS"},{"p":"oracle.kubernetes.operator.rest","c":"FilterPriorities","l":"CSRF_PROTECTION_FILTER_PRIORITY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CURRENT_STEPS"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"current()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CYCLING_POD"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"CYCLING_SERVERS"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"DATA_HOME"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"DEBUG_CM_MOUNTS_PATH"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"DEBUG_CM_VOLUME"},{"p":"oracle.kubernetes.operator","c":"OverrideDistributionStrategy","l":"DEFAULT"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DEFAULT_HTTP_ACCESS_LOG_IN_LOG_HOME"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"DEFAULT_IGNORESESSIONS"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DEFAULT_IMAGE"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DEFAULT_INCLUDE_SERVER_OUT_IN_POD_LOG"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"DEFAULT_TIMEOUT"},{"p":"oracle.kubernetes.operator.steps","c":"DefaultResponseStep","l":"DefaultResponseStep()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.steps","c":"DefaultResponseStep","l":"DefaultResponseStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.steps","c":"DefaultResponseStep","l":"DefaultResponseStep(Step, Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"defineClasspath(URL...)","url":"defineClasspath(java.net.URL...)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"defineClasspath(URL...)","url":"defineClasspath(java.net.URL...)"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"defineSchemaUrlAndContents(URL, URL)","url":"defineSchemaUrlAndContents(java.net.URL,java.net.URL)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"defineSchemaUrlAndContents(URL, URL)","url":"defineSchemaUrlAndContents(java.net.URL,java.net.URL)"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"delay(Step, Packet, long, TimeUnit)","url":"delay(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,long,java.util.concurrent.TimeUnit)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"delete"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"deletecollection"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"deleteCollectionPodAsync(String, ResponseStep)","url":"deleteCollectionPodAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"deleteConfigMapAsync(String, String, V1DeleteOptions, ResponseStep)","url":"deleteConfigMapAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"JobHelper","l":"deleteDomainIntrospectorJobStep(Step)","url":"deleteDomainIntrospectorJobStep(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.steps","c":"DeleteDomainStep","l":"DeleteDomainStep(DomainPresenceInfo, String, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.helpers.DomainPresenceInfo,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"deleteFromEvent(DomainPresenceInfo, V1Service)","url":"deleteFromEvent(oracle.kubernetes.operator.helpers.DomainPresenceInfo,io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper","l":"deleteIntrospectorConfigMapStep(String, String, Step)","url":"deleteIntrospectorConfigMapStep(java.lang.String,java.lang.String,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"deleteJobAsync(String, String, V1DeleteOptions, ResponseStep)","url":"deleteJobAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"deleteNamespacedDomain(String, String, V1DeleteOptions, Integer, Boolean, String)","url":"deleteNamespacedDomain(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,java.lang.Integer,java.lang.Boolean,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"deleteNamespacedDomainAsync(String, String, V1DeleteOptions, Integer, Boolean, String, ApiCallback)","url":"deleteNamespacedDomainAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,java.lang.Integer,java.lang.Boolean,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"deleteNamespacedDomainCall(String, String, V1DeleteOptions, Integer, Boolean, String, ApiCallback)","url":"deleteNamespacedDomainCall(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,java.lang.Integer,java.lang.Boolean,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"deleteNamespacedDomainWithHttpInfo(String, String, V1DeleteOptions, Integer, Boolean, String)","url":"deleteNamespacedDomainWithHttpInfo(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,java.lang.Integer,java.lang.Boolean,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"deletePodAsync(String, String, V1DeleteOptions, ResponseStep)","url":"deletePodAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"deletePodStep(String, Step)","url":"deletePodStep(java.lang.String,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"deleteSecret(String, String, V1DeleteOptions)","url":"deleteSecret(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"deleteServerPodFromEvent(String, V1Pod)","url":"deleteServerPodFromEvent(java.lang.String,io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"deleteService(String, String, V1DeleteOptions)","url":"deleteService(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"deleteServiceAsync(String, String, V1DeleteOptions, ResponseStep)","url":"deleteServiceAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1DeleteOptions,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"deleteServicesStep(String, Step)","url":"deleteServicesStep(java.lang.String,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.rest","c":"RestServer","l":"destroy()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"dispatchConfigMapWatch(Watch.Response)","url":"dispatchConfigMapWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"dispatchConfigMapWatch(Watch.Response)","url":"dispatchConfigMapWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"dispatchDomainWatch(Watch.Response)","url":"dispatchDomainWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"dispatchDomainWatch(Watch.Response)","url":"dispatchDomainWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"dispatchEventWatch(Watch.Response)","url":"dispatchEventWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"dispatchEventWatch(Watch.Response)","url":"dispatchEventWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"dispatchPodWatch(Watch.Response)","url":"dispatchPodWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"dispatchPodWatch(Watch.Response)","url":"dispatchPodWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"dispatchServiceWatch(Watch.Response)","url":"dispatchServiceWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"dispatchServiceWatch(Watch.Response)","url":"dispatchServiceWatch(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"distributeOverridesDynamically()"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"DNS_1123_FIELDS_PARAM"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"doContinueList(Packet)","url":"doContinueList(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"doDeepSubstitution(Map, T)","url":"doDeepSubstitution(java.util.Map,T)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"doDeepSubstitution(Map, T, boolean)","url":"doDeepSubstitution(java.util.Map,T,boolean)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doDelay(Packet, long, TimeUnit)","url":"doDelay(oracle.kubernetes.operator.work.Packet,long,java.util.concurrent.TimeUnit)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doDelay(Step, Packet, long, TimeUnit)","url":"doDelay(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,long,java.util.concurrent.TimeUnit)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doEnd(Packet)","url":"doEnd(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doForkAtLeastOne(Step, Packet, Collection)","url":"doForkAtLeastOne(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,java.util.Collection)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doForkJoin(Step, Packet, Collection)","url":"doForkJoin(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,java.util.Collection)"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"DOMAIN_COMPONENT_NAME"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_DEBUG_CONFIG_MAP_SUFFIX"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_GROUP"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"DOMAIN_HOME"},{"p":"oracle.kubernetes.operator","c":"IntrospectorConfigMapKeys","l":"DOMAIN_INPUTS_HASH"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"DOMAIN_INTROSPECT_REQUESTED"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"DOMAIN_INTROSPECTOR_JOB"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"DOMAIN_INTROSPECTOR_JOB_SUFFIX"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"DOMAIN_INTROSPECTOR_LOG_RESULT"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"DOMAIN_NAME"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_PATH"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_PLURAL"},{"p":"oracle.kubernetes.operator","c":"IntrospectorConfigMapKeys","l":"DOMAIN_RESTART_VERSION"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_SCALE_PATH"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_SHORT"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_SINGULAR"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"DOMAIN_SOURCE_TYPE"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_SPECIFIC_PATH"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"DOMAIN_STATUS"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_STATUS_PATH"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"DOMAIN_TOPOLOGY"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"DOMAIN_UID"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"DOMAIN_UID_UNIQUENESS_FAILED"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"DOMAIN_VALIDATION_ERRORS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"DOMAIN_VALIDATION_FAILED"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"DOMAIN_VERSION"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"Domain()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainAction","l":"DomainAction(DomainActionType)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.model.DomainActionType)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"DomainCommonConfigurator()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"DomainCondition(DomainConditionType)","url":"%3Cinit%3E(oracle.kubernetes.weblogic.domain.model.DomainConditionType)"},{"p":"oracle.kubernetes.operator.rest","c":"Scan","l":"domainConfig"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"DomainConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"DomainConfigurator()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"DomainConfigurator(Domain)","url":"%3Cinit%3E(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfiguratorFactory","l":"DomainConfiguratorFactory()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"DOMAINHOME_LABEL"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"DomainList()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainModel","l":"DomainModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainModel","l":"DomainModel(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"DOMAINNAME_LABEL"},{"p":"oracle.kubernetes.operator","c":"DomainPresence","l":"DomainPresence()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"domainPresenceFailureRetryMaxCount"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"domainPresenceFailureRetrySeconds"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"DomainPresenceInfo(Domain)","url":"%3Cinit%3E(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"DomainPresenceInfo(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"domainPresenceRecheckIntervalSeconds"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"DomainProcessorImpl(DomainProcessorDelegate)","url":"%3Cinit%3E(oracle.kubernetes.operator.DomainProcessorDelegate)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"DomainResource","l":"DomainResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"DOMAINRESTARTVERSION_LABEL"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"DOMAINS"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"domainSpec"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"DomainSpec()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"DomainsResource","l":"DomainsResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"DomainStatus()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"DomainStatus(DomainStatus)","url":"%3Cinit%3E(oracle.kubernetes.weblogic.domain.model.DomainStatus)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"DOMAINSTATUSES"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainTopology","l":"DomainTopology()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainTopology","l":"DomainTopology(WlsDomainConfig)","url":"%3Cinit%3E(oracle.kubernetes.operator.wlsconfig.WlsDomainConfig)"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"DOMAINUID_LABEL"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingContext","l":"domainUid()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingContext","l":"domainUid(String)","url":"domainUid(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainValidationSteps","l":"DomainValidationSteps()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"IntrospectorConfigMapKeys","l":"DOMAINZIP_HASH"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doNext(Packet)","url":"doNext(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doNext(Step, Packet)","url":"doNext(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.calls","c":"RetryStrategy","l":"doPotentialRetry(Step, Packet, int)","url":"doPotentialRetry(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,int)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doRetry(Packet, long, TimeUnit)","url":"doRetry(oracle.kubernetes.operator.work.Packet,long,java.util.concurrent.TimeUnit)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doSuspend(Consumer)","url":"doSuspend(java.util.function.Consumer)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doSuspend(Step, Consumer)","url":"doSuspend(oracle.kubernetes.operator.work.Step,java.util.function.Consumer)"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"doTerminate(Throwable, Packet)","url":"doTerminate(java.lang.Throwable,oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"DUPLICATE_CLUSTER_NAME_FOUND"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"DUPLICATE_SERVER_NAME_FOUND"},{"p":"oracle.kubernetes.operator","c":"OverrideDistributionStrategy","l":"DYNAMIC"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"DYNAMIC_CONFIG_OVERRIDE"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"ENCODED_CREDENTIALS"},{"p":"oracle.kubernetes.operator.work","c":"Engine","l":"Engine(ScheduledExecutorService)","url":"%3Cinit%3E(java.util.concurrent.ScheduledExecutorService)"},{"p":"oracle.kubernetes.operator.work","c":"Engine","l":"Engine(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator.work","c":"ThreadLocalContainerResolver","l":"enterContainer(Container)","url":"enterContainer(oracle.kubernetes.operator.work.Container)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"entering()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"entering(Object...)","url":"entering(java.lang.Object...)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"entrySet()"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"entrySet()"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"ENVVARS"},{"p":"oracle.kubernetes.operator","c":"Pair","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.CallBuilderTuning","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.WatchTuning","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesVersion","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"SemanticVersion","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Model","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Opss","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Server","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerService","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"ERR_INTROSPECTOR"},{"p":"oracle.kubernetes.operator.rest","c":"FilterPriorities","l":"ERROR_FILTER_PRIORITY"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"ErrorBody","l":"ErrorBody()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest","c":"ErrorFilter","l":"ErrorFilter()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"ErrorModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"ErrorModel(int, String)","url":"%3Cinit%3E(int,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"EVENTS"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"eventualLongDelay"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"EXCEPTION"},{"p":"oracle.kubernetes.operator.rest","c":"ExceptionMapper","l":"ExceptionMapper()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"EXEC"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExec","l":"exec(String...)","url":"exec(java.lang.String...)"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExecFactoryImpl.KubernetesExecImpl","l":"exec(String...)","url":"exec(java.lang.String...)"},{"p":"oracle.kubernetes.json.mojo","c":"JsonSchemaMojo","l":"execute()"},{"p":"oracle.kubernetes.operator","c":"MakeRightDomainOperation","l":"execute()"},{"p":"oracle.kubernetes.operator.calls","c":"SynchronousCallFactory","l":"execute(ApiClient, RequestParams)","url":"execute(io.kubernetes.client.openapi.ApiClient,oracle.kubernetes.operator.calls.RequestParams)"},{"p":"oracle.kubernetes.operator.calls","c":"SynchronousCallDispatcher","l":"execute(SynchronousCallFactory, RequestParams, Pool)","url":"execute(oracle.kubernetes.operator.calls.SynchronousCallFactory,oracle.kubernetes.operator.calls.RequestParams,oracle.kubernetes.operator.helpers.Pool)"},{"p":"oracle.kubernetes.operator.work","c":"ThreadLocalContainerResolver","l":"exitContainer(Container)","url":"exitContainer(oracle.kubernetes.operator.work.Container)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"exiting()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"exiting(Object)","url":"exiting(java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"OperatorServiceType","l":"EXTERNAL"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"EXTERNAL_CHANNEL_SERVICE_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"EXTERNAL_CHANNEL_SERVICE_EXISTS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"EXTERNAL_CHANNEL_SERVICE_REPLACED"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainConditionType","l":"Failed"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"FAILED_NOT_RESTARTABLE_STATE"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"FAILURE_THRESHOLD"},{"p":"oracle.kubernetes.operator.calls","c":"FailureStatusSourceException","l":"FailureStatusSourceException(FailureStatusSource)","url":"%3Cinit%3E(oracle.kubernetes.operator.calls.FailureStatusSource)"},{"p":"oracle.kubernetes.operator.calls","c":"FailureStatusSourceException","l":"FailureStatusSourceException(FailureStatusSource, Throwable)","url":"%3Cinit%3E(oracle.kubernetes.operator.calls.FailureStatusSource,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"FIBER_COMPONENT_NAME"},{"p":"oracle.kubernetes.operator.work","c":"FiberGate","l":"FiberGate(Engine)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Engine)"},{"p":"oracle.kubernetes.operator.rest","c":"BaseDebugLoggingFilter","l":"FILTER_REQUEST_ENTITY"},{"p":"oracle.kubernetes.operator.rest","c":"BaseDebugLoggingFilter","l":"FILTER_REQUEST_START_TIME"},{"p":"oracle.kubernetes.operator.rest","c":"AuthenticationFilter","l":"filter(ContainerRequestContext)","url":"filter(javax.ws.rs.container.ContainerRequestContext)"},{"p":"oracle.kubernetes.operator.rest","c":"RequestDebugLoggingFilter","l":"filter(ContainerRequestContext)","url":"filter(javax.ws.rs.container.ContainerRequestContext)"},{"p":"oracle.kubernetes.operator.rest","c":"ErrorFilter","l":"filter(ContainerRequestContext, ContainerResponseContext)","url":"filter(javax.ws.rs.container.ContainerRequestContext,javax.ws.rs.container.ContainerResponseContext)"},{"p":"oracle.kubernetes.operator.rest","c":"ResponseDebugLoggingFilter","l":"filter(ContainerRequestContext, ContainerResponseContext)","url":"filter(javax.ws.rs.container.ContainerRequestContext,javax.ws.rs.container.ContainerResponseContext)"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"findEnvVar(List, String)","url":"findEnvVar(java.util.List,java.lang.String)"},{"p":"oracle.kubernetes.operator.authentication","c":"Helpers","l":"findServiceAccount(String, String)","url":"findServiceAccount(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.authentication","c":"Helpers","l":"findServiceAccountByToken(String)","url":"findServiceAccountByToken(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"fine(String)","url":"fine(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"fine(String, Object...)","url":"fine(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"fine(String, Throwable)","url":"fine(java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"finer(String)","url":"finer(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"finer(String, Object...)","url":"finer(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"finer(String, Throwable)","url":"finer(java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"finest(String)","url":"finest(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"finest(String, Object...)","url":"finest(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"finest(String, Throwable)","url":"finest(java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"FORCE_SUSPENDING_STATE"},{"p":"oracle.kubernetes.operator","c":"ShutdownType","l":"Forced"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"forCluster()"},{"p":"oracle.kubernetes.operator","c":"MakeRightDomainOperation","l":"forDeletion()"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"forDomain()"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfiguratorFactory","l":"forDomain(Domain)","url":"forDomain(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"forDomainUidSelector(String)","url":"forDomainUidSelector(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFormatter","l":"format(LogRecord)","url":"format(java.util.logging.LogRecord)"},{"p":"oracle.kubernetes.operator.rest","c":"BaseDebugLoggingFilter","l":"formatEntity(MediaType, String)","url":"formatEntity(javax.ws.rs.core.MediaType,java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"formatMessage(String, Object...)","url":"formatMessage(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.rest","c":"BaseDebugLoggingFilter","l":"formatTime(long)"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"forServer()"},{"p":"oracle.kubernetes.operator.calls","c":"UnrecoverableErrorBuilder","l":"fromFailedCall(CallResponse)","url":"fromFailedCall(oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnrecoverableErrorBuilderImpl","l":"fromFailedCall(CallResponse)","url":"fromFailedCall(oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator","c":"DomainSourceType","l":"FromModel"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"fromPacket(Packet)","url":"fromPacket(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"generate(Class)","url":"generate(java.lang.Class)"},{"p":"oracle.kubernetes.operator.calls","c":"CallFactory","l":"generate(RequestParams, ApiClient, String, ApiCallback)","url":"generate(oracle.kubernetes.operator.calls.RequestParams,io.kubernetes.client.openapi.ApiClient,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.json","c":"YamlDocGenerator","l":"generate(String)","url":"generate(java.lang.String)"},{"p":"oracle.kubernetes.json","c":"YamlDocGenerator","l":"generate(String, Map)","url":"generate(java.lang.String,java.util.Map)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"generateDynamicServerConfigs(WlsServerConfig, String, String)","url":"generateDynamicServerConfigs(oracle.kubernetes.operator.wlsconfig.WlsServerConfig,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"generateMarkdown(String, File, Map)","url":"generateMarkdown(java.lang.String,java.io.File,java.util.Map)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"generateMarkdown(String, File, Map)","url":"generateMarkdown(java.lang.String,java.io.File,java.util.Map)"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"generateSchema(String, File)","url":"generateSchema(java.lang.String,java.io.File)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"generateSchema(String, File)","url":"generateSchema(java.lang.String,java.io.File)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"get"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ClusterResource","l":"get()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ClustersResource","l":"get()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"DomainResource","l":"get()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"DomainsResource","l":"get()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"SwaggerResource","l":"get()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"VersionResource","l":"get()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"VersionsResource","l":"get()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"get()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"get(long, TimeUnit)","url":"get(long,java.util.concurrent.TimeUnit)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"get(Object)","url":"get(java.lang.Object)"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainAction","l":"getAction()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getAdditionalVolumeMounts()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getAdditionalVolumeMounts()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getAdditionalVolumeMounts()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getAdditionalVolumes()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getAdditionalVolumes()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getAdditionalVolumes()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getAdminPort()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getAdminProtocolChannelName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getAdminServer()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"getAdminServerChannelNames()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getAdminServerName()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"getAdminServerSpec()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getAdminServerSpec()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"getAdminService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServerSpec","l":"getAdminService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServerSpecCommonImpl","l":"getAdminService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getAffinity()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getAffinity()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getAffinity()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getAffinity()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getAffinity()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getAffinity()"},{"p":"oracle.kubernetes.operator.authentication","c":"Helpers","l":"getAllServiceAccounts()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"getAnnotations()"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"getApiClient()"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getApiClient()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"getApiGroup()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getApiVersion()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"getApiVersion()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"getBackend()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getBackend(String)","url":"getBackend(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getBackend(String)","url":"getBackend(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getCalculatedListenPorts()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters","l":"getCallBuilderTuning()"},{"p":"oracle.kubernetes.operator","c":"TuningParametersImpl","l":"getCallBuilderTuning()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"getChannel(String)","url":"getChannel(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"getChannelName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"getChannelNames()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"getChannels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"getChannels()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ClusterModel","l":"getCluster()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getCluster(String)","url":"getCluster(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getClusterAnnotations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getClusterAnnotations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getClusterAnnotations()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getClusterConfig(String)","url":"getClusterConfig(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getClusterConfigs()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"getClusteredServerStartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getClusterLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getClusterLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getClusterLabels()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"getClusterName()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"getClusterName()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"getClusterName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getClusterName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getClusterName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getClusterName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"getClusterName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"getClusterName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getClusterName(String)","url":"getClusterName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"getClusterName(V1Service)","url":"getClusterName(io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getClusterNames()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"WlsDomain","l":"getClusterNames()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ClustersResource","l":"getClusterResource(String)","url":"getClusterResource(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getClusterRestartVersion()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getClusterRestartVersion()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"getClusters()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getClusters()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"getClusters()"},{"p":"oracle.kubernetes.operator.rest","c":"RestBackendImpl","l":"getClusters(String)","url":"getClusters(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.backend","c":"RestBackend","l":"getClusters(String)","url":"getClusters(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getClusterService()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getClusterService(String)","url":"getClusterService(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getClusterSize()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"getClusterSpec(String)","url":"getClusterSpec(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"DomainResource","l":"getClustersResource()"},{"p":"oracle.kubernetes.operator.helpers","c":"SemanticVersion","l":"getCompatibilityWith(String)","url":"getCompatibilityWith(java.lang.String)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"getCompletionCallback()"},{"p":"oracle.kubernetes.operator.work","c":"ComponentRegistry","l":"getComponents()"},{"p":"oracle.kubernetes.operator.work","c":"Container","l":"getComponents()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"getComponents()"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"getComponents()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"getConditions()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getConfigOverrides()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getConfigOverrideSecrets()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getConfiguration()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getConfiguration()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Server","l":"getConfiguration()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getConfiguredClusters()"},{"p":"oracle.kubernetes.operator.work","c":"ContainerResolver","l":"getContainer()"},{"p":"oracle.kubernetes.operator.work","c":"ThreadLocalContainerResolver","l":"getContainer()"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"getContainer(V1Pod)","url":"getContainer(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"getContainer(V1PodSpec)","url":"getContainer(io.kubernetes.client.openapi.models.V1PodSpec)"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getContainerCommand()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodStepContext","l":"getContainerCommand()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getContainerName()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodStepContext","l":"getContainerName()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"getContainerRequestContext()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getContainers()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodStepContext","l":"getContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getContainerSecurityContext()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getContainerSecurityContext()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getContainerSecurityContext()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"getContextClassLoader()"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"getCreatedbyOperatorSelector()"},{"p":"oracle.kubernetes.operator.work","c":"FiberGate","l":"getCurrentFibers()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"getCurrentIfSet()"},{"p":"oracle.kubernetes.utils","c":"SystemClock","l":"getCurrentTime()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getDataHome()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getDataHome()"},{"p":"oracle.kubernetes.operator.work","c":"ContainerResolver","l":"getDefault()"},{"p":"oracle.kubernetes.operator","c":"DomainSourceType","l":"getDefaultDomainHome(String)","url":"getDefaultDomainHome(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"getDefaultPolicy()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"getDesiredState()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getDesiredState()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getDesiredState()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"getDesiredState()"},{"p":"oracle.kubernetes.operator.calls","c":"AsyncRequestStep","l":"getDetail()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"getDetail()"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServerUpIteratorStep","l":"getDetail()"},{"p":"oracle.kubernetes.operator.steps","c":"ServerDownIteratorStep","l":"getDetail()"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"getDetail()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"ErrorBody","l":"getDetails()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getDomain()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainTopology","l":"getDomain()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getDomainHome()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getDomainHome()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getDomainHomeSourceType()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getDomainHomeSourceType()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"DomainsResource","l":"getDomainResource(String)","url":"getDomainResource(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getDomainRestartVersion()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getDomainRestartVersion()"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"getDomainSpec()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"VersionResource","l":"getDomainsResource()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Model","l":"getDomainType()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getDomainUid()"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainModel","l":"getDomainUid()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getDomainUid()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getDomainUid()"},{"p":"oracle.kubernetes.operator.rest","c":"RestBackendImpl","l":"getDomainUids()"},{"p":"oracle.kubernetes.operator.rest.backend","c":"RestBackend","l":"getDomainUids()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainTopology","l":"getDomainValid()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getDynamicClusterSize()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getDynamicClusterSize()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getDynamicServersConfig()"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"getE()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getEffectiveLogHome()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"getEnabled()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"getEnv()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getEnv()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"getEnvironment()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getEnvironmentVariables()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getEnvironmentVariables()"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"getExceptionString()"},{"p":"oracle.kubernetes.operator.work","c":"Engine","l":"getExecutor()"},{"p":"oracle.kubernetes.operator.work","c":"FiberGate","l":"getExecutor()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getExternalHttpsPort()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getExternalHttpsPort()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getExternalService(String)","url":"getExternalService(java.lang.String)"},{"p":"oracle.kubernetes.operator.calls","c":"FailureStatusSourceException","l":"getFailureStatusSource()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"Cause","l":"getField()"},{"p":"oracle.kubernetes.operator.builders","c":"CallParams","l":"getFieldSelector()"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"getHeadersString()"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"getHelper()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getHost()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getHost()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"getHref()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"getIgnoreSessions()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"getImage()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getImage()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getImage()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getImage()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"getImagePullPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getImagePullPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getImagePullPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getImagePullPolicy()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"getImagePullSecrets()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getImagePullSecrets()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getImagePullSecrets()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getImagePullSecrets()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getInitContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getInitContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getInitContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getInitContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getInitContainers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"getInitialDelaySeconds()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters","l":"getInstance()"},{"p":"oracle.kubernetes.operator","c":"TuningParametersImpl","l":"getInstance()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClientPool","l":"getInstance()"},{"p":"oracle.kubernetes.operator.rest","c":"RestServer","l":"getInstance()"},{"p":"oracle.kubernetes.operator.work","c":"ContainerResolver","l":"getInstance()"},{"p":"oracle.kubernetes.operator.work","c":"ThreadFactorySingleton","l":"getInstance()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getInternalHttpsPort()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getInternalHttpsPort()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getIntrospectMD5VolumeSource()"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper","l":"getIntrospectorConfigMapName(String)","url":"getIntrospectorConfigMapName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"getIntrospectorJobActiveDeadlineSeconds()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getIntrospectorJobActiveDeadlineSeconds()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getIntrospectVersion()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getIntrospectVersion()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"getIstio()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getIstioReadinessPort()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getIstioReadinessPort()"},{"p":"oracle.kubernetes.operator.rest.model","c":"CollectionModel","l":"getItems()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"getItems()"},{"p":"oracle.kubernetes.operator.work","c":"Container","l":"getIterableSpi(Class)","url":"getIterableSpi(java.lang.Class)"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"getIterableSpi(Class)","url":"getIterableSpi(java.lang.Class)"},{"p":"oracle.kubernetes.operator.work","c":"ComponentEx","l":"getIterableSpi(Class)","url":"getIterableSpi(java.lang.Class)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFactory","l":"getJson()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getKind()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"getKind()"},{"p":"oracle.kubernetes.json","c":"KubernetesSchemaReference","l":"getKubernetesSchemaCacheUrl()"},{"p":"oracle.kubernetes.json","c":"YamlDocGenerator","l":"getKubernetesSchemaMarkdown()"},{"p":"oracle.kubernetes.json","c":"YamlDocGenerator","l":"getKubernetesSchemaMarkdownFile()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"getLabels()"},{"p":"oracle.kubernetes.operator.builders","c":"CallParams","l":"getLabelSelector()"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"getLabelSelector()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getLastKnownServerStatus(String)","url":"getLastKnownServerStatus(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"getLastProbeTime()"},{"p":"oracle.kubernetes.operator.rest","c":"Scan","l":"getLastScanTime()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"getLastTransitionTime()"},{"p":"oracle.kubernetes.operator","c":"Pair","l":"getLeft()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"getLevel()"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"getLifecycle()"},{"p":"oracle.kubernetes.operator.rest.backend","c":"VersionUtils","l":"getLifecycle(String)","url":"getLifecycle(java.lang.String)"},{"p":"oracle.kubernetes.operator.builders","c":"CallParams","l":"getLimit()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"getLinks()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getListenAddress()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"getListenPort()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getListenPort()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getLivenessProbe()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getLivenessProbe()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getLivenessProbe()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getLocalAdminProtocolChannelPort()"},{"p":"oracle.kubernetes.operator.rest","c":"BaseDebugLoggingFilter","l":"getLoggableHeaders(ContainerRequestContext)","url":"getLoggableHeaders(javax.ws.rs.container.ContainerRequestContext)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFactory","l":"getLogger(String, String)","url":"getLogger(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getMachineConfig(String)","url":"getMachineConfig(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getMachineConfigs()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getMachineName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getMachineNameMatchExpression()"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"getMainContainerName()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getMainContainerName()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters","l":"getMainTuning()"},{"p":"oracle.kubernetes.operator","c":"TuningParametersImpl","l":"getMainTuning()"},{"p":"oracle.kubernetes.operator.helpers","c":"SemanticVersion","l":"getMajor()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ScaleClusterParamsModel","l":"getManagedServerCount()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getManagedServers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getMaxClusterConcurrentStartup()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getMaxClusterSize()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getMaxConcurrentStartup()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"getMaxConcurrentStartup(String)","url":"getMaxConcurrentStartup(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getMaxConcurrentStartup(String)","url":"getMaxConcurrentStartup(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getMaxDynamicClusterSize()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getMaxDynamicClusterSize()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"getMaxReplicas()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"getMaxUnavailable(String)","url":"getMaxUnavailable(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getMaxUnavailable(String)","url":"getMaxUnavailable(java.lang.String)"},{"p":"oracle.kubernetes.operator.calls","c":"FailureStatusSource","l":"getMessage()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"Cause","l":"getMessage()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"ErrorBody","l":"getMessage()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnrecoverableErrorBuilderImpl","l":"getMessage()"},{"p":"oracle.kubernetes.weblogic.domain","c":"ConfigurationNotSupportedException","l":"getMessage()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"getMessage()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"getMessage()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainValidationFailure","l":"getMessage()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getMetadata()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"getMetadata()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getMinAvailable(String)","url":"getMinAvailable(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getMinClusterSize()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getMinDynamicClusterSize()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getMinDynamicClusterSize()"},{"p":"oracle.kubernetes.operator.helpers","c":"SemanticVersion","l":"getMinor()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"getMinReplicas()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"getModel()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getModel()"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper","l":"getModelInImageSpecHash(String)","url":"getModelInImageSpecHash(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"getName()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"getName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"getName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsMachineConfig","l":"getName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getName()"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"getName()"},{"p":"oracle.kubernetes.operator","c":"ConfigMapWatcher","l":"getNamespace()"},{"p":"oracle.kubernetes.operator","c":"DomainWatcher","l":"getNamespace()"},{"p":"oracle.kubernetes.operator","c":"EventWatcher","l":"getNamespace()"},{"p":"oracle.kubernetes.operator","c":"JobWatcher","l":"getNamespace()"},{"p":"oracle.kubernetes.operator","c":"NamespaceWatcher","l":"getNamespace()"},{"p":"oracle.kubernetes.operator","c":"PodWatcher","l":"getNamespace()"},{"p":"oracle.kubernetes.operator","c":"ServiceWatcher","l":"getNamespace()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getNamespace()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getNamespace()"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomain(String, String)","url":"getNamespacedDomain(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainAsync(String, String, ApiCallback)","url":"getNamespacedDomainAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainCall(String, String, ApiCallback)","url":"getNamespacedDomainCall(java.lang.String,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainScale(String, String)","url":"getNamespacedDomainScale(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainScaleAsync(String, String, ApiCallback)","url":"getNamespacedDomainScaleAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainScaleCall(String, String, ApiCallback)","url":"getNamespacedDomainScaleCall(java.lang.String,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainScaleWithHttpInfo(String, String)","url":"getNamespacedDomainScaleWithHttpInfo(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainStatus(String, String)","url":"getNamespacedDomainStatus(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainStatusAsync(String, String, ApiCallback)","url":"getNamespacedDomainStatusAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainStatusCall(String, String, ApiCallback)","url":"getNamespacedDomainStatusCall(java.lang.String,java.lang.String,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainStatusWithHttpInfo(String, String)","url":"getNamespacedDomainStatusWithHttpInfo(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"getNamespacedDomainWithHttpInfo(String, String)","url":"getNamespacedDomainWithHttpInfo(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getNetworkAccessPoints()"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"getNext()"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"getNext()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsMachineConfig","l":"getNodeManagerListenAddress()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsMachineConfig","l":"getNodeManagerListenPort()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsMachineConfig","l":"getNodeManagerType()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getNodeName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getNodeName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getNodeName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getNodeName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getNodeName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getNodeName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"getNodeName()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"getNodePort()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"getNodePort()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getNodeSelectors()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getNodeSelectors()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getNodeSelectors()"},{"p":"oracle.kubernetes.operator.helpers","c":"SemanticVersion","l":"getNumericPortion(String)","url":"getNumericPortion(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorExternalCertificateData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorExternalCertificateData()"},{"p":"oracle.kubernetes.operator.utils","c":"Certificates","l":"getOperatorExternalCertificateData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorExternalCertificateFile()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorExternalCertificateFile()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorExternalKeyData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorExternalKeyData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorExternalKeyFile()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorExternalKeyFile()"},{"p":"oracle.kubernetes.operator.utils","c":"Certificates","l":"getOperatorExternalKeyFile()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorInternalCertificateData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorInternalCertificateData()"},{"p":"oracle.kubernetes.operator.utils","c":"Certificates","l":"getOperatorInternalCertificateData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorInternalCertificateFile()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorInternalCertificateFile()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorInternalKeyData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorInternalKeyData()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"getOperatorInternalKeyFile()"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"getOperatorInternalKeyFile()"},{"p":"oracle.kubernetes.operator.utils","c":"Certificates","l":"getOperatorInternalKeyFile()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"getOperatorNamespace()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"getOpss()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getOpssKeyWalletVolumeSource(String)","url":"getOpssKeyWalletVolumeSource(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getOpssWalletFileSecret()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getOpssWalletFileSecret()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getOpssWalletPasswordSecret()"},{"p":"oracle.kubernetes.operator","c":"JobWatcher","l":"getOrCreateFor(Domain)","url":"getOrCreateFor(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"getOverallHealth()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"getOverrideDistributionStrategy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getOverrideDistributionStrategy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getOverrideDistributionStrategy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"getOverridesConfigMap()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"getPacket()"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"getPacket()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"getParent()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"getPathSegment()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"getPeriodSeconds()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getPodAnnotations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getPodAnnotations()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"getPodAwaiterStepFactory(String)","url":"getPodAwaiterStepFactory(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"getPodDomainUid(V1Pod)","url":"getPodDomainUid(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getPodLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getPodLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getPodSecurityContext()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getPodSecurityContext()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getPodSecurityContext()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"getPodServerName(V1Pod)","url":"getPodServerName(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters","l":"getPodTuning()"},{"p":"oracle.kubernetes.operator","c":"TuningParametersImpl","l":"getPodTuning()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"getPrefix()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"getPrerelease()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"getPrereleaseVersion()"},{"p":"oracle.kubernetes.operator.builders","c":"CallParams","l":"getPretty()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getPriorityClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getPriorityClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getPriorityClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getPriorityClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getPriorityClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getPriorityClassName()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"getProductVersion()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"getProtocol()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"getPublicPort()"},{"p":"oracle.kubernetes.operator.helpers","c":"Pool","l":"getQueue()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getReadinessGates()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getReadinessGates()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getReadinessGates()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getReadinessGates()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getReadinessGates()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getReadinessGates()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"getReadinessPort()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getReadinessProbe()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getReadinessProbe()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getReadinessProbe()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"getReadyStatus(V1Pod)","url":"getReadyStatus(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator.calls","c":"FailureStatusSource","l":"getReason()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"Cause","l":"getReason()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnrecoverableErrorBuilderImpl","l":"getReason()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"getReason()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"getReason()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainValidationFailure","l":"getReason()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"getRel()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"getReplicaCount(String)","url":"getReplicaCount(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getReplicaCount(String)","url":"getReplicaCount(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getReplicaLimit(String)","url":"getReplicaLimit(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"WlsDomain","l":"getReplicaLimit(String)","url":"getReplicaLimit(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"getReplicas()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getReplicas()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"getReplicas()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getReplicas()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"getReplicas()"},{"p":"oracle.kubernetes.operator.calls","c":"AsyncRequestStep","l":"getRequestParams()"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"getRequestParams()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"getResource()"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"getResource(String)","url":"getResource(java.lang.String)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"getResource(String)","url":"getResource(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"getResourceBundle()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getResources()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getResources()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getResources()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getResources()"},{"p":"oracle.kubernetes.operator.builders","c":"CallParams","l":"getResourceVersion()"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesUtils","l":"getResourceVersion(String)","url":"getResourceVersion(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesUtils","l":"getResourceVersion(V1ObjectMeta)","url":"getResourceVersion(io.kubernetes.client.openapi.models.V1ObjectMeta)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"getRestartedLabel()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getRestartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getRestartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getRestartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getRestartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getRestartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getRestartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getRestartVersion()"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"getResult()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getRetrieveServersSearchPayload()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getRetrieveServersSearchUrl()"},{"p":"oracle.kubernetes.operator.helpers","c":"SemanticVersion","l":"getRevision()"},{"p":"oracle.kubernetes.operator","c":"Pair","l":"getRight()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"getRoot()"},{"p":"oracle.kubernetes.operator","c":"NamespaceStatus","l":"getRulesReviewStatus()"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServersUpStep","l":"getRunningServers(DomainPresenceInfo)","url":"getRunningServers(oracle.kubernetes.operator.helpers.DomainPresenceInfo)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getRuntimeClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getRuntimeClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getRuntimeClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getRuntimeClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getRuntimeClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getRuntimeClassName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getRuntimeEncryptionSecret()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ClusterResource","l":"getScaleClusterResource()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getSchedulerName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getSchedulerName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getSchedulerName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getSchedulerName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getSchedulerName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getSchedulerName()"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretHelper","l":"getSecretData(SecretType, String, String, Step)","url":"getSecretData(oracle.kubernetes.operator.helpers.SecretType,java.lang.String,java.lang.String,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"getSecrets()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getServer(String, String)","url":"getServer(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getServerConfig(String)","url":"getServerConfig(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getServerConfigs()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getServerConfigs()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getServerConfigs()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"getServerName()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"getServerName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"getServerName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"getServerName()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"getServerName(V1Service)","url":"getServerName(io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getServerNamePrefix()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getServerNames()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getServerPod(String)","url":"getServerPod(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getServerPods()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getServerRestartVersion()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getServerRestartVersion()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"getServers()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"getServers()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getServers()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getServers()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getServers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"getServers()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getServerService(String)","url":"getServerService(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"getServerSpec(String, String)","url":"getServerSpec(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getServerStartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"getServerStartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getServerStartPolicy()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Server","l":"getServerStartPolicy()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getServerStartupInfo()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getServerTemplate()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"getServerTemplateName()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"getServerTemplates()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getServiceAccountName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getServiceAccountName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getServiceAccountName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getServiceAccountName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getServiceAccountName()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getServiceAnnotations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getServiceAnnotations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getServiceAnnotations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getServiceAnnotations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getServiceAnnotations()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"getServiceDomainUid(V1Service)","url":"getServiceDomainUid(io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getServiceLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getServiceLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getServiceLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getServiceLabels()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getServiceLabels()"},{"p":"oracle.kubernetes.operator.authentication","c":"Authenticator","l":"getServiceToken()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getShutdown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getShutdown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getShutdown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getShutdown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getShutdown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"getShutdownType()"},{"p":"oracle.kubernetes.utils","c":"OperatorUtils","l":"getSortingString(String)","url":"getSortingString(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getSpec()"},{"p":"oracle.kubernetes.operator.work","c":"Component","l":"getSpi(Class)","url":"getSpi(java.lang.Class)"},{"p":"oracle.kubernetes.operator.work","c":"Container","l":"getSpi(Class)","url":"getSpi(java.lang.Class)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"getSpi(Class)","url":"getSpi(java.lang.Class)"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"getSpi(Class)","url":"getSpi(java.lang.Class)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"getSslListenPort()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"getState()"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"getStatus()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"getStatus()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getStatus()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"getStatus()"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"getStatusCode()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"getSubjectRulesReviewStatus(String)","url":"getSubjectRulesReviewStatus(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"getSubResource()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"getSubsystems()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"getSuspendedStep()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"VersionResource","l":"getSwaggerResource()"},{"p":"oracle.kubernetes.operator.work","c":"Step.MultiThrowable","l":"getThrowables()"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"getTime()"},{"p":"oracle.kubernetes.operator.builders","c":"CallParams","l":"getTimeoutSeconds()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"getTimeoutSeconds()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"getTimeoutSeconds()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"getTitle()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"getTitle()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"getTolerations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"getTolerations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"getTolerations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"getTolerations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"getTolerations()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"getTolerations()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"getType()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"getType()"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"getUnchangedCount()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"getUnderlyingLogger()"},{"p":"oracle.kubernetes.operator.helpers","c":"ConflictRetry","l":"getUpdatedObject()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getUpdateDynamicClusterSizePayload(int)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getUpdateDynamicClusterSizeUrl()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"getUriInfo()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainTopology","l":"getValidationErrors()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getValidationFailures(KubernetesResourceLookup)","url":"getValidationFailures(oracle.kubernetes.weblogic.domain.model.KubernetesResourceLookup)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"getValidationWarningsAsString()"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"getValue(String)","url":"getValue(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"getVersion()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"getVersion()"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"getVersion()"},{"p":"oracle.kubernetes.operator.rest.backend","c":"VersionUtils","l":"getVersion(String)","url":"getVersion(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"VersionsResource","l":"getVersionResource(String)","url":"getVersionResource(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.backend","c":"VersionUtils","l":"getVersions()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Opss","l":"getWalletFileSecret()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Opss","l":"getWalletPasswordSecret()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters","l":"getWatchTuning()"},{"p":"oracle.kubernetes.operator","c":"TuningParametersImpl","l":"getWatchTuning()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getWdtConfigMap()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"getWdtConfigMap()"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getWdtConfigMapVolumeSource(String)","url":"getWdtConfigMapVolumeSource(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"getWdtDomainType()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getWdtDomainType()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"getWebLogicCredentialsSecretName()"},{"p":"oracle.kubernetes.operator.rest","c":"Scan","l":"getWlsDomainConfig()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"getWlsDomainConfig()"},{"p":"oracle.kubernetes.operator","c":"ShutdownType","l":"Graceful"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"GRACEFUL_SHUTDOWNTYPE"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"hasConditionWith(Predicate)","url":"hasConditionWith(java.util.function.Predicate)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"hasDynamicServers()"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"hasEnvVar(List, String)","url":"hasEnvVar(java.util.List,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"Pair","l":"hashCode()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.CallBuilderTuning","l":"hashCode()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"hashCode()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"hashCode()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.WatchTuning","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"SemanticVersion","l":"hashCode()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"hashCode()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"hashCode()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Model","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Opss","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Server","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerService","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"hashCode()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"hashCode()"},{"p":"oracle.kubernetes.operator","c":"DomainSourceType","l":"hasLogHomeByDefault()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"hasNamedServer(String)","url":"hasNamedServer(java.lang.String)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchImpl","l":"hasNext()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"hasStaticServers()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"hasType(DomainConditionType)","url":"hasType(oracle.kubernetes.weblogic.domain.model.DomainConditionType)"},{"p":"oracle.kubernetes.operator.authentication","c":"Helpers","l":"Helpers(Authenticator)","url":"%3Cinit%3E(oracle.kubernetes.operator.authentication.Authenticator)"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"hideAdminUserCredentials(List)","url":"hideAdminUserCredentials(java.util.List)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"href(String...)","url":"href(java.lang.String...)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"HTTP_METHOD_FAILED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"HTTP_REQUEST_TIMED_OUT"},{"p":"oracle.kubernetes.operator.http","c":"HttpResponseStep","l":"HttpResponseStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"IF_NEEDED"},{"p":"oracle.kubernetes.operator","c":"ImagePullPolicy","l":"IfNotPresent"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"IFNOTPRESENT_IMAGEPULLPOLICY"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"ignoreSessions(Boolean)","url":"ignoreSessions(java.lang.Boolean)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ILLEGAL_SECRET_NAMESPACE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ILLEGAL_SIT_CONFIG_MII"},{"p":"oracle.kubernetes.operator","c":"DomainSourceType","l":"Image"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretType","l":"ImagePull"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"incrementAndGetFailureCount()"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"info"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"info(LoggingFilter, String, Object...)","url":"info(oracle.kubernetes.operator.logging.LoggingFilter,java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"info(String)","url":"info(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"info(String, Object...)","url":"info(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"info(String, Throwable)","url":"info(java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"INGRESSES"},{"p":"oracle.kubernetes.operator.rest","c":"RestBackendImpl","l":"INITIAL_VERSION"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"initialDelaySeconds(Integer)","url":"initialDelaySeconds(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClientPool","l":"initialize(ThreadFactory)","url":"initialize(java.util.concurrent.ThreadFactory)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters","l":"initializeInstance(ScheduledExecutorService, String)","url":"initializeInstance(java.util.concurrent.ScheduledExecutorService,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"initialShortDelay"},{"p":"oracle.kubernetes.operator","c":"ConfigMapWatcher","l":"initiateWatch(WatchBuilder)","url":"initiateWatch(oracle.kubernetes.operator.builders.WatchBuilder)"},{"p":"oracle.kubernetes.operator","c":"DomainWatcher","l":"initiateWatch(WatchBuilder)","url":"initiateWatch(oracle.kubernetes.operator.builders.WatchBuilder)"},{"p":"oracle.kubernetes.operator","c":"EventWatcher","l":"initiateWatch(WatchBuilder)","url":"initiateWatch(oracle.kubernetes.operator.builders.WatchBuilder)"},{"p":"oracle.kubernetes.operator","c":"JobWatcher","l":"initiateWatch(WatchBuilder)","url":"initiateWatch(oracle.kubernetes.operator.builders.WatchBuilder)"},{"p":"oracle.kubernetes.operator","c":"NamespaceWatcher","l":"initiateWatch(WatchBuilder)","url":"initiateWatch(oracle.kubernetes.operator.builders.WatchBuilder)"},{"p":"oracle.kubernetes.operator","c":"PodWatcher","l":"initiateWatch(WatchBuilder)","url":"initiateWatch(oracle.kubernetes.operator.builders.WatchBuilder)"},{"p":"oracle.kubernetes.operator","c":"ServiceWatcher","l":"initiateWatch(WatchBuilder)","url":"initiateWatch(oracle.kubernetes.operator.builders.WatchBuilder)"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"INSPECTING_DOMAIN_PROGRESS_REASON"},{"p":"oracle.kubernetes.operator.rest","c":"ScanCache","l":"INSTANCE"},{"p":"oracle.kubernetes.operator","c":"MakeRightDomainOperation","l":"interrupt()"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainActionType","l":"INTROSPECT"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"INTROSPECT_HOME"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"INTROSPECTION_STATE_LABEL"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"INTROSPECTOR_JOB_FAILED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"INTROSPECTOR_JOB_FAILED_DETAIL"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"INTROSPECTOR_JOB_FAILURE_LOGGED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"INTROSPECTOR_POD_FAILED"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"introspectorJobActiveDeadlineSeconds"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"IntrospectorJobEnvVars()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"INVALID_DOMAIN_UID"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"INVALID_MANAGE_SERVER_COUNT"},{"p":"oracle.kubernetes.operator.work","c":"NextAction.Kind","l":"INVOKE"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"invoke(Step, Packet)","url":"invoke(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"isAdminPortEnabled()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"isAdminProtocol()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"isAllowReplicasBelowMinDynClusterSize()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"isAllowReplicasBelowMinDynClusterSize()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"isAllowReplicasBelowMinDynClusterSize(String)","url":"isAllowReplicasBelowMinDynClusterSize(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"isAllowReplicasBelowMinDynClusterSize(String)","url":"isAllowReplicasBelowMinDynClusterSize(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"isAlpha()"},{"p":"oracle.kubernetes.operator.calls","c":"UnrecoverableErrorBuilder","l":"isAsyncCallFailure(CallResponse)","url":"isAsyncCallFailure(oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"isBeta()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"isCancelled()"},{"p":"oracle.kubernetes.operator.rest","c":"RestBackendImpl","l":"isCluster(String, String)","url":"isCluster(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.backend","c":"RestBackend","l":"isCluster(String, String)","url":"isCluster(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"JobWatcher","l":"isComplete(V1Job)","url":"isComplete(io.kubernetes.client.openapi.models.V1Job)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isConfigEnabled()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"KubernetesResourceLookup","l":"isConfigMapExists(String, String)","url":"isConfigMapExists(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"Main","l":"isDedicated()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"isDeleting(V1Pod)","url":"isDeleting(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"isDns1123Required(String)","url":"isDns1123Required(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest","c":"RestBackendImpl","l":"isDomainUid(String)","url":"isDomainUid(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.backend","c":"RestBackend","l":"isDomainUid(String)","url":"isDomainUid(java.lang.String)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"isDone()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServerConfig","l":"isDynamicServer()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"isDynamicServer()"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"isEmpty()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"isFailed(V1Pod)","url":"isFailed(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator.calls","c":"CallResponse","l":"isFailure()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isFineEnabled()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isFinerEnabled()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isFinestEnabled()"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesUtils","l":"isFirstNewer(V1ObjectMeta, V1ObjectMeta)","url":"isFirstNewer(io.kubernetes.client.openapi.models.V1ObjectMeta,io.kubernetes.client.openapi.models.V1ObjectMeta)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"isGA()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"isHttpAccessLogInLogHome()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"isIncludeServerOutInPodLog()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isInfoEnabled()"},{"p":"oracle.kubernetes.operator","c":"MakeRightDomainOperation","l":"isInspectionRequired(Packet)","url":"isInspectionRequired(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.helpers","c":"JobStepContext","l":"isIstioEnabled()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"isIstioEnabled()"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"isK8sContainer(V1Container)","url":"isK8sContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"isLatest()"},{"p":"oracle.kubernetes.operator.rest.backend","c":"VersionUtils","l":"isLatest(String)","url":"isLatest(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"isLocalAdminProtocolChannelSecure()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isLoggable(Level)","url":"isLoggable(java.util.logging.Level)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"isNamespaceRunning(String)","url":"isNamespaceRunning(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"NamespaceStatus","l":"isNamespaceStarting()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"isNewIntrospectionRequiredForNewServers()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"isNotAuthorizedOrForbidden(CallResponse)","url":"isNotAuthorizedOrForbidden(oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"isNotDeleting()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"isPatchableFrom(ClusterStatus)","url":"isPatchableFrom(oracle.kubernetes.weblogic.domain.model.ClusterStatus)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"isPatchableFrom(DomainCondition)","url":"isPatchableFrom(oracle.kubernetes.weblogic.domain.model.DomainCondition)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"isPatchableFrom(ServerStatus)","url":"isPatchableFrom(oracle.kubernetes.weblogic.domain.model.ServerStatus)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"isPatchableFrom(SubsystemHealth)","url":"isPatchableFrom(oracle.kubernetes.weblogic.domain.model.SubsystemHealth)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"PatchableComponent","l":"isPatchableFrom(T)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"isPopulated()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"isPrecreateServerService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpec","l":"isPrecreateServerService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterSpecCommonImpl","l":"isPrecreateServerService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"isPrecreateServerService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"isPrecreateServerService()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerService","l":"isPrecreateService()"},{"p":"oracle.kubernetes.operator.helpers","c":"PodHelper","l":"isReady(V1Pod)","url":"isReady(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"KubernetesResourceLookup","l":"isSecretExists(String, String)","url":"isSecretExists(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"isServerPodBeingDeleted(String)","url":"isServerPodBeingDeleted(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"isServerService(V1Service)","url":"isServerService(io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"isServiceOnly()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isSevereEnabled()"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"isShuttingDown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"isShuttingDown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"isShuttingDown()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"isShuttingDown()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"isSslPortEnabled()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"ISTIO_ENABLED"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"ISTIO_POD_NAMESPACE"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"ISTIO_READINESS_PORT"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"Istio()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnrecoverableErrorBuilderImpl","l":"isUnrecoverable(ApiException)","url":"isUnrecoverable(io.kubernetes.client.openapi.ApiException)"},{"p":"oracle.kubernetes.operator.rest.backend","c":"VersionUtils","l":"isVersion(String)","url":"isVersion(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"isWarningEnabled()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"isWellFormed()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ItemModel","l":"ItemModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.builders","c":"WatchImpl","l":"iterator()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"JOB_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"JOB_CREATION_TIMESTAMP_MESSAGE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"JOB_DEADLINE_EXCEEDED_MESSAGE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"JOB_DELETED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"JOB_IS_COMPLETE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"JOB_IS_FAILED"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"JOB_POD_NAME"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"JOBNAME_LABEL"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"JOBS"},{"p":"oracle.kubernetes.utils","c":"OperatorUtils","l":"joinListGrammatically(List)","url":"joinListGrammatically(java.util.List)"},{"p":"oracle.kubernetes.operator","c":"ModelInImageDomainType","l":"JRF"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"JSON_PARSING_FAILED"},{"p":"oracle.kubernetes.json.mojo","c":"JsonSchemaMojo","l":"JsonSchemaMojo()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"K8S_MASTER_URL"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"K8S_VERSION_CHECK"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"K8S_VERSION_CHECK_FAILURE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"K8S_VERSION_TOO_LOW"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"keySet()"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExec","l":"KubernetesExec()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExecFactoryImpl","l":"KubernetesExecFactoryImpl()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesUtils","l":"KubernetesUtils()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesVersion","l":"KubernetesVersion(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"LastKnownStatus(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"LastKnownStatus(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"oracle.kubernetes.operator.rest","c":"Scan","l":"lastScanTime"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"LATEST_IMAGE_SUFFIX"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"LegalNames()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"LinkContainerModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"LinkModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"LinkModel(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"LinkModel(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"list"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listConfigMapsAsync(String, ResponseStep)","url":"listConfigMapsAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listDomain(String)","url":"listDomain(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listDomainAsync(String, ResponseStep)","url":"listDomainAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.calls","c":"AsyncRequestStep","l":"listenTimeoutDoubled()"},{"p":"oracle.kubernetes.operator.calls","c":"RetryStrategyListener","l":"listenTimeoutDoubled()"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listEventAsync(String, ResponseStep)","url":"listEventAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"LISTING_DOMAINS"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listNamespaceAsync(ResponseStep)","url":"listNamespaceAsync(oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"listNamespacedDomain(String, String, String, String, String, Integer, String, Integer, Boolean)","url":"listNamespacedDomain(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Integer,java.lang.String,java.lang.Integer,java.lang.Boolean)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"listNamespacedDomainAsync(String, String, String, String, String, Integer, String, Integer, Boolean, ApiCallback)","url":"listNamespacedDomainAsync(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Integer,java.lang.String,java.lang.Integer,java.lang.Boolean,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"listNamespacedDomainCall(String, String, String, String, String, Integer, String, Integer, Boolean, ApiCallback)","url":"listNamespacedDomainCall(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Integer,java.lang.String,java.lang.Integer,java.lang.Boolean,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"listNamespacedDomainWithHttpInfo(String, String, String, String, String, Integer, String, Integer, Boolean)","url":"listNamespacedDomainWithHttpInfo(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Integer,java.lang.String,java.lang.Integer,java.lang.Boolean)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listPodAsync(String, ResponseStep)","url":"listPodAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listSecretsAsync(String, ResponseStep)","url":"listSecretsAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listService(String)","url":"listService(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"listServiceAsync(String, ResponseStep)","url":"listServiceAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"livenessProbeInitialDelaySeconds"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"livenessProbePeriodSeconds"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"livenessProbeTimeoutSeconds"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"LOCALSUBJECTACCESSREVIEWS"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"LOG_HOME"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"LOG_HOME_NOT_MOUNTED"},{"p":"oracle.kubernetes.operator.calls","c":"FailureStatusSourceException","l":"log()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"log(Level, String)","url":"log(java.util.logging.Level,java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"log(Level, String, Object...)","url":"log(java.util.logging.Level,java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"log(Level, String, Throwable)","url":"log(java.util.logging.Level,java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.rest","c":"BaseDebugLoggingFilter","l":"LOGGER"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingContext","l":"LOGGING_CONTEXT_KEY"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFilter","l":"LOGGING_FILTER_PACKET_KEY"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingContext","l":"LoggingContext()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"LoggingFacade(Logger)","url":"%3Cinit%3E(java.util.logging.Logger)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFormatter","l":"LoggingFormatter()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"LOGS"},{"p":"oracle.kubernetes.operator.rest","c":"ScanCache","l":"lookupScan(String, String)","url":"lookupScan(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"MacroSubstitutor","l":"MacroSubstitutor(int, String, String, String, String)","url":"%3Cinit%3E(int,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"MAIN_COMPONENT_NAME"},{"p":"oracle.kubernetes.operator","c":"Main","l":"Main()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"Main","l":"main(String[])","url":"main(java.lang.String[])"},{"p":"oracle.kubernetes.operator","c":"SwaggerBuildHelper","l":"main(String[])","url":"main(java.lang.String[])"},{"p":"oracle.kubernetes.operator.helpers","c":"CrdHelper","l":"main(String[])","url":"main(java.lang.String[])"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"MainImpl()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"MainTuning(int, int, int, int, int, int, long, long)","url":"%3Cinit%3E(int,int,int,int,int,int,long,long)"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"MAKE_RIGHT_DOMAIN_OPERATION"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MANAGED_POD_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MANAGED_POD_EXISTS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MANAGED_POD_PATCHED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MANAGED_POD_REPLACED"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"MANAGED_SERVERS_STARTING_PROGRESS_REASON"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MANAGED_SERVICE_CREATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MANAGED_SERVICE_EXISTS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MANAGED_SERVICE_REPLACED"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"ManagedServer()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServerSpecCommonImpl","l":"ManagedServerSpecCommonImpl(DomainSpec, Server, Cluster, Integer)","url":"%3Cinit%3E(oracle.kubernetes.weblogic.domain.model.DomainSpec,oracle.kubernetes.weblogic.domain.model.Server,oracle.kubernetes.weblogic.domain.model.Cluster,java.lang.Integer)"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServersUpStep","l":"ManagedServersUpStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServerUpAfterStep","l":"ManagedServerUpAfterStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.steps","c":"ManagedServerUpIteratorStep","l":"ManagedServerUpIteratorStep(Collection, Step)","url":"%3Cinit%3E(java.util.Collection,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MATCHING_DOMAIN_NOT_FOUND"},{"p":"oracle.kubernetes.json","c":"Range","l":"maximum()"},{"p":"oracle.kubernetes.json","c":"Range","l":"minimum()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"MODEL_CONFIGMAP_NOT_FOUND"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"MODEL_IN_IMAGE_DOMAINZIP_HASH"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"MODEL_IN_IMAGE_MODEL_SECRETS_HASH"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Model","l":"Model()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"name"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"namespace"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Scope","l":"namespace"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"NAMESPACE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NAMESPACE_IS_DEFAULT"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NAMESPACE_IS_MISSING"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingContext","l":"namespace()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingContext","l":"namespace(String)","url":"namespace(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"NAMESPACES"},{"p":"oracle.kubernetes.operator","c":"NamespaceStatus","l":"NamespaceStatus()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"NetworkAccessPoint()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"NetworkAccessPoint(String, String, Integer, Integer)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"NETWORKPOLICIES"},{"p":"oracle.kubernetes.operator","c":"ImagePullPolicy","l":"Never"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"NEVER"},{"p":"oracle.kubernetes.operator.builders","c":"WatchImpl","l":"next()"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"NextAction()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NO_CLUSTER_IN_DOMAIN"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NO_EXTERNAL_CERTIFICATE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NO_INTERNAL_CERTIFICATE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NO_MANAGED_SERVER_IN_DOMAIN"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NO_WLS_SERVER_IN_CLUSTER"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"NODE_PORT_TYPE"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"NODEMGR_HOME"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"NODEMGR_HOME"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"NON_CLUSTERED_SERVER_START_POLICY_ALWAYS"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"NON_CLUSTERED_SERVER_START_POLICY_NEVER"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"NonClusteredServerConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"Container","l":"NONE"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"NOT_FOUND"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NOT_STARTING_DOMAINUID_THREAD"},{"p":"oracle.kubernetes.operator.rest.resource","c":"BaseResource","l":"notFound(String)","url":"notFound(java.lang.String)"},{"p":"oracle.kubernetes.utils","c":"SystemClock","l":"now()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NULL_DOMAIN_UID"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NULL_TOKEN_REVIEW_STATUS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"NULL_USER_INFO"},{"p":"oracle.kubernetes.operator","c":"OverrideDistributionStrategy","l":"ON_RESTART"},{"p":"oracle.kubernetes.operator.logging","c":"OncePerMessageLoggingFilter","l":"OncePerMessageLoggingFilter()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber.CompletionCallback","l":"onCompletion(Packet)","url":"onCompletion(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber.ExitCallback","l":"onExit()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"onFailure(Packet, CallResponse)","url":"onFailure(oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.steps","c":"DefaultResponseStep","l":"onFailure(Packet, CallResponse)","url":"onFailure(oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.http","c":"HttpResponseStep","l":"onFailure(Packet, HttpResponse)","url":"onFailure(oracle.kubernetes.operator.work.Packet,java.net.http.HttpResponse)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"onFailure(Step, Packet, CallResponse)","url":"onFailure(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"onFailureNoRetry(Packet, CallResponse)","url":"onFailureNoRetry(oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.helpers","c":"Pool","l":"onRecycle(T)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"onSuccess(Packet, CallResponse)","url":"onSuccess(oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.steps","c":"DefaultResponseStep","l":"onSuccess(Packet, CallResponse)","url":"onSuccess(oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.calls.CallResponse)"},{"p":"oracle.kubernetes.operator.http","c":"HttpResponseStep","l":"onSuccess(Packet, HttpResponse)","url":"onSuccess(oracle.kubernetes.operator.work.Packet,java.net.http.HttpResponse)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber.CompletionCallback","l":"onThrowable(Packet, Throwable)","url":"onThrowable(oracle.kubernetes.operator.work.Packet,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"OP_CONFIG_NAMESPACE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"OP_CONFIG_SERVICE_ACCOUNT"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"OP_CONFIG_TARGET_NAMESPACES"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"OPERATOR_SHUTTING_DOWN"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"OPERATOR_STARTED"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"OPERATOR_VERISON"},{"p":"oracle.kubernetes.operator","c":"OperatorLiveness","l":"OperatorLiveness()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"OPERATORNAME_LABEL"},{"p":"oracle.kubernetes.operator","c":"OperatorReady","l":"OperatorReady()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.utils","c":"OperatorUtils","l":"OperatorUtils()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"OPSS_KEY_MOUNT_PATH"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"OPSS_KEY_SECRET_NAME"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"OPSS_KEYPASSPHRASE_VOLUME"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"OPSS_SECRET_NOT_SPECIFIED"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"OPSS_WALLETFILE_MOUNT_PATH"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"OPSS_WALLETFILE_SECRET_NAME"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"OPSS_WALLETFILE_VOLUME"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Opss","l":"Opss()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretType","l":"OpssWalletFile"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretType","l":"OpssWalletPassword"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingContext","l":"optionalContext()"},{"p":"oracle.kubernetes.operator.steps","c":"ReadHealthStep","l":"OVERALL_HEALTH_FOR_SERVER_OVERLOADED"},{"p":"oracle.kubernetes.operator.steps","c":"ReadHealthStep","l":"OVERALL_HEALTH_NOT_AVAILABLE"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"OVERRIDE_SECRETS_MOUNT_PATH"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"OVERRIDES_CM_MOUNT_PATH"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"owner"},{"p":"oracle.kubernetes.operator.work","c":"Step.StepAndPacket","l":"packet"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"Packet()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"Pair","l":"Pair(L, R)","url":"%3Cinit%3E(L,R)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainTopology","l":"parseDomainTopologyYaml(String)","url":"parseDomainTopologyYaml(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainTopology","l":"parseDomainTopologyYaml(String, Consumer>)","url":"parseDomainTopologyYaml(java.lang.String,java.util.function.Consumer)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"patch"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"patchConfigMapAsync(String, String, V1Patch, ResponseStep)","url":"patchConfigMapAsync(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"patchDomain(String, String, V1Patch)","url":"patchDomain(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"patchDomainAsync(String, String, V1Patch, ResponseStep)","url":"patchDomainAsync(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomain(String, String, V1Patch)","url":"patchNamespacedDomain(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainAsync(String, String, V1Patch, ApiCallback)","url":"patchNamespacedDomainAsync(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainCall(String, String, V1Patch, ApiCallback)","url":"patchNamespacedDomainCall(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainScale(String, String, V1Patch)","url":"patchNamespacedDomainScale(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainScaleAsync(String, String, V1Patch, ApiCallback)","url":"patchNamespacedDomainScaleAsync(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainScaleCall(String, String, V1Patch, ApiCallback)","url":"patchNamespacedDomainScaleCall(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainScaleWithHttpInfo(String, String, V1Patch)","url":"patchNamespacedDomainScaleWithHttpInfo(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainStatus(String, String, V1Patch)","url":"patchNamespacedDomainStatus(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainStatusAsync(String, String, V1Patch, ApiCallback)","url":"patchNamespacedDomainStatusAsync(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainStatusCall(String, String, V1Patch, ApiCallback)","url":"patchNamespacedDomainStatusCall(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainStatusWithHttpInfo(String, String, V1Patch)","url":"patchNamespacedDomainStatusWithHttpInfo(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"patchNamespacedDomainWithHttpInfo(String, String, V1Patch)","url":"patchNamespacedDomainWithHttpInfo(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"patchPodAsync(String, String, V1Patch, ResponseStep)","url":"patchPodAsync(java.lang.String,java.lang.String,io.kubernetes.client.custom.V1Patch,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.utils","c":"PatchUtils","l":"PatchUtils()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest","c":"RestBackendImpl","l":"performDomainAction(String, DomainAction)","url":"performDomainAction(java.lang.String,oracle.kubernetes.operator.rest.model.DomainAction)"},{"p":"oracle.kubernetes.operator.rest.backend","c":"RestBackend","l":"performDomainAction(String, DomainAction)","url":"performDomainAction(java.lang.String,oracle.kubernetes.operator.rest.model.DomainAction)"},{"p":"oracle.kubernetes.operator.helpers","c":"HealthCheckHelper","l":"performK8sVersionCheck()"},{"p":"oracle.kubernetes.operator.helpers","c":"HealthCheckHelper","l":"performSecurityChecks(KubernetesVersion, String, String)","url":"performSecurityChecks(oracle.kubernetes.operator.helpers.KubernetesVersion,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"periodSeconds(Integer)","url":"periodSeconds(java.lang.Integer)"},{"p":"oracle.kubernetes.operator","c":"DomainSourceType","l":"PersistentVolume"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"PERSISTENTVOLUMECLAIMS"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"PERSISTENTVOLUMES"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"POD_DELETED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"POD_DUMP"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"POD_IS_FAILED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"POD_IS_READY"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"PODPRESETS"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"PODS"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"PODSECURITYPOLICIES"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"PODTEMPLATES"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"PodTuning(int, int, int, int, int, int, long)","url":"%3Cinit%3E(int,int,int,int,int,int,long)"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"PODWATCHER_COMPONENT_NAME"},{"p":"oracle.kubernetes.operator.helpers","c":"Pool","l":"Pool()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"DomainResource","l":"post(DomainAction)","url":"post(oracle.kubernetes.operator.rest.model.DomainAction)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ScaleClusterResource","l":"post(ScaleClusterParamsModel)","url":"post(oracle.kubernetes.operator.rest.model.ScaleClusterParamsModel)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"prettyPrint(Object)","url":"prettyPrint(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"ProbeTuning()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"processDynamicClusters()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"PROCESSING_DOMAIN"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainConditionType","l":"Progressing"},{"p":"oracle.kubernetes.operator.rest.model","c":"BaseModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ClusterModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"CollectionModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ScaleClusterParamsModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"propertiesToString()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"proxy"},{"p":"oracle.kubernetes.operator.work","c":"Packet","l":"put(String, Object)","url":"put(java.lang.String,java.lang.Object)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"put(String, String)","url":"put(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"putAll(Map)","url":"putAll(java.util.Map)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"PV_ACCESS_MODE_FAILED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"PV_NOT_FOUND_FOR_DOMAIN_UID"},{"p":"oracle.kubernetes.json","c":"EnumClass","l":"qualifier()"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readBetaCustomResourceDefinitionAsync(String, ResponseStep)","url":"readBetaCustomResourceDefinitionAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readConfigMapAsync(String, String, ResponseStep)","url":"readConfigMapAsync(java.lang.String,java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readCustomResourceDefinitionAsync(String, ResponseStep)","url":"readCustomResourceDefinitionAsync(java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readDomainAsync(String, String, ResponseStep)","url":"readDomainAsync(java.lang.String,java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper","l":"readExistingIntrospectorConfigMap(String, String)","url":"readExistingIntrospectorConfigMap(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"READINESS_PROBE_NOT_READY_STATE"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"readinessProbeInitialDelaySeconds"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"readinessProbePeriodSeconds"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"readinessProbeTimeoutSeconds"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper","l":"readIntrospectionVersionStep(String, String)","url":"readIntrospectionVersionStep(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readJobAsync(String, String, ResponseStep)","url":"readJobAsync(java.lang.String,java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readNamespace(String)","url":"readNamespace(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readPodAsync(String, String, ResponseStep)","url":"readPodAsync(java.lang.String,java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readPodLogAsync(String, String, ResponseStep)","url":"readPodLogAsync(java.lang.String,java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readSecret(String, String)","url":"readSecret(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readSecretAsync(String, String, ResponseStep)","url":"readSecretAsync(java.lang.String,java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.authentication","c":"Helpers","l":"readSecretByReference(V1ObjectReference, String)","url":"readSecretByReference(io.kubernetes.client.openapi.models.V1ObjectReference,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readService(String, String)","url":"readService(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readServiceAsync(String, String, ResponseStep)","url":"readServiceAsync(java.lang.String,java.lang.String,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"readTuningParameter(String, long)","url":"readTuningParameter(java.lang.String,long)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"readVersionCode()"},{"p":"oracle.kubernetes.operator.watcher","c":"WatchListener","l":"receivedResponse(Watch.Response)","url":"receivedResponse(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"JobWatcher","l":"receivedResponse(Watch.Response)","url":"receivedResponse(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"PodWatcher","l":"receivedResponse(Watch.Response)","url":"receivedResponse(io.kubernetes.client.util.Watch.Response)"},{"p":"oracle.kubernetes.operator","c":"MakeRightDomainOperation","l":"recordInspection(Packet)","url":"recordInspection(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.helpers","c":"Pool","l":"recycle(T)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"redirect"},{"p":"oracle.kubernetes.operator.rest","c":"ScanCache","l":"registerScan(String, String, Scan)","url":"registerScan(java.lang.String,java.lang.String,oracle.kubernetes.operator.rest.Scan)"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"REMAINING_SERVERS_HEALTH_TO_READ"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"remove(Object)","url":"remove(java.lang.Object)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"removeConditionIf(Predicate)","url":"removeConditionIf(java.util.function.Predicate)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"removeServerService(String)","url":"removeServerService(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"replace"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REPLACE_CRD_FAILED"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"replaceBetaCustomResourceDefinitionAsync(String, V1beta1CustomResourceDefinition, ResponseStep)","url":"replaceBetaCustomResourceDefinitionAsync(java.lang.String,io.kubernetes.client.openapi.models.V1beta1CustomResourceDefinition,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"replaceConfigMapAsync(String, String, V1ConfigMap, ResponseStep)","url":"replaceConfigMapAsync(java.lang.String,java.lang.String,io.kubernetes.client.openapi.models.V1ConfigMap,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"replaceCustomResourceDefinitionAsync(String, V1CustomResourceDefinition, ResponseStep)","url":"replaceCustomResourceDefinitionAsync(java.lang.String,io.kubernetes.client.openapi.models.V1CustomResourceDefinition,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"replaceDomain(String, String, Domain)","url":"replaceDomain(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"replaceDomainAsync(String, String, Domain, ResponseStep)","url":"replaceDomainAsync(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"replaceDomainStatusAsync(String, String, Domain, ResponseStep)","url":"replaceDomainStatusAsync(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,oracle.kubernetes.operator.helpers.ResponseStep)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomain(String, String, Domain)","url":"replaceNamespacedDomain(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainAsync(String, String, Domain, ApiCallback)","url":"replaceNamespacedDomainAsync(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainCall(String, String, Domain, ApiCallback)","url":"replaceNamespacedDomainCall(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainScale(String, String, Domain)","url":"replaceNamespacedDomainScale(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainScaleAsync(String, String, Domain, ApiCallback)","url":"replaceNamespacedDomainScaleAsync(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainScaleCall(String, String, Domain, ApiCallback)","url":"replaceNamespacedDomainScaleCall(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainScaleWithHttpInfo(String, String, Domain)","url":"replaceNamespacedDomainScaleWithHttpInfo(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainStatus(String, String, Domain)","url":"replaceNamespacedDomainStatus(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainStatusAsync(String, String, Domain, ApiCallback)","url":"replaceNamespacedDomainStatusAsync(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainStatusCall(String, String, Domain, ApiCallback)","url":"replaceNamespacedDomainStatusCall(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain,io.kubernetes.client.openapi.ApiCallback)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainStatusWithHttpInfo(String, String, Domain)","url":"replaceNamespacedDomainStatusWithHttpInfo(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"replaceNamespacedDomainWithHttpInfo(String, String, Domain)","url":"replaceNamespacedDomainWithHttpInfo(java.lang.String,java.lang.String,oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REPLICA_MORE_THAN_WLS_SERVERS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REPLICAS_EXCEEDS_TOTAL_CLUSTER_SERVER_COUNT"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REPLICAS_LESS_THAN_TOTAL_CLUSTER_SERVER_COUNT"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"reportSuspendedFibers()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"reportSuspendedFibers()"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapHelper","l":"reportTopologyErrorsAndStop()"},{"p":"oracle.kubernetes.operator.rest","c":"FilterPriorities","l":"REQUEST_DEBUG_LOGGING_FILTER_PRIORITY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REQUEST_PARAMS_FOR_NAME"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REQUEST_PARAMS_IN_NS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REQUEST_PARAMS_WITH"},{"p":"oracle.kubernetes.operator.rest","c":"RequestDebugLoggingFilter","l":"RequestDebugLoggingFilter()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"RequestParams(String, String, String, Object)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.lang.Object)"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"RequestParams(String, String, String, Object, CallParams)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.lang.Object,oracle.kubernetes.operator.builders.CallParams)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"RESERVED_ENVIRONMENT_VARIABLES"},{"p":"oracle.kubernetes.operator.calls","c":"RetryStrategy","l":"reset()"},{"p":"oracle.kubernetes.operator.logging","c":"OncePerMessageLoggingFilter","l":"resetLogHistory()"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"RESOURCE_BUNDLE_NOT_FOUND"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"ResourceVersion(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator.calls","c":"AsyncRequestStep","l":"RESPONSE_COMPONENT_NAME"},{"p":"oracle.kubernetes.operator.rest","c":"FilterPriorities","l":"RESPONSE_DEBUG_LOGGING_FILTER_PRIORITY"},{"p":"oracle.kubernetes.operator.rest","c":"ResponseDebugLoggingFilter","l":"ResponseDebugLoggingFilter()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"ResponseStep()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"ResponseStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"ResponseStep(Step, Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"REST_AUTHENTICATION_MISSING_ACCESS_TOKEN"},{"p":"oracle.kubernetes.operator.rest","c":"AuthenticationFilter","l":"REST_BACKEND_PROPERTY"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfig","l":"REST_CONFIG_PROPERTY"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainActionType","l":"RESTART"},{"p":"oracle.kubernetes.operator.rest","c":"RestConfigImpl","l":"RestConfigImpl(String, Collection)","url":"%3Cinit%3E(java.lang.String,java.util.Collection)"},{"p":"oracle.kubernetes.operator","c":"ModelInImageDomainType","l":"RestrictedJRF"},{"p":"oracle.kubernetes.operator.work","c":"AsyncFiber","l":"resume(Packet)","url":"resume(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"resume(Packet)","url":"resume(oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"RESUMING_STATE"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"RETRIEVING_SECRET"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"ROLLING_SERVERS"},{"p":"oracle.kubernetes.operator.helpers","c":"RollingHelper","l":"rollServers(Map, Step)","url":"rollServers(java.util.Map,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"OperatorLiveness","l":"run()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"run()"},{"p":"oracle.kubernetes.operator","c":"ServerStartState","l":"RUNNING"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"RUNNING_STATE"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"runSteps(Step)","url":"runSteps(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"RUNTIME_ENCRYPTION_SECRET_MOUNT_PATH"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"RUNTIME_ENCRYPTION_SECRET_NAME"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"RUNTIME_ENCRYPTION_SECRET_VOLUME"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretType","l":"RuntimeEncryption"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"SCALE_COUNT_GREATER_THAN_CONFIGURED"},{"p":"oracle.kubernetes.operator.rest","c":"RestBackendImpl","l":"scaleCluster(String, String, int)","url":"scaleCluster(java.lang.String,java.lang.String,int)"},{"p":"oracle.kubernetes.operator.rest.backend","c":"RestBackend","l":"scaleCluster(String, String, int)","url":"scaleCluster(java.lang.String,java.lang.String,int)"},{"p":"oracle.kubernetes.operator.rest.model","c":"ScaleClusterParamsModel","l":"ScaleClusterParamsModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"ScaleClusterResource","l":"ScaleClusterResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest","c":"Scan","l":"Scan(WlsDomainConfig, DateTime)","url":"%3Cinit%3E(oracle.kubernetes.operator.wlsconfig.WlsDomainConfig,org.joda.time.DateTime)"},{"p":"oracle.kubernetes.operator.work","c":"AsyncFiber","l":"scheduleOnce(long, TimeUnit, Runnable)","url":"scheduleOnce(long,java.util.concurrent.TimeUnit,java.lang.Runnable)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"scheduleOnce(long, TimeUnit, Runnable)","url":"scheduleOnce(long,java.util.concurrent.TimeUnit,java.lang.Runnable)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorDelegate","l":"scheduleWithFixedDelay(Runnable, long, long, TimeUnit)","url":"scheduleWithFixedDelay(java.lang.Runnable,long,long,java.util.concurrent.TimeUnit)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"SchemaGenerator()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"SCRIPT_CONFIG_MAP"},{"p":"oracle.kubernetes.operator","c":"KubernetesConstants","l":"SCRIPT_CONFIG_MAP_NAME"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"SCRIPT_LOADED"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"SCRIPTS_MOUNTS_PATH"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"SCRIPTS_VOLUME"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretHelper","l":"SECRET_DATA_KEY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"SECRET_DATA_NOT_FOUND"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"SECRET_NOT_FOUND"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"SECRET_NOT_SPECIFIED"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretHelper","l":"SecretHelper()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"SECRETS"},{"p":"oracle.kubernetes.operator","c":"IntrospectorConfigMapKeys","l":"SECRETS_MD_5"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"SECRETS_MOUNT_PATH"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"SECRETS_VOLUME"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfiguratorFactory","l":"selectCommonDomainModel()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"SELFSUBJECTACCESSREVIEWS"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"SELFSUBJECTRULESREVIEWS"},{"p":"oracle.kubernetes.operator.helpers","c":"SemanticVersion","l":"SemanticVersion(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"oracle.kubernetes.operator.helpers","c":"SemanticVersion","l":"SemanticVersion(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"oracle.kubernetes.operator.helpers","c":"SemanticVersion","l":"SemanticVersion(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"OperatorServiceType","l":"SERVER"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"SERVER_HEALTH_MAP"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"SERVER_NAME"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"SERVER_NAME"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"SERVER_OUT_IN_POD_LOG"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"SERVER_SCAN"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"SERVER_START_POLICY_ALWAYS"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"SERVER_START_POLICY_NEVER"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"SERVER_STATE_MAP"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Server","l":"Server()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"serverConfig"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"ServerConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"ServerEnvVars()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"ServerHealth()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"SERVERNAME_LABEL"},{"p":"oracle.kubernetes.operator","c":"LabelConstants","l":"SERVERRESTARTVERSION_LABEL"},{"p":"oracle.kubernetes.operator","c":"DomainStatusUpdater","l":"SERVERS_READY_REASON"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"SERVERS_TO_ROLL"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerService","l":"ServerService()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"ServerSpecBase(DomainSpec)","url":"%3Cinit%3E(oracle.kubernetes.weblogic.domain.model.DomainSpec)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"ServerStartupInfo(WlsServerConfig, String, ServerSpec)","url":"%3Cinit%3E(oracle.kubernetes.operator.wlsconfig.WlsServerConfig,java.lang.String,oracle.kubernetes.weblogic.domain.model.ServerSpec)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"ServerStartupInfo(WlsServerConfig, String, ServerSpec, boolean)","url":"%3Cinit%3E(oracle.kubernetes.operator.wlsconfig.WlsServerConfig,java.lang.String,oracle.kubernetes.weblogic.domain.model.ServerSpec,boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"ServerStatus()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerEnvVars","l":"SERVICE_NAME"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"SERVICE_URL"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"SERVICES"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"setAdminPort(int)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"setAdminPort(Integer)","url":"setAdminPort(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"setAdminServerName(String)","url":"setAdminServerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"setAllowReplicasBelowMinDynClusterSize(Boolean)","url":"setAllowReplicasBelowMinDynClusterSize(java.lang.Boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setAllowReplicasBelowMinDynClusterSize(Boolean)","url":"setAllowReplicasBelowMinDynClusterSize(java.lang.Boolean)"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"setApiClient(ApiClient)","url":"setApiClient(io.kubernetes.client.openapi.ApiClient)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"setApiVersion(String)","url":"setApiVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"setApiVersion(String)","url":"setApiVersion(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setCalculatedListenPorts(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"setChannelName(String)","url":"setChannelName(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"ClusterModel","l":"setCluster(String)","url":"setCluster(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"setCluster(String, ClusterConfig)","url":"setCluster(java.lang.String,oracle.kubernetes.operator.helpers.ClusterConfig)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"setClusteredServerStartPolicy(String)","url":"setClusteredServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"setClusterName(String)","url":"setClusterName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"setClusterName(String)","url":"setClusterName(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"setClusterName(String)","url":"setClusterName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"setClusterName(String)","url":"setClusterName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"setClusterName(String)","url":"setClusterName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"setClusterName(String)","url":"setClusterName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"setClusters(List)","url":"setClusters(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"setClusters(Map)","url":"setClusters(java.util.Map)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"setClusterService(KubernetesResource)","url":"setClusterService(oracle.kubernetes.weblogic.domain.model.KubernetesResource)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setConfigOverrideSecrets(List)","url":"setConfigOverrideSecrets(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setConfiguration(Configuration)","url":"setConfiguration(oracle.kubernetes.weblogic.domain.model.Configuration)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"setConfiguredClusters(List)","url":"setConfiguredClusters(java.util.List)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"setContextClassLoader(ClassLoader)","url":"setContextClassLoader(java.lang.ClassLoader)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setDataHome(String)","url":"setDataHome(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setDeleting(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"setDesiredState(String)","url":"setDesiredState(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"setDetail(String)","url":"setDetail(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setDomain(Domain)","url":"setDomain(oracle.kubernetes.weblogic.domain.model.Domain)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainTopology","l":"setDomain(WlsDomainConfig)","url":"setDomain(oracle.kubernetes.operator.wlsconfig.WlsDomainConfig)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setDomainHome(String)","url":"setDomainHome(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setDomainHomeInImage(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setDomainHomeSourceType(DomainSourceType)","url":"setDomainHomeSourceType(oracle.kubernetes.operator.DomainSourceType)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Model","l":"setDomainType(String)","url":"setDomainType(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainModel","l":"setDomainUid(String)","url":"setDomainUid(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setDomainUid(String)","url":"setDomainUid(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainTopology","l":"setDomainValid(boolean)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setDynamicClusterSize(Integer)","url":"setDynamicClusterSize(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"setDynamicServersConfig(WlsDynamicServersConfig)","url":"setDynamicServersConfig(oracle.kubernetes.operator.wlsconfig.WlsDynamicServersConfig)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"setEnabled(Boolean)","url":"setEnabled(java.lang.Boolean)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"setEnv(List)","url":"setEnv(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"setEnv(List)","url":"setEnv(java.util.List)"},{"p":"oracle.kubernetes.operator.logging","c":"OncePerMessageLoggingFilter","l":"setFiltering(boolean)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"setHref(String)","url":"setHref(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setHttpAccessLogInLogHome(boolean)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"setImage(String)","url":"setImage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setImage(String)","url":"setImage(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"setImagePullPolicy(String)","url":"setImagePullPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setImagePullPolicy(String)","url":"setImagePullPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setImagePullSecret(V1LocalObjectReference)","url":"setImagePullSecret(io.kubernetes.client.openapi.models.V1LocalObjectReference)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"setImagePullSecrets(List)","url":"setImagePullSecrets(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setImagePullSecrets(List)","url":"setImagePullSecrets(java.util.List)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"setIncludeAdditionalProperties(boolean)"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"setIncludeAdditionalProperties(boolean)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"setIncludeAdditionalProperties(boolean)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"setIncludeSchemaReference(boolean)"},{"p":"oracle.kubernetes.operator","c":"MakeRightDomainOperation","l":"setInspectionRun()"},{"p":"oracle.kubernetes.operator.work","c":"ContainerResolver","l":"setInstance(ContainerResolver)","url":"setInstance(oracle.kubernetes.operator.work.ContainerResolver)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"setIntrospectorJobActiveDeadlineSeconds(Long)","url":"setIntrospectorJobActiveDeadlineSeconds(java.lang.Long)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setIntrospectVersion(String)","url":"setIntrospectVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerService","l":"setIsPrecreateService(Boolean)","url":"setIsPrecreateService(java.lang.Boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"setIstio(Istio)","url":"setIstio(oracle.kubernetes.weblogic.domain.model.Istio)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"setItems(List)","url":"setItems(java.util.List)"},{"p":"oracle.kubernetes.operator.rest.model","c":"CollectionModel","l":"setItems(List)","url":"setItems(java.util.List)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFactory","l":"setJson(JSON)","url":"setJson(io.kubernetes.client.openapi.JSON)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"setKind(String)","url":"setKind(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"setKind(String)","url":"setKind(java.lang.String)"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"setKubernetesVersion(String)","url":"setKubernetesVersion(java.lang.String)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"setKubernetesVersion(String)","url":"setKubernetesVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"setLastProbeTime(DateTime)","url":"setLastProbeTime(org.joda.time.DateTime)"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"setLatest(boolean)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"setLevel(Level)","url":"setLevel(java.util.logging.Level)"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"setLifecycle(String)","url":"setLifecycle(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkContainerModel","l":"setLinks(List)","url":"setLinks(java.util.List)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"setListenPort(Integer)","url":"setListenPort(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setLogHome(String)","url":"setLogHome(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setLogHomeEnabled(Boolean)","url":"setLogHomeEnabled(java.lang.Boolean)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setMachineNameMatchExpression(String)","url":"setMachineNameMatchExpression(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"ScaleClusterParamsModel","l":"setManagedServerCount(int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setMaxClusterConcurrentStartup(Integer)","url":"setMaxClusterConcurrentStartup(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"setMaxConcurrentStartup(Integer)","url":"setMaxConcurrentStartup(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setMaxDynamicClusterSize(Integer)","url":"setMaxDynamicClusterSize(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"setMaxReplicas(int)"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"ErrorBody","l":"setMessage(String)","url":"setMessage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"setMessage(String)","url":"setMessage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"setMetadata(V1ListMeta)","url":"setMetadata(io.kubernetes.client.openapi.models.V1ListMeta)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"setMetadata(V1ObjectMeta)","url":"setMetadata(io.kubernetes.client.openapi.models.V1ObjectMeta)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setMinDynamicClusterSize(Integer)","url":"setMinDynamicClusterSize(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"setMinReplicas(int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"setModel(Model)","url":"setModel(oracle.kubernetes.weblogic.domain.model.Model)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"setName(String)","url":"setName(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setName(String)","url":"setName(java.lang.String)"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"setNext(Step)","url":"setNext(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"setNodePort(int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"setNodePort(Integer)","url":"setNodePort(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"setOpss(Opss)","url":"setOpss(oracle.kubernetes.weblogic.domain.model.Opss)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"setOverrideDistributionStrategy(OverrideDistributionStrategy)","url":"setOverrideDistributionStrategy(oracle.kubernetes.operator.OverrideDistributionStrategy)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"setOverridesConfigMap(String)","url":"setOverridesConfigMap(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setPopulated(boolean)"},{"p":"oracle.kubernetes.operator.helpers","c":"ResponseStep","l":"setPrevious(AsyncRequestStep)","url":"setPrevious(oracle.kubernetes.operator.calls.AsyncRequestStep)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"setReadinessPort(Integer)","url":"setReadinessPort(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"setReason(String)","url":"setReason(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"setRel(String)","url":"setRel(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"EffectiveConfigurationFactory","l":"setReplicaCount(String, int)","url":"setReplicaCount(java.lang.String,int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"setReplicaCount(String, int)","url":"setReplicaCount(java.lang.String,int)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"setReplicas(int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"setReplicas(Integer)","url":"setReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"setReplicas(Integer)","url":"setReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setReplicas(Integer)","url":"setReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"setReplicas(Integer)","url":"setReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"setRestartedLabel(String)","url":"setRestartedLabel(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"setSecrets(List)","url":"setSecrets(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"setServer(String, ClusteredServerConfig)","url":"setServer(java.lang.String,oracle.kubernetes.operator.helpers.ClusteredServerConfig)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"setServer(String, NonClusteredServerConfig)","url":"setServer(java.lang.String,oracle.kubernetes.operator.helpers.NonClusteredServerConfig)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setServerConfigs(List)","url":"setServerConfigs(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"setServerName(String)","url":"setServerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"setServerName(String)","url":"setServerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"setServerName(String)","url":"setServerName(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setServerNamePrefix(String)","url":"setServerNamePrefix(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setServerPod(String, V1Pod)","url":"setServerPod(java.lang.String,io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setServerPodBeingDeleted(String, Boolean)","url":"setServerPodBeingDeleted(java.lang.String,java.lang.Boolean)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setServerPodFromEvent(String, V1Pod)","url":"setServerPodFromEvent(java.lang.String,io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"setServers(List)","url":"setServers(java.util.List)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"setServers(List)","url":"setServers(java.util.List)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"setServers(List)","url":"setServers(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"setServers(Map)","url":"setServers(java.util.Map)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"setServers(Map)","url":"setServers(java.util.Map)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setServerService(String, V1Service)","url":"setServerService(java.lang.String,io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"setServerStartPolicy(String)","url":"setServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"setServerStartPolicy(String)","url":"setServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"setServerStartPolicy(String)","url":"setServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Server","l":"setServerStartPolicy(String)","url":"setServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"setServerStartupInfo(Collection)","url":"setServerStartupInfo(java.util.Collection)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setServerTemplate(WlsServerConfig)","url":"setServerTemplate(oracle.kubernetes.operator.wlsconfig.WlsServerConfig)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"setServerTemplateName(String)","url":"setServerTemplateName(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"setServerTemplates(List)","url":"setServerTemplates(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"setShuttingDown(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"setShuttingDown(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"setSpec(DomainSpec)","url":"setSpec(oracle.kubernetes.weblogic.domain.model.DomainSpec)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"setSslListenPort(Integer)","url":"setSslListenPort(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"setState(String)","url":"setState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"setStatus(DomainStatus)","url":"setStatus(oracle.kubernetes.weblogic.domain.model.DomainStatus)"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"setStatus(int)"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExec","l":"setStdin(boolean)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"setSupportObjectReferences(boolean)"},{"p":"oracle.kubernetes.json.mojo","c":"Main","l":"setSupportObjectReferences(boolean)"},{"p":"oracle.kubernetes.json.mojo","c":"MainImpl","l":"setSupportObjectReferences(boolean)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingContext","l":"setThreadContext()"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"setTitle(String)","url":"setTitle(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"LinkModel","l":"setTitle(String)","url":"setTitle(java.lang.String)"},{"p":"oracle.kubernetes.operator.utils","c":"KubernetesExec","l":"setTty(boolean)"},{"p":"oracle.kubernetes.operator.rest.model","c":"ErrorModel","l":"setType(String)","url":"setType(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainTopology","l":"setValidationErrors(List)","url":"setValidationErrors(java.util.List)"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"setVersion(String)","url":"setVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Opss","l":"setWalletFileSecret(String)","url":"setWalletFileSecret(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Opss","l":"setWalletPasswordSecret(String)","url":"setWalletPasswordSecret(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"setWlsDomainConfig(WlsDomainConfig)","url":"setWlsDomainConfig(oracle.kubernetes.operator.wlsconfig.WlsDomainConfig)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"severe(LoggingFilter, String, Object...)","url":"severe(oracle.kubernetes.operator.logging.LoggingFilter,java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"severe(LoggingFilter, String, Throwable)","url":"severe(oracle.kubernetes.operator.logging.LoggingFilter,java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"severe(String)","url":"severe(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"severe(String, Object...)","url":"severe(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"severe(String, Throwable)","url":"severe(java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServerSpecCommonImpl","l":"shouldStart(int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpec","l":"shouldStart(int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"shouldStart(int)"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"SHUTDOWN_STATE"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"Shutdown()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"shutdownType(String)","url":"shutdownType(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"SHUTTING_DOWN_STATE"},{"p":"oracle.kubernetes.operator","c":"IntrospectorConfigMapKeys","l":"SIT_CONFIG_FILE_PREFIX"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"SIT_CONFIG_MAP_VOLUME"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"size()"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"STANDBY_STATE"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ConfigurationConstants","l":"START_ADMIN_ONLY"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ConfigurationConstants","l":"START_ALWAYS"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ConfigurationConstants","l":"START_IF_NEEDED"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ConfigurationConstants","l":"START_NEVER"},{"p":"oracle.kubernetes.operator.rest","c":"RestServer","l":"start(Container)","url":"start(oracle.kubernetes.operator.work.Container)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"start(Step, Packet, Fiber.CompletionCallback)","url":"start(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.work.Fiber.CompletionCallback)"},{"p":"oracle.kubernetes.operator.work","c":"FiberGate","l":"startFiber(String, Step, Packet, Fiber.CompletionCallback)","url":"startFiber(java.lang.String,oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.work.Fiber.CompletionCallback)"},{"p":"oracle.kubernetes.operator.work","c":"FiberGate","l":"startFiberIfLastFiberMatches(String, Fiber, Step, Packet, Fiber.CompletionCallback)","url":"startFiberIfLastFiberMatches(java.lang.String,oracle.kubernetes.operator.work.Fiber,oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.work.Fiber.CompletionCallback)"},{"p":"oracle.kubernetes.operator.work","c":"FiberGate","l":"startFiberIfNoCurrentFiber(String, Step, Packet, Fiber.CompletionCallback)","url":"startFiberIfNoCurrentFiber(java.lang.String,oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet,oracle.kubernetes.operator.work.Fiber.CompletionCallback)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"STARTING_LIVENESS_THREAD"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"STARTING_STATE"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"STATES_SUPPORTING_REST"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"statusUpdateTimeoutSeconds"},{"p":"oracle.kubernetes.operator.work","c":"Step.StepAndPacket","l":"step"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"Step()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"Step(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.work","c":"Step.StepAndPacket","l":"StepAndPacket(Step, Packet)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step,oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.rest","c":"RestServer","l":"stop()"},{"p":"oracle.kubernetes.operator","c":"DomainProcessor","l":"stopNamespace(String)","url":"stopNamespace(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"DomainProcessorImpl","l":"stopNamespace(String)","url":"stopNamespace(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"STORAGE_VOLUME"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"STORAGECLASSES"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"SUBJECTACCESSREVIEWS"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"SubsystemHealth()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"NextAction.Kind","l":"SUSPEND"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"suspend(Consumer)","url":"suspend(java.util.function.Consumer)"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"suspend(Step, Consumer)","url":"suspend(oracle.kubernetes.operator.work.Step,java.util.function.Consumer)"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"SUSPENDING_STATE"},{"p":"oracle.kubernetes.operator","c":"SwaggerBuildHelper","l":"SwaggerBuildHelper()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.resource","c":"SwaggerResource","l":"SwaggerResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.utils","c":"SystemClock","l":"SystemClock()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"Pool","l":"take()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"targetNamespaceRecheckIntervalSeconds"},{"p":"oracle.kubernetes.operator.work","c":"AsyncFiber","l":"terminate(Throwable, Packet)","url":"terminate(java.lang.Throwable,oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"terminate(Throwable, Packet)","url":"terminate(java.lang.Throwable,oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"terminate(Throwable, Packet)","url":"terminate(java.lang.Throwable,oracle.kubernetes.operator.work.Packet)"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesVersion","l":"TEST_VERSION"},{"p":"oracle.kubernetes.operator.work","c":"ThreadFactorySingleton","l":"ThreadFactorySingleton()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"ThreadLocalContainerResolver","l":"ThreadLocalContainerResolver()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.work","c":"NextAction.Kind","l":"THROW"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"throwing(Throwable)","url":"throwing(java.lang.Throwable)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"timeoutSeconds(Integer)","url":"timeoutSeconds(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"timeoutSeconds(Long)","url":"timeoutSeconds(java.lang.Long)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"toClusterServiceName(String, String)","url":"toClusterServiceName(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"toDns1123LegalName(String)","url":"toDns1123LegalName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"toEventName(String, String)","url":"toEventName(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"toExternalServiceName(String, String)","url":"toExternalServiceName(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"toJobIntrospectorName(String)","url":"toJobIntrospectorName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"TOKENREVIEWS"},{"p":"oracle.kubernetes.operator.utils","c":"PatchUtils","l":"toKubernetesPatch(JsonPatch)","url":"toKubernetesPatch(javax.json.JsonPatch)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"toPodName(String, String)","url":"toPodName(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"IntrospectorConfigMapKeys","l":"TOPOLOGY_YAML"},{"p":"oracle.kubernetes.operator.rest","c":"ExceptionMapper","l":"toResponse(Exception)","url":"toResponse(java.lang.Exception)"},{"p":"oracle.kubernetes.operator.helpers","c":"LegalNames","l":"toServerServiceName(String, String)","url":"toServerServiceName(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"Pair","l":"toString()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.CallBuilderTuning","l":"toString()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"toString()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.PodTuning","l":"toString()"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.WatchTuning","l":"toString()"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo.ServerStartupInfo","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainTopology","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesVersion","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"LastKnownStatus","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"ResourceVersion","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"SemanticVersion","l":"toString()"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.rest.model","c":"BaseModel","l":"toString()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"NetworkAccessPoint","l":"toString()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsMachineConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"toString()"},{"p":"oracle.kubernetes.operator.work","c":"Fiber","l":"toString()"},{"p":"oracle.kubernetes.operator.work","c":"NextAction","l":"toString()"},{"p":"oracle.kubernetes.operator.work","c":"Step","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"BaseConfiguration","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Cluster","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Model","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Opss","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ProbeTuning","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Server","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerService","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecBase","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerSpecCommonImpl","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Shutdown","l":"toString()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"toString()"},{"p":"oracle.kubernetes.operator.calls","c":"RequestParams","l":"toString(boolean)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"toTopology()"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"TRACE"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"trace(String)","url":"trace(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"trace(String, Object...)","url":"trace(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"TUNING_PARAMETERS"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.MainTuning","l":"unchangedCountToDelayStatusRecheck"},{"p":"oracle.kubernetes.operator.helpers","c":"OperatorServiceType","l":"UNKNOWN"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainActionType","l":"UNKNOWN"},{"p":"oracle.kubernetes.operator","c":"WebLogicConstants","l":"UNKNOWN_STATE"},{"p":"oracle.kubernetes.operator.calls","c":"UnrecoverableErrorBuilder","l":"UnrecoverableErrorBuilder()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnrecoverableErrorBuilderImpl","l":"UnrecoverableErrorBuilderImpl()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"update"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextBase","l":"updateForOwnerReference(V1ObjectMeta)","url":"updateForOwnerReference(io.kubernetes.client.openapi.models.V1ObjectMeta)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainPresenceInfo","l":"updateLastKnownServerStatus(String, String)","url":"updateLastKnownServerStatus(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServiceHelper","l":"updatePresenceFromEvent(DomainPresenceInfo, V1Service)","url":"updatePresenceFromEvent(oracle.kubernetes.operator.helpers.DomainPresenceInfo,io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainStatusPatch","l":"updateSynchronously(Domain, String, String)","url":"updateSynchronously(oracle.kubernetes.weblogic.domain.model.Domain,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.json","c":"SchemaGenerator","l":"useKubernetesVersion(String)","url":"useKubernetesVersion(java.lang.String)"},{"p":"oracle.kubernetes.json","c":"YamlDocGenerator","l":"useKubernetesVersion(String)","url":"useKubernetesVersion(java.lang.String)"},{"p":"oracle.kubernetes.json","c":"Description","l":"value()"},{"p":"oracle.kubernetes.json","c":"EnumClass","l":"value()"},{"p":"oracle.kubernetes.json","c":"Pattern","l":"value()"},{"p":"oracle.kubernetes.operator","c":"DomainSourceType","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"ImagePullPolicy","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"ModelInImageDomainType","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"OverrideDistributionStrategy","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"ServerStartState","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"ShutdownType","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Scope","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"OperatorServiceType","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretType","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainActionType","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator.work","c":"NextAction.Kind","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainConditionType","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"DomainSourceType","l":"values()"},{"p":"oracle.kubernetes.operator","c":"ImagePullPolicy","l":"values()"},{"p":"oracle.kubernetes.operator","c":"ModelInImageDomainType","l":"values()"},{"p":"oracle.kubernetes.operator","c":"OverrideDistributionStrategy","l":"values()"},{"p":"oracle.kubernetes.operator","c":"ServerStartPolicy","l":"values()"},{"p":"oracle.kubernetes.operator","c":"ServerStartState","l":"values()"},{"p":"oracle.kubernetes.operator","c":"ShutdownType","l":"values()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"values()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Resource","l":"values()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Scope","l":"values()"},{"p":"oracle.kubernetes.operator.helpers","c":"ConfigMapConsumer","l":"values()"},{"p":"oracle.kubernetes.operator.helpers","c":"OperatorServiceType","l":"values()"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretType","l":"values()"},{"p":"oracle.kubernetes.operator.rest.model","c":"DomainActionType","l":"values()"},{"p":"oracle.kubernetes.operator.work","c":"NextAction.Kind","l":"values()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainConditionType","l":"values()"},{"p":"oracle.kubernetes.operator.helpers","c":"BasePodStepContext","l":"varsToSubVariables(List)","url":"varsToSubVariables(java.util.List)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"VERIFY_ACCESS_DENIED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"VERIFY_ACCESS_DENIED_WITH_NS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"VERIFY_ACCESS_START"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"VERIFY_K8S_MIN_VERSION"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"VersionModel()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.rest.model","c":"VersionModel","l":"VersionModel(String, boolean, String)","url":"%3Cinit%3E(java.lang.String,boolean,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"VersionResource","l":"VersionResource(BaseResource, String)","url":"%3Cinit%3E(oracle.kubernetes.operator.rest.resource.BaseResource,java.lang.String)"},{"p":"oracle.kubernetes.operator.rest.resource","c":"VersionsResource","l":"VersionsResource()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator","c":"ProcessingConstants","l":"WAIT_FOR_POD_READY"},{"p":"oracle.kubernetes.operator","c":"PodAwaiterStepFactory","l":"waitForDelete(V1Pod, Step)","url":"waitForDelete(io.kubernetes.client.openapi.models.V1Pod,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"PodWatcher","l":"waitForDelete(V1Pod, Step)","url":"waitForDelete(io.kubernetes.client.openapi.models.V1Pod,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"JobWatcher","l":"waitForReady(V1Job, Step)","url":"waitForReady(io.kubernetes.client.openapi.models.V1Job,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"PodAwaiterStepFactory","l":"waitForReady(V1Pod, Step)","url":"waitForReady(io.kubernetes.client.openapi.models.V1Pod,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"PodWatcher","l":"waitForReady(V1Pod, Step)","url":"waitForReady(io.kubernetes.client.openapi.models.V1Pod,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WAITING_FOR_JOB_READY"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WAITING_FOR_POD_READY"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"warning(LoggingFilter, String, Object...)","url":"warning(oracle.kubernetes.operator.logging.LoggingFilter,java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"warning(String)","url":"warning(java.lang.String)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"warning(String, Object...)","url":"warning(java.lang.String,java.lang.Object...)"},{"p":"oracle.kubernetes.operator.logging","c":"LoggingFacade","l":"warning(String, Throwable)","url":"warning(java.lang.String,java.lang.Throwable)"},{"p":"oracle.kubernetes.operator","c":"MakeRightDomainOperation","l":"wasInspectionRun()"},{"p":"oracle.kubernetes.operator.helpers","c":"AuthorizationProxy.Operation","l":"watch"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WATCH_DOMAIN"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WATCH_DOMAIN_DELETED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WATCH_EVENT"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.WatchTuning","l":"watchBackstopRecheckDelay"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"WatchBuilder()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.steps","c":"WatchDomainIntrospectorJobReadyStep","l":"WatchDomainIntrospectorJobReadyStep(Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.WatchTuning","l":"watchLifetime"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.WatchTuning","l":"watchMinimumDelay"},{"p":"oracle.kubernetes.operator.steps","c":"WatchPodReadyAdminStep","l":"WatchPodReadyAdminStep(PodAwaiterStepFactory, Step)","url":"%3Cinit%3E(oracle.kubernetes.operator.PodAwaiterStepFactory,oracle.kubernetes.operator.work.Step)"},{"p":"oracle.kubernetes.operator","c":"TuningParameters.WatchTuning","l":"WatchTuning(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"WDT_CONFIG_MAP_VOLUME"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"WDT_DOMAIN_TYPE"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"WDT_ENCRYPT_KEY_MOUNT_PATH"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"WDT_ENCRYPT_PASSPHRASE_VOLUME"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"IntrospectorJobEnvVars","l":"WDT_ENCRYPTION_PASSPHRASE_NAME"},{"p":"oracle.kubernetes.operator.helpers","c":"StepContextConstants","l":"WDTCONFIGMAP_MOUNT_PATH"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"WeblogicApi()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.weblogic.domain.api","c":"WeblogicApi","l":"WeblogicApi(ApiClient)","url":"%3Cinit%3E(io.kubernetes.client.openapi.ApiClient)"},{"p":"oracle.kubernetes.operator.helpers","c":"SecretType","l":"WebLogicCredentials"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"with(Consumer)","url":"with(java.util.function.Consumer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"withActivationTime(DateTime)","url":"withActivationTime(org.joda.time.DateTime)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withAdditionalPvClaimVolume(String, String)","url":"withAdditionalPvClaimVolume(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withAdditionalPvClaimVolume(String, String)","url":"withAdditionalPvClaimVolume(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withAdditionalVolume(String, String)","url":"withAdditionalVolume(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withAdditionalVolume(String, String)","url":"withAdditionalVolume(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withAdditionalVolume(String, String)","url":"withAdditionalVolume(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withAdditionalVolume(String, String)","url":"withAdditionalVolume(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withAdditionalVolumeMount(String, String)","url":"withAdditionalVolumeMount(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withAdditionalVolumeMount(String, String)","url":"withAdditionalVolumeMount(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withAdditionalVolumeMount(String, String)","url":"withAdditionalVolumeMount(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withAdditionalVolumeMount(String, String)","url":"withAdditionalVolumeMount(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"withAdminServer(String, String, int)","url":"withAdminServer(java.lang.String,java.lang.String,int)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withAffinity(V1Affinity)","url":"withAffinity(io.kubernetes.client.openapi.models.V1Affinity)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withAffinity(V1Affinity)","url":"withAffinity(io.kubernetes.client.openapi.models.V1Affinity)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withAffinity(V1Affinity)","url":"withAffinity(io.kubernetes.client.openapi.models.V1Affinity)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withAffinity(V1Affinity)","url":"withAffinity(io.kubernetes.client.openapi.models.V1Affinity)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withAllowReplicasBelowDynClusterSize(boolean)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withAllowReplicasBelowMinDynClusterSize(Boolean)","url":"withAllowReplicasBelowMinDynClusterSize(java.lang.Boolean)"},{"p":"oracle.kubernetes.weblogic.domain","c":"NetworkAccessPointConfigurator","l":"withAnnotation(String, String)","url":"withAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"withApiVersion(String)","url":"withApiVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"withApiVersion(String)","url":"withApiVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"withChannel(String)","url":"withChannel(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminServer","l":"withChannel(String, int)","url":"withChannel(java.lang.String,int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"withChannel(String, int)","url":"withChannel(java.lang.String,int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"withChannelName(String)","url":"withChannelName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withCluster(Cluster)","url":"withCluster(oracle.kubernetes.weblogic.domain.model.Cluster)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"withCluster(String, ClusterConfig)","url":"withCluster(java.lang.String,oracle.kubernetes.operator.helpers.ClusterConfig)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"withCluster(WlsClusterConfig)","url":"withCluster(oracle.kubernetes.operator.wlsconfig.WlsClusterConfig)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withClusteredServerStartPolicy(String)","url":"withClusteredServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"withClusterName(String)","url":"withClusterName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withClusterName(String)","url":"withClusterName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"withClusterName(String)","url":"withClusterName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"withClusterName(String)","url":"withClusterName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"withClusters(Map)","url":"withClusters(java.util.Map)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Model","l":"withConfigMap(String)","url":"withConfigMap(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withConfigOverrideDistributionStrategy(OverrideDistributionStrategy)","url":"withConfigOverrideDistributionStrategy(oracle.kubernetes.operator.OverrideDistributionStrategy)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withConfigOverrideDistributionStrategy(OverrideDistributionStrategy)","url":"withConfigOverrideDistributionStrategy(oracle.kubernetes.operator.OverrideDistributionStrategy)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withConfigOverrides(String)","url":"withConfigOverrides(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withConfigOverrides(String)","url":"withConfigOverrides(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withConfigOverrides(String)","url":"withConfigOverrides(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withConfigOverrideSecrets(String...)","url":"withConfigOverrideSecrets(java.lang.String...)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withConfigOverrideSecrets(String...)","url":"withConfigOverrideSecrets(java.lang.String...)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withContainer(V1Container)","url":"withContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withContainer(V1Container)","url":"withContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withContainer(V1Container)","url":"withContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withContainer(V1Container)","url":"withContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withContainerSecurityContext(V1SecurityContext)","url":"withContainerSecurityContext(io.kubernetes.client.openapi.models.V1SecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withContainerSecurityContext(V1SecurityContext)","url":"withContainerSecurityContext(io.kubernetes.client.openapi.models.V1SecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withContainerSecurityContext(V1SecurityContext)","url":"withContainerSecurityContext(io.kubernetes.client.openapi.models.V1SecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withContainerSecurityContext(V1SecurityContext)","url":"withContainerSecurityContext(io.kubernetes.client.openapi.models.V1SecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDataHome(String)","url":"withDataHome(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultImage(String)","url":"withDefaultImage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultImagePullPolicy(String)","url":"withDefaultImagePullPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultImagePullSecret(V1LocalObjectReference)","url":"withDefaultImagePullSecret(io.kubernetes.client.openapi.models.V1LocalObjectReference)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultImagePullSecrets(V1LocalObjectReference...)","url":"withDefaultImagePullSecrets(io.kubernetes.client.openapi.models.V1LocalObjectReference...)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultLivenessProbeSettings(Integer, Integer, Integer)","url":"withDefaultLivenessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withDefaultLivenessProbeSettings(Integer, Integer, Integer)","url":"withDefaultLivenessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultReadinessProbeSettings(Integer, Integer, Integer)","url":"withDefaultReadinessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withDefaultReadinessProbeSettings(Integer, Integer, Integer)","url":"withDefaultReadinessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultReplicaCount(int)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDefaultServerStartPolicy(String)","url":"withDefaultServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withDefaultServerStartPolicy(String)","url":"withDefaultServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.operator","c":"MakeRightDomainOperation","l":"withDeleting(boolean)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withDesiredState(String)","url":"withDesiredState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withDesiredState(String)","url":"withDesiredState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"withDesiredState(String)","url":"withDesiredState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDomainHome(String)","url":"withDomainHome(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDomainHomeInImage(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withDomainHomeInImage(boolean)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDomainHomeSourceType(DomainSourceType)","url":"withDomainHomeSourceType(oracle.kubernetes.operator.DomainSourceType)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withDomainType(String)","url":"withDomainType(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withDomainType(String)","url":"withDomainType(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Model","l":"withDomainType(String)","url":"withDomainType(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withDomainUid(String)","url":"withDomainUid(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withEnv(List)","url":"withEnv(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"withEnv(List)","url":"withEnv(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"withEnv(List)","url":"withEnv(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withEnvironmentVariable(String, String)","url":"withEnvironmentVariable(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withEnvironmentVariable(String, String)","url":"withEnvironmentVariable(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withEnvironmentVariable(String, String)","url":"withEnvironmentVariable(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withEnvironmentVariable(String, String)","url":"withEnvironmentVariable(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withEnvironmentVariable(V1EnvVar)","url":"withEnvironmentVariable(io.kubernetes.client.openapi.models.V1EnvVar)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withEnvironmentVariable(V1EnvVar)","url":"withEnvironmentVariable(io.kubernetes.client.openapi.models.V1EnvVar)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withEnvironmentVariable(V1EnvVar)","url":"withEnvironmentVariable(io.kubernetes.client.openapi.models.V1EnvVar)"},{"p":"oracle.kubernetes.operator","c":"MakeRightDomainOperation","l":"withExplicitRecheck()"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"withFieldSelector(String)","url":"withFieldSelector(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"withFieldSelector(String)","url":"withFieldSelector(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"withHealth(ServerHealth)","url":"withHealth(oracle.kubernetes.weblogic.domain.model.ServerHealth)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"withHealth(String)","url":"withHealth(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withHttpAccessLogInLogHome(boolean)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withImage(String)","url":"withImage(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"withImage(String)","url":"withImage(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"withImage(String)","url":"withImage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withImage(String)","url":"withImage(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withImagePullPolicy(String)","url":"withImagePullPolicy(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"withImagePullPolicy(String)","url":"withImagePullPolicy(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"withImagePullPolicy(String)","url":"withImagePullPolicy(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withImagePullSecrets(List)","url":"withImagePullSecrets(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"withImagePullSecrets(List)","url":"withImagePullSecrets(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"withImagePullSecrets(List)","url":"withImagePullSecrets(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withIncludeServerOutInPodLog(boolean)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withInitContainer(V1Container)","url":"withInitContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withInitContainer(V1Container)","url":"withInitContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withInitContainer(V1Container)","url":"withInitContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withInitContainer(V1Container)","url":"withInitContainer(io.kubernetes.client.openapi.models.V1Container)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withIntrospectorJobActiveDeadlineSeconds(long)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withIntrospectorJobActiveDeadlineSeconds(long)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withIntrospectVersion(String)","url":"withIntrospectVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withIntrospectVersion(String)","url":"withIntrospectVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"withIsAdminServer(boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerService","l":"withIsPrecreateService(Boolean)","url":"withIsPrecreateService(java.lang.Boolean)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withIstio()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withIstio()"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Configuration","l":"withIstio(Istio)","url":"withIstio(oracle.kubernetes.weblogic.domain.model.Istio)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Istio","l":"withIstioEnabled(Boolean)","url":"withIstioEnabled(java.lang.Boolean)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"withItems(List)","url":"withItems(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"withKind(String)","url":"withKind(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"withKind(String)","url":"withKind(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"NetworkAccessPointConfigurator","l":"withLabel(String, String)","url":"withLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"withLabelSelector(String)","url":"withLabelSelector(java.lang.String)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"withLabelSelectors(String...)","url":"withLabelSelectors(java.lang.String...)"},{"p":"oracle.kubernetes.operator.helpers","c":"CallBuilder","l":"withLabelSelectors(String...)","url":"withLabelSelectors(java.lang.String...)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"withLastProbeTime(DateTime)","url":"withLastProbeTime(org.joda.time.DateTime)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withLimitRequirement(String, String)","url":"withLimitRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withLimitRequirement(String, String)","url":"withLimitRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withLimitRequirement(String, String)","url":"withLimitRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withLimitRequirement(String, String)","url":"withLimitRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"withListenAddress(String)","url":"withListenAddress(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withLivenessProbeSettings(Integer, Integer, Integer)","url":"withLivenessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withLivenessProbeSettings(Integer, Integer, Integer)","url":"withLivenessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withLogHome(String)","url":"withLogHome(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withLogHomeEnabled(boolean)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withMaxConcurrentStartup(Integer)","url":"withMaxConcurrentStartup(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withMaxConcurrentStartup(Integer)","url":"withMaxConcurrentStartup(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"withMaximumReplicas(Integer)","url":"withMaximumReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"withMaxReplicas(int)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withMaxUnavailable(int)"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnrecoverableErrorBuilderImpl","l":"withMessage(String)","url":"withMessage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"withMessage(String)","url":"withMessage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"withMessage(String)","url":"withMessage(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainList","l":"withMetadata(V1ListMeta)","url":"withMetadata(io.kubernetes.client.openapi.models.V1ListMeta)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"withMetadata(V1ObjectMeta)","url":"withMetadata(io.kubernetes.client.openapi.models.V1ObjectMeta)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"withMinimumReplicas(Integer)","url":"withMinimumReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"withMinReplicas(int)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withModelConfigMap(String)","url":"withModelConfigMap(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withModelConfigMap(String)","url":"withModelConfigMap(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withNodeName(String)","url":"withNodeName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withNodeName(String)","url":"withNodeName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withNodeName(String)","url":"withNodeName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withNodeName(String)","url":"withNodeName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"withNodeName(String)","url":"withNodeName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withNodePort(int)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"withNodePort(int)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"withNodePort(int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Channel","l":"withNodePort(Integer)","url":"withNodePort(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withNodeSelector(String, String)","url":"withNodeSelector(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withNodeSelector(String, String)","url":"withNodeSelector(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withNodeSelector(String, String)","url":"withNodeSelector(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withNodeSelector(String, String)","url":"withNodeSelector(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"KubernetesUtils","l":"withOperatorLabels(String, V1ObjectMeta)","url":"withOperatorLabels(java.lang.String,io.kubernetes.client.openapi.models.V1ObjectMeta)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withOpssKeyPassPhrase(V1SecretReference)","url":"withOpssKeyPassPhrase(io.kubernetes.client.openapi.models.V1SecretReference)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withOpssWalletFileSecret(String)","url":"withOpssWalletFileSecret(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withOpssWalletFileSecret(String)","url":"withOpssWalletFileSecret(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withOpssWalletPasswordSecret(String)","url":"withOpssWalletPasswordSecret(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withOpssWalletPasswordSecret(String)","url":"withOpssWalletPasswordSecret(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerHealth","l":"withOverallHealth(String)","url":"withOverallHealth(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withPodAnnotation(String, String)","url":"withPodAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withPodAnnotation(String, String)","url":"withPodAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withPodAnnotation(String, String)","url":"withPodAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withPodAnnotation(String, String)","url":"withPodAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withPodLabel(String, String)","url":"withPodLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withPodLabel(String, String)","url":"withPodLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withPodLabel(String, String)","url":"withPodLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withPodLabel(String, String)","url":"withPodLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withPodSecurityContext(V1PodSecurityContext)","url":"withPodSecurityContext(io.kubernetes.client.openapi.models.V1PodSecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withPodSecurityContext(V1PodSecurityContext)","url":"withPodSecurityContext(io.kubernetes.client.openapi.models.V1PodSecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withPodSecurityContext(V1PodSecurityContext)","url":"withPodSecurityContext(io.kubernetes.client.openapi.models.V1PodSecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withPodSecurityContext(V1PodSecurityContext)","url":"withPodSecurityContext(io.kubernetes.client.openapi.models.V1PodSecurityContext)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withPrecreateServerService(boolean)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withPriorityClassName(String)","url":"withPriorityClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withPriorityClassName(String)","url":"withPriorityClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withPriorityClassName(String)","url":"withPriorityClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withPriorityClassName(String)","url":"withPriorityClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withReadinessGate(V1PodReadinessGate)","url":"withReadinessGate(io.kubernetes.client.openapi.models.V1PodReadinessGate)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withReadinessGate(V1PodReadinessGate)","url":"withReadinessGate(io.kubernetes.client.openapi.models.V1PodReadinessGate)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withReadinessProbeSettings(Integer, Integer, Integer)","url":"withReadinessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withReadinessProbeSettings(Integer, Integer, Integer)","url":"withReadinessProbeSettings(java.lang.Integer,java.lang.Integer,java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"withReadyReplicas(Integer)","url":"withReadyReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"Cause","l":"withReason(String)","url":"withReason(java.lang.String)"},{"p":"oracle.kubernetes.operator.calls.unprocessable","c":"UnrecoverableErrorBuilderImpl","l":"withReason(String)","url":"withReason(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"withReason(String)","url":"withReason(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"withReason(String)","url":"withReason(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"withReplicas(int)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withReplicas(int)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"withReplicas(Integer)","url":"withReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withReplicas(Integer)","url":"withReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"withReplicas(Integer)","url":"withReplicas(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ClusterStatus","l":"withReplicasGoal(Integer)","url":"withReplicasGoal(java.lang.Integer)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withRequestRequirement(String, String)","url":"withRequestRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withRequestRequirement(String, String)","url":"withRequestRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withRequestRequirement(String, String)","url":"withRequestRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withRequestRequirement(String, String)","url":"withRequestRequirement(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"withResourceVersion(String)","url":"withResourceVersion(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withRestartedLabel(String)","url":"withRestartedLabel(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"withRestartedLabel(String)","url":"withRestartedLabel(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"withRestartedLabel(String)","url":"withRestartedLabel(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withRestartPolicy(String)","url":"withRestartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withRestartPolicy(String)","url":"withRestartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withRestartPolicy(String)","url":"withRestartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withRestartPolicy(String)","url":"withRestartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withRestartVersion(String)","url":"withRestartVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withRestartVersion(String)","url":"withRestartVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withRestartVersion(String)","url":"withRestartVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withRestartVersion(String)","url":"withRestartVersion(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withRuntimeClassName(String)","url":"withRuntimeClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withRuntimeClassName(String)","url":"withRuntimeClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withRuntimeClassName(String)","url":"withRuntimeClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withRuntimeClassName(String)","url":"withRuntimeClassName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withRuntimeEncryptionSecret(String)","url":"withRuntimeEncryptionSecret(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withRuntimeEncryptionSecret(String)","url":"withRuntimeEncryptionSecret(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Model","l":"withRuntimeEncryptionSecret(String)","url":"withRuntimeEncryptionSecret(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withSchedulerName(String)","url":"withSchedulerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withSchedulerName(String)","url":"withSchedulerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withSchedulerName(String)","url":"withSchedulerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withSchedulerName(String)","url":"withSchedulerName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"withServer(String, ClusteredServerConfig)","url":"withServer(java.lang.String,oracle.kubernetes.operator.helpers.ClusteredServerConfig)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"withServer(String, NonClusteredServerConfig)","url":"withServer(java.lang.String,oracle.kubernetes.operator.helpers.NonClusteredServerConfig)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusteredServerConfig","l":"withServerName(String)","url":"withServerName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"NonClusteredServerConfig","l":"withServerName(String)","url":"withServerName(java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"ServerConfig","l":"withServerName(String)","url":"withServerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ManagedServer","l":"withServerName(String)","url":"withServerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"withServerName(String)","url":"withServerName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainStatus","l":"withServers(List)","url":"withServers(java.util.List)"},{"p":"oracle.kubernetes.operator.helpers","c":"ClusterConfig","l":"withServers(Map)","url":"withServers(java.util.Map)"},{"p":"oracle.kubernetes.operator.helpers","c":"DomainConfig","l":"withServers(Map)","url":"withServers(java.util.Map)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withServerStartPolicy(String)","url":"withServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withServerStartPolicy(String)","url":"withServerStartPolicy(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withServerStartState(String)","url":"withServerStartState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withServerStartState(String)","url":"withServerStartState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withServerStartState(String)","url":"withServerStartState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withServerStartState(String)","url":"withServerStartState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withServiceAnnotation(String, String)","url":"withServiceAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withServiceAnnotation(String, String)","url":"withServiceAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServiceConfigurator","l":"withServiceAnnotation(String, String)","url":"withServiceAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"withServiceAnnotation(String, String)","url":"withServiceAnnotation(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withServiceLabel(String, String)","url":"withServiceLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withServiceLabel(String, String)","url":"withServiceLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServiceConfigurator","l":"withServiceLabel(String, String)","url":"withServiceLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"AdminService","l":"withServiceLabel(String, String)","url":"withServiceLabel(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.helpers","c":"AnnotationHelper","l":"withSha256Hash(V1Pod)","url":"withSha256Hash(io.kubernetes.client.openapi.models.V1Pod)"},{"p":"oracle.kubernetes.operator.helpers","c":"AnnotationHelper","l":"withSha256Hash(V1Service)","url":"withSha256Hash(io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"withSpec(DomainSpec)","url":"withSpec(oracle.kubernetes.weblogic.domain.model.DomainSpec)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"ServerStatus","l":"withState(String)","url":"withState(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Domain","l":"withStatus(DomainStatus)","url":"withStatus(oracle.kubernetes.weblogic.domain.model.DomainStatus)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCondition","l":"withStatus(String)","url":"withStatus(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"withSubsystemName(String)","url":"withSubsystemName(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"withSymptoms(List)","url":"withSymptoms(java.util.List)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"SubsystemHealth","l":"withSymptoms(String...)","url":"withSymptoms(java.lang.String...)"},{"p":"oracle.kubernetes.operator.builders","c":"WatchBuilder","l":"withTimeoutSeconds(Integer)","url":"withTimeoutSeconds(java.lang.Integer)"},{"p":"oracle.kubernetes.operator.http","c":"HttpAsyncRequestStep","l":"withTimeoutSeconds(long)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ClusterConfigurator","l":"withToleration(V1Toleration)","url":"withToleration(io.kubernetes.client.openapi.models.V1Toleration)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withToleration(V1Toleration)","url":"withToleration(io.kubernetes.client.openapi.models.V1Toleration)"},{"p":"oracle.kubernetes.weblogic.domain","c":"ServerConfigurator","l":"withToleration(V1Toleration)","url":"withToleration(io.kubernetes.client.openapi.models.V1Toleration)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withToleration(V1Toleration)","url":"withToleration(io.kubernetes.client.openapi.models.V1Toleration)"},{"p":"oracle.kubernetes.operator.helpers","c":"OperatorServiceType","l":"withTypeLabel(V1Service)","url":"withTypeLabel(io.kubernetes.client.openapi.models.V1Service)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Opss","l":"withWalletFileSecret(String)","url":"withWalletFileSecret(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"Opss","l":"withWalletPasswordSecret(String)","url":"withWalletPasswordSecret(java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain","c":"DomainConfigurator","l":"withWebLogicCredentialsSecret(String, String)","url":"withWebLogicCredentialsSecret(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainCommonConfigurator","l":"withWebLogicCredentialsSecret(String, String)","url":"withWebLogicCredentialsSecret(java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.weblogic.domain.model","c":"DomainSpec","l":"withWebLogicCredentialsSecret(V1SecretReference)","url":"withWebLogicCredentialsSecret(io.kubernetes.client.openapi.models.V1SecretReference)"},{"p":"oracle.kubernetes.operator","c":"ModelInImageDomainType","l":"WLS"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_CLUSTER_SIZE_UPDATED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_CONFIGURATION_READ"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_HEALTH_READ_FAILED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_HEALTH_READ_FAILED_NO_HTTPCLIENT"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_SERVER_TEMPLATE_NOT_FOUND"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_UPDATE_CLUSTER_SIZE_FAILED"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_UPDATE_CLUSTER_SIZE_INVALID_CLUSTER"},{"p":"oracle.kubernetes.operator.logging","c":"MessageKeys","l":"WLS_UPDATE_CLUSTER_SIZE_STARTING"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"WlsClusterConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"WlsClusterConfig(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsClusterConfig","l":"WlsClusterConfig(String, WlsDynamicServersConfig)","url":"%3Cinit%3E(java.lang.String,oracle.kubernetes.operator.wlsconfig.WlsDynamicServersConfig)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"WlsDomainConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"WlsDomainConfig(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDomainConfig","l":"WlsDomainConfig(String, String, Map, Map, Map, Map)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.util.Map,java.util.Map,java.util.Map,java.util.Map)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"WlsDynamicServersConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsDynamicServersConfig","l":"WlsDynamicServersConfig(Integer, Integer, Integer, String, boolean, String, WlsServerConfig, List)","url":"%3Cinit%3E(java.lang.Integer,java.lang.Integer,java.lang.Integer,java.lang.String,boolean,java.lang.String,oracle.kubernetes.operator.wlsconfig.WlsServerConfig,java.util.List)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsMachineConfig","l":"WlsMachineConfig(String, Integer, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.Integer,java.lang.String,java.lang.String)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"WlsServerConfig()","url":"%3Cinit%3E()"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"WlsServerConfig(String, String, int)","url":"%3Cinit%3E(java.lang.String,java.lang.String,int)"},{"p":"oracle.kubernetes.operator.wlsconfig","c":"WlsServerConfig","l":"WlsServerConfig(String, String, String, Integer, Integer, Integer, List)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.lang.Integer,java.lang.Integer,java.lang.Integer,java.util.List)"},{"p":"oracle.kubernetes.operator.work","c":"Engine","l":"wrappedExecutorService(String, Container)","url":"wrappedExecutorService(java.lang.String,oracle.kubernetes.operator.work.Container)"},{"p":"oracle.kubernetes.json","c":"YamlDocGenerator","l":"YamlDocGenerator(Map)","url":"%3Cinit%3E(java.util.Map)"}] \ No newline at end of file diff --git a/docs/apidocs/member-search-index.zip b/docs/apidocs/member-search-index.zip index da36b4416aa673f1fb94a9f3e62b9ea959f826db..012bcc2d93d4fa5842c53a7c38eae7c6d91e2461 100644 GIT binary patch literal 29670 zcmV)6K*+yPO9KQH00;;O0QYh6Pyhe`000000000002lxO0BvP$Vr6nIb7f(2V`wdD zZe(S6E^2dcZtcBmZ{s+ZF8Wsr4GiD|1O|Fu?1RBUqc#*$Pkh}+BJbq6OAo}g*w>>QFf%H2_-T3=skY?~%1fMyRiR*d0`RaZ* zTjKvctQPKX|KCj$f#e9%AWzb93bLF6JE!~&#Cf<6@-T_-!YBtRkMFO(xXayo{WD489M&783smu&PhOse@$3Hu%b(Kv z7hN3S)*DN3{|>$f<0yz<#{~h^O0gYM2bR{0km#z5$dVS1ZNp}YA9;C@pR$U-Np#9! zH;?H5$!m_cqJ$!~v4CWi*(5%MsHH~aefgVbxGbg0at%#k6uf~5{+Tg@dYv4+930U| z06+7J>nV5%PEk%K?CfO`W*O{8ILx#BkH_E1>E1{|Yc5A;`d@l%^iyvj1U4)))ISKue!>3D>bA)A71pN2=YY-J+}!|flK&q1X{ z&I8el6GI+SD9EE(mPwX8j$O$YrVF3_^+dv4%TSS&zQ7uYxL{eWu_))vuB1%Xi4pmq zM5w3lRRv@o$871M=K^uQvOAX z@JyGbl$%;a(_V-Xzu_J{;D;5%ezJz+7{q%(Pfx|qS^SdRe0uzye#i08eAG>UEWr&E z_KSTK!l{WqjDurHYMhN3(%O}+ldNj|7)0R#>oT5#G)5;T$&9QQvL$ttr%Gg>>ti_F29)d9p9bW1$F%dOKsF3?AgS%KW_?P+jFPDRT%2RQuG9#=cw`F3ZCUboC~-U&dZmWh(iBwn~6WB-k#F_?vb?mFP*L)6J-+O8LUd?9{rOlA@8~7g#(kW* zPs5NR7i7v5isNMP45E57t#@!pyK`l&ebK|&N4(#F|2)A{E1H&t?0Gy!A0wol0IZye zpSB6MN&0PEe5F0wHXu8~dVve@k>^Ls!~^{E!i~Z+bGcT52g_qQPM)(ImdueJ?XsNQ zf|n!(?7nnaeu^th!b^5xX7B-W5geTte64y(UZx;|FN-btqMUH&{>$>R2x7P|PzBZY z8v04#XqJ;QSHu*Qb?Kz^&N8Lou1K(FoF{7AAGBSW)>*EY<0;GzcSzn?h;qU&*j^PG4myc zz3Vhg(l8G}If=La15!;-9HP#c&3&Xq-pp2;nXk0&D4G&WURhH^^5E+<`S~Fwi{JF1 z8gOWJ;)$fTNuO#O5_FCsSr?>~TQ6ssPmQ_(j;{Zb_5%OHuDV;WfXx!j_@8=^Xy@!?nDD|N{gWv z$)5KZ+swLwV5i{u^g1VX&(%btX5wPnqD%HMs7bQ^E6k4EedQyGP$JLV9Lc70`q zo&4np{i9n4d@La!YD$%ytVJ1nMz-s{OyIY13ib&+=AdW99{vRF9`W54UR`{SkfmW^tXJm`G)Rd{xK#6dehto@gDCE+DPa-ERP^i12jhc za~D2~3{f8vB_w|JkZrsW6h0ntuj<;XP@=ewB)PmUJJtep*{GF$qamA7^${%V6x zrB;-F%@j7S2kT^=hE4gN0(-u*@#!&S=iH&w`oj4Os|jbWl3uS_(3u3M43z6C{JY0S zkMtDfx(Cucd_jlPQt!Y%>On=W4&T4Q0}U2E$Kx?G1My=O!4rRGc66G&1#w&+CFn1! znhxm^d;bRZ-$wP<;}r&iKW{!s-ipT!X(4Y9xsj~=n52S^vXv{d?;8&_hIpik7WAUz za&dy1hO@LHjYU163hp77m$t?e`$F)N>e;kCd)EHwZW*FOk8(@H?4NenEA|{7 z|5VL=9sOu!%KTGzt6Z_p_p450+mZQ$eQ+p6mARvKqbVpK3KJ`2gL!(dmTGv0N=-KB zMz17{SaUft3ZPKk_Z5{dAJ`G2h&e#XcoG9Oh-Y%%=WHby{TM{b6p^GI&R?QwpebLW zU`*1QvI`XU^%-wa$XqU2#1@MBxGVaYYG#=WlF5AQ!83#%e?tnko2_^L*R_VZ|C$^{ zNI!G-&;_I|Ly`h-0FM?C+MZ8~h}_eGiyFF?3kZqyV@;~6Po-Kmi(-k9jpeKeWctpsK7Y+lAu0_=Sp`{B$;AE zlevA+enhLBy8DOhj*(VCxMmcdUgJ%pLhEc?Jh}@nqONvQh@Wr-dwy$Gx{y$F8j!ph z?lx3mxo0ZNJh5wt!2nN^_xB`bBtYrAQPmO1b`O_OY@oKFZWvGXlag$|DVNFTTy~9< zPNfgo*dpAs9!qeiptG0zql4=6s}UNsjbqODsm3q&why-gkcqo4-a;PXBU!@=@6}k9SxUa;~3L0vE&iD^m|@4LRTxJeCVk;K-q7x;yyvXbutC)#zO6G-g7Xf+)7+DNC__uF(8L-qXF0w6ue)` zH#IHqYUw+(rN(6+b8TJ5<*k++^4rd>cnODA|LA+2O!2%AIi+BtdqOd58O_{#3sxYF zh7y$27w|D6VrQKV^iC8`2WXAvam&6wLt8us(FruR26=1L9!iortYq$_Y4DNVB`GaK znYsB?dIvCENk0(zyD|4GkZ3+v+xc|ISgX%xkM0shXj8QE?p{YWQ{@#zTiV-94dlEw zld+=nQh-A8+Gt?Xtf&=~oxcQ?FAi|RF=o}ds|TcL{bUYh2*PT}t09OEBhosS#y}|4 z_BuI8l;otKnn{sjU~NRmXszq49c$6`OV&^=KpbZ$613{Av{}Q{x~SWA@t) ze#UiZJ^$$q;+|776OPbxF{VC!)pgm#e%j0olS-o+E+nbO2E2e2Dd~8Y8V1LJ(bw%0 zrsUl3aA;D!5>Ly2ga1DiQCu3L&va>`MAZ`}_gTY6T% ze)=f9DFu1l*qYcTtvfqsSASYDLGsb`EAuX!42kQ}5=(rLz=9ER@@ zNaVk}qO&WghI9DtpoIRrOFFw`2|3G-fnKNRbw){IknZ?3TfZKZj(1GO?SXFvXuP_S z>~zBw=xeR2&l)-1zyiduO^kHfT(XPRe$h|sDLn*Ex-MCyVwNmg7{x8ZnQ<51(*EK~ z>I~&RJy?$#M7X&Hc`!L;aOf8Lv?+K&%JDFX@ezFV`1>;~^LtYv6!((}1lm#hv)CHl z^wrc3?L4X(LFt|HnL7x~C>Qkw*KP6!+Z#Xb7edAeOx?SVz~gqk{h(9B+3!&>BeZHa zoX=Z6Fj5)V=C?`PrNOtE9?P&Ie)0{(9c@j@*tjccSPd%M9X$1lmSoNvwdpRiyODy` zbL1&a?27UblUU{(+uAU=L{m5Mg@%mfTN0#KsiKr4VU3p55S45N`n^_Wf2o#joU$F8 zxAMNNyk*K?3Cv;CLlaQ&>J0-$-rHH2%%y5t5 zO`7ErBafocLUls=*40A^qHu+1Y$zeIMB|aCxwJK=m2%s#+_0~y!vpEfwm#)P(sO}O z>Yt%Hk+4w3&G2YziS-jow4RIPUkrCXQr-F)1$)E3&z3OS^i^4@?zI{?VG0;A!iL0b zjIGPFRM?5$rOEppJlTQ++Np5B&tjpjaoO-q7h_`{)Y{pduz=?vOW}|I`B^?vnetjJ zTN}Ij^{QWVwpOc`zSBHNG}~CUnw(N}ZO)|_agJd*mV^kv{CAz*!~=I3L{vl-qYAS} zdpCZC;v!!?}Jo( zsN6919S&qTa%vpOyobt{rv5_RF@Q=MrO#)BcqJ4WNQP)-(ftXj$3fH_u)ekEC0H&z z{vi41!bz!tWl7NsbKK3SJq9)GyzW6xUzIypm$4V~iB`-$V{5MlD`ZKNvj>*4Tx0V$ zmp=0q0X$oY>OlCYrayqsYN~?rQ$yt+qH{^LUtyrsAa0khd)TT8TRBI55qtxi@bxV( zZIT;yGf6@Fo12{Bn%(KIz_c2}tTVF_^Rh=Vxie9{*FO3pJPQ{VfcnCpshB$<1UG<|^C@5stb#zhgV%PkaW>j@{7Z%|SN4xTM@1tF_ejbYQuPF(x z%_-?y)koq-wLxuNqr_f?Za{D#A);!!8vd13a2JXUB)E$jC7JsteNEPd^JFrY5Y}8( z{!h(l-lkLY_Gx&`MQvJJ56He4gzJW#jD!|q_A&CH#wICdxMvlZ7P*dIyc52WaP~+6 zu>s#h@MDBXN#E4#BL`5ePXm!5Du|LlN$bbFXsI6ixpwV15(8JRFcFi#t;tsMVl{EA zjaHxLID-t<+aYb|%)6O`@1RlpI zgRA$54Jqi?Tf8jCh5NIsTvHNvhmds@#Z2~1qi9wuWZ71w)H4%qOKr2jDKhyQ1l3PA zAU$F2Lv^u+wB2&mZTmNasc;(?Aoxc-AI zx=IQo?}XV9?VmPMqo<;<=4oN0Y|NzA#n@S;9IMPPkzcl;THkPB0~oK;chs=cPmW2H zynZyUoh`-BVXaDBRAr}Jvi+h1+aF~ZpU>nxTb^yBAj`0&<863%it+kZ6&A|EziZQs z&`_8e_}r*a!!bj$k{mFfjQi~i<#k-KZ6^pCatN3$?|066wwugn?$S=~=>m4LG0hDo zn7h02_s1Y*@TZW~nKSoxo(q5Z0|r`KE&p8IDg|3(A|a7P?CUgy=y_OWoAx$$yY*(} zyAvO!4!WDoQ9iZxX13bQd^_p6x0?-Yo1N#oYN3Fe{4j~Tx21e4U*X__<6*tBleL7x zkz8YKwd{_J&yTFB<2$>DmC0CQ1ZL6iX6oK<;bd6s7OU;j_fP_thhYdjuI5`M=8HoI z4e>k;GkC0cK9L;)mH@9GCH9@8mXrRsu84>fYUj-7t0$azW;SuW-K~p$E@sQ!^y_k0 zCK;Ulhm|ml1(8Ou6Ab1990qmahpa?e85`=oSBG$n@{i`kp*dCmYW;) zNADK75N|TMX9>4dXV0io;1Uyj&>>CK8#kY#1Z&;Gcd&(Hnq?4`wKBdbDNIQo7^tK^ zMC@N!6QCCR*ARMN=7qCy@Ftj5uDP1ggs4WrO25xs&&dI_OzDSG#uwa4V^maX`6({8 z!VX%QdY#*YRT!%4d0vKZG|{`7R8G~qx~ud+n`%Xr+fn()5?kixyLPp0w%M9_kZWw2 zFAiyOWPF8PccqmqFMY(0sy;KTq}Gj-wR?NQdz&vzo2zQq*Jt!xRa>rV-ZMQHs%Dp( zYg?jp%uPw%8qKsD+YAl_@QMr^Z!4QAeko``9;Wpwkb<%5Nx|VzHsJD#DvrITcI+?{ zZ=-oVEqr$4X?e472Il>GqN@kwHt7GScYxG--TKnfZs2~E%Z%ohRy$Vo+|rs)8P~R@ zDY}Z4)e;1nx*$`OxwMob7$r7zsK|YjjiQZiGrriBq@XRhrG9vo+{`%>)N5BOZ|*^0 zwXaC@TJ6pvpIu9DbyUyl3e#?R_lvAD&F4q@ChJ^oxPrs2Ic*7W4)8&meDsKRQviiX zJG_4rqHf}U%cgD!P}=aVwBNDDkw>-SwEau+FYwMrJ`)(PpA{tET%^ITpJ{<%CaPO) zbdcObb%vR5F4D+X&$Ga9>F-tJmUk(vmA^>qUNN@~=QJLLXOh zgMLWREoK;>07|w|Gs_lU4`zYQm=qz8+>*H|07viioaJGTO@cVb1M>gRH=lf#;o2vh z55kRqe(ofhX1m$c$}!7aA#;5@#aF_e7ss^Rd2fZ=c~-pgR^ zCsz~kJNVqm=OD=PRSbkiuI``zKre8kIq`wKW>;Jh#%AkR4PUX-yUKqi_)^2XvKZhR zs`*=|o!e^R%$Dj%bSs7{l^kg|SuNJ9C9;uIv}{&naYs!>SIfKE{cho`ci#5yZuXZ& z3iq3pxkaDMCYQh}TIK#$w;wOhjf@E~1)VL|Ti@F~IG&0@u4?Dami}htt=);g+qnO} zbv<7v`?UuAYP0)ub!$V?kt1sl4n5wH{q4r}+O3NXhl}NDqiC|N3^(6y9F@cidczqu zCbp~1zu_6+FqkSK6{$KTp9L1zIq$3f?!;IGyzxE8eezZk9p+nE)IlL~FOUC!W&zC>OG zcg}2Xbzy&W=Ci4TJ%ilMX4UH1qRTsjt;=`ksOVm9luz~4V8z_J9%qfO!*k}n?4uF; z!~Zw}DQP8w<2qEI7HN$3-t=0()l`^>4`Hq8%BLgYw?+fD1ymF8^e$n%eNgI%n8^O7 zH>~t)q5AMq@8*_}k@mC29yTB;hBG$qR2yvae!q?H&DW1YK$fM?BC8!bhjix6>Yi9g zvBy;dYx=COdkgv`;-8$4P>Zp0k6?2x{euL5<-BHsew^4+aJ48N_8wBT)Xc~$hCJj} ztAZfS=CT2K`mqRpPEg{`^HB4^9CJZ`f}euzv&lZ^$w( z{f^RtsCJ#u6!n`S$(xbztjNTpD>600s4hQg<)mL#Lh#(@ACAxsLh-}Yg@U6!<`9Qj z%jkKY%GajZ8oQ$$5NiD#=~2ul?wSVsvcQMEwn+@Yb|?-l)pPff4xdaqezI#EK$-!Q z*+)a15t@m~12G#f^~Q0Qm1h7}Z@5b5ZrPSnM8o0QqIlS2)auiEiZWI@*7nJcvOWHA zTm!PPt|3K=@?yp-IOgORADWJgm2G%130KmAShIsK-&im@CrvAl&Ln-;TMSjxB>%^3 zt$Hcacm;^OswH=>`0*JoT`?W@_EDP&jhjX7;Ace8<|C~fl68VS+ruEjuZ6o)F8Eok ztj%jugFKI1(-V%mtq9aOKaYWccY>25K8(0^IGU&?YTve=EII9mV&a+O9_!b8q^4&5d4b~alt+q=$ zw*@6WjjN*tPhnLeGkt}?vx&`H6M|Tn2dp6To7q(3rmOji!(C2RQ+K*!Vz+6IIWCnf z`7uIqK@O(~9NeE^f67S?N6vX%Jg19`M>B#2?(FKmSaNXUfZ#As;GTj67udNVMIvof z`5pkI6DVJf%D*apgc4m-kU=mNvhIR?Z~!cW@L><3O^zo?Ia|K7lX13`oQegsVgc#T z6vO5*{YjQL6BLD+_xR{2-6fX1gk^pH^AtoGZBV8)$z!oC`{=nC2Psb7bv_Pinzr+i zUMGhOQO1VZ1Jf4g4#~F6-K(98Xpx`ryu>9JiD#n8s`aTOgz|Y7GZ|sx-9x%Ny8r`&4z#wTnsa~$XU?zq%yh$2PktW4=w_rc z>lk7!X`?=Q3*xvmW;hc~GM_I&bD+JkmGZ^)X-Y3Z_!7c})LiA1%5 zV{Ua;2F|}i3ZeSXMD+BWeLxZCeW39zwWX7#rgJwN&ht&vqP-!T4E7N*$st1$Vx8h6 z(HW!rH%iG((VE~rI0{_@XUjZ^UvVS=8@HzJUlVujt9dPQW9sJ~;HYGa;CQUY75~(l?Uh1v z|K+w_$(Fcm?$1g=if$o`R)&AlD@6V(3q2P{j_Ng5Ggaz3fwrVE|AyVAEb=5~iTD%# zCV3tf-hYO9`@K6?;Oy7#kh;xVcM4aN zr|5GF8vYf1Oiv5QDX?5@q3pAC4D3i{8xXcub2q!iS?M$b?$i=z-opc50a^SW5lb*_^Lw=J7oX~h!$_ww1<$9~Vy$LRTlB0* zgVOAf9iG~W(U1U%MuPJ3X%azVHnMKsW66yp@j?!Z%;t-CeLB^vmZs&dB&N1f+Bf1cKviL($&W| zc_)fEoDL8DQ-#|v8CiUEr6+3rDH))`TICBMN4XQQvUD4$m|j+W3I#Pxf#5?Z)LV(!so zxjFsM67DoFh!ij221)P8bj8=;J(?!_#=a02Z%Jo#ug==^Za%R|70CK3YjgRcT;x+2 zz|_B>%oQOevXNk<-<&eL6-9;Du}G?yDnh&pUsN{A1*eN3{f4C6vVY)K1r&R!{8r8+ z9MBj{x$9)?GRyd{!m_|FSra*C>wM8dtz21Xy0h@2ZsH;yVP1hsC_-tlEqb03jAmX{ zU8Y+g#Qbo}pq;bu~dp3*TH-)At-}R3-qZT&+5flw5 zUb$qm8pabUA+RAhjel+1M++ezh>buHJth&X@_vHnpE&9$6An{Da z5@G6L-VYL|U!IC?GZ|Nh#{ab7{bv!k?x4$phkNr8Bycz^x_mBMpwqVEy}TfUnD&H? zDqgI7>sUmUwn|@oX_wjqWjveg0vk7m&TTuwj3WLP-F&Z-c(Ee_ah&9s1;tfS$~R-D zl(193&>m?q9UQ}A#ief?{6q`X*l&SQxKESQ(cb!c45{?r6O!>@R)=jpm9W8=E96_G zM2!{0$O?(y#oe*Ms_UN0S4I~sQnLJv9E!BAsxF@d(f$+#IXIvm1XyTOn{U6#osl?b zK44fMSibr6p!L@tDw4^%r+8&695^4#q9V{std)v8%5tVDvh5u}3AXuAO(g`@`wxLC zm<#Bvpaq_6sL)r|h6)#gq#~fYQ)&xo!{Ey#6irI{Cm}8zQ%h&j0@fDaZe|o~sva$` zB2c_$?z#JRV2uVg0vTr9*@JEwatcH=!X#F>o$Gh6o;5|+2s&s&Ofe3cCFp)FWHQ)o zfO4@NEI~`6Mp$a&)&&eBH?O7mwFM7)Dj1L>sGNz%-)nKDg%Yhs0k|!*F@rKtYniWR zCAtBw;pLog6WG$zWf5DVj!gSf(L!rg-(zdL#zdc1>w?=bBFsmFOmA%qRKAL6j4VgB(H=5NyK)(Z8_W+2?lBLc)gzObd!zUfC0 zNenmP4R}QvG(LEA{7Ur@$f8nrJu7IES{ov9*#p#}3|8yH{l70T2MK3hk?v$DTo3G1 z(4#r(t1P=<*xhKYAlH;=%BThsD8&W`z1>_kvxHbG1f51o(FIkA)uNBD=yl5hKmHEO z2y1BZPVMA?zaNr2GzR-}NHDay{4;rO=Mag|f$FUckKI}O9@w3Ho2pSdnN|l@zxrx$ zTpy%ij1*#>tuly3mIZXV64ENJ^pM$~g7lnh6ZR5(Ls8(ALdjKSfSXub3`nT8xpc@W ziK8TT5_0sJC&59_2UhC5iBRE=oP)#jM-|hH`ez!k%f#G4;KV=|zv(ZI6R_D!S0XMp zq@stz%}%0Z|E-3E9SJS2rqdt~9+KYHiJE|#!rK(Q1gA(VlUal3T?Ix8U`{2c(|VyE zx!Ic>IV(B}_g+>mOQs+T(X~w;bi}UIT^B6_%a$mcB!mO0GPKkm5ocAU@(z>I6yw4X z9oY&CtO=OWEYJvx3-rG|&T_hJ8gt8n6Vz$)BkqqY&km~zq8^#L1U8Z-+ccaC(G*%y zg~aT=5F6M2YIU==`l~@2Gg>X^1F)tVddA6a3{i$SrNZIWI)t`3#5oH5gtMb2f+ys`8I``KK z_j|gyI=jSU5UDnS`Xw1P(p9}HGq?A(NT|Ik9DRMkj|~b^VYg=l(3v9Tz2ZE1?X^p@ znWYeJj6@gy0%yb_c2IA)Z#}Qorr_zAZ`i@@^XfdY{ix}Ot zYsUMAWF@8g9^odzi5;JJA&3-LvS;Fq!H#zl#798WQzmv#p$CBUo|(=B(s2_bCWlt$ zz(bPR8}@o&+;TS$<8Oih`jCPb^W~Gz8wTNKuW|E&+{AY5}{kajjxYnpqLwtik&lxwN);U+~r@w+G(P=6wmY z$hxyQ9PF0ZKDJB>wM0eQ!?vLZt_vzaV7QgA!ty;t6tvXn&>$rgph#j7bc`sF|+^n=}GBKc#!rytX{YLmf{Hk<~Q! z5IjvXIOFog^nZ{zK03#MhPYRvmrX?_Ny|b_jz7(Xtr^odE%6m$*j^4+?M&eiir~Oh zSrv42M;9VyCs2d9`rATp>KLRRvpVV#;087}3W47}r?i?{54y$kJc-aT7bQ34Pg=7a zy!Ra%e58$TL`5@se82o00q+=+=)!-vpZU4X6fg-h++q!XPTHmAz5BC`0naW2O)=Mb zFBX(w)!JzO5_TBP>JGI|KqiLqm+~ozfw}=NAVu0W22Ln43E=;>X}cYQN|@vtav7?2 zFk}?S)wr$Y!7p_D(iOCC7|vY##s%i?g{rQ4od;R|C5Elb8Wzc<4tYUa5=VJEPW)X_$*=~>#8NGcVV4)|SP{y44X%J^5F{moLaV1Ovtt?Ws19{W}`J+*$^yW8fpJkCUE#3_R;y4TYjy%;%~OYf09sA&fx$# zF~nYi9Btapevd`5FwRBz0m6$a0_&<+=J0rcB}%kdSl6K0MwjVt)M*$rI`aOK1$H$$ ziMQs9!PH(~kswDej=D2{O1`n51yoHuM9-O=ZL(#El(3U^QQ5n20VOwB@#fe{e1S7E zV|!tv;Qb=1wA$w|6c$0ge{+8xQ*x7LB3`w*7cNNS^>c)4I;ER|cdBF&tnFBWnwYAN z`itOi9qS2xF@`H5pjQG!4iGkN&gOiAGp*Xx3UTmuZ>tu;&&qC$#_OlHL$(dkDpI-+*Hj?gOn^s6E2AG3=8t zLPAbMH?k!L996?HqH1ZyutU=t+BK@Ogevj2v4pIW2T+lkd{}a$ahc@a>3D>qJ~&8> z+zhCwsYL7mi_UI#P_czMovV0!+9tr_wXFLzl z&$oG*(^8dz!`MtM+}t`Q+o8%mB^I#l4cJaJ-D`M^IE%5l6q2YPf=n9vOIprC3{E}6 zfA!;}l9Jf`yxpco93rgk0I^mFR5tX2<`gZKFy&eo4ag=JXI&LUIS-$Z5{8|KINItl z&@&4oJ!=Qc{SMDkcA)-Dp6vjYAK8IhCkHz~^j5Ven8ux@8nDh*Vusj}sip)yP|x=k zopP;gFYR(qMsYj{fm=TDG%5GFwF(5KvmRCwN%yQUPNCjX-`0BKkAI13VvVQHC?p?T zawuXB?2JbS>euP5UL&(Y_;o6b0_h?{UbNzC4^{5tiw;}Xj7E)rxjoJKnYJ|97_47o z@L`7gO}7f-7pk)HgsXpj$-!${4SN+ZIC9m_&H6^hOYk!nQ(7-g;vNb|Idus2Ln{=( z$)#s%!FEZ5PA?;-ZX&&cIkkAyAre+{;c$1uHc@3(Oug}C#$6UcdAlx)z(Y2Ma08+Q ztK~e45PO;A)iNyhMr;}fg(b9oH(A^0O(Q~$hVDJU^7IbUaF5y?88XTCKE8y#w5t^p zD_X7y*D(Q*)(eXG0H$4+RXRR@R_L%HYZ-v-9Mw^x(dqGEsmXfMX{PZ7d<@#{{qb9| z2W@{XeEp%?pZz*^;b}YctnNiey{YV1M~TKDqsl&=W*S4yYJ2#t*n_tJK(pEeUbsoY zCP+y-g~G=x7lo{#(f?Yd;UKd*svh#x?4A)GY>1~Iia^f!c57?*Ig3;OijEekAEZfq=r5=PD&h5AKq5L}>Ee#JpClz_@_vBd0%rAj;nuHjzzU z6p_c)Cjw2wHAT7D!sinWO9-p|+BZPdS%?V3a0o&jEti!x1KJ8MA+ZH7Yy5n&vKnyx2i<6c|I&1TT+JyX+ncDOZs4t40nN`sJSXd$Cy zN-ATIP^MYMC4-N7Z#6R@Wvbcv4dU4Leba*!ny*;FYwEsr3SPpWwjoovdcn~)5Uf^; zZv}UKh@9utK9(T!eTc7h5qfNEdiv-;iMM* z%gD&O@aZ1_`Scu-8w0bopADq=?xtmwm?mImF^?WSyQ<Rgz3_pA<`%}q>P-n=UFDH=Q&%D zxIM*(9wACwPdJ2v?W2J`R8c~;hb$LPRq%CGNrLvuWP*JuO9(+NMeLSQS`@LcjVQD8 z`1|VlZxrAjbpN&vKB6Qr&#|gOsw>{OuBGz^d=Hfy zy--GQ@s&5>>znnf^-Yp!S;>_4RyCRQ6oCv?68xar5G798l=ggZ!R=8HP){+sk19eB z7W(VT*Ph=7_|o0|HzO46JR&q zrynFqth%k6bY-BuU0)p7XrsMTvA4_$lrrG}*N^Uau-a3?I<%~-?GTYo2HVK|Ot6jK zuWcH4R5ZFpr963xEw0I*$f2=vf3E%yj@-V$e5bG{FwouJ(H*vUW5SD73qw0uBUwDu zm2Ixbw8WX?h_fdw*-4apKX8~omX^62aCbd>V7G?$GN92X;2UEUW$kFKh}kysIa$*x zvfTT%e=~%8P+tTYgEU%3GA}eN(n^rwMjqnE+zzZh_+qzqz-bVE`HznJ5ScA4KUB;RxYf+%b4eW1P z_vF>I=$5WC^$-*lZ*BDIpZ(jK)3Dk#3~0T0s{6rc{-8MluO&rt-)5Nv5Y z6iX|9CC3Qq8Hp<}l+`Xi=BSB>k|gacPD5&TD>>n5ro!`(6WslWBt`uHhoq$%QPj&K zd+BvWEkmw+*x{vyDs#95QPsGiW}S~cAO!P#1wgG?Wdly)N}*HlZj&Jzb{G=2>a*yb zupM9B7DcwmHI=oX#8om|h79z+RF}ttfymhhoKdPa*DWj1DTAWz0pLWj<`xE2(<^C% z9|6istke!Nb`e|S#VN`||1C{^P|qU@UOqB9H#DvQeyFO}P%z;|V96=(8-hd{-NX`h zT^P{-)>{kxFxLrl*5&!s4QF@=^OFdqLnsL>1IvU{8zf}Hx?NmeUblN zjazXis_u%mjrVVGzXONvgwc9VCR@05q|pa_Gbj1yO|JUj6pX?>w$f!TRJO+h-1-m1 zaNqVt8Ue58KrHN!!#F<^MP)N&b(7z18miwj$SyMco-|u?lg&n7 zN~EG{^CbCp;?2Ay-zhROZpOEI?^AL36r^b1&YX-MxceUEAoNLk_eoxu$hWEjc#kXn z#!x(3n6+h@el0A_`j{xM36z9+R6()Q;w#n5N2*1n&g%195Vl*m>E~vs+brg*0t)Y0 z!C8wUDuXqTAKDzA3x^f89iU4URA;q)I^=4hDs}JYm4P*b>aw_9F?AcuS~%~w@JF}I z{(|7(sNi{y%1%;nKvxq1($}F$pni?dgr4^H0gKJw=i3(7OyGsXEow>%cn`k;FQ-Ty zq!Jk*16dx#c`^I%H_pVp+s=31!`7d!o|gXCwQJ9g>Mh91^8rc)ohAu{TS(rXs8@ctz!io1tYMJT850Y3Ce79Ca?-- zqZaTAJ92Bd662@-a7q^YeaOi53w;omNjy{&%a0p<5aq7F{SbRrSvhKAKiKB=z8`4s zX`pAo*c;olzuIe8aiJH2c~}nI_mt;4>dTPI{$wZm1O+H)^T~qn!{d=Y+TD8P{~Ukm}8p6wK5D z`Jp^%MAfemXO~=Y`Y->OgmIYv%Rk(^(_T2bgqoYV}=#|IkUMtwT8NJ z|9$Iv{?4B*-05z$^_BWF&yU4$gMSugfJ|H`@$rZc*r7J=l%i{hdSB76k1{m7+bvyp zs?>6Y@b(VdYki6$9_VG6?v^Wmy>UHv>F;I>=iXg!=kxVyKAU{Cv(<&K zagqWL_CLO?yG@b^1Wdv^;e9oT%aRrb+iX5}@16P1b0-_u-z}Ym>#dzho6cMxd*<&Z ztL5G7ez%y-dT+qE|4o!TMQj-s2aO|(h6Z5_iJ-h`PJFlrIW>mRF!K?3uGV5kMhp=> zD<(q-X;i!jBe-c-p?rv?54V`&;@t$tJYtJyHABN*eME@~KO88qFGH}o#V*qTH=jy- zTy=h!PX;i;o-Oa;g6g@R=H(`eUvWze9~d!pww(DhxV${N8*jE+T07689S}+@QxF9o zg~=^St@{d6wjt|uU{a5 zL8%x225<~z!ZdM?tyDH4%2uDAjyi!<>xv+fW|@`hm;Ppjo5J*NAkNbyI|8&_!U<25 z8(9r~_pn-MGzRuyubnYVG$_C9VEg*+ZtmQ=b1Mhf5`48Ok6+FjAMtkH_U>->mz6^v zOXknjtwlvh1N3g{`tT2pMTgi=LsG46R8ZJ%U@xrh?+2*FT1QdTB({ilKOsM09UL8N z3Prvsi~*HR2bl}fmm{e*$&RjK`RL4N(_($w&Mb8hL0vdY=N`@scLNU;aKdbtN;)@b z+V}C75Zh=|{M8pFeM(yf`7r*Td;?frck_ujAh6pHeyO6e>x`OPU|X}u2s5k-M$YDL zjE!^WX$k@=`AyYL6(DL9B|nPPPqzU6ScLKPBWApX>|K*vCs&Bn3gPn9XxEN% zN?#2U%;H)Y)-rWN%@#%Z?s@hi^Fs ziZ^NjyYSa`RG!qRP-SyzTVX0mn)gE#$Si`R`!me)tgSPIk~TYK!7hVS>NTJ^0oqgV zA~@KC$iYcSyUV<>n{rpMX9ll9gtZtIM{)N1@BjJ_l-Dp!K|LCDy@c^J>{uD9h;$Mj z%6CI90t0f;xWZ18*plh5AQN)$Y#IO?LDxOt@$^N<#nU^}9PaxuH;PDGpKECQ1&8`f zqtAy+Z7m59M5rQRz}lL82hW~b;=U?qItXf}cQ#Q;qKJUgEMI~ja1^o`4{tunlPPi^ z=%!J;IYZvXCQ0tzv1272X2?8+9PnUQ&0=b2XA6B6@1xU!rkz`z@)| z=nN!9O)131dKT?5g_;Vq&kUV(OZ;h1r*X%gTU*aEg|H zv#rXNQJZ88j)`Jh59Cy*f2tBNnRM6fWs< zs4!cjb2}Q_cWLrI;>xg%!WUDuix%K)+Hs3438nh;UIVn|2_bUC7U|D7k7m;~qQ*C0 z$^z>mprN5wL0k+;Eb`^souupJc#1l8EGE915IaRisSupclGArBV6PR1BT@4&vQDfP z_HaN7XR8h8L?#gFf>+iqY(Q}Ms4Ex9V=KCaUaC}Li`}V5<%-!+xGPWlGWXjpfY^AO zmg*nnhlW_hejY;OSQmsfNM;pBidr-k0pEkNda9&s>T^YkoHvl5 zHtmyVK#-cPU`iHA%ea!IQJI4FxzNiZRZ{_T%N5U`t#_Ab~cYs;(SGe9Ti0CGPj#NxRWn~fEJe2w!!_? zYByg!*}K&L20lE+z{7Q&LzEy}*k#kUZQHhO+gWK_m9}l$wr$(C&FXxA54wBMaR)Jo zyJ8x5#dr2TTRasrZDXR}aYhmZ#z*X!BGsxLnmCO|GS*i`F2qO%HWsFOnrF3a z3$(IY!%|-~hgVUw<64h~4QDO5Gx#SlJOhw;7CUtoj!LVDb$cA32vrhsfvfNd%n4S^ z%urO_{=EI#qwI8q=ddS}jm~1JcU<|K1L0nWPfB1X zy?@}qN?k5sju1lSA4TYFDhf1c@^-B$6s-`zCJy$AyupkJ>-bNpBb(pY*!^=R?_o}F z%V~AMH@{KN9NM<|>Dz6cRe!B8)bE%DMX_qtdG7>`V9R%H9?6+4TSZd@OW;U9=5?Eg ze%aDSKxv7rt<;&T1S9rjhK&SdUwDh;ih{*RQ5>iu;V2|*^kl@woTh7#&JH+Tq(-l8 z#L9iW8EO0Is)Pj+4&57vf_v=!+D31s4Y3s;jLf?Bw+u+T$ zjZ%nJ@nm?E~YippazugV~DV;RnO z*dSglf?)QX8u}7tnvrLS;nMk?j?lT;YIYe^;dWX_N7<22sD`?yM^`8 zXqUOQg47T-6lV5zQP~D(Bnl*6}83B3n{hb(w zcAXwb7?h7qucF+iF`~mVtqqZ4s{?r?FHu_d|mXq1e$-M zw2rEgU#@J*=y1X^Lc$k?)I|p0`FWqA|D4lblI;gp}n#y z8PX;)fCi^wM{@}SCZ%Q}#qpjuI_9~&PF(QS1YKWyAGNH=L4sMIli%hx=T?vKtqkr= z^B4o!Ot37m-ok@QBNMql((T3^(UVaKNUAO&8c|g77=z!ph+QwkiD~^g5K_Uu)!!Uy z^=&OW@z6&B3%=y9X4AI^Ye=6Ni#wIpCaTqh%@!B_X(|3JDv7SP^-{B{?R191UiH;|FYlb`;7|=eQa^VIM;Ok zY@Rli>kD~|cg5QI*jtmFQOL-jNnuEMHvC<3*`x3ZrG(hxziX;A)Im3cnf3bYsM=z; zoUK9IKpYP5HuE+9ZfP*ImRa|}RVd!N?~;pKsg)yD`?n$m%twtqV2;y(LWZGt!8_ig zGh5c}2iTEXy=CiGZVrq5UDq+=KDAnwroM-(Wxoyad%V$IAmF@aw>R@%vH@rtC zvwj*aC%|Px!ZVMGamHY7cU633ZE{ zg0p3MpKIM`C$-|BK=bAFjAH>p zqQzV%OBP)Ks93Me-KK_W)Iu=>9Pt#CHnMrLX3d)jwL#uSvy8QZ3C(I=`1K?tW*d_Y zBTwEH&wS+s!dLr>5a*9)4ep#)-!+b$PA{G5R@bX_M)!Ws1=QU~+Rl zx9`sNEne|hh9$6Tj1W2V+NR|{E+#3le9~gFei1zJX=gGJ-;lPg1fk?Efs>19eJ*jP z_Kmz69c$8c;vxvDW?LBr_*&xOH*hw@B2M8uQ|dD+Hg}gu zLXDFi&Sp+1JqtG+K|ySd<=R?66teVATsyW6b4BxUHdA z$yyuw3>a&ECGUSLO>M@@=6=pM#zqPh!8?B5P4ah6tLu06E71}wE_Gn}5mqBkAXHQN zT$1q{)EUyCy#6Wio?!;IEqSE0-(UvXYuu4a?w%tCuQ{VfPxF~zsXqkE{Vk;exlbd{ zvjiC@k20)ymR1YTg%_dZ_4v)2XMwUF-%a+S3a&dKCVmFPL2=O9r}^yxt)EGUi=VTF zPR9XL$YgRw>jAQAC2AiKXj)?g5o4!VsW@rw>tlQ5*>9*J@kX>qX%}(lH3&!>ndovorsz4AD=4#N5@ba_9hg4&TPiul=e<_#?_a6p?&JRd*oI z5jQ5r->1+hOZ?Gj_W{zs?@v=8)QX!(gU@Pxb+#PW5Y~r3KZBr-j+uJpb$}Dy-5QNy zJEY{eNUoWDqgdp@CBpEIa`ZmRCF+|^!ht`C^(Y6kZ*IqLmZR}x?i10#MC@^#B7#gV z_a9rbwOBHB)z(zSPK|=o`0&DLO-LBeMa@|>ZY6cn_+XE^XxiuiVqn$R-~qwJPpFh) zn1Q?zH)xPr&jRL8Ud;=^A~(nh;b=U8Q;7lwXsa=3otS?Lg}wG+27YFNPn>#K{!m|A zJzm-++dbdS!Cr2P)zDVowKU^*-Gz}^-gI{$G7r)7cIf8|#J`Vt5tkgQd_Qg;BVVcz zZ1jm7W?(+GVaILgn zOu(@fz>{VWtx5PQ(+|DTxG(bumhcCL|Ev34x@2=HOh@$0b;vT*CoVuU4y0H+(WCw% z!@1k2_8$@Njv3p6Ejfv=59+o~6px%_7>A2r2NX)_+hJb-+$U5Wq6y=pWZ$7uPH7%(Io zeDz2ySiD5hO^fQ#^Bu5gR^M_ElF1q+?{f?QJ={f1*;cK}dEDR}wVtfPq9GOpRP>(T#k z^I>LO-XA%*(Bs4wIzxVI)}Ox68*3eK{5t4$6iM0SxKb&sEb8I-;K`K`HSM1wX{ew9 zMjS@!F*wuccWhYAaV=4mTb87b{5I;)LM27JC~GKxx~#5jG?0db zGKm?Quo11dOf64%wG?@<>^_F}8j)2*&?7xS7($YQ^SrqzLb9JaL$sVk6Xxq*j_mjt z>UHytAuR)7tG#H4L;M7+?kS1~Oj%}G??!ouy|S*tZsKj8>$e#GW`~Ed4L;|@Jc~~lT{WEK zZjEZyJr%jns4E_SgUux7Z?w$h8lhX}l?o37zo}c(l7~lzh(9aLa-!ARG`^dk5*ouB zwX4{E^Xv90GH`^{IetlhTb=%8wB0OizEk5Ds})$}|G|*3x=)sNbTT0fpjM0uWevqjJ^e*Vw&Ks+(lgY7ny1lf(dE`&w@j0trkSW zKp+}gp^{lsC4t6awqD01axcZX-99GE+g zK~Fch^08Q3oO9E4X2tJsAYSoTR&|Of*2w@l%xS?QPA;7J_IRv}$o)#Xz#OHcnMNme z;(o3Z+&o573C8?zl13_mx#x(fCUJ9ilC0RsF+S6NIrP81j%w%Ao(LN?DiGXFMwM61 zC}n`ej>hJYs*-&^@KAnsw~U-T_i|I>x#z>C>p`w0n z-wDn>Eo~}j#>gKOr0b&6HJZ|*lh-F@vP`xG%4B56PLULEG%-TJ1s6PIxf^8!|J4X? z4e_P5^g80ySn!Ql?FWfI%a6uj=;HVBlS?c+TNcsDIuFB)b1iw;MHwkx7kTlGZFc%4^bX_WJ*tS|rFBg<|O0a}jRP8ay8% z>ChQ-dF%DMHU7Ciw|}K z@;zmPW-nokcZ)M`I$k2?NO`VvKg;G1`!lW0E+07B>{Wosl;(c5ZE^}$7p@UiIq))? zYy@L0(y8YBvg-c3@(X)05GthabTQ=3vPgx1qWJ$z!I;_k~_PJY2l#k zDy1{GUDwySH$&uH1JR!xPPt%^HWPCj)~7X`l<+rv62#-Xd=T=J0;M+lGSRmZRq<5Ip6o8;8)tYBsZ<{e%V`Jr#c$3xCnieXa-=0Exy2msTwTIzsBt!gK)eCoerc@GP^l)d-!#F#8#HFe zh%lIM0of9$kt}BOkZ=q$Kbs>Z@vq69e)ZCeF7wo2&PAmMcIEcB_$zh|Fm&$)U`Ql5 zsYVgc!TEeB%L)5OdD(?UV;Bj8a1Ctpsf5e$jNOP#S=AqUQZ#T|YsLvCCzord$8%0e zqP~#0wt$ch%Jd7?kM%Q{t3qaL5c}ygSskwp%!tl}bzC%rU=)ZHX?FePv`_72-P2b0c4Ju#2kFuaBqN8&GYw1Rx}vOS)1%VWc(71q^in>$Pg5sznR8f_Xu`% zgH|;Pw8-tV-~U)BYg%C6Bd%AhXjtP|PFZ=$I5({tOi@IF0y7pg!|TU@%WZYTkR!E! zGDX#C1z-`cLtF#-*-yV{jv!ebh4R&R%RIbUImpB@DkrJ& zZjUQmOU4&1tJyyl?*qnJiEYfX3ZIM|Ty)!v;B_zw3&Foi52!23HCur4WQu12Vd1=u z1M~mEu6?eBF;hw;g&i4f&7>fooj$fjx!GNU_KM*285hL#e3Yo8ze5H7t zr8>cAMWqIoTpx3{Fyv#*{g_`x@2lu6gby1NWw8RPeeLa;VA%ofw&^MDBK0tBz>R3` z_lRiAzy}TE-AaO5h%GKBhZ_cN-0LC{{-uVJk+Dk8xJ@qNE72cmz1%k&s?(?df@2cArSbl}n4@%^g1*u8%Wr2~4nwE)lGfMj#BN z>T6e$Fv)RM2l#K}kEa?01sj5gesS1>MwaxAwo|QvlBiyCv_HHNgtj zTW1fl+Tdf1UN!`mOY}ig1UNxBQ;s`Y#M9#|p$4=qp$GnbM~;t0ZCcKPH;YR?dA@pM z%zM(PVsW=GZwV_1tDw!+p^K1W)8sPri%Ec9n;ie}n-ls)N>%UaKpJ}H+n5W!nPwv1 ztQ4!q_!XtJD5tRWV=eRgl5sSgG#3xJp1?mr|Bf$1bJdlz0-`M>BT=FC|LCzw?yA#Y z|AC&j=tRM?j2hZKb5zHh;D_GILn2F6t`LJv9*$QD9_d<9%07=k7#`POA%0qpI~9~F zlwBu9VO;dEu;N1R|ACFcG4ZJrD2Lz99YuKu97C^3S#T9|^6G=05`=-bDJGqvykV(b zzOE3xYh377I`y(trNiyFIj)91&zJ@(sF>2@@A-hK$&JWx_K;*|OQsnk=pS%bTj#?D zugA$fAihr)e0*X*aeQIpWI)1KZI&`e^kJ=Po?XY>3+@3O3lxq6mv{!%&&vgZf9fvC zsT`^!hGD)!#8uP>(@YXPL29{C%aC435S}S!P|KDE3)MUjiv4$78J=5-XLkOoc6*RP z^HG)I*%BK8s8P10_Z#RX7v#VUxJyUSs&U^a-e8KRAxEW7t>ahCvTCAPlU7)7qSD{k zTsj8!b(v~F{0JqE&8>)WeQ4ILDXZUO5!si>l|QpVRP|bVNvIXYmYR(FL(U)}+Q@Vl zZXF;g1#4~HEEh8rS~z-LOk&9-B-j7?tH2^=WMWr8Y)~l;QVFd$qO1e#Clr|%z%HfG zA9(RlimN54m+_S4Q8GLld$<=6PVqT$2%PH@c`85o|TQw5K6RtI|3n#ji*3a zh>j>Do`#)`&Ji&Y#X*YoCN1+mTTE?<&3ZQUQ=>B>f10dg@aFylDL~;($ukuQ497~S z58sBgvSo9$X;wPx|3lijlU1mw4dRBhVS zR%LO9mqg!Yv9Zps!i>y^Xus4Jx|o$w+Til!O-d2|1C)D?>qR#We;x2@fM&e7L~xxk z7fFVPiL6uQd(cydd7Z{=UnWs59m;^uou3G_2t!?Vz)VwRx&KV(G$x?lbv=dJRCdHh za|Jr!qEr7lxZbqeq>~d8ZDVJXQe1Co@krcylr#xsln5K2RXQ*_4@R6%niMGS4L*F;do2*&iZ(O?-3 z|90+HOa{JCF=Oq4`hIo{#c<2sr&0g;5EFwP=O%F1HeXUmUm3-_9VG7A{9z3EmQujIo*07=Q+sktHyO(R6V{U9`00MJNwFnPsxp~0c`OmE{b(D~S>%sOtug#>b6|c3A z#pT5Y=1v>x(K`|Mzoq>^i9by^eOcrQ^SO?KK|U5tfT&v2;++1;8FB#EQyZ+*%BS1Y zCpWg;4!350m|OWRBx@NC>+dp73&~r=UyEMFSHdY%Y#HlrDT|x6-6LeBd?^TPZ`|e` zX|!&Y$6d6+diq$p;hvrcvp25Nt2XixYl%UYOazRx47K1RR_f=FqcWOb1(O`+L`o;kPg9(tTI+{y*G8& zQv(5NRwP+dzaqnh=dSF3e;Z^q*JB|YN`@8#PCIvIHfvU?fub60%MU+FG1x#{1wbjh zZ!yZL#|JHCk}=!jjJ+KvEO1b!`y)K@;Q`6{;^gQk{}uwO%>&)d;$dEC33!YG3|mWT z{qR#&5Aq(i=os&yoaQz7)@mwA#&8K)JE+SnCNfi;`7&{Xd5v=hdu<-(5h0kzMgcSD zIh@_8W1sG@^4U<3gb|^TIgLIpEr?hs&rKd}dgk!*n&aC)yPr0aKFD8J!6t|9VSqYO zULI8IHp^^P?}U)Mr$oaS9>BbTzfccw<5b3#7E_UaO;VE4pyI#0dKIyZF%^!)E<`LQ zp4aHcJq7mnTzo_5=?i*#K@|e$_I14!j0y~-5?HXpV@w=e?d8VAy{p|9Dm+}&eBwMa zhL$zz)T5i?>b|%nH>m$y#9c-excE|^#b_*K-9{$%mGDPr= zCt^k<$0`p+MBoE&Y$C2eWqR4^rYcb|*xatpj&o9*GQRQPtef=^*xbSGd-RYke806j zkJFa%OuqWML_8lTjE?6*rE@OL-HF>j;vkwyB-Db6={Ok-Uca1}-I;;|3-xAC(r!w* ztJ$SSNI2TY8pbWZY?B}K`a+Zc775@FgOAb}A6m1P3j1gRrw5#cUAxxx7$na!q(QUd z#$&Oc(#c>dnNr%!>0iWtAQ3V?pX>S!E@OQ>6c@Wki$Xm+C)UKf~X&o zGFwSk^oTxrXiU6fQXLbPuW~2DlltYdx6415*JVu#Qa!UJyqj5Gjst|M{(3I{BT2*n zBNa3QE6tv2%i*NP`Gu@kN%73p$qnmo7X-Cwp`IJkNn%}kzBK=&T{)Y-tME{43j292 z@E<`X#hf&dMoLt-_9)0m5pxjLn}<_CIV`Le_&VW@LVg_Kxly`v9q`etOac9W@cT-L z74c=9w_iy^8mP@jcfsq&TjzkB>l-&Kd%$-BIpAN}5WUpe&GsW%WU4%B@v{CTc7Skl zp(JdvU6MpOQP;ti)N~7a)slPu=ylgyf9bNt?nEGUry z|0kVV|Lqw#UU2>dzPw$Ds;lK`EQwO$LwMbSBY0?=OKYg5H$WZe-juc}UY)+aIncs| zD%$L3$5Z~@FJOMxV_{(GXyLG;Y~1`QHoVJ$OxlPNJejUyW-XipcLYC_kkkP@UatKB zR-sM!u}RwSM}r&NeE;J{OccASYME=;i^8YB8$=xPIgv6f0G?_4OttMt(NPqCaTvNi zM!|CPIQ95K^8BZfP?{xvCz>Eqa?XH9$Ulizyp6ImTDeYsPb!!WOwtjgAdRLkbLX{< z*k)#CP9j<}U3*f4c{@(WDQ;d-GKt(;X=9QvW_=1`LpPzucQ5mdXtaRmQc(F^kcoi8 z5&}{_**9_>0GsvIW*6pHU}nx{PATe6L8Ss(P^qqhMP7OSXqz*F1hryh+5CcMVdzag z!W!@jsJ_e+o~VrGGY3|t<8+)o>Q_kdcdnwf{mk{%!8|Bh8O)MuYa@k*)?{qte|rcb z9~nW{`CwzGjGlSJ%jl_d#H0h6jGJWG zzfN>=6?-H+fEkixNY1yYz;gg2+_5mUNUR9SdFQcm-+W0sziOoI%t4cTH7fxv?GU%{ zZ?WYqk!Z#hg)cKKQ~+kw`Df!lnc||o*1Ws{(MCxV%xN^*U>iiKUyYjIgk~rz)7;#Q zTQ!xsf@Ab^&qn~a<{dBf!4A}Mydvs1wkVc0p0IKi>wh1~q) z_C_sp+mm%WKMcy|K0svYXzvR`$T|Tq#yf}Y>5EQMav=tB#!OI1S4DL{l7f6#0m?Fe zk!>6>^EyTQqIU2jcf2vlB`N9-*b#1*-Cjx0XM255DQI3mR51_W{0O1f3!)Q3RU4b7HrS#C(9b!zEP?yz~A{qK!>= zBx?u@SSgUY7NSyQJkI}?d6GN!xPyHonlxf?GZO9}qQE;Zef!roSIG$bJ=A5^pv}lg z(k%A}8hva%UyuC*S@m&F^#LMZ&UUaD-U0ixqY!~%t>`mDqmtoIlzuPRW#F>Y`jwdz z<`nWpwB6By+c}oY?OUUyDt( z2AkD%<4A&HIee;H*>f(vdxd!f96THpjR=_;mk6Dae$R^7E#VlRTU4O0G%r7-=3|)8DG?9JcIyasd)>4-P{E9S5C8QvV==)yR7jt$Nq{zm>y%u|UJ@K3gGjXqb=<`np3@keT7 z0gfIN90C(8UMUS%P*ArW03F&PtydMXDeW~X2Pu^iMzq)hJVt`>`__#{E59$ikTN=N z?2#BnYGL($cbpKTFxyhcr(i0rj0$a0-Y^5aKme}b`Bf4n=r&f;+0p^Q?z1EnQYn^2 zYgH%KD6Ro6gm%ixffuJULij|g&C~~`Hck7H(8ppX8tfiOGtuf^rl;-6zK5u%8SI7i zZrd$PzX&d)hbbs>L05fGjiW3qm>ct&YZPO8Dixh%lW^PqzO>I!Q9zbe$A2w5OnuPo zv#XOQb7S%9fu<66i9*WPx{nd+RnQfBFZNs`=tLZ^|^ zTSN9vTlpllxeZ+wHT;ld6g=#OwTX)D?qK%86(;lQIe67o(_m|gelUat4!A&s7*C>| zVn@^5pPT3rM}n<}jE&`$;(LVyncjO2G9-cpF7M5^&g3x-K~qrd=^qgKQ*lM80;JK| zp$f7e6j;R0ftm|vEf=N`R4EhlV^!nB^16p{~|ZG4)JMb8&Wqsbcr|Ao(@{`eyk->n4a8KZ(@DS)~?@N~O2* zXm@gqZU)yBcFA{FgJckoEwes;OE1d94%Dh*^v!b^SEKh+E5L8xSuHR_)sv`=jLAlF zDalh)iC*aOX!U*!yO|{ojib83oN>!iy}yQ}(*o%l22XFDB)g>gBC_H6N#6_BAUcSZ z)fH9LhRX(Hdcd2W!02)*%2+4(OA`h`Lh|;>&C`4<*bt8I%*(V^6k0Rfm!H}_zN17Klc{C~ZwbU!5h)l-!5?s95}9n~r^)Z( zEqISHnwP}bq2$4I*!k_J(9*bwp(aCnCc-?(;#HYMv#_*zmfB;$m`D$U!m&6Fo$0f%TaIR|z`0{J5xbQKihlQDuk(3!-h2mkb~%*RTfJw4O^akZA>XH@?h#CJsSl32R(av7zR)Q!XV-O9$7=7 z)+nTbc>SS!g0(j`a+c3Z=1X!q8N(q?(=^80RbD&NV@P&LM3*QwBoyk%9+a=p$w`fS zU>kgn3byMz^Fx~--RS;MNvi+|Dqpp0L1)1ilu1AsU>QaW4=F|480TVevfqA%rml%hILnzKmtLHwHz}>l(|Yo_IXWzU53Y5|G@46iZ3k zX-1WD;q(r4YFOW3K}s2Lz*-+IP7FoyY5s>alahFsCkO`KnA(Va8}LYvcev#S{~l3F z04PH?!88~KYVvx?T@?wxTYxuvxn&wSem zyrgbE_9^^OsIS3E<>AXE%rDuzV7)Ko zvaI$rUFuwSbyI`s7)0nNbyxek5Zu59?;EbyI3X_QOD^E8t}=o%5&$>xntL@|IzrxS zm2d++?kiPfZHVf@f{Seq6kdaV`*-Y3i70MaFS0I*Lv~o`M$|r8xcId<7WcWho1!wE zV-J2=!Xe&+^+RduSs6fwI<}sR2@2Uy-}*W_Y>-Nqke>upY3ZW5*DW3r%BaHD!<;L8-7;n=EgkPd zGCCc!9Un)0kOi)K_Tl|@yK(o_V@a@Pq{Fk-{_RpR+^+Xl2O9c3T@_ENQ2>elg(AmVKh`sn+^)(%r#L{$%@VEXSf({iH?u57MPt5r^| zNecoO8cAzJrNphHE;hC4ouJ7c9tizDT68nW56pA3Wr9 zjSo(0cv|e?1aNwhZ0!`}uyWX^=0$=I(iHOwOf-$TrZ}2mC#yX@lFWRMft`uTU>M7;omTXD3&un+x!wc+~Nh+8&%Q>a~YZQXEm+~Sv@>q{7gr$-Hf zP?camz`ip~?`U6_|K57>1FoVm<{`6G?UJKUz>Z?sROIobQKSVKMVH_kcs&TMmxN>=q8O$Nu%4Bs4S+>MWaK;$v$QOcNRt?&XcB*` zxu9lZ5`2cdEUONV_tvHoG`p@`F-PQyGSnbyhL_>G61))6v3oY4BryNv|)urRrhF^Kp)=C)|4N*@M(DdCSih(x@^i_QaOD= z^32YYC!*jOj0OQhX-(KuptoiAb`(t?(5s>Mn{=ed#z^2!<7>sP5t2;{Be2{umLoUH z@J#b2tAevFP+Ly`#fw0G0r53JnX#wa@$PP4b*=lgbzXa3yxlBey;yp%cm4{1{aUnc z*lLVn-~Wq!0*7qZoVg z`SQu_6l@on@>ky_Yu~w6we8yS)2)#P|IkMATunFFoR8omxK*F^M_{Qi6J!RZcC_%+ zKAy0%H7fZ^6@eg#ko6V1}~d;YC)w(BEd&{{p$mY?%M&io4H=wvgDh^ zR?=>$U`?#TpDxb-``Le8 eod56j|7+${kOl?&ZztgI68pVJ{JtFk;C}%pXW|$D literal 27272 zcmV)XK&`(}O9KQH00;;O02PJSPyhe`000000000002lxO0BvP$Vr6nIb7f(2V`wdD zZe(S6E^2dcZtcBmZ{xVOAo^Dd4Q#*z1O{q1=HlR@Q3J(R5_kEvEjiUagMp#gOrkDD z@{#4L${yVRe)*C_Qj|nel+>Z~*TM)+Mx8wk#Uv7Tc!`2>1zk$?^zdZ)&36@2$%$ZDF&)dyc_q*8= z|L`5Ch=VuWgz9@`>W6Ha<|^Nce6iK zfunztbGio<%WZH1o3aQ&4-N-sk8sYz`0EJ$GfCnM_8X)N)bX1SUY3UO%YTFI&uR6G zHVW|QjU{mZ3cdy7D2QLiIRe#Au@h1SEbSLT(bgA{BrO`7mdz9wd0CL1PbGbm=zN0H zJfi<6)f{bk3q@>W0g_c>llTy#ks6Wu;x|ul(Mpx%3N(dP@CqXM=PBQl891UP0Dfd> zeU~Ip!Euex&g;1*aQ8eQT()*n@;@*@j&$K#D{f|Lf#my;gjS*;W{As z!t_|Nzgs25HOz&i^#x8CL0Y54f-- z*iY7Q9fNoe=z}ExIg6i@n-7m4>31Cc%t!6`#}c?DJKL$~Fz~X@~K^miXh-61r8yOuDI!^}Ww?ZF}1WiKogQPleW#te9#?f)}VFqvU z7mz9v#0*yPq1hqElG#LG9dn~ZqaKsPol@|KPBU~)=RAQkUCfr94n9G4hv4m&j*`5t zO4>S!!u>l3YqgyJsWKao%ojK;6y^fG_+P+h@Xk}VUQKtCjqCXC)Gko>kD2Ftc44j^ zfAV0P(2cvEJCjDJW|O{NZTwz@*L6JNm79IYUDyq>Zk&IGtV z?7!jqa}IBiN5+dVhgp`4$`kq@zfQt9%>MDK+bAehLKPP8GPXz`S^HzQGG6mJ9DQfH zbC&4bf}5*x;DlLV9~9doWR1!(gK#~6wO+dr^rJJIJGXN*&yKfhx?%+Qvp2YE*5@eV z?}F%i02fmCJ7xaG`BP;zQ#hZCn(8PbNW0m>xp&vw`Fy>a&n8MY6+cl<948rOF!>`y zDDJQ@TKDC8=Ke8p*Zyp^+}&+fi=DT<{oS4TJE|$$xQ{dUOFyWH7ET#M{=g2NKvbEL z^?C=_oI6+64&+mCdXM)T@SkV+jz{|@=iH9R=zX*f_FnL`Lzg+&NJ5CUXqq6h+t)YXI_*NP7-oiS{6YJ?*%Hd+g`&w2^7sT(&mbYg3Q)s zso8+wK!lE$rGpH|H2EH1$1IifT$YY6LAHM-yL=XBX>vM(J#6!P@`PsY{R)U%CkIRl zxwi(V2eoHjM}r{OmU?)_1KFCK!25GK+1dBcZrp!uU9U-o zqz%w2ecl#7hwK6LXA5_=RqC+9b44s3u}t%C{->J{v~nG!!Q1KP!vw;-3(y(yj;kkF z`?5}w2n(j^KW)Yk%xhFZ1;o;H(`vlM6WrRI=}=SSoEE0PsHf<^o-8`}CmvGG!=sRq z(Bwza`Q;5#~H+2e_{?OzHMn&0KYPz3EmP{MbG8Ohp{Cl*2C*GOwuq5 zL9vOq{sR*1P8=f6n9Y56vs-UwtIf<;I(HQ9l_gcy*0Qp}C&YUWd;X@INi-_lv&E9}an1#@Bl{aA>lzXf50t!6D;c(=}U z_qdvG7w&Gc+Ae*h+j=l08J(Zxjekz_$&F;?9aaysGZEM+csjq#NguhrDX;8^xYAqJ zgsAv!?Fgv7kE#`2JJxQb#ukm(AEulKhj+|DG`h=`#c=Y<5&B2B5BRY`KGftDISz^v z_Jl0oI~mY#*)kWNo!R^CIgAd)ws=Cn)Ye5CwW!|42{b|KDf9|bQNRS=%%jL?aCNa7iW>x6!AM2Ip?xyaYvz`81<<7Z75AcQa2bTQJTqRLmJ(n{H&V?5U{=36P&ziGNK$?Zm=)GBp64;^+ zSmYA!{VRMyVZM_yAST5sTxW~zaMN3D@*2c(@phrVtO_rrujc(L*nb^WtH&!02>!hJ zAgLAK8q!AI9#SJY`7ufbv121uX5ZJoXbj-p;D8}xz_axL#+5!DaKw9h%QukdFP7) zJ8Tru@E3$9F;D~XMBe+H`NQn(7?qGtijb7`7#Jq$zf6n4Ru8DgAiJ+15t|9>!(Gv0 zDoACt6qEVZgIvEIH%JO>H(T%gKi3*Y@oVyUfXi4kO3p#rvgXL)_2Bm*g0|=RAwurx zgG8-Oi!D!FAgxJZC635knQcsf^IhhL%$??LMC7GQybN~AZVc8i&hBbM?t>vy3DOP-T0x=o8Wn>I zqqA}G>V|9DLk1&lh4p;d3o{I|eE6k~D+8BP*jm%8$HtZ(%5T={7~~CnH*3p$k?i zZ|WR`4HlW9Ogy3tC~H4%bhl@PJ~1SbF_ktVcNWHR6>4iEck0ut5w^35V$Nl#LN8a_ zg<1iSiI*!r^dDi7Y+!|YHBx29<~)=xei}6kRvto2e?(P7Xf+bb$A+rXS{I4RfZWbu zsOrUokQn4NX>udWA<&fTdSUvp(Z%JPLD#y>tzuOzW@?`YvJppzk5CK(N}hUR7uj&<0j4QqMx*3D(ckc+GuC9hPA&?3Nx z^y$VBqUV1Pxbmf1eyxOr#0|1PVtf=r@tR;7*bP?NKDMd9> z)GGNYs?XqkMA*(M8K_QVPJ0-Q`gO}z4=@&wL39SSqd{to#zToyhn>uvG!5QQcS%ay zP-1RA6qfA_RniYc`fki^;w2Kr)pkDJF_zZz*`vEe0mBq6l-tjd%~bgW(dPCxQv*J) z$=oTQycD4Ls>g;mVs2V(_<02a6;w2*;THwuPQ?6||mT z@CH%O$yo_Ss9cOsPpjJWE$pZD#4x#W%H={5+-$%zNRd2^C#hy}*vd{KyUnd5rs&*n zaA{Hz5Rc1$h5tX~@jq(fmb3|tL@5zQ_el^Y$@?S9H+XvVBa0Zzm~Ov`vdHOwh zGMOa}kzPNu(7RwyV+_f@vOkRcA}3geS>r$Tk`^V z;dtZXZoxl{fT?>~5%73iZ{O+GaQ1r?h6WvkHBa7#4~$;nw&|@CAZgHTCK@vAh@X4~ zam!efHa0W`HK##oxq`P|K9UUkUfJ$4s}m`(YPv6_ja_2yV-w4~8XE@&x2T&YzLAA_ zk_Is?kWnR~$TUdEqAfKz4_gsVua#JaQYJO-wNhKVUt4Z&a2DR2}%hBfS!(4;3GqLD=R2gDu+QGEpR#-^7bIroHv=$~@u zof?uQO)pGwJE8Un)G(^L2N|s@Zm>4XD&`ZdIBdqIRcdc|_&^b*ZLp~FLWgCQ$9VCn zp==G|xujGrH>s)NS&M25k~F!#ihBJvX{>}MJ?+K@+1UbQ0p#FdJhy#^)qxaSR}clS|6&SC>Z7u9pPi6p0F7 z-Um~z$PcqM^%E&J8ragk<`Pu60L?GIelNZ%^x|TuR#gwXYMbinu0vtm|6a~NCBcn% z#$$oJ_P8c0zS36tY@0|5)H<{1erJc;1IoQd@G|!4)80yB~ z9)pyDKZT^uoVmC2T=>iHF;vfL`TOctDO?W|po65LU8f<0o`q$uO>c9zTW?mrJMmE( zhP&Au<)&G0W~2(-sMqQe!#AaU}e1E-jCKD7V zY`(hRK`iKhE%V*DhF;IvA^9E)h-UZ8)yDN89@qnwU8vlJ*}}QEI={0eoW!Y{=RjI* zQ4!jxXlU$?ia%Sp5WcqQK6nn!QO5F`IpAtdhscTMIC(b7Vrm*ow25jCO$s~fIk2wt zE%__SPjq6Xiby#ipCW+yonw%_j<%aQXH+TH7csZ;hI&|;aApHz=CG28S=%&n;sZX? z;l4x!+SzjjUu4p;@gOEJ%j`TAqXJR9fyGUqxS5j! zFiFa5U0$72C-uKBCD&8jY=vD6PU?MbcEmQ6X!EoTFlbUyGU;N~@2^R-DBfIZFa~se zX?BdPBUkPi+19!zZlXlWu@ZdosG2jSUJtLvU*wBT0=W-mvCNE~j5xB&!d`dMP8JFw zaiYr4%sQ#1jk0)jRm|8s9$NLb?bmi(>6m7czSWvE*Nz$7xZnjD1KySrA#Qr(2}dPaC~Lu2`{aK_l(W}?-@2x4B%nJ3@zG!&ft*BK379eKw}e zSotbRG?-J1G!SsaOIDIIys!4I(%#(K-s)VDD2>{aMLxTh*=p&Y)f1-KQ0*rPS^mZRV{`1$}-OQa&k=@J2 zS?I%+Xu1yx(l&G!O8X&#a(07sOjJPWfkPE5<1rj!4p9MUYo zl}|V;^&5Y9>Lj`T+R4<)^2expxw)NU)orVSm$n;Ld)rL2qH0=^@(U=Z>$>O02gxo& zr4~0=9r8O^?qqWioU&C6gh4L##J`~mJZMgQAl2+?D1xy$`sKivK3{@H4YweAOhwO+yFrOBbg z@L<`_tawnA(01G9>|a}&JKLGfbw;<&ke?dxf3ybapBDT4=*(wRhq&Kp_P2F4wV!|O zF{g5f#41GFoV`Q5-MZ?2h=>m%V~8r0j)dR-`w>W~P{ci!!qZb6c>AC*n`L4vn`#BQ zoW(-giEhI!K_i`Ki!*G1QjF&?AOauJypSj3Cn``hTt$d12=zRmnt&ygEoB zcUt8LX*~T6$kO*k@MD6Ksttq91ABP>o-CSCR4ax#RxHq|U^{Ka3fgeqHemk>_Fs`T zSNaVFW>=j$VJNEF3`xyMD9dvp=vtK5f>Aww($e|6?1bPE&KHi5WIg|3Y6;Kb9&-@; zIm_sKowBRy$+UF6=LxoM4%#SM4yV4rE(x%((=~|!uoH@d@^rktq|4_dT|cL5TtJ!u zaoM6i-U#)`)tHaE!i`N{*e8>U1O|quMN=ReXk@t6pYmca^8tgJ(_PLNY?7(}>QP)Bj`m?~{; zYMu;|G;u>uC~8;Cs!=|S&ec1gjvzja&{jOZf%LaBdo`!(%iBrf1?8Vwp@Yo5Dm6;8 z-xtX~NZ-O3CC>6+)8so!e<#~>WwY{{EI+Wg&st@ZTO41-cZ-lJ__=wv+Ai(Ldkgq9 z&W9HGR_U+OCT&X z2_V%7Pm+19sI!xJt>C%xqo^bS2{9C7Vlnec4hj<}3On!d(P<2UC4vgVqCfw64x$qs zP-Zkqu{f4pgbj>m1t)VDj)ID~V>s07VXiID5LJ8ZlpNZaGV)AyJBE zMML6dEH8#c%V@F&MLYa@o}J*#4vLYc6u!Wv0AKu1pr@x>yUz6jC`r<~3n0G4%`4Sx z4~?1_dNP(7gAy?O@gYQ|9ti3A>GTfo|F@pjx6DwrCi#H7*{n7uDF;aYlyiI}Qb?p5 zp_tq>P14)skgE%e-yJO}Sn#AbECNzu)6@`yWi1WMf}zkb2`;4=WvL*0u~={)-KDP~ zP*xDNq9_V*WzUoN1v|dl&}g}TOx(4v=4`~RsULfQ1LQ1%~wuToZU|J7d0Zq3~O=&!clE0(W$~!O1 z(<@|Gs&>4!M{-;i^X{@4nEFt>{=jJt8}zPRgTd9V5W7vSD+O2KRA{*c!Sae0Q$8Gd z<`hRGCUko#BAd3aIPvPCoppy?jJKx=}I+6ffDpMlg55% zNKcqaKnDEapw13_0Z(&;MO0K1U%TCM<>%hQ&h6aA{+D)>Eg?kPjl1(7AfAWSTxn|A zQj>T z#N{6)b<#wFm||ony2o5GhvJz$?U>6K-}-c`mm^Kvp;hx^{QWeB_x(QqW?cKV9+~v( z+Tpk+TB|SRX6mpRXTjg#=vr3jzG-bOAk&=^^10!h{7k)83FY-1#s?B5V1$$pD3Brk z^{FaJV49YelISBdp+dlIVM^pfL2`~Uk8-=;BQL{RpEpTUI~hQX$h>{W8FwoNp7kw_ zXlrM_pJisIxUheOHy^)CP z+BPeV6!kGJr%XC8r|L=42h!S^k>KxnY8aYo=BAk@t;uP7^Q}{Wd2 z<+mQy*s#yh1iltDo}-LeL0Ii7EqWl0CpWZdWC`#C(YkOIv z_}JI*Y|mGj%oVV}yA9!m7~!~8)!ip+WN|Mh>06L7j353zg0&m4PtpTN2&yT$9tv;F zw6*w1BIsPmbY$m2$M2KI=Z!p5SgiC^o@^TN+7Mk;0Rah0E1@#T1 zz>;NC^FK+b)6~o;YQB0&$i+;>pTS!+P4=~OAs)w)$!I@swej72U_)(_6H_+k@?$oS zvfYDecaE8BLRy?gf>CyT-p@uTDzuJ8RGq{C4QaS@N*6);6>*rw{J_fxD9%#xt(-`> zpfNDzscXs3{j-oPkW0=)j@T+)v{55f7KUyRTGTB;h~~3Y#Jm8NKwQ#LGxRMZ*p|Gg z`l>d76vNkaf+-ECWC5a8BE9dy%ZuHyq`q1`fHdy8sNk~reO+{oqON<$3^j*sgiy3x zc;V6m_TxYUaX1H}Ne`mOB!VO@ki7V091y9r+8qEz#W2`DGL4bzchH6!uVy@&{%{!n zTNtmCRCTxN!A+Aa*(VWo(LyPGx`y%+CZX`OGZ2`$&(A3H#5aBci4Pza3DXbrd60Ny z@>q0-$+$Z-RGkIaEQ@ff-jgiwaBseX1Pc3wF5k-*@HCxx&(Fwgq&Wknii;sXIu@Zy zN2M!#>6F?7%IL}M0yZ8D9kn!q8AZIh+5E1OxELb@ahznB1jSQPN;hN8ldxMq7xicn z-IPLI8K|)>KEZIGCg-EQ^Ys`~R=p!g#=TS>Y~vGxjT2fzzD2=`;)Axc&W6~-aJOR) zt12ies*Lm-QndVz>TPn25 z+EU@-LzDWYU)s7dorDK3kh5Ci=M4<8PMW%~yj=Zfy&w{1nkxVa(f?K4ztZdumuvC-ay0 z_=(`GQqdy?CYOnd%vSjtuZ3RU!@PwpUbp$C_ribosDEI1y`~-?C4n8Rn+u2sYFCXl zJfDscK;6!*%(NjQ5J?PgybX8>PZ>9Id6nvmi-k%($gDt<^x6;-7tmZCl)=%Md!(Da zAB5yNUYN0_0?3<=Lq%$8c`mMj-MmU787p{mrs1IjH`5H)1N#(on62uG%N`ybSq2lR z20SB$4GwzuuWWk?F+vD*8UaKXs6q@9efa#oK!X2ua$uZFWq=<)!ZzX#pml1zKK{N> z>dBqk8@qnRhc zLC?KY>g|Z2!W%gQho|>4Ruy$NNQtcZVy_*{BIbJtlDh*op{&>_s8}E<(}n{%;^@G>2My{$hxBPhd5W#)OgxamX3I z2a*+moB1H|@=KXaNodiha;HGmziy{1DsEia$QUAuR*Q8ruPk9g``OjoP{YPjvYN$f zLkXzB8-DbKuTDab4n0^c&IRrdcuvGY^pIu8 zle#OUg71JKWOWW8N6=tGAT}{ls%u7qhG-?Nx<1Gz!I@p3cOi%rPqHWCfWWSI5@kk! zrYDYT-$D-nNe)js8%W1BiZBFL_P|4OvbXH@fN{s&JdD2z4CzA(p3RR>K35Y2H+zW_ zxGqtYZ$oPU`As-`LvhV)a=6_f%5ElG5P6Y*J5>FFT%X|gY05Zsw7i*0$(9oaOnY4Q_mU0B&Jo= zwAF({8i9=8(j9tUIiBObo+o;cbu&aG1W5W|Q<#qdZs6FX@YCH$7DXiF8Z6xMg8L%n1mT^u=yPlcVS=b{%9h= zvr9l-6lLBp9_1mlwwgbOEmnQHORW_k6T|d#QA%PUZoo50k??{6Cp4J^@PFI1S!t^h zCba^&2vyk|WE9BJc&z3A^g6Dt3c?Kx&Rn>`1?KGpRb8?*4^G+V7>+J$g&~t~$s5|W zsxQ0;c=`y#r)=27+{oTO5MZH_R#3*2`e_iKNJc(Ya*NYCWVXN@JS$#{?UCa#xNpGJ z+NNer;4y^iew7M(=wK*hG4^d!Km-!=jk zUKT)9fmNBIC7=wzFm@Ub9k#ybU?~t+pI2iT4|g@1<5IgCkqN)T)u<;sGH1h^qzion z(CZmnE3;$Cw7lIyW(Ukr{cIr(@6|zQ1_pnL%uce_jARP|vUiu|lP7 zCjmo8Lb3m(KrNqpkhJ^M*aZTmwI5b;33lu-&N120-^PC8kAI48;%BtZDkL9Vaw%d8 z?5sxy)Xy_pomOTE;pge_moR%prZVWn*IugJ#}{3;tR_{Bez{6@c%m(BHU`$uvG_2- z-L_i^;wS2|@rJ8@eaXdZ+6{XhFkr7MZzO#?vnBYEIeT8*vNVa!Be3o2Ak-fykO3!> z^wfg-S_4lfJ$5^iPQeZuY}OG9D-qT?U4~7lGDUW0_%i*zMWDQD-y+~X2Sbp2DuLB< zPeBm787GT*dpbj`TL-x@oP9?W+tBM)gc=T2)Ac;eS?+^60cjRKBR57cZIcV@7_wWz z!$vY=0Gx*CjuMVmJ5x(T))7xVj?dt|*JLWgkyHj=pxaJ@}2VdmaCtcC`t3L3x4I`bj#4_x%eOS|i7yrgspa|DHU3 zL56Frfxs#yVNdUpbVRUouU@uVk((LkV7hQY4wIs2^+)a=y*FP$RlNWEy+APtj)ivO%G+rCZ?Hj*YbbJiM2bhj%4{XGbA zwlZ*}7GpBo2zf&bIlmxaG2a&~B7~#xY}N4pT(y-900y((F=b)vgj<8pLG3$ycP}Vv zM#v~+x60Zhm}#~-$>L+`t>&NjrOkpF!m(|@tOrsUzWfBIK2HqP6g-DNY=cbU=>=C? zPhhoDzbW`!LC9HV9>%3Xdb);}8D99vgV??pwHNTxJ!}n;^t9^%x^UR_fT8<18QHDn z-cvn5K0ig_-ZXd}9}(nVXK?OCA5p|@Kw$zc$I!74Tee0lVUcYl>!A5vWF35u!y|-4 zwG&CCam@R1`?L)|1oWL+lvJ5Bw$^THFlAp7NJ3j6j!v#5+VE98N$dbs zaraQbWaNio1+J)!v;wrj3qxnvRYF~ETB0Fzavq~L_{0TKA|T-E`*IxXjR<`kdWwpK zR;VY1)Y}>lNpA4o=+N`hF!5e&PUUF}Vs%${ge&u-wFT6KR_T3GpDBn7$DUlcl zC~nX3p+lsp#^)2kVEf%+530!i+Jh|Td{yA<2$KZ)l|Abynj8lZd2>&Tqs&HU`)O?% zbj@U1KvJ{7twOFWa;wn$8=EReqnxlw>xMe1=2FyQ0^wl|z5(hC>46~KzpjJ#C<)B7 z=xCs73wbE$0{CcboABk;x(;`fBw7h83p;@d>vN94X#>86;5&WMD^XgTitw~O3VhHx zMv9L-^hwn%lfS6>*6qjcSO(Dk=?Wh@;Tz~l70?HC={aHxkMx+e4_r8D?IY+sNR2y} z&PH|fveAf?cx}T~ivpk?;Qnrp?xekBt%H_Lg&ica#cCTezfx^O?>08Ij4H~NAPRm- zDYoPzeVFji_6^gs=c2bU^j-&Fu>6ze;s4SV(mGp2(xMBb4;66$a0UP?!yr7LG`p^Oo(V3 z$-dCAAu53MxAG7*=9W9v#V3PrXCL zl#RP}fK3x=JrHJBu;yc+uXE^iWE(O~@(ns@%zn|*YnI!hox8%Vti}RReK3{RxE*O{ zAE0G=F?-PE41p?S^95V7PQ9{yK7hw@ko6UojYrZ$NI4!sFPZM>(ctX&NWI^K=%5$) zb(gIrOm%F7b?`m+Lt)-6_}MhhyIuHA<7L%jsAupN`l0`Jg2k){P~8iPYi8{o)oqz} zblhoLq4q#GOll8~N46n%qrO;;I=Qkbct80H%wJ&gxuq$ldz;p-@TD_q52zrawge^Zm;wqV$LIOH#zvWRPAmr2g z$tdlvcmkbIkhMJkoS(_u6o5*4C1dbCKg!mA^V-eJw0 zqO97n}+Io zhU#2|FN@$vq-oUn)K88HTn^0Sl-`JVSJ>ljD{hXb(dPnE-qm@Md_D8_S(5J*2^rVJ zx2gv!Df|+o=pH{gC;9;I`m}?f&r)3|sW9PpRT=UQD*oDFDq1iVGji+0RLRGkLzN9Z ztulISG_csG>V6lP?*?kRxrylxi&luS`fx=!l%MT@MXEq`&aN-uX^z@XQgA@B-v9|j zkRhnLo|F~t2|7}mmykhM+%>WpXKIZnJ7=u+LCm3L$+CSj8-dpxHqHuG9JLw)*xu=o z+KbfFV`PvkJopfwNeQ}#-+ znt3-t&~E(gF-S*9y!zYYNAl}abtRQ8%Wk7@x-25b2@HaN)fM%L$MYBoPiUMEPR?Nk zIP#{p54DJTXA>xMGns%@u%om9ugoNF39iH%s5>|%6ZS4>$}^B>V!ObUKjOPUTqbc} z(ih z+&Y7_OQ1wKYze02lTxbou?V%I@UaEk>WUZitli<|Rsi}dz<{kmLaalL; zbo>nBXS7qw#hPBB8CH9m8(j@plPA=oGH&Q_BUNpM6qu=%>O;YLN9C^(XS-Tb`j1~H zVH{@v_|mz1z5HuAK?LDj&6GbDI;zb1R=~Q*L}dtLu@MIUQ_T)H_CWCW=KKh z;ts(rw3V_86eRTpdjkg}bw zHY&SZG&hiYBR?=Ej|4>&{u_+oK!V^vJ;E!bpcW;U0V&#_QO1{UdqOJ%{dBrrYlfxBLM-Q1RrjQko5=+mV z%-PagyAvN?hr8)&;mnr1^=5^yM);y~yw%dc7-tf|aVX*Y&a#m`Zj{2tS(==VINLhh zM&#jKu;NR9v%=)>9##tt4!q$JQ-EA;c9YfeZg#(0IBU%2@4W5Z-RuvG3i*)lorB}J zOyR8?g)yM)K`#R*tsF_8wRRp&%SUHEo90VwJG1ic&!H}yC46nd7un{~MYFbDDn0(C zDP_l>Lu@@r;jcccEUU)sv|;=$`3kVy;N}A{jb%>&T&W^EXbr@e!?va<4Nq7mh1??D z7;)l;!JcbX+&Kc3v~21cLpNO4VGTyUypG5qHt=@7V3fIf@&(fL5L z^sLU=489T%5Qn{`gtU(x77}EN7~6~zDzfV9%HD`$p$fBxRAih1M^8rX=l?hr5uo70 zFaBm%I@d;R=`wIs@6;9-*6=h(@lbX0EVX)S7BH)KG_A0eX+e7T%@cUkbMgsl_w0ea z)$<*dqQx_sgKr?>x|!FM%C17MP1!(wn?!xv@e z^UC2Wn(;u$NtSDc!C{r&CFxUmIDok6fnWPg-w*wILkvVy@q(~vA|IaC=z)rs+g+Nx zjkq@KpzzI9?E(dGHtiTil7v>>X|DjZX0t0UiMSzA@8aZ+? zY@XHhxh6$niN}kM0b)I5<|yUfg#t-j$~PR+ZXw9ZUKaiuW6~EP2SD|ZL(P7 zIl6qUNaBo(P3-4tGIoC^q(L;RI8qcBsqow$WS>(dsY(}JAhKUZjM}tIEN0=gX$7X_ zkhBa}ax^Mq(0;0Ur$|*vZEiE+`Lor|T{^eTUJD%&Y+PqLTO#wD^=i{(#-QrEi2v?j z+Cknk=lDpTjx@q4QKm9wZk&bLyQoc-G#NR^(EYIoN0B#|wQW3zctDz>+g0`o(sp$) z*P?-Rwv}C?Rb?f0vA)WhzU4PTtnQWwLcbJ-A!e&c;J#vaQql z*C|2Q@m~pr_dEQJ924Gx1u2Xwg*}>He*O<{w{Se)-R!m-r5RU&_~^pHfP*r5a3`O8 z0gA_YyRot%S>XO^wVSWL*i&VH1@9hERD7_jzkKi_XO)~%uCT+hsK-PfDa?&kTi*e{ zidt7F?ExFlPgKfL9Oau2IGC~oGpbY#w5$>%ODL^yY7A-%q5vHl>c^lWKv5kKd3??Y zqDMbb0Dl|i`g6z^dDPoj-8{d|R;n!Muq37V0Sd({%ac|sY@-#i4Tz*pP}j7^%q_o6 zXzE6r4T++JsUoaVd2~f6{*wNcRmQAj;1m}bF<>r+gH@aUhK&SBGsH$QT$c<)WmMWp z9JA<5EX$;QBf_%E(aKa=n6D<(4MSQ+()uK$Y`~FZ1tAzMGWmr2hf$bEI3pHKv@%W3 z>Mwg1IL?^>I}&8z<((wi;>OGjgUW1RpU}qjjax`&gZXlh$!KF<=SVPExaT#!t+WQH zu(Tju6$YoMl?;&ZrNuE3Wtzb;%!Mqp#=#{ON)Ft<7f<%;|EZ(Bq@WU1M2biMTF@%U zsnKep5agum`11Ry^B~`RfauWbMB>f*<55n<6;DC40V&hxKIaPI=xM5&rw1ecui0sy z9TejoS?JE#ASpecS{%+Ro*-*Hz&bfJasbF=xq93bUtJATOH3M?xpmS;(jD&OE9w%l zG>|dsd0lUudY;$4c|1v?ZP|b_Uk@>$v@fmE1fmdfuE@h0g(jL+0}b_sY7NpbIrNN# zPx;t~;$psypDgqx>pTV(f%%=uy)IpzgwW7 z2Wkp2_I*Zum54BqM5HUU)A=mebLv2#u-$r9MOtGdyU0j&3ZBj{T$H_Xecrnp^X`kVu$@tfQ$F#>tp?q?Y|}o1Y4Wzf_R@2{1oqJJ-$&qd&^)eZI}L(WX?W zM%NmV7INA69vh41s*(x=qe^flOnF6gq=?Y0Rn>~LtkqPU165*VNM6GXbtvL<07gF_6kY{+)>%$q%%Qyu8#^tVG5 zD_)cNnrIvqNLTAlW7(b~n@705<*BulUzZO0fwmllcj2|9cU2b4_x^{uKJF@Z-5pm! zNK0}1M3gFld{CX&nsfkH#X3f*T?Y>CB*PJ-@s5qzLe{r0?_d)A{>DAfu#|I3=7B|O zc)svSQExlG8>jCK8Q|$Rtj-P{{^Q2$radz--287Z=M=V@#PNAA{$Bqo?VjlwPhA91c}?f7{&^u zU>G{FI1yxiNjr7nqp6Vf-M=QvO$Z!g_;4cQb<8PL|Cywp7M{!a49uDYtOm+a>zqq& z{z6?a(HUX1UWpAC!__g<;h2lQrScqQGoW5_=GT$jGgKEk$dGiCZTo)md`wafXF4W! zvUtl@z{zhvoFnGtl*v<)9S#5G-16bXy*4)@T?<&pd>CR36Ew^r=}k~ zaRa`&EfCZARtag!7dTmb;|%$Q=F&VICvG-IwG1;yf)stg2BVUI6}?W@0&clC&fUqf zDh(0`@b6|mIXg#=hV>NTYn|To@r}8ZrH>S3yH6@eM%2Ycb`RuYAr{S8 zTP$)Lo36hn2-+OOuJeu8a3g|0F;TZIh?qk3Gl%;fW`7pXG!)lsLI+ zMd)wz#VRg%oeGIUJN_^=GUQ9;nRGCmHj2##nlpSKWAY2RdjIjIs2~q5HsO*#^&*#n zS&fb`=Hke2jl^&gv22{w|LwSwDF52dk=MLqrx)C~^54WxCP`@j@`-J1KP^XD%#p(0vR%c1ohhQ@d!%6x6DG@oNv;YwD61vUtqH(*anx)UDh|9-U8PP zFNY%_H1eYGf`kA~?8Blx?hxDP6cZJLHNA8dRSrT%r9ZNR;G+mZ+_T zM4bPDe)?__)6X(}EbR?@a(^OoU%>=EG@gI4SX)R|lh{*{G-)*1Q>o~pfaeW>Bsy~~ z4z*h{KZZAaB}}>|%=fH~i+sFM7i(IC1yT-iB@iR)rDjE_HMIzTVzP_uc>Q=02ZbUK zCCFvZO`W6-a}C$PpVsH0{8!#W#XsR7VJapLw4Tw_Q%2_5YO6hGKC*eKvSMnpYJZ0_ z)EG8M@~D?eQwO_yS~CDwB8O|?OBS35yx+M?V2YW@>!H1=8vqT})U?EqQF=N3G8~w13fQx2W^PR^#rcvGByMbqjhUO6NdnLuB77}X-&qZ~q z{hm34tW-YRDE$NQ~mq${Wnzka1r?wy5)qW{~;AL&fgU9O);R^{rLXGN1^ zhRmh39Eux;k%Rk0QF1NPN9?!Vjg2{m;-H2|x!MYBd#il?=XI&?wF4vHA&*YDV1s6#4OAxqYzL86fForXHww&E-~ zblMcMUOLJlc6t;LVsH_Hm?U@7*NQBQ8^oo9bGlauY8YZID{0KZb)~*Z3qq?Rm^0dg?WafDdHgOEhBw}I)1#sngTiPaQ(pvOfhT*WPZc*h7 zGkVF#Y}Mm9DfCJ@*cc}A^g|KGnFn=SKNJwD(^dZ#4ABOD_eUfL_6aUrLbl@95rp&z zREBfy(r2A%4c3dm`UV@u+gc|(&L=w#vDR+_kq+|32f6chV(jW=1Eq)cAAVKpA7xo< zkP6?g8Vf?UR$1pY87=Pwfm^M*<|@ZdN}v5(iwBhXHM8_?;gzP7Lxkk=E%nFR&VK%9 zyV-}ab=`^SGM8>vZVSgw2A^Z(2K&|27el?J=>{ek%!{6SSyDh0TL$M35q0qI1JZ14 zFsx-iNetPQ=Q$?qLar;T=T7m(6Xz{w7`y=^y+)8jVp+UZBnt^9-;}?KIP;Ngs`DP& zW)YNgw^rN28`i#7h6K`Kwz54aFj23>AU=3>xE-tTC;MY&M|NxD>QioVxg)JA7BVU8 zNBRBvgVc0gHC0>El|*G7*E2TnvbXD*T+FXw3XofXUNY6HuDag+vyeO;N>f3-e)=so z6>lJ%0`Lp|?3jv3g57*g=Suz7nDQ>U=?-e675FT;^Cg9U@a0D)4+_WXLxpn2tmDK?Vn+z<_ zz}ao^jj$P5vnazmY{0=xm;F|&G~uVpEX}vlC|mb{c6f8VX9Q+7fLy64I>C8yDA!>@ zb3O40=Ftt4Y29)Y{z4TxUs#CkRScr`fW}9khVwbG`h;vfRm7oa z>@sI=-}Hex!JN~{K`>hyt&s`5T}~6sRW^p|apoYO5ID#*V^YA0YG;uN20ns~$VeVL z(PTQc?$Qi8%xbTjxy2qHZVvL|?C}GDplWS4$8#6bV`KTeI#%6Q-!#Ko`4*naZT4#uN`2}2zKEHs~#r(x&Tu@hOu z9!ii3c=<+5-Mm*A#z)c{K?WH{)F7h#+xTKx;%Lz-i^-sAt1DRAn6~bBf9LKScs*ktK6novYM(2uaXj*-ic;aIaZ*TB_N@B?idVaHL^&ejNqy(z z;9t&%%wK~NiBD&<{=QBH7NfAvXCzbw+{UpsxeSijV^=APS0K3LU`<(4N)&4j0XO3f z6N$$k24@C@)8X}3hGfscMR~-Z;%26KAx&6 zCDj$Kddm4+7KPN;Y$M_fq&#) zPpACvYTh4ooEQkmx`x0 z#~L&;qgOV3l06xX{xe5G9s~EfltnKvM{|K;SX=vT+v`mt8M3}^ZjFAf4NN|FmG^Q- zDjm))N$#1x^&0WfO*1ZN2M~HUPJp_h3)!6WujhZz#?yQ7)th8f;^lX0ptDI>uR2wV zp`P?p{zN?N6Yc$Pbw`jucxzr&?+#fNy}Wn184@3 zut2UZIO0p?cHvR;KpVfER)cpk(l9nlp`2BIa<>Rvn~IkC1(eGTv0 zgcda~kg;6nbe)$}!**W@YjE}7I0Qh7E3D7!C$gh5B+lE+HlHK(FsV9m&1lvvThD;j-LGA*Xz~KwiedgRli_O79 z4L#}-E~}kclCUl>m##lnJ|9N3#K5g++aQP#(}@s5z%){M%rp@^Nw zgxCSlzUqF#*p7a*E~Cp;+Je)tU2Zjq)s38dbW0is<%0tCQrwrp`iNt02Y`*8-Pdhuf5gr*uo7b;NZf^Ox z34I-ifI|cR=#ph9b3Gx!tiJZ3gq!u9QMm(6xBF=b<#GxZcFQE>4%sHz-jh5Nqr{5t z0EIxUSqsi4v46OaW;C@uO7^Zcdj*i_ObK_?Rc!k8wdwDn;G& zfKZj{Jf=zYw3Pf1g1b>R9{{lO{B_?ZMH$|43dZ!ieIburac2u>~CAzbX3!_GM%Wl9pCxWp9Kw$H%B3JwAU7e@H1Jywhm zWCCTIY5LM~f@%61gVch2qW#Hz3U7@ucdZM z7iI-r)H(iMrg4~{g~3h~m#E2n6^JhYqOGF-{UZ{LYR6SqRjgBJM!r90Or#Sk$}yn* zR44jVxxl5bbemr5$qHQIb-pBNSIdVr!7k@w0&hYY;)p!f1!HLeDemN!YbzGo z-@{YU^2wgrt6P&{sPvK{n|Ae>%~o$M)_spP6?^Pro` zw(kKkMsT%+^|rudpcy;<^{~vhxgQb1`fkU?ih#hKqOpv3ct$+6f!>s;_cY*7Se}?O zsmhbIEef7TE2&XjTbW0Z*59OGLZx%NWQ7Q1AMk79Y7vBCz{T1}z!;8u2qqj-hF8aHHs(47E49o3zvtZ>T{?rx|2qGC2rhH1BR9uOvr! zCzlu9uqJ@K{v%d9kXU!TbFgUH-&J&XT37#ATas97!4JsWyjwYE;hC6#?8`tWOzG9s zjB#=Aju>H@*oEaWwCYk~k~AzAf!q-^e>pyytfj-2#u>h-aP^u25E8x`@rdIk?DGYV z)ETtR>w(e5rzEfw6NBaWB>%~9v;?}>dLlIb9S-(K7P^_SE!u?Egj~nc*wK`;{l09( z;gTu_>l@zTS{Slw)22I-g(h#`{}bW0jr?_K)8e>woJfqXSURkZ>0ok8BIT)tK8-v{ zK7>C070^x|r}IG^8GhJFMs;k%zv~V~kX;RgD1;n=OU~KjMx#? z%A*J}oexXei^EK?sgkh?cE^ul>q*?Cd2^c6FI#BMgMf14^o~p9YA>Hb$SwJ2PQT(F)sFJxH8_zPYP+I=+FF{MahHT;IP$JmhmChA7LOGGOUm23! z>)S24?*yb^#%^a1oc5ZbRI04Xq4sOH}Mh?r-D2iBE9a*8`U0w=4#U! zj6K>?4fC?ROe#m6-ZP`BdsVU3_>W?5f1K!&(xT>KRctToCiWm-U3oIMa2FpBz8)@7 zZW_fUzOpo^d2yHg@$RqQG1a>X9_bg!$4EZi$KeEa8--BphH(_;lH0R`5uY!uMU@vP zsRVDzK5rN#6Q z;#vmD4BDi1r^y(xKOZqlHC~>t^$SCDgCXhS9O2+>xVf#-&5vQz#N?3fvJyf(boXmD zfHb-k6Hi)PK>7{~q#z$yT24_r-)wyi3uQVi&&00Wx(ZIY&a>ZMV{|1e)rPEOh=DTp z?l~KNS2cPYLZ$WX67`kFmDR-Z0-TsBYprOhR ze&%4#0R8N`PNnYbVwXvKuV{J443jZ8*ZmDW(uK}4t?zV=vB%c6jQ)@w8nnHJks_a6 z{^tpb@#)pkF(BLpVw?+0)1N$;s~IdA8q6G; z#Hh>?_Gg=DCQ{)9K@M9sk6kMIv4UQx3j)n5mtygs^Q^w{*7OpAR=7$ddc)t^X(&Q? zbNZ%m{UMv6Tvs`3Y_;cuu2kHj!@Kv##rKQG7F<R|-u^NfPp90} z`O7)%;oj2hfL3Q`t8|n-Nlf6x6)_FZ)%ZXo)SDSx@kXv0SM~C|XH~5+l|XM4*WYl1 zUVuUUw@RbiYj{BZ`2ca(Ci{4P@n@~+(` z2r%2@@+CM~y%TfTFCVAj;wX$FE--znO?`wnEhd`<4zE+eQ<&pRZ76uRknvr$rD%ZB z^`h6d+=7OGpH^n}@ER#;q!acgk?Zx%gJc3HS5CeQH&Bs!k>}luEgFN?`Xl)@z&eia zK-GsIxVgZ_lhcq(j<0eV3JA$q3`3)BxG>65d0v6}3vN5#yuODMU)gTGWG{}3s~dc- zZ4E5!bu((lmUE?fY{V{zWUKV9M9ESaae^UD8g@WaRax!$2!A;@_WFl9P6Cn%$R9M2 zhUgt_HFye@{YL15L-$YqU>0?KHy#};H4}mql(ScTifUNeogi0(ciUv7Fk8^{n&*1J zjn=2*jH0NZDjfGKgDgG9Qvo$}?OX$)=V`L)tHu)-_r1uRpCWF~)DmYr3W+13Y+@Cl&sf{a;n|;R$Y`I?ERgo1 zXzgHN`8H@#VGdsih{0#0^Z)!H+(sCZoMn7JHp}VOYsLJD_g%s+`gMb*%}Q4OF(*4T z5JkX{r0)0?=eEe!Cl(SKf4fOO&57dO)oFn%4M z80by7mwGxV-6cBCp@>jbeHc@{0&CTzZq<_$^01RYL3Ku%w#ZY6x4fbtr&Wp^ox4hS z-<*{2oag=E^v1Z`-lo^D&CtX!4F`$as%`DuQ)A;o$tkRSN=Vv!v9yR*EA#%yCmH81 zN&4~oON?iIV(5Fq9E~BZvy(!VB&PZA13f#|yssOK%2^Q0qPL9q$T|d#$50OMWpPCi zi}F5&)2`5$`@c75EEkX!FUJ%B+#{+Y@G)t4jGUhJD29{1nBpcf0<2qO9XyN~9_m$p0S7Wg)KluYH@-Y{*9Ud7chqBb@Qg9XIRzd4 z7?X-qFxCKxit7p1zJ5N1Y6sQeNo)90{~VhN&c+DqLwG?AF;6(Z%J$_;Xf8us8D}`G zMB-24|CW!$Lxx*FMAH}*VaSV(dN~nA*)c>fY!fJOlP$XHRIU48UgqOb7`Oh?ah1aN!r2UNyGNd4j+S(nmbo1l zC_R#dtXFB!=s_p(f>pho;ZfSqs?!M5;+RNKMVe}d4}b#d(e(#!JzfFQXw=<_PC4euJPtx7lZI@0_2gzF4KrUV zm5pD1f6Y7Kuu*d41H;_a0cE2Xl?lCFLT)f*93uGG?H~|Wb6BAm+kHuWN*>U4k6k7l zL!qNvtoh%VrMXGv#|Pj@BA_oYK5?kAGZ-!jNO@DfGxHM(6x(V8D1`z+qK!GI!}U}pj84~mP#b<-D3Zj(-H?_`8> z+9C5;a6~D1R2`M4$ts!um8pLj^@}3V`iGM%vecl_lv(hDCi_6t3F55mjP2@5(|;>l z7fuWy%(W~@?^b>3Z=acZFBuWBaQsW)4ayX6R&b+6Fv{F27q0NcK{zN-_?b9R8radJ zNO^X<`fv|q zlj)-p%~w2>(iOp8$Tdrd?F&_m^FiQao~j^JUv9`VdDIV_H0-yc7TsLHAcGGx!6m>M zMq9#>YH7OE{u6krBt%wvQsJp{6rd*7RUQzTeK#1@v*aFr@(A&7PYZYrvcL#wle~m; z5UE(|1ETF|lcr~`S7h1yPsb2VQQNJ5JA1m5TfAk#j$_s#ZdI06Q;0P})$@@3-+t@L z)IFZOz2y+eHdrArhH$9&MJWcC?jU$l&@xQhSG~e8umZ(C0bqweDQGA9E$G9z}>-ej-WlAv}A;fJ~o_udTDD zNc;s^TU=Q;bG*~qnI(Bouz6;d24rotJ*Vb6hQD!EJ}I!6AVpHa1|BL0@MuFoe2$`N`{b^jwf10@7kI5PE7oSj$=f?QYLbQ_+kS)<#{Am_s!CB;Ty_*D(@&`|93%Z-ctC0|* zf;fTf)?g8VlA7T0Wzf@lmGn#nP-UHlSAI;o=EYSGi7d17{{C9#-?n@-B%TWJhO9^- zN~m9$;3&SC9syzqJNdT6K;i9G7~_$)To2fGVvg+DAS;3;|G4bnSu5z5omC~~PC=v} z>KB{nCSeuLYVjC&qN^fm&l7*sRmNH#$1#9fc`SVyZ<%W!3rM@bJq^vwvo%ExuIHc? z(|TbiRV^^~WeIWZSmq2asd@dz!6dD4!-bbmesXS|hNjz`xDMcjCRQIz7->=4P6HX- z9)2n3DQLXv2!d<1s`MSke^YjrkqVAcmSK~=c_lZ!dv^z4C*#ZklAkRj4`r)jM)7l8 z++8agm+|3Xg|Ba#A6YCtbAD5~#Ohbu)SvR0FxEEbLDvZlm5veH$lRn5T9kpcnd>kG z!Up&y)c;K?e4X7-sVHncg6Sa-e{>s&P^vKp%{-B_9hW3-#ulW5QT$2o_f2qBEj7%5 zJ3w(mZl@QHSle^82ooM^IsH7uP0vg=vSze@n5oQ@0GJau;Q_1?43g(_!OCch4WO8H z7bY#Af$tv5B6iy`G<%5{Baj|SjVXp|T{DbR&yLeX`(bB$<;{*9wlap!lf}w?{ zcE|$eSt#LUwLOpr`=t5FF^dX^2VGr-EkxbGP@P20!am6gMuk;Uj_+mD|3v)WtO{&8 z++gM^cdb8f)>R*m)POB|nf3y6w&`AA5Kq3dTar+#W_Ad1XW@iXT<=`_nXQ*! zkVozx94%|UM$S*bS&*bRh`%Z`RXN!BxRwcSIl);0=u+G;NcgW3V`EuHYIs<%bA=)jejo)YpD}NJu&Iq)%xoLx{M4qLILjH-bY^lsV+gJfNK}K*=!K9%nSFhk($!dhi>_ z5G%xMLu2YY!`?)iN$CP30lC!KNTwPpMy6$DH;OuChna5ri0X<_ebKYSvkd|h(TRzW zFC`8?4JZ~p`zCtpvI{BeW(HoQz$7JwT`^Jw0&P;F7Nd-V+GB>L zYsOFXf1=iQJgD+%P4UlhLlSycmIQ?_|pn^f#!mNVNQdT)!FM39)Ii3 zi(gP&MCg-f$wN-7zSF@}1Q7Om=MHh7Bpy*0eM zn#B~J0v)g-nL8g9oq_nn7@d8Vf=H_jb0Do2Mlzh@tQaz0WQjUZB(7(vf_s8amNBEh z(z)IHEg6I_e3vOrnX|K5V)lKpMGA@0tv5Ozg12p}e5Pz|=;(2cf=M?+i6j;--!ZR@ z{JxOTtQI;i)x&_YJUa$W-U_9uG$~}mW2m^Gr5Jl*JUHcGjE#lkZ}A&fJP8-uuE$f3 zS}J1}Y*uR=hMRu36mgm#$)BKQUN_(%WGhMToSn9*HWt|cI1vy#gvl{JAU%T z&kZ;lj{QqJNNR4!>mTqAdO1_{QP>!pc-S20lh<@h%yba;BU<*zNzrq^vbaVRk9`pg z`l7Rk4rRt6Ll-YIYEODS_k8;(NJBzVG3sO-n*#xn>VN?$NCShQ0sWtDQUCX||GGu} bzsLWtca(xOIK+Q%0{@)iKUZ3d|3?1 - -Description (weblogic-kubernetes-operator 2.6.0 API) + +Description (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Annotation Type Description

    @@ -151,8 +146,8 @@

    value

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/json/EnumClass.html b/docs/apidocs/oracle/kubernetes/json/EnumClass.html index ca53c42f1e2..9d972e74e04 100644 --- a/docs/apidocs/oracle/kubernetes/json/EnumClass.html +++ b/docs/apidocs/oracle/kubernetes/json/EnumClass.html @@ -2,10 +2,10 @@ - -EnumClass (weblogic-kubernetes-operator 2.6.0 API) + +EnumClass (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Annotation Type EnumClass

    @@ -202,8 +197,8 @@

    qualifier

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/json/KubernetesSchemaReference.html b/docs/apidocs/oracle/kubernetes/json/KubernetesSchemaReference.html index 80b426ac39b..9e497c18aef 100644 --- a/docs/apidocs/oracle/kubernetes/json/KubernetesSchemaReference.html +++ b/docs/apidocs/oracle/kubernetes/json/KubernetesSchemaReference.html @@ -2,10 +2,10 @@ - -KubernetesSchemaReference (weblogic-kubernetes-operator 2.6.0 API) + +KubernetesSchemaReference (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class KubernetesSchemaReference

    @@ -171,8 +166,8 @@

    getKubernetesSchemaCacheUrl

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/json/Pattern.html b/docs/apidocs/oracle/kubernetes/json/Pattern.html index b261d35165f..d25286e82bd 100644 --- a/docs/apidocs/oracle/kubernetes/json/Pattern.html +++ b/docs/apidocs/oracle/kubernetes/json/Pattern.html @@ -2,10 +2,10 @@ - -Pattern (weblogic-kubernetes-operator 2.6.0 API) + +Pattern (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Annotation Type Pattern

    @@ -151,8 +146,8 @@

    value

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/json/Range.html b/docs/apidocs/oracle/kubernetes/json/Range.html index 45f029f0272..403bed82988 100644 --- a/docs/apidocs/oracle/kubernetes/json/Range.html +++ b/docs/apidocs/oracle/kubernetes/json/Range.html @@ -2,10 +2,10 @@ - -Range (weblogic-kubernetes-operator 2.6.0 API) + +Range (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Annotation Type Range

    @@ -177,8 +172,8 @@

    maximum

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/json/SchemaGenerator.html b/docs/apidocs/oracle/kubernetes/json/SchemaGenerator.html index 9b9e4d10a00..9356fa72fad 100644 --- a/docs/apidocs/oracle/kubernetes/json/SchemaGenerator.html +++ b/docs/apidocs/oracle/kubernetes/json/SchemaGenerator.html @@ -2,10 +2,10 @@ - -SchemaGenerator (weblogic-kubernetes-operator 2.6.0 API) + +SchemaGenerator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class SchemaGenerator

    @@ -155,20 +150,27 @@

    Method Summary

    +void +addPackageToSuppressDescriptions​(java.lang.String packageName) + +
    Suppress descriptions for fields from these packages.
    + + + java.util.Map<java.lang.String,​java.lang.Object> generate​(java.lang.Class someClass)
    Generates an object representing a JSON schema for the specified class.
    - + static java.lang.String prettyPrint​(java.lang.Object schema)
    Returns a pretty-printed string corresponding to a generated schema.
    - + void setIncludeAdditionalProperties​(boolean includeAdditionalProperties) @@ -176,21 +178,21 @@

    Method Summary

    not in the schema.
    - + void setIncludeSchemaReference​(boolean includeSchemaReference)
    Specifies whether top-level schema reference is included.
    - + void setSupportObjectReferences​(boolean supportObjectReferences)
    Specifies whether object fields will be implemented as references to existing definitions.
    - + void useKubernetesVersion​(java.lang.String version) @@ -315,6 +317,17 @@

    setIncludeSchemaReference

  • +

    addPackageToSuppressDescriptions

    +
    public void addPackageToSuppressDescriptions​(java.lang.String packageName)
    +
    Suppress descriptions for fields from these packages.
    +
    +
    Parameters:
    +
    packageName - Package name
    +
    +
    +
  • +
  • +

    generate

    public java.util.Map<java.lang.String,​java.lang.Object> generate​(java.lang.Class someClass)
    Generates an object representing a JSON schema for the specified class.
    @@ -332,8 +345,8 @@

    generate

  • - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/json/YamlDocGenerator.html b/docs/apidocs/oracle/kubernetes/json/YamlDocGenerator.html index 48d219d94ba..d9d677972a8 100644 --- a/docs/apidocs/oracle/kubernetes/json/YamlDocGenerator.html +++ b/docs/apidocs/oracle/kubernetes/json/YamlDocGenerator.html @@ -2,10 +2,10 @@ - -YamlDocGenerator (weblogic-kubernetes-operator 2.6.0 API) + +YamlDocGenerator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class YamlDocGenerator

    @@ -290,8 +285,8 @@

    getKubernetesSchemaMarkdownFile

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/json/class-use/Description.html b/docs/apidocs/oracle/kubernetes/json/class-use/Description.html index 034f468e4c2..791735323cd 100644 --- a/docs/apidocs/oracle/kubernetes/json/class-use/Description.html +++ b/docs/apidocs/oracle/kubernetes/json/class-use/Description.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.json.Description (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.json.Description (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.json.Description

    @@ -109,30 +104,6 @@

    Uses of class  -AdminServer -  - - -class  -Channel -  - - -class  -Cluster - -
    An element representing a cluster in the domain configuration.
    - - - -class  -Domain - -
    Domain represents a WebLogic domain and how it will be realized in the Kubernetes cluster.
    - - - -class  DomainSpec
    DomainSpec is a description of a domain.
    @@ -145,16 +116,6 @@

    Uses of DomainStatus represents information about the status of a domain.

    - -class  -ManagedServer -  - - -class  -Shutdown -  -
    @@ -213,5 +174,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/json/class-use/EnumClass.html b/docs/apidocs/oracle/kubernetes/json/class-use/EnumClass.html index 8e6248a1334..e6ccd3ef5db 100644 --- a/docs/apidocs/oracle/kubernetes/json/class-use/EnumClass.html +++ b/docs/apidocs/oracle/kubernetes/json/class-use/EnumClass.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.json.EnumClass (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.json.EnumClass (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.json.EnumClass

    @@ -99,5 +94,7 @@

    Uses of

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/json/class-use/KubernetesSchemaReference.html b/docs/apidocs/oracle/kubernetes/json/class-use/KubernetesSchemaReference.html index 2e51e486f25..1bc263a4c1b 100644 --- a/docs/apidocs/oracle/kubernetes/json/class-use/KubernetesSchemaReference.html +++ b/docs/apidocs/oracle/kubernetes/json/class-use/KubernetesSchemaReference.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.json.KubernetesSchemaReference (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.json.KubernetesSchemaReference (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.json.KubernetesSchemaReference

    @@ -147,5 +142,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/json/class-use/Pattern.html b/docs/apidocs/oracle/kubernetes/json/class-use/Pattern.html index 9ddaffd28c6..4dbf2e1c41d 100644 --- a/docs/apidocs/oracle/kubernetes/json/class-use/Pattern.html +++ b/docs/apidocs/oracle/kubernetes/json/class-use/Pattern.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.json.Pattern (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.json.Pattern (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.json.Pattern

    @@ -99,5 +94,7 @@

    Uses of C

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/json/class-use/Range.html b/docs/apidocs/oracle/kubernetes/json/class-use/Range.html index 5559bf5a8c7..41e95758bf2 100644 --- a/docs/apidocs/oracle/kubernetes/json/class-use/Range.html +++ b/docs/apidocs/oracle/kubernetes/json/class-use/Range.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.json.Range (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.json.Range (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.json.Range

    @@ -99,5 +94,7 @@

    Uses of Cla

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/json/class-use/SchemaGenerator.html b/docs/apidocs/oracle/kubernetes/json/class-use/SchemaGenerator.html index 91914c60c7b..803665bec72 100644 --- a/docs/apidocs/oracle/kubernetes/json/class-use/SchemaGenerator.html +++ b/docs/apidocs/oracle/kubernetes/json/class-use/SchemaGenerator.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.json.SchemaGenerator (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.json.SchemaGenerator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.json.SchemaGenerator

    @@ -99,5 +94,7 @@

    U

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/json/class-use/YamlDocGenerator.html b/docs/apidocs/oracle/kubernetes/json/class-use/YamlDocGenerator.html index e49cf5f8d2e..bb237409eaa 100644 --- a/docs/apidocs/oracle/kubernetes/json/class-use/YamlDocGenerator.html +++ b/docs/apidocs/oracle/kubernetes/json/class-use/YamlDocGenerator.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.json.YamlDocGenerator (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.json.YamlDocGenerator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.json.YamlDocGenerator

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/json/mojo/JsonSchemaMojo.html b/docs/apidocs/oracle/kubernetes/json/mojo/JsonSchemaMojo.html index 4f58e243603..a651a69dac3 100644 --- a/docs/apidocs/oracle/kubernetes/json/mojo/JsonSchemaMojo.html +++ b/docs/apidocs/oracle/kubernetes/json/mojo/JsonSchemaMojo.html @@ -2,10 +2,10 @@ - -JsonSchemaMojo (weblogic-kubernetes-operator 2.6.0 API) + +JsonSchemaMojo (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class JsonSchemaMojo

    @@ -233,8 +228,8 @@

    execute

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/json/mojo/Main.html b/docs/apidocs/oracle/kubernetes/json/mojo/Main.html index 7fe05854001..5e7c381bfce 100644 --- a/docs/apidocs/oracle/kubernetes/json/mojo/Main.html +++ b/docs/apidocs/oracle/kubernetes/json/mojo/Main.html @@ -2,10 +2,10 @@ - -Main (weblogic-kubernetes-operator 2.6.0 API) + +Main (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/json/mojo/MainImpl.html b/docs/apidocs/oracle/kubernetes/json/mojo/MainImpl.html index 9f2d7d428ed..a8e0448b46e 100644 --- a/docs/apidocs/oracle/kubernetes/json/mojo/MainImpl.html +++ b/docs/apidocs/oracle/kubernetes/json/mojo/MainImpl.html @@ -2,10 +2,10 @@ - -MainImpl (weblogic-kubernetes-operator 2.6.0 API) + +MainImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/json/mojo/class-use/JsonSchemaMojo.html b/docs/apidocs/oracle/kubernetes/json/mojo/class-use/JsonSchemaMojo.html index 599962cacac..0477687250b 100644 --- a/docs/apidocs/oracle/kubernetes/json/mojo/class-use/JsonSchemaMojo.html +++ b/docs/apidocs/oracle/kubernetes/json/mojo/class-use/JsonSchemaMojo.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.json.mojo.JsonSchemaMojo (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.json.mojo.JsonSchemaMojo (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.json.mojo.JsonSchemaMojo

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/json/mojo/class-use/Main.html b/docs/apidocs/oracle/kubernetes/json/mojo/class-use/Main.html index 122fff0db09..4a1975578eb 100644 --- a/docs/apidocs/oracle/kubernetes/json/mojo/class-use/Main.html +++ b/docs/apidocs/oracle/kubernetes/json/mojo/class-use/Main.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.json.mojo.Main (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.json.mojo.Main (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.json.mojo.Main

    @@ -147,5 +142,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/json/mojo/class-use/MainImpl.html b/docs/apidocs/oracle/kubernetes/json/mojo/class-use/MainImpl.html index a66a1f128d1..8d221cae848 100644 --- a/docs/apidocs/oracle/kubernetes/json/mojo/class-use/MainImpl.html +++ b/docs/apidocs/oracle/kubernetes/json/mojo/class-use/MainImpl.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.json.mojo.MainImpl (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.json.mojo.MainImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.json.mojo.MainImpl

    @@ -99,5 +94,7 @@

    Use

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/json/mojo/package-summary.html b/docs/apidocs/oracle/kubernetes/json/mojo/package-summary.html index 922d31fe379..ff2ad13db8f 100644 --- a/docs/apidocs/oracle/kubernetes/json/mojo/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/json/mojo/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.json.mojo (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.json.mojo (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.json.mojo

    @@ -146,5 +141,7 @@

    Package oracle.kubernetes.json.mojo

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/json/mojo/package-tree.html b/docs/apidocs/oracle/kubernetes/json/mojo/package-tree.html index bd818c39fcd..cd3197ac85e 100644 --- a/docs/apidocs/oracle/kubernetes/json/mojo/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/json/mojo/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.json.mojo Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.json.mojo Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.json.mojo

    @@ -125,5 +120,7 @@

    Interface Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/json/mojo/package-use.html b/docs/apidocs/oracle/kubernetes/json/mojo/package-use.html index 1a054a86c96..406120cc0ff 100644 --- a/docs/apidocs/oracle/kubernetes/json/mojo/package-use.html +++ b/docs/apidocs/oracle/kubernetes/json/mojo/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.json.mojo (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.json.mojo (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.json.mojo

    @@ -144,5 +139,7 @@

    Uses of Pa

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/json/package-summary.html b/docs/apidocs/oracle/kubernetes/json/package-summary.html index bf8970f58bc..51dffca5d9f 100644 --- a/docs/apidocs/oracle/kubernetes/json/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/json/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.json (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.json (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.json

    @@ -170,5 +165,7 @@

    Package oracle.kubernetes.json

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/json/package-tree.html b/docs/apidocs/oracle/kubernetes/json/package-tree.html index 853ac1130b7..5e43e7c74df 100644 --- a/docs/apidocs/oracle/kubernetes/json/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/json/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.json Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.json Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.json

    @@ -125,5 +120,7 @@

    Annotation Type Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/json/package-use.html b/docs/apidocs/oracle/kubernetes/json/package-use.html index 12694d3f8f5..f5b30e52145 100644 --- a/docs/apidocs/oracle/kubernetes/json/package-use.html +++ b/docs/apidocs/oracle/kubernetes/json/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.json (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.json (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.json

    @@ -175,5 +170,7 @@

    Uses of Package

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/ConfigMapWatcher.html b/docs/apidocs/oracle/kubernetes/operator/ConfigMapWatcher.html index 710d42467a1..ceec4c71943 100644 --- a/docs/apidocs/oracle/kubernetes/operator/ConfigMapWatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/ConfigMapWatcher.html @@ -2,10 +2,10 @@ - -ConfigMapWatcher (weblogic-kubernetes-operator 2.6.0 API) + +ConfigMapWatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class ConfigMapWatcher

    @@ -136,15 +131,22 @@

    Method Summary

    +java.lang.String +getNamespace() + +
    Gets the Kubernetes namespace associated with the watcher.
    + + + WatchI<io.kubernetes.client.openapi.models.V1ConfigMap> initiateWatch​(WatchBuilder watchBuilder)
    Initiates a watch by using the watch builder to request any updates for the specified watcher.
    - + protected boolean -isStopping() +isStopping()   @@ -210,6 +212,17 @@

    init

  • +

    getNamespace

    +
    public java.lang.String getNamespace()
    +
    Gets the Kubernetes namespace associated with the watcher.
    +
    +
    Returns:
    +
    String object or null if the watcher is not namespaced
    +
    +
    +
  • +
  • +

    isStopping

    protected boolean isStopping()
    @@ -220,8 +233,8 @@

    isStopping

    - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/DomainPresence.html b/docs/apidocs/oracle/kubernetes/operator/DomainPresence.html index 899cb3ed871..a7c58e166c6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/DomainPresence.html +++ b/docs/apidocs/oracle/kubernetes/operator/DomainPresence.html @@ -2,10 +2,10 @@ - -DomainPresence (weblogic-kubernetes-operator 2.6.0 API) + +DomainPresence (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Class DomainPresence

    @@ -158,8 +153,8 @@

    DomainPresence

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/DomainProcessor.html b/docs/apidocs/oracle/kubernetes/operator/DomainProcessor.html index 52417cfd0c9..5f9e42a879e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/DomainProcessor.html +++ b/docs/apidocs/oracle/kubernetes/operator/DomainProcessor.html @@ -2,10 +2,10 @@ - -DomainProcessor (weblogic-kubernetes-operator 2.6.0 API) + +DomainProcessor (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Interface DomainProcessor

    @@ -122,45 +117,47 @@

    Method Summary

    -void -dispatchConfigMapWatch​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1ConfigMap> item) +MakeRightDomainOperation +createMakeRightOperation​(DomainPresenceInfo liveInfo)   -void -dispatchDomainWatch​(io.kubernetes.client.util.Watch.Response<Domain> item) +MakeRightDomainOperation +createMakeRightOperation​(Domain liveDomain)   void -dispatchEventWatch​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1Event> item) +dispatchConfigMapWatch​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1ConfigMap> item)   void -dispatchPodWatch​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1Pod> item) +dispatchDomainWatch​(io.kubernetes.client.util.Watch.Response<Domain> item)   void -dispatchServiceWatch​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1Service> item) +dispatchEventWatch​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1Event> item)   void -makeRightDomainPresence​(DomainPresenceInfo info, -boolean explicitRecheck, -boolean isDeleting, -boolean isWillInterrupt) +dispatchPodWatch​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1Pod> item)   void -reportSuspendedFibers() +dispatchServiceWatch​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1Service> item)   void +reportSuspendedFibers() +  + + +void stopNamespace​(java.lang.String ns)   @@ -183,11 +180,14 @@

    Method Details

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/DomainProcessorDelegate.html b/docs/apidocs/oracle/kubernetes/operator/DomainProcessorDelegate.html index 5459a672477..ce7746084c5 100644 --- a/docs/apidocs/oracle/kubernetes/operator/DomainProcessorDelegate.html +++ b/docs/apidocs/oracle/kubernetes/operator/DomainProcessorDelegate.html @@ -2,10 +2,10 @@ - -DomainProcessorDelegate (weblogic-kubernetes-operator 2.6.0 API) + +DomainProcessorDelegate (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Interface DomainProcessorDelegate

    @@ -140,32 +135,39 @@

    Method Summary

    +SemanticVersion +getProductVersion() + +
    Returns the version of the operator.
    + + + io.kubernetes.client.openapi.models.V1SubjectRulesReviewStatus getSubjectRulesReviewStatus​(java.lang.String namespace)   - + KubernetesVersion getVersion()
    Returns the version of the Kubernetes environment in which the operator is running.
    - + boolean isNamespaceRunning​(java.lang.String namespace)
    Returns true if the namespace is running.
    - + void runSteps​(Step firstStep)
    Runs a chain of steps.
    - + java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay​(java.lang.Runnable command, long initialDelay, @@ -248,6 +250,17 @@

    getVersion

  • +

    getProductVersion

    +
    SemanticVersion getProductVersion()
    +
    Returns the version of the operator.
    +
    +
    Returns:
    +
    an object that represents the semantic version
    +
    +
    +
  • +
  • +

    createFiberGate

    FiberGate createFiberGate()
    Creates a new FiberGate.
    @@ -293,8 +306,8 @@

    - +
    +

    Class DomainProcessorImpl

    @@ -152,58 +147,58 @@

    Method Summary

    +oracle.kubernetes.operator.DomainProcessorImpl.MakeRightDomainOperationImpl +createMakeRightOperation​(DomainPresenceInfo liveInfo) +  + + +MakeRightDomainOperation +createMakeRightOperation​(Domain liveDomain) +  + + void dispatchConfigMapWatch​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1ConfigMap> item)
    Dispatch config map watch event.
    - + void dispatchDomainWatch​(io.kubernetes.client.util.Watch.Response<Domain> item)
    Dispatch the Domain event to the appropriate handler.
    - + void dispatchEventWatch​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1Event> item)
    Dispatch event watch event.
    - + void dispatchPodWatch​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1Pod> item)
    Dispatch pod watch event.
    - + void dispatchServiceWatch​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1Service> item)
    Dispatch service watch event.
    - -void -makeRightDomainPresence​(DomainPresenceInfo info, -boolean explicitRecheck, -boolean isDeleting, -boolean isWillInterrupt) - -
    Begin activity to align domain status with domain resource.
    - - - + void reportSuspendedFibers()
    Report on currently suspended fibers.
    - + void stopNamespace​(java.lang.String ns) @@ -340,20 +335,21 @@

    dispat

  • -

    makeRightDomainPresence

    -
    public void makeRightDomainPresence​(DomainPresenceInfo info, -boolean explicitRecheck, -boolean isDeleting, -boolean isWillInterrupt)
    -
    Begin activity to align domain status with domain resource.
    +

    createMakeRightOperation

    +
    public oracle.kubernetes.operator.DomainProcessorImpl.MakeRightDomainOperationImpl createMakeRightOperation​(DomainPresenceInfo liveInfo)
    Specified by:
    -
    makeRightDomainPresence in interface DomainProcessor
    -
    Parameters:
    -
    info - domain presence info
    -
    explicitRecheck - if explicit recheck
    -
    isDeleting - if is deleting domain
    -
    isWillInterrupt - if will interrupt already running activities
    +
    createMakeRightOperation in interface DomainProcessor
    +
    +
    +
  • +
  • +
    +

    createMakeRightOperation

    +
    public MakeRightDomainOperation createMakeRightOperation​(Domain liveDomain)
    +
    +
    Specified by:
    +
    createMakeRightOperation in interface DomainProcessor
  • @@ -363,8 +359,8 @@

    - +
    +

    Enum DomainSourceType

    @@ -139,10 +134,14 @@

    Enum Constant Summary

    -Image +FromModel   +Image +  + + PersistentVolume   @@ -158,7 +157,7 @@

    Enum Constant Summary

    Method Summary

    -
    +
    @@ -170,13 +169,23 @@

    Method Summary

    + + + + + + + + + + - + - + - + + + + + + + + + + + + + + + + @@ -269,6 +279,36 @@

    ALL_STOPPED_AVAILABLE_REASON

    +
  • +
    +

    BAD_DOMAIN

    +
    public static final java.lang.String BAD_DOMAIN
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    ERR_INTROSPECTOR

    +
    public static final java.lang.String ERR_INTROSPECTOR
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    BAD_TOPOLOGY

    +
    public static final java.lang.String BAD_TOPOLOGY
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • @@ -362,8 +402,8 @@

    - +
    +

    Class DomainWatcher

    @@ -136,15 +131,22 @@

    Method Summary

    + + + + + - + - + @@ -210,6 +212,17 @@

    init
  • +

    getNamespace

    +
    public java.lang.String getNamespace()
    +
    Gets the Kubernetes namespace associated with the watcher.
    +
    +
    Returns:
    +
    String object or null if the watcher is not namespaced
    +
    +
    +
  • +
  • +

    isStopping

    protected boolean isStopping()
    @@ -220,8 +233,8 @@

    isStopping

    - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/EventWatcher.html b/docs/apidocs/oracle/kubernetes/operator/EventWatcher.html index 928a1bc530a..0ce7636d68b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/EventWatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/EventWatcher.html @@ -2,10 +2,10 @@ - -EventWatcher (weblogic-kubernetes-operator 2.6.0 API) + +EventWatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class EventWatcher

    @@ -137,15 +132,22 @@

    Method Summary

  • + + + + + - + - + @@ -213,6 +215,17 @@

    init
  • +

    getNamespace

    +
    public java.lang.String getNamespace()
    +
    Gets the Kubernetes namespace associated with the watcher.
    +
    +
    Returns:
    +
    String object or null if the watcher is not namespaced
    +
    +
    +
  • +
  • +

    isStopping

    protected boolean isStopping()
    @@ -223,8 +236,8 @@

    isStopping

    - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/ImagePullPolicy.html b/docs/apidocs/oracle/kubernetes/operator/ImagePullPolicy.html index 5fc69379457..4483417d9b6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/ImagePullPolicy.html +++ b/docs/apidocs/oracle/kubernetes/operator/ImagePullPolicy.html @@ -2,10 +2,10 @@ - -ImagePullPolicy (weblogic-kubernetes-operator 2.6.0 API) + +ImagePullPolicy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Enum ImagePullPolicy

    @@ -280,8 +275,8 @@

    valueOf

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/VersionConstants.html b/docs/apidocs/oracle/kubernetes/operator/IntrospectorConfigMapKeys.html similarity index 65% rename from docs/apidocs/oracle/kubernetes/operator/VersionConstants.html rename to docs/apidocs/oracle/kubernetes/operator/IntrospectorConfigMapKeys.html index d9c6b400af5..3a4f3e824fd 100644 --- a/docs/apidocs/oracle/kubernetes/operator/VersionConstants.html +++ b/docs/apidocs/oracle/kubernetes/operator/IntrospectorConfigMapKeys.html @@ -2,11 +2,11 @@ - -VersionConstants (weblogic-kubernetes-operator 2.6.0 API) + +IntrospectorConfigMapKeys (weblogic-kubernetes-operator 3.0.0 API) - - + + @@ -25,9 +25,9 @@ -
    +
    +
    - - +
    - +
    +
    -

    Interface VersionConstants

    +

    Interface IntrospectorConfigMapKeys


    -
    public interface VersionConstants
    +
    public interface IntrospectorConfigMapKeys
    +
    Keys in the generated introspector config map.
      @@ -112,28 +108,45 @@

      Field Summary

  • - - + + - - + + - - + + - - + + - - + + + + + + +
    abstract java.lang.StringgetDefaultDomainHome​(java.lang.String uid) 
    booleanhasLogHomeByDefault() 
    static DomainSourceType valueOf​(java.lang.String name)
    Returns the enum constant of this type with the specified name.
    static DomainSourceType[] values() @@ -223,6 +232,12 @@

    PersistentVolume

    public static final DomainSourceType PersistentVolume
    +
  • +
    +

    FromModel

    +
    public static final DomainSourceType FromModel
    +
    +
  • @@ -264,14 +279,26 @@

    valueOf

    +
  • +
    +

    hasLogHomeByDefault

    +
    public boolean hasLogHomeByDefault()
    +
    +
  • +
  • +
    +

    getDefaultDomainHome

    +
    public abstract java.lang.String getDefaultDomainHome​(java.lang.String uid)
    +
    +
  • - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/DomainStatusUpdater.html b/docs/apidocs/oracle/kubernetes/operator/DomainStatusUpdater.html index 5da9432ad1d..0988e14480a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/DomainStatusUpdater.html +++ b/docs/apidocs/oracle/kubernetes/operator/DomainStatusUpdater.html @@ -2,10 +2,10 @@ - -DomainStatusUpdater (weblogic-kubernetes-operator 2.6.0 API) + +DomainStatusUpdater (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class DomainStatusUpdater

    @@ -130,16 +125,31 @@

    Field Summary

    static java.lang.StringINSPECTING_DOMAIN_PROGRESS_REASONBAD_DOMAIN  
    static java.lang.StringMANAGED_SERVERS_STARTING_PROGRESS_REASONBAD_TOPOLOGY 
    static java.lang.StringERR_INTROSPECTOR 
    static java.lang.StringINSPECTING_DOMAIN_PROGRESS_REASON  
    static java.lang.StringMANAGED_SERVERS_STARTING_PROGRESS_REASON 
    static java.lang.String SERVERS_READY_REASON  
    java.lang.StringgetNamespace() +
    Gets the Kubernetes namespace associated with the watcher.
    +
    WatchI<Domain> initiateWatch​(WatchBuilder watchBuilder)
    Initiates a watch by using the watch builder to request any updates for the specified watcher.
    protected booleanisStopping()isStopping()  
    java.lang.StringgetNamespace() +
    Gets the Kubernetes namespace associated with the watcher.
    +
    WatchI<io.kubernetes.client.openapi.models.V1Event> initiateWatch​(WatchBuilder watchBuilder)
    Initiates a watch by using the watch builder to request any updates for the specified watcher.
    protected booleanisStopping()isStopping()  
    static java.lang.StringDEFAULT_DOMAIN_VERSION DOMAIN_INPUTS_HASH +
    A hash of the Model-in-Image inputs.
    +
    static java.lang.StringDOMAIN_V1 DOMAIN_RESTART_VERSION +
    The last value of the restartVersion field from the domain resource.
    +
    static java.lang.StringDOMAIN_V2 DOMAINZIP_HASH +
    A hash computed from the WebLogic domain.
    +
    static java.lang.StringOPERATOR_V1 SECRETS_MD_5 +
    An MD5 has of the Model-in-Image secrets.
    +
    static java.lang.StringOPERATOR_V2 SIT_CONFIG_FILE_PREFIX +
    The prefix for a number of keys which may appear in the introspector config map.
    +
    static java.lang.StringTOPOLOGY_YAML +
    The topology generated from the WebLogic domain.
    +
    @@ -153,51 +166,68 @@

    Field Details

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/JobWatcher.html b/docs/apidocs/oracle/kubernetes/operator/JobWatcher.html index 981442215f7..b974711a3d3 100644 --- a/docs/apidocs/oracle/kubernetes/operator/JobWatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/JobWatcher.html @@ -2,10 +2,10 @@ - -JobWatcher (weblogic-kubernetes-operator 2.6.0 API) + +JobWatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class JobWatcher

    @@ -139,39 +134,46 @@

    Method Summary

    +java.lang.String +getNamespace() + +
    Gets the Kubernetes namespace associated with the watcher.
    + + + static JobWatcher getOrCreateFor​(Domain domain)
    Returns a cached JobWatcher, if present; otherwise, creates a new one.
    - + WatchI<io.kubernetes.client.openapi.models.V1Job> initiateWatch​(WatchBuilder watchBuilder)
    Initiates a watch by using the watch builder to request any updates for the specified watcher.
    - + static boolean isComplete​(io.kubernetes.client.openapi.models.V1Job job)
    Test if job is complete.
    - + protected boolean -isStopping() +isStopping()   - + void receivedResponse​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1Job> item)
    receive response.
    - + Step waitForReady​(io.kubernetes.client.openapi.models.V1Job job, Step next) @@ -217,6 +219,17 @@

    getOr
  • +

    getNamespace

    +
    public java.lang.String getNamespace()
    +
    Gets the Kubernetes namespace associated with the watcher.
    +
    +
    Returns:
    +
    String object or null if the watcher is not namespaced
    +
    +
    +
  • +
  • +

    create

    public static JobWatcher create​(java.util.concurrent.ThreadFactory factory, java.lang.String ns, @@ -305,8 +318,8 @@

    isStopping

  • -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/KubernetesConstants.html b/docs/apidocs/oracle/kubernetes/operator/KubernetesConstants.html index 65ef26fcf52..a8e8bd11086 100644 --- a/docs/apidocs/oracle/kubernetes/operator/KubernetesConstants.html +++ b/docs/apidocs/oracle/kubernetes/operator/KubernetesConstants.html @@ -2,10 +2,10 @@ - -KubernetesConstants (weblogic-kubernetes-operator 2.6.0 API) + +KubernetesConstants (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Interface KubernetesConstants

    @@ -118,34 +113,44 @@

    Field Summary

    static java.lang.String -CONTAINER_NAME +API_VERSION_WEBLOGIC_ORACLE   static java.lang.String -CRD_NAME +CONTAINER_NAME   +static java.lang.String +CRD_NAME +  + + static boolean DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE   - + static boolean DEFAULT_HTTP_ACCESS_LOG_IN_LOG_HOME   - + static java.lang.String DEFAULT_IMAGE   - + static boolean DEFAULT_INCLUDE_SERVER_OUT_IN_POD_LOG   + +static int +DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP +  + static java.lang.String DOMAIN @@ -153,77 +158,77 @@

    Field Summary

    static java.lang.String -DOMAIN_CONFIG_MAP_NAME +DOMAIN_DEBUG_CONFIG_MAP_SUFFIX   static java.lang.String -DOMAIN_DEBUG_CONFIG_MAP_SUFFIX +DOMAIN_GROUP   static java.lang.String -DOMAIN_GROUP +DOMAIN_PATH   static java.lang.String -DOMAIN_PATH +DOMAIN_PLURAL   static java.lang.String -DOMAIN_PLURAL +DOMAIN_SCALE_PATH   static java.lang.String -DOMAIN_SCALE_PATH +DOMAIN_SHORT   static java.lang.String -DOMAIN_SHORT +DOMAIN_SINGULAR   static java.lang.String -DOMAIN_SINGULAR +DOMAIN_SPECIFIC_PATH   static java.lang.String -DOMAIN_SPECIFIC_PATH +DOMAIN_STATUS_PATH   static java.lang.String -DOMAIN_STATUS_PATH +DOMAIN_VERSION   static java.lang.String -DOMAIN_VERSION +GRACEFUL_SHUTDOWNTYPE   static java.lang.String -GRACEFUL_SHUTDOWNTYPE +IFNOTPRESENT_IMAGEPULLPOLICY   static java.lang.String -IFNOTPRESENT_IMAGEPULLPOLICY +INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX   static java.lang.String -INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX +LATEST_IMAGE_SUFFIX   static java.lang.String -LATEST_IMAGE_SUFFIX +SCRIPT_CONFIG_MAP_NAME   @@ -346,6 +351,16 @@

    DOMAIN_VERSION

  • +

    API_VERSION_WEBLOGIC_ORACLE

    +
    static final java.lang.String API_VERSION_WEBLOGIC_ORACLE
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +

    DOMAIN_PATH

    static final java.lang.String DOMAIN_PATH
    @@ -416,6 +431,16 @@

    DEFAULT_ALLOW_REPL

  • +

    DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP

    +
    static final int DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +

    CONTAINER_NAME

    static final java.lang.String CONTAINER_NAME
    @@ -426,11 +451,11 @@

    CONTAINER_NAME

  • -

    DOMAIN_CONFIG_MAP_NAME

    -
    static final java.lang.String DOMAIN_CONFIG_MAP_NAME
    +

    SCRIPT_CONFIG_MAP_NAME

    +
    static final java.lang.String SCRIPT_CONFIG_MAP_NAME
    See Also:
    -
    Constant Field Values
    +
    Constant Field Values
  • @@ -466,8 +491,8 @@

    GRACEFUL_SHUTDOWNTYPE

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/LabelConstants.html b/docs/apidocs/oracle/kubernetes/operator/LabelConstants.html index 53a8f8088ec..37da857448d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/LabelConstants.html +++ b/docs/apidocs/oracle/kubernetes/operator/LabelConstants.html @@ -2,10 +2,10 @@ - -LabelConstants (weblogic-kubernetes-operator 2.6.0 API) + +LabelConstants (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Interface LabelConstants

    @@ -152,26 +147,41 @@

    Field Summary

    static java.lang.String +INTROSPECTION_STATE_LABEL +  + + +static java.lang.String JOBNAME_LABEL   + +static java.lang.String +MODEL_IN_IMAGE_DOMAINZIP_HASH +  + static java.lang.String -OPERATORNAME_LABEL +MODEL_IN_IMAGE_MODEL_SECRETS_HASH   static java.lang.String -RESOURCE_VERSION_LABEL +OPERATOR_VERISON   static java.lang.String -SERVERNAME_LABEL +OPERATORNAME_LABEL   static java.lang.String +SERVERNAME_LABEL +  + + +static java.lang.String SERVERRESTARTVERSION_LABEL   @@ -225,11 +235,11 @@

    Field Details

    @@ -381,8 +421,8 @@

    getCreatedbyOperatorSelector

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/Main.html b/docs/apidocs/oracle/kubernetes/operator/Main.html index d15c6110be1..f7fa477d36d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/Main.html +++ b/docs/apidocs/oracle/kubernetes/operator/Main.html @@ -2,10 +2,10 @@ - -Main (weblogic-kubernetes-operator 2.6.0 API) + +Main (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    +
    +
    - - +
    - +
    +

    Class Main

    @@ -104,33 +99,6 @@

    Class Main

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/MakeRightDomainOperation.html b/docs/apidocs/oracle/kubernetes/operator/MakeRightDomainOperation.html new file mode 100644 index 00000000000..a59e16409a1 --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/operator/MakeRightDomainOperation.html @@ -0,0 +1,317 @@ + + + + + +MakeRightDomainOperation (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    + +
    + +

    Interface MakeRightDomainOperation

    +
    +
    +
    +
    +
    public interface MakeRightDomainOperation
    +
    Defines the operation to bring a running domain into compliance with its domain resource and introspection result.
    +
    +
    + +
    +
    + +
    +
    + +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/ModelInImageDomainType.html b/docs/apidocs/oracle/kubernetes/operator/ModelInImageDomainType.html new file mode 100644 index 00000000000..6e513fa219d --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/operator/ModelInImageDomainType.html @@ -0,0 +1,328 @@ + + + + + +ModelInImageDomainType (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    + +
    + +

    Enum ModelInImageDomainType

    +
    +
    +
    java.lang.Object +
    java.lang.Enum<ModelInImageDomainType> +
    oracle.kubernetes.operator.ModelInImageDomainType
    +
    +
    +
    +
    +
    All Implemented Interfaces:
    +
    java.io.Serializable, java.lang.Comparable<ModelInImageDomainType>, java.lang.constant.Constable
    +
    +
    +
    public enum ModelInImageDomainType
    +extends java.lang.Enum<ModelInImageDomainType>
    +
    +
    +
      + +
    • +
      + + +

      Nested Class Summary

      +
      +

      Nested classes/interfaces inherited from class java.lang.Enum

      + + +java.lang.Enum.EnumDesc<E extends java.lang.Enum<E>>
      +
      +
    • + +
    • +
      + + +

      Enum Constant Summary

      +
      + + + + + + + + + + + + + + + + + + + + + + +
      Enum Constants 
      Enum ConstantDescription
      JRF 
      RestrictedJRF 
      WLS 
      +
      +
      +
    • + +
    • +
      + + +

      Method Summary

      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + +
      Modifier and TypeMethodDescription
      static ModelInImageDomainTypevalueOf​(java.lang.String name) +
      Returns the enum constant of this type with the specified name.
      +
      static ModelInImageDomainType[]values() +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      +
      +
      +

      Methods inherited from class java.lang.Enum

      + + +clone, compareTo, describeConstable, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
      +
      +

      Methods inherited from class java.lang.Object

      + + +getClass, notify, notifyAll, wait, wait, wait
      +
      +
    • +
    +
    +
    +
      + +
    • +
      + + +

      Enum Constant Details

      + +
      +
    • + +
    • +
      + + +

      Method Details

      +
        +
      • +
        +

        values

        +
        public static ModelInImageDomainType[] values()
        +
        Returns an array containing the constants of this enum type, in +the order they are declared.
        +
        +
        Returns:
        +
        an array containing the constants of this enum type, in the order they are declared
        +
        +
        +
      • +
      • +
        +

        valueOf

        +
        public static ModelInImageDomainType valueOf​(java.lang.String name)
        +
        Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
        +
        +
        Parameters:
        +
        name - the name of the enum constant to be returned.
        +
        Returns:
        +
        the enum constant with the specified name
        +
        Throws:
        +
        java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
        +
        java.lang.NullPointerException - if the argument is null
        +
        +
        +
      • +
      +
      +
    • +
    +
    +
    + +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/NamespaceStatus.html b/docs/apidocs/oracle/kubernetes/operator/NamespaceStatus.html index 77d84d611af..2cd46352ed2 100644 --- a/docs/apidocs/oracle/kubernetes/operator/NamespaceStatus.html +++ b/docs/apidocs/oracle/kubernetes/operator/NamespaceStatus.html @@ -2,10 +2,10 @@ - -NamespaceStatus (weblogic-kubernetes-operator 2.6.0 API) + +NamespaceStatus (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class NamespaceStatus

    @@ -212,8 +207,8 @@

    getRulesReviewStatus

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/NamespaceWatcher.html b/docs/apidocs/oracle/kubernetes/operator/NamespaceWatcher.html index dc47d39fe4e..3753470cb1b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/NamespaceWatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/NamespaceWatcher.html @@ -2,10 +2,10 @@ - -NamespaceWatcher (weblogic-kubernetes-operator 2.6.0 API) + +NamespaceWatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class NamespaceWatcher

    @@ -135,15 +130,22 @@

    Method Summary

    +java.lang.String +getNamespace() + +
    Gets the Kubernetes namespace associated with the watcher.
    + + + WatchI<io.kubernetes.client.openapi.models.V1Namespace> initiateWatch​(WatchBuilder watchBuilder)
    Initiates a watch by using the watch builder to request any updates for the specified watcher.
    - + protected boolean -isStopping() +isStopping()   @@ -207,6 +209,17 @@

    init
  • +

    getNamespace

    +
    public java.lang.String getNamespace()
    +
    Gets the Kubernetes namespace associated with the watcher.
    +
    +
    Returns:
    +
    String object or null if the watcher is not namespaced
    +
    +
    +
  • +
  • +

    isStopping

    protected boolean isStopping()
    @@ -217,8 +230,8 @@

    isStopping

  • -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/OperatorLiveness.html b/docs/apidocs/oracle/kubernetes/operator/OperatorLiveness.html index 9474f6420c5..25316eef466 100644 --- a/docs/apidocs/oracle/kubernetes/operator/OperatorLiveness.html +++ b/docs/apidocs/oracle/kubernetes/operator/OperatorLiveness.html @@ -2,10 +2,10 @@ - -OperatorLiveness (weblogic-kubernetes-operator 2.6.0 API) + +OperatorLiveness (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class OperatorLiveness

    @@ -212,8 +207,8 @@

    run

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/OperatorReady.html b/docs/apidocs/oracle/kubernetes/operator/OperatorReady.html index 98121e6592a..dac7b0cc13a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/OperatorReady.html +++ b/docs/apidocs/oracle/kubernetes/operator/OperatorReady.html @@ -2,10 +2,10 @@ - -OperatorReady (weblogic-kubernetes-operator 2.6.0 API) + +OperatorReady (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class OperatorReady

    @@ -210,8 +205,8 @@

    create

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/OverrideDistributionStrategy.html b/docs/apidocs/oracle/kubernetes/operator/OverrideDistributionStrategy.html new file mode 100644 index 00000000000..ffddcc05aac --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/operator/OverrideDistributionStrategy.html @@ -0,0 +1,361 @@ + + + + + +OverrideDistributionStrategy (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    + +
    + +

    Enum OverrideDistributionStrategy

    +
    +
    +
    java.lang.Object +
    java.lang.Enum<OverrideDistributionStrategy> +
    oracle.kubernetes.operator.OverrideDistributionStrategy
    +
    +
    +
    +
    +
    All Implemented Interfaces:
    +
    java.io.Serializable, java.lang.Comparable<OverrideDistributionStrategy>, java.lang.constant.Constable
    +
    +
    +
    public enum OverrideDistributionStrategy
    +extends java.lang.Enum<OverrideDistributionStrategy>
    +
    +
    +
      + +
    • +
      + + +

      Nested Class Summary

      +
      +

      Nested classes/interfaces inherited from class java.lang.Enum

      + + +java.lang.Enum.EnumDesc<E extends java.lang.Enum<E>>
      +
      +
    • + +
    • +
      + + +

      Enum Constant Summary

      +
      + + + + + + + + + + + + + + + + + + +
      Enum Constants 
      Enum ConstantDescription
      DYNAMIC 
      ON_RESTART 
      +
      +
      +
    • + +
    • +
      + + +

      Field Summary

      +
      + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeFieldDescription
      static OverrideDistributionStrategyDEFAULT 
      +
      +
      +
    • + +
    • +
      + + +

      Method Summary

      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + +
      Modifier and TypeMethodDescription
      static OverrideDistributionStrategyvalueOf​(java.lang.String name) +
      Returns the enum constant of this type with the specified name.
      +
      static OverrideDistributionStrategy[]values() +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      +
      +
      +

      Methods inherited from class java.lang.Enum

      + + +clone, compareTo, describeConstable, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
      +
      +

      Methods inherited from class java.lang.Object

      + + +getClass, notify, notifyAll, wait, wait, wait
      +
      +
    • +
    +
    +
    +
      + +
    • +
      + + +

      Enum Constant Details

      + +
      +
    • + +
    • +
      + + +

      Field Details

      + +
      +
    • + +
    • +
      + + +

      Method Details

      +
        +
      • +
        +

        values

        +
        public static OverrideDistributionStrategy[] values()
        +
        Returns an array containing the constants of this enum type, in +the order they are declared.
        +
        +
        Returns:
        +
        an array containing the constants of this enum type, in the order they are declared
        +
        +
        +
      • +
      • +
        +

        valueOf

        +
        public static OverrideDistributionStrategy valueOf​(java.lang.String name)
        +
        Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
        +
        +
        Parameters:
        +
        name - the name of the enum constant to be returned.
        +
        Returns:
        +
        the enum constant with the specified name
        +
        Throws:
        +
        java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
        +
        java.lang.NullPointerException - if the argument is null
        +
        +
        +
      • +
      +
      +
    • +
    +
    +
    + +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/Pair.html b/docs/apidocs/oracle/kubernetes/operator/Pair.html index 6ed1f525710..235007c244c 100644 --- a/docs/apidocs/oracle/kubernetes/operator/Pair.html +++ b/docs/apidocs/oracle/kubernetes/operator/Pair.html @@ -2,10 +2,10 @@ - -Pair (weblogic-kubernetes-operator 2.6.0 API) + +Pair (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class Pair<L,​R>

    @@ -261,8 +256,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/PodAwaiterStepFactory.html b/docs/apidocs/oracle/kubernetes/operator/PodAwaiterStepFactory.html index 15b27286242..9f236d38f00 100644 --- a/docs/apidocs/oracle/kubernetes/operator/PodAwaiterStepFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/PodAwaiterStepFactory.html @@ -2,10 +2,10 @@ - -PodAwaiterStepFactory (weblogic-kubernetes-operator 2.6.0 API) + +PodAwaiterStepFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/PodWatcher.html b/docs/apidocs/oracle/kubernetes/operator/PodWatcher.html index f080d66203e..fbd714c7363 100644 --- a/docs/apidocs/oracle/kubernetes/operator/PodWatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/PodWatcher.html @@ -2,10 +2,10 @@ - -PodWatcher (weblogic-kubernetes-operator 2.6.0 API) + +PodWatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class PodWatcher

    @@ -140,25 +135,32 @@

    Method Summary

    +java.lang.String +getNamespace() + +
    Gets the Kubernetes namespace associated with the watcher.
    + + + WatchI<io.kubernetes.client.openapi.models.V1Pod> initiateWatch​(WatchBuilder watchBuilder)
    Initiates a watch by using the watch builder to request any updates for the specified watcher.
    - + protected boolean -isStopping() +isStopping()   - + void receivedResponse​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1Pod> item)
    Receive response.
    - + Step waitForDelete​(io.kubernetes.client.openapi.models.V1Pod pod, Step next) @@ -166,7 +168,7 @@

    Method Summary

    Waits until the Pod is deleted.
    - + Step waitForReady​(io.kubernetes.client.openapi.models.V1Pod pod, Step next) @@ -237,6 +239,17 @@

    init
  • +

    getNamespace

    +
    public java.lang.String getNamespace()
    +
    Gets the Kubernetes namespace associated with the watcher.
    +
    +
    Returns:
    +
    String object or null if the watcher is not namespaced
    +
    +
    +
  • +
  • +

    receivedResponse

    public void receivedResponse​(io.kubernetes.client.util.Watch.Response<io.kubernetes.client.openapi.models.V1Pod> item)
    Receive response.
    @@ -294,8 +307,8 @@

    isStopping

  • -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/ProcessingConstants.html b/docs/apidocs/oracle/kubernetes/operator/ProcessingConstants.html index 733e771aafe..abe9b685519 100644 --- a/docs/apidocs/oracle/kubernetes/operator/ProcessingConstants.html +++ b/docs/apidocs/oracle/kubernetes/operator/ProcessingConstants.html @@ -2,10 +2,10 @@ - -ProcessingConstants (weblogic-kubernetes-operator 2.6.0 API) + +ProcessingConstants (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Interface ProcessingConstants

    @@ -123,17 +118,17 @@

    Field Summary

    static java.lang.String -DOMAIN_INTROSPECTOR_JOB +DOMAIN_INTROSPECT_REQUESTED   static java.lang.String -DOMAIN_INTROSPECTOR_LOG_RESULT +DOMAIN_INTROSPECTOR_JOB   static java.lang.String -DOMAIN_RESTART_VERSION +DOMAIN_INTROSPECTOR_LOG_RESULT   @@ -143,19 +138,29 @@

    Field Summary

    static java.lang.String -ENCODED_CREDENTIALS +DOMAIN_VALIDATION_ERRORS   static java.lang.String -ENVVARS +ENCODED_CREDENTIALS   static java.lang.String +ENVVARS +  + + +static java.lang.String FIBER_COMPONENT_NAME   + +static java.lang.String +INTROSPECTOR_JOB_FAILURE_LOGGED +  + static java.lang.String JOB_POD_NAME @@ -168,47 +173,56 @@

    Field Summary

    static java.lang.String -PODWATCHER_COMPONENT_NAME -  +MAKE_RIGHT_DOMAIN_OPERATION + +
    Key to an object of type MakeRightDomainOperation.
    + static java.lang.String -REMAINING_SERVERS_HEALTH_TO_READ +PODWATCHER_COMPONENT_NAME   static java.lang.String -SCRIPT_CONFIG_MAP +REMAINING_SERVERS_HEALTH_TO_READ   static java.lang.String -SERVER_HEALTH_MAP +SCRIPT_CONFIG_MAP   static java.lang.String -SERVER_NAME +SERVER_HEALTH_MAP   static java.lang.String -SERVER_SCAN +SERVER_NAME   static java.lang.String +SERVER_SCAN + +
    key to an object of type WlsServerConfig.
    + + + +static java.lang.String SERVER_STATE_MAP   - + static java.lang.String SERVERS_TO_ROLL   - + static java.lang.String -SIT_CONFIG_MAP +WAIT_FOR_POD_READY   @@ -271,6 +285,7 @@

    PODWATCHER_COMPONENT_NAME

    SERVER_SCAN

    static final java.lang.String SERVER_SCAN
    +
    key to an object of type WlsServerConfig.
    See Also:
    Constant Field Values
    @@ -389,41 +404,72 @@

    DOMAIN_INTROSPECTOR_LOG_RESULT
  • -

    SIT_CONFIG_MAP

    -
    static final java.lang.String SIT_CONFIG_MAP
    +

    DOMAIN_INTROSPECT_REQUESTED

    +
    static final java.lang.String DOMAIN_INTROSPECT_REQUESTED
    See Also:
    -
    Constant Field Values
    +
    Constant Field Values
  • -

    DOMAIN_RESTART_VERSION

    -
    static final java.lang.String DOMAIN_RESTART_VERSION
    +

    REMAINING_SERVERS_HEALTH_TO_READ

    +
    static final java.lang.String REMAINING_SERVERS_HEALTH_TO_READ
    See Also:
    -
    Constant Field Values
    +
    Constant Field Values
  • -

    REMAINING_SERVERS_HEALTH_TO_READ

    -
    static final java.lang.String REMAINING_SERVERS_HEALTH_TO_READ
    +

    ENCODED_CREDENTIALS

    +
    static final java.lang.String ENCODED_CREDENTIALS
    See Also:
    -
    Constant Field Values
    +
    Constant Field Values
  • -

    ENCODED_CREDENTIALS

    -
    static final java.lang.String ENCODED_CREDENTIALS
    +

    DOMAIN_VALIDATION_ERRORS

    +
    static final java.lang.String DOMAIN_VALIDATION_ERRORS
    See Also:
    -
    Constant Field Values
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    INTROSPECTOR_JOB_FAILURE_LOGGED

    +
    static final java.lang.String INTROSPECTOR_JOB_FAILURE_LOGGED
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    WAIT_FOR_POD_READY

    +
    static final java.lang.String WAIT_FOR_POD_READY
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    MAKE_RIGHT_DOMAIN_OPERATION

    +
    static final java.lang.String MAKE_RIGHT_DOMAIN_OPERATION
    +
    Key to an object of type MakeRightDomainOperation.
    +
    +
    See Also:
    +
    Constant Field Values
  • @@ -433,8 +479,8 @@

    ENCODED_CREDENTIALS

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/ServerStartPolicy.html b/docs/apidocs/oracle/kubernetes/operator/ServerStartPolicy.html index 695a699cc42..b9ee675d35b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/ServerStartPolicy.html +++ b/docs/apidocs/oracle/kubernetes/operator/ServerStartPolicy.html @@ -2,10 +2,10 @@ - -ServerStartPolicy (weblogic-kubernetes-operator 2.6.0 API) + +ServerStartPolicy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Enum ServerStartPolicy

    @@ -334,8 +329,8 @@

    forServer

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/ServerStartState.html b/docs/apidocs/oracle/kubernetes/operator/ServerStartState.html index f6dbeb11572..f9208e91f5a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/ServerStartState.html +++ b/docs/apidocs/oracle/kubernetes/operator/ServerStartState.html @@ -2,10 +2,10 @@ - -ServerStartState (weblogic-kubernetes-operator 2.6.0 API) + +ServerStartState (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Enum ServerStartState

    @@ -270,8 +265,8 @@

    valueOf

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/ServerStatusReader.html b/docs/apidocs/oracle/kubernetes/operator/ServerStatusReader.html index 6229c4dafec..63cb6025e92 100644 --- a/docs/apidocs/oracle/kubernetes/operator/ServerStatusReader.html +++ b/docs/apidocs/oracle/kubernetes/operator/ServerStatusReader.html @@ -2,10 +2,10 @@ - -ServerStatusReader (weblogic-kubernetes-operator 2.6.0 API) + +ServerStatusReader (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Class ServerStatusReader

    @@ -114,8 +109,8 @@

    Methods inherited from class java.lang.Object

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/ServiceWatcher.html b/docs/apidocs/oracle/kubernetes/operator/ServiceWatcher.html index 016bab3dae6..5c89ba6d481 100644 --- a/docs/apidocs/oracle/kubernetes/operator/ServiceWatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/ServiceWatcher.html @@ -2,10 +2,10 @@ - -ServiceWatcher (weblogic-kubernetes-operator 2.6.0 API) + +ServiceWatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class ServiceWatcher

    @@ -136,15 +131,22 @@

    Method Summary

    +java.lang.String +getNamespace() + +
    Gets the Kubernetes namespace associated with the watcher.
    + + + WatchI<io.kubernetes.client.openapi.models.V1Service> initiateWatch​(WatchBuilder watchBuilder)
    Initiates a watch by using the watch builder to request any updates for the specified watcher.
    - + protected boolean -isStopping() +isStopping()   @@ -210,6 +212,17 @@

    init
  • +

    getNamespace

    +
    public java.lang.String getNamespace()
    +
    Gets the Kubernetes namespace associated with the watcher.
    +
    +
    Returns:
    +
    String object or null if the watcher is not namespaced
    +
    +
    +
  • +
  • +

    isStopping

    protected boolean isStopping()
    @@ -220,8 +233,8 @@

    isStopping

  • -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/ShutdownType.html b/docs/apidocs/oracle/kubernetes/operator/ShutdownType.html index 5360747b5d3..8a95a736fdb 100644 --- a/docs/apidocs/oracle/kubernetes/operator/ShutdownType.html +++ b/docs/apidocs/oracle/kubernetes/operator/ShutdownType.html @@ -2,10 +2,10 @@ - -ShutdownType (weblogic-kubernetes-operator 2.6.0 API) + +ShutdownType (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Enum ShutdownType

    @@ -270,8 +265,8 @@

    valueOf

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/SwaggerBuildHelper.html b/docs/apidocs/oracle/kubernetes/operator/SwaggerBuildHelper.html index 47796daa2d5..62a9ec7a266 100644 --- a/docs/apidocs/oracle/kubernetes/operator/SwaggerBuildHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/SwaggerBuildHelper.html @@ -2,10 +2,10 @@ - -SwaggerBuildHelper (weblogic-kubernetes-operator 2.6.0 API) + +SwaggerBuildHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class SwaggerBuildHelper

    @@ -210,8 +205,8 @@

    main

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/TuningParameters.CallBuilderTuning.html b/docs/apidocs/oracle/kubernetes/operator/TuningParameters.CallBuilderTuning.html index 9ea97344f1b..583d52202bc 100644 --- a/docs/apidocs/oracle/kubernetes/operator/TuningParameters.CallBuilderTuning.html +++ b/docs/apidocs/oracle/kubernetes/operator/TuningParameters.CallBuilderTuning.html @@ -2,10 +2,10 @@ - -TuningParameters.CallBuilderTuning (weblogic-kubernetes-operator 2.6.0 API) + +TuningParameters.CallBuilderTuning (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class TuningParameters.CallBuilderTuning

    @@ -317,8 +312,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/TuningParameters.MainTuning.html b/docs/apidocs/oracle/kubernetes/operator/TuningParameters.MainTuning.html index e1fd8287e4b..f731a6a995d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/TuningParameters.MainTuning.html +++ b/docs/apidocs/oracle/kubernetes/operator/TuningParameters.MainTuning.html @@ -2,10 +2,10 @@ - -TuningParameters.MainTuning (weblogic-kubernetes-operator 2.6.0 API) + +TuningParameters.MainTuning (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class TuningParameters.MainTuning

    @@ -387,8 +382,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/TuningParameters.PodTuning.html b/docs/apidocs/oracle/kubernetes/operator/TuningParameters.PodTuning.html index 0d4c1db68b9..eefed247a73 100644 --- a/docs/apidocs/oracle/kubernetes/operator/TuningParameters.PodTuning.html +++ b/docs/apidocs/oracle/kubernetes/operator/TuningParameters.PodTuning.html @@ -2,10 +2,10 @@ - -TuningParameters.PodTuning (weblogic-kubernetes-operator 2.6.0 API) + +TuningParameters.PodTuning (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class TuningParameters.PodTuning

    @@ -373,8 +368,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/TuningParameters.WatchTuning.html b/docs/apidocs/oracle/kubernetes/operator/TuningParameters.WatchTuning.html index acb2dd8c129..da1bea02df2 100644 --- a/docs/apidocs/oracle/kubernetes/operator/TuningParameters.WatchTuning.html +++ b/docs/apidocs/oracle/kubernetes/operator/TuningParameters.WatchTuning.html @@ -2,10 +2,10 @@ - -TuningParameters.WatchTuning (weblogic-kubernetes-operator 2.6.0 API) + +TuningParameters.WatchTuning (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class TuningParameters.WatchTuning

    @@ -126,11 +121,16 @@

    Field Summary

    int -watchLifetime +watchBackstopRecheckDelay   int +watchLifetime +  + + +int watchMinimumDelay   @@ -156,9 +156,12 @@

    Constructor Summary

    -WatchTuning​(int watchLifetime, -int watchMinimumDelay) -  +WatchTuning​(int watchLifetime, +int watchMinimumDelay, +int watchBackstopRecheckDelay) + +
    Create watch tuning.
    + @@ -232,6 +235,12 @@

    watchMinimumDelay

    public final int watchMinimumDelay
    +
  • +
    +

    watchBackstopRecheckDelay

    +
    public final int watchBackstopRecheckDelay
    +
    +
  • @@ -244,9 +253,17 @@

    Constructor Details

    • -

      WatchTuning

      +

      WatchTuning

      public WatchTuning​(int watchLifetime, -int watchMinimumDelay)
      +int watchMinimumDelay, +int watchBackstopRecheckDelay)
    +
    Create watch tuning.
    +
    +
    Parameters:
    +
    watchLifetime - Watch lifetime
    +
    watchMinimumDelay - Minimum delay before accepting new events to prevent hot loops
    +
    watchBackstopRecheckDelay - Recheck delay for get while waiting for a status to backstop missed watch events
    +
    @@ -295,8 +312,8 @@

    equals

    - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/TuningParameters.html b/docs/apidocs/oracle/kubernetes/operator/TuningParameters.html index d79f4f503de..a2933f0335d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/TuningParameters.html +++ b/docs/apidocs/oracle/kubernetes/operator/TuningParameters.html @@ -2,10 +2,10 @@ - -TuningParameters (weblogic-kubernetes-operator 2.6.0 API) + +TuningParameters (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface TuningParameters

    @@ -274,8 +269,8 @@

    getPodTuning

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/TuningParametersImpl.html b/docs/apidocs/oracle/kubernetes/operator/TuningParametersImpl.html index 80534a6c69f..c402df23ca7 100644 --- a/docs/apidocs/oracle/kubernetes/operator/TuningParametersImpl.html +++ b/docs/apidocs/oracle/kubernetes/operator/TuningParametersImpl.html @@ -2,10 +2,10 @@ - -TuningParametersImpl (weblogic-kubernetes-operator 2.6.0 API) + +TuningParametersImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class TuningParametersImpl

    @@ -255,8 +250,8 @@

    getPodTuning

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/WebLogicConstants.html b/docs/apidocs/oracle/kubernetes/operator/WebLogicConstants.html index d198bde6dd7..1a81be15427 100644 --- a/docs/apidocs/oracle/kubernetes/operator/WebLogicConstants.html +++ b/docs/apidocs/oracle/kubernetes/operator/WebLogicConstants.html @@ -2,10 +2,10 @@ - -WebLogicConstants (weblogic-kubernetes-operator 2.6.0 API) + +WebLogicConstants (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Interface WebLogicConstants

    @@ -323,8 +318,8 @@

    READINESS_PROBE_NOT_READY_STATE<

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/authentication/Authenticator.html b/docs/apidocs/oracle/kubernetes/operator/authentication/Authenticator.html index b95477653f9..462e03df946 100644 --- a/docs/apidocs/oracle/kubernetes/operator/authentication/Authenticator.html +++ b/docs/apidocs/oracle/kubernetes/operator/authentication/Authenticator.html @@ -2,10 +2,10 @@ - -Authenticator (weblogic-kubernetes-operator 2.6.0 API) + +Authenticator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class Authenticator

    @@ -370,8 +365,8 @@

    closeClient<

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/authentication/Helpers.html b/docs/apidocs/oracle/kubernetes/operator/authentication/Helpers.html index 1f45700bfe2..545e32890f2 100644 --- a/docs/apidocs/oracle/kubernetes/operator/authentication/Helpers.html +++ b/docs/apidocs/oracle/kubernetes/operator/authentication/Helpers.html @@ -2,10 +2,10 @@ - -Helpers (weblogic-kubernetes-operator 2.6.0 API) + +Helpers (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/authentication/class-use/Authenticator.html b/docs/apidocs/oracle/kubernetes/operator/authentication/class-use/Authenticator.html index aad64c69cdb..2cae0a9fdad 100644 --- a/docs/apidocs/oracle/kubernetes/operator/authentication/class-use/Authenticator.html +++ b/docs/apidocs/oracle/kubernetes/operator/authentication/class-use/Authenticator.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.authentication.Authenticator (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.authentication.Authenticator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.authentication.Authenticator

    @@ -149,5 +144,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/authentication/class-use/Helpers.html b/docs/apidocs/oracle/kubernetes/operator/authentication/class-use/Helpers.html index 314d8650b08..355302873b3 100644 --- a/docs/apidocs/oracle/kubernetes/operator/authentication/class-use/Helpers.html +++ b/docs/apidocs/oracle/kubernetes/operator/authentication/class-use/Helpers.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.authentication.Helpers (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.authentication.Helpers (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.authentication.Helpers

    @@ -151,5 +146,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/authentication/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/authentication/package-summary.html index a698d630a4e..bada477ca82 100644 --- a/docs/apidocs/oracle/kubernetes/operator/authentication/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/authentication/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.authentication (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.authentication (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.authentication

    @@ -138,5 +133,7 @@

    Package oracle.kubernetes.operator.authen

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/authentication/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/authentication/package-tree.html index 772af7ae5e8..9fe3fa730c4 100644 --- a/docs/apidocs/oracle/kubernetes/operator/authentication/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/authentication/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.authentication Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.authentication Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.authentication

    @@ -115,5 +110,7 @@

    Class Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/authentication/package-use.html b/docs/apidocs/oracle/kubernetes/operator/authentication/package-use.html index df0b6d3f88f..65dd73e4766 100644 --- a/docs/apidocs/oracle/kubernetes/operator/authentication/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/authentication/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.authentication (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.authentication (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.authentication

    @@ -156,5 +151,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/builders/CallParams.html b/docs/apidocs/oracle/kubernetes/operator/builders/CallParams.html index b64c808f90f..cac89535284 100644 --- a/docs/apidocs/oracle/kubernetes/operator/builders/CallParams.html +++ b/docs/apidocs/oracle/kubernetes/operator/builders/CallParams.html @@ -2,10 +2,10 @@ - -CallParams (weblogic-kubernetes-operator 2.6.0 API) + +CallParams (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface CallParams

    @@ -255,8 +250,8 @@

    getResourceVersion

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/builders/WatchBuilder.WatchFactory.html b/docs/apidocs/oracle/kubernetes/operator/builders/WatchBuilder.WatchFactory.html index 73f0e7c5f80..358aa647047 100644 --- a/docs/apidocs/oracle/kubernetes/operator/builders/WatchBuilder.WatchFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/builders/WatchBuilder.WatchFactory.html @@ -2,10 +2,10 @@ - -WatchBuilder.WatchFactory (weblogic-kubernetes-operator 2.6.0 API) + +WatchBuilder.WatchFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/builders/WatchBuilder.html b/docs/apidocs/oracle/kubernetes/operator/builders/WatchBuilder.html index 736bea5d3c4..bf417038358 100644 --- a/docs/apidocs/oracle/kubernetes/operator/builders/WatchBuilder.html +++ b/docs/apidocs/oracle/kubernetes/operator/builders/WatchBuilder.html @@ -2,10 +2,10 @@ - -WatchBuilder (weblogic-kubernetes-operator 2.6.0 API) + +WatchBuilder (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class WatchBuilder

    @@ -441,8 +436,8 @@

    withTimeoutSeconds

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/builders/WatchI.html b/docs/apidocs/oracle/kubernetes/operator/builders/WatchI.html index 46d8012700e..70c6adb6d03 100644 --- a/docs/apidocs/oracle/kubernetes/operator/builders/WatchI.html +++ b/docs/apidocs/oracle/kubernetes/operator/builders/WatchI.html @@ -2,10 +2,10 @@ - -WatchI (weblogic-kubernetes-operator 2.6.0 API) + +WatchI (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Interface WatchI<T>

    @@ -134,8 +129,8 @@

    Methods inherited from interface java.util.Iterator

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/builders/WatchImpl.html b/docs/apidocs/oracle/kubernetes/operator/builders/WatchImpl.html index 9637ef6a36b..1906728bfa6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/builders/WatchImpl.html +++ b/docs/apidocs/oracle/kubernetes/operator/builders/WatchImpl.html @@ -2,10 +2,10 @@ - -WatchImpl (weblogic-kubernetes-operator 2.6.0 API) + +WatchImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class WatchImpl<T>

    @@ -231,8 +226,8 @@

    next

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/builders/class-use/CallParams.html b/docs/apidocs/oracle/kubernetes/operator/builders/class-use/CallParams.html index 9747326e251..7eeab465e39 100644 --- a/docs/apidocs/oracle/kubernetes/operator/builders/class-use/CallParams.html +++ b/docs/apidocs/oracle/kubernetes/operator/builders/class-use/CallParams.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.builders.CallParams (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.builders.CallParams (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.builders.CallParams

    @@ -208,5 +203,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchBuilder.WatchFactory.html b/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchBuilder.WatchFactory.html index 183ebff9841..55513577085 100644 --- a/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchBuilder.WatchFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchBuilder.WatchFactory.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.builders.WatchBuilder.WatchFactory (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.builders.WatchBuilder.WatchFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.builders.WatchBuilder.WatchFactory

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchBuilder.html b/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchBuilder.html index f8635d15353..88c2fd15dce 100644 --- a/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchBuilder.html +++ b/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchBuilder.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.builders.WatchBuilder (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.builders.WatchBuilder (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.builders.WatchBuilder

    @@ -233,5 +228,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchI.html b/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchI.html index e0dc1645f65..b2e1970a400 100644 --- a/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchI.html +++ b/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchI.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.builders.WatchI (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.builders.WatchI (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.builders.WatchI

    @@ -284,5 +279,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchImpl.html b/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchImpl.html index 636c71ec8c0..3bf2a606d47 100644 --- a/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchImpl.html +++ b/docs/apidocs/oracle/kubernetes/operator/builders/class-use/WatchImpl.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.builders.WatchImpl (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.builders.WatchImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.builders.WatchImpl

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/builders/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/builders/package-summary.html index 4bc8cc62902..668be649cef 100644 --- a/docs/apidocs/oracle/kubernetes/operator/builders/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/builders/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.builders (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.builders (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.builders

    @@ -163,5 +158,7 @@

    Package oracle.kubernetes.operator.builde

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/builders/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/builders/package-tree.html index 02b27bab583..9323140cfca 100644 --- a/docs/apidocs/oracle/kubernetes/operator/builders/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/builders/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.builders Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.builders Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.builders

    @@ -141,5 +136,7 @@

    Interface Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/builders/package-use.html b/docs/apidocs/oracle/kubernetes/operator/builders/package-use.html index 46881aa4e65..7f201cd88a9 100644 --- a/docs/apidocs/oracle/kubernetes/operator/builders/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/builders/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.builders (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.builders (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.builders

    @@ -218,5 +213,7 @@

    Us

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/AsyncRequestStep.html b/docs/apidocs/oracle/kubernetes/operator/calls/AsyncRequestStep.html index 9af214e80c7..caf81fa56ed 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/AsyncRequestStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/AsyncRequestStep.html @@ -2,10 +2,10 @@ - -AsyncRequestStep (weblogic-kubernetes-operator 2.6.0 API) + +AsyncRequestStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class AsyncRequestStep<T>

    @@ -364,8 +359,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/CallFactory.html b/docs/apidocs/oracle/kubernetes/operator/calls/CallFactory.html index 5c881c09d75..d2a6305fc5f 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/CallFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/CallFactory.html @@ -2,10 +2,10 @@ - -CallFactory (weblogic-kubernetes-operator 2.6.0 API) + +CallFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/CallResponse.html b/docs/apidocs/oracle/kubernetes/operator/calls/CallResponse.html index 7961f7ac55e..d92f34dc5ce 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/CallResponse.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/CallResponse.html @@ -2,10 +2,10 @@ - -CallResponse (weblogic-kubernetes-operator 2.6.0 API) + +CallResponse (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class CallResponse<T>

    @@ -269,8 +264,8 @@

    getHeadersString

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/CallWrapper.html b/docs/apidocs/oracle/kubernetes/operator/calls/CallWrapper.html index 82559e596e1..4da2a098e8a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/CallWrapper.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/CallWrapper.html @@ -2,10 +2,10 @@ - -CallWrapper (weblogic-kubernetes-operator 2.6.0 API) + +CallWrapper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class CallWrapper

    @@ -215,8 +210,8 @@

    cancel

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/CancellableCall.html b/docs/apidocs/oracle/kubernetes/operator/calls/CancellableCall.html index 2454f31e60c..60cc9f86e16 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/CancellableCall.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/CancellableCall.html @@ -2,10 +2,10 @@ - -CancellableCall (weblogic-kubernetes-operator 2.6.0 API) + +CancellableCall (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface CancellableCall

    @@ -159,8 +154,8 @@

    cancel

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/FailureStatusSource.html b/docs/apidocs/oracle/kubernetes/operator/calls/FailureStatusSource.html index f5eae434e92..7126ffed451 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/FailureStatusSource.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/FailureStatusSource.html @@ -2,10 +2,10 @@ - -FailureStatusSource (weblogic-kubernetes-operator 2.6.0 API) + +FailureStatusSource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface FailureStatusSource

    @@ -96,7 +91,7 @@

    Interface FailureStatusS
    All Known Implementing Classes:
    -
    OtherUnrecoverableErrorBuilder, UnprocessableEntityBuilder
    +
    UnrecoverableErrorBuilderImpl

    public interface FailureStatusSource
    @@ -166,8 +161,8 @@

    getReason

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/FailureStatusSourceException.html b/docs/apidocs/oracle/kubernetes/operator/calls/FailureStatusSourceException.html index 36ae4942222..7fffbf7d958 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/FailureStatusSourceException.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/FailureStatusSourceException.html @@ -2,10 +2,10 @@ - -FailureStatusSourceException (weblogic-kubernetes-operator 2.6.0 API) + +FailureStatusSourceException (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class FailureStatusSourceException

    @@ -136,8 +131,8 @@

    Constructor Summary

      -FailureStatusSourceException​(FailureStatusSource failureStatusSource, -java.lang.Exception cause) +FailureStatusSourceException​(FailureStatusSource failureStatusSource, +java.lang.Throwable cause)   @@ -210,9 +205,9 @@

    F
  • -

    FailureStatusSourceException

    +

    FailureStatusSourceException

    public FailureStatusSourceException​(FailureStatusSource failureStatusSource, -java.lang.Exception cause)
    +java.lang.Throwable cause)
  • @@ -244,8 +239,8 @@

    log

    - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/OtherUnrecoverableErrorBuilder.html b/docs/apidocs/oracle/kubernetes/operator/calls/OtherUnrecoverableErrorBuilder.html deleted file mode 100644 index 89adce0efcc..00000000000 --- a/docs/apidocs/oracle/kubernetes/operator/calls/OtherUnrecoverableErrorBuilder.html +++ /dev/null @@ -1,267 +0,0 @@ - - - - - -OtherUnrecoverableErrorBuilder (weblogic-kubernetes-operator 2.6.0 API) - - - - - - - - - - - - - - - - -
    - -
    - -
    -
    - -

    Class OtherUnrecoverableErrorBuilder

    -
    -
    -
    java.lang.Object -
    oracle.kubernetes.operator.calls.OtherUnrecoverableErrorBuilder
    -
    -
    -
    -
    All Implemented Interfaces:
    -
    FailureStatusSource
    -
    -
    -
    public class OtherUnrecoverableErrorBuilder
    -extends java.lang.Object
    -implements FailureStatusSource
    -
    A builder for 'forbidden' and other unrecoverable async results.
    -
    -
    -
      - -
    • -
      - - -

      Method Summary

      -
      -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Modifier and TypeMethodDescription
      static OtherUnrecoverableErrorBuilderfromFailedCall​(CallResponse callResponse) -
      Create a ForbiddenErrorBuilder from the provided failed call.
      -
      java.lang.StringgetMessage() 
      java.lang.StringgetReason() 
      static booleanisUnrecoverable​(io.kubernetes.client.openapi.ApiException e) 
      -
      -
      -
      -

      Methods inherited from class java.lang.Object

      - - -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      -
      -
    • -
    -
    -
    - -
    -
    -
    - - - - diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/RequestParams.html b/docs/apidocs/oracle/kubernetes/operator/calls/RequestParams.html index 0e2a258a4f8..64c74f1b498 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/RequestParams.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/RequestParams.html @@ -2,10 +2,10 @@ - -RequestParams (weblogic-kubernetes-operator 2.6.0 API) + +RequestParams (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class RequestParams

    @@ -357,8 +352,8 @@

    toString

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/RetryStrategy.html b/docs/apidocs/oracle/kubernetes/operator/calls/RetryStrategy.html index ef506505112..f824f4c5e55 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/RetryStrategy.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/RetryStrategy.html @@ -2,10 +2,10 @@ - -RetryStrategy (weblogic-kubernetes-operator 2.6.0 API) + +RetryStrategy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface RetryStrategy

    @@ -186,8 +181,8 @@

    reset

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/RetryStrategyListener.html b/docs/apidocs/oracle/kubernetes/operator/calls/RetryStrategyListener.html index f07831b7519..69518b2e8b9 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/RetryStrategyListener.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/RetryStrategyListener.html @@ -2,10 +2,10 @@ - -RetryStrategyListener (weblogic-kubernetes-operator 2.6.0 API) + +RetryStrategyListener (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface RetryStrategyListener

    @@ -158,8 +153,8 @@

    listenTimeoutDoubled

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/SynchronousCallDispatcher.html b/docs/apidocs/oracle/kubernetes/operator/calls/SynchronousCallDispatcher.html index eabe1ee6c72..08f960b27c1 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/SynchronousCallDispatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/SynchronousCallDispatcher.html @@ -2,10 +2,10 @@ - -SynchronousCallDispatcher (weblogic-kubernetes-operator 2.6.0 API) + +SynchronousCallDispatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/SynchronousCallFactory.html b/docs/apidocs/oracle/kubernetes/operator/calls/SynchronousCallFactory.html index b94ead0ae1b..1d3757520a5 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/SynchronousCallFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/SynchronousCallFactory.html @@ -2,10 +2,10 @@ - -SynchronousCallFactory (weblogic-kubernetes-operator 2.6.0 API) + +SynchronousCallFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/UnrecoverableErrorBuilder.html b/docs/apidocs/oracle/kubernetes/operator/calls/UnrecoverableErrorBuilder.html index aa482ed693d..4ba15e37d4b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/UnrecoverableErrorBuilder.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/UnrecoverableErrorBuilder.html @@ -2,10 +2,10 @@ - -UnrecoverableErrorBuilder (weblogic-kubernetes-operator 2.6.0 API) + +UnrecoverableErrorBuilder (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class UnrecoverableErrorBuilder

    @@ -164,7 +159,7 @@

    Method Summary

    static <T> boolean isAsyncCallFailure​(CallResponse<T> callResponse) -
    Returns true if the specified call response indicates an unprocessable entity response from Kubernetes.
    +
    Returns true if the specified call response indicates an unrecoverable response from Kubernetes.
    @@ -209,7 +204,7 @@

    Method Details

    isAsyncCallFailure

    public static <T> boolean isAsyncCallFailure​(CallResponse<T> callResponse)
    -
    Returns true if the specified call response indicates an unprocessable entity response from Kubernetes.
    +
    Returns true if the specified call response indicates an unrecoverable response from Kubernetes.
    Type Parameters:
    T - call response type
    @@ -252,8 +247,8 @@

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/AsyncRequestStep.html b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/AsyncRequestStep.html index a5f8a303727..fc621aa4288 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/AsyncRequestStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/AsyncRequestStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.calls.AsyncRequestStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.calls.AsyncRequestStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.calls.AsyncRequestStep

    @@ -149,5 +144,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CallFactory.html b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CallFactory.html index 6054fb598a9..9d672cf1d15 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CallFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CallFactory.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.calls.CallFactory (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.calls.CallFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.calls.CallFactory

    @@ -195,5 +190,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CallResponse.html b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CallResponse.html index 84d77975bee..fb5d4b49c0d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CallResponse.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CallResponse.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.calls.CallResponse (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.calls.CallResponse (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.calls.CallResponse

    @@ -195,24 +190,17 @@

    Uses of -static OtherUnrecoverableErrorBuilder -OtherUnrecoverableErrorBuilder.fromFailedCall​(CallResponse callResponse) - -
    Create a ForbiddenErrorBuilder from the provided failed call.
    - - - static FailureStatusSource UnrecoverableErrorBuilder.fromFailedCall​(CallResponse callResponse)
    Populate FailureStatusSource from a failed call response.
    - + static <T> boolean UnrecoverableErrorBuilder.isAsyncCallFailure​(CallResponse<T> callResponse) -
    Returns true if the specified call response indicates an unprocessable entity response from Kubernetes.
    +
    Returns true if the specified call response indicates an unrecoverable response from Kubernetes.
    @@ -237,10 +225,10 @@

    Uses of -static UnprocessableEntityBuilder -UnprocessableEntityBuilder.fromFailedCall​(CallResponse callResponse) +static FailureStatusSource +UnrecoverableErrorBuilderImpl.fromFailedCall​(CallResponse callResponse) -
    Create an UnprocessableEntityBuilder from the provided failed call.
    +
    Create an UnrecoverableErrorBuilder from the provided failed call.
    @@ -370,5 +358,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CallWrapper.html b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CallWrapper.html index fcf388e043f..e1ac4080942 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CallWrapper.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CallWrapper.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.calls.CallWrapper (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.calls.CallWrapper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.calls.CallWrapper

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CancellableCall.html b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CancellableCall.html index b0c8242c401..b410ea385ff 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CancellableCall.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/CancellableCall.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.calls.CancellableCall (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.calls.CancellableCall (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.calls.CancellableCall

    @@ -171,5 +166,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/FailureStatusSource.html b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/FailureStatusSource.html index 220006d58ee..2bb124d61c4 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/FailureStatusSource.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/FailureStatusSource.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.calls.FailureStatusSource (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.calls.FailureStatusSource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/FailureStatusSourceException.html b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/FailureStatusSourceException.html index 473147cf4f8..e2f0f5635e6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/FailureStatusSourceException.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/FailureStatusSourceException.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.calls.FailureStatusSourceException (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.calls.FailureStatusSourceException (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.calls.FailureStatusSourceException

    @@ -149,5 +144,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/OtherUnrecoverableErrorBuilder.html b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/OtherUnrecoverableErrorBuilder.html deleted file mode 100644 index aaf354dd809..00000000000 --- a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/OtherUnrecoverableErrorBuilder.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - -Uses of Class oracle.kubernetes.operator.calls.OtherUnrecoverableErrorBuilder (weblogic-kubernetes-operator 2.6.0 API) - - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    oracle.kubernetes.operator.calls.OtherUnrecoverableErrorBuilder

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use OtherUnrecoverableErrorBuilder 
    PackageDescription
    oracle.kubernetes.operator.calls 
    -
    -
    - -
    -
    -
    - - - diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/RequestParams.html b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/RequestParams.html index 7dd64c9d455..2dc817bdbaf 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/RequestParams.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/RequestParams.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.calls.RequestParams (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.calls.RequestParams (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.calls.RequestParams

    @@ -268,5 +263,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/RetryStrategy.html b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/RetryStrategy.html index e9892b6ec44..d756ab49120 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/RetryStrategy.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/RetryStrategy.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.calls.RetryStrategy (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.calls.RetryStrategy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.calls.RetryStrategy

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/RetryStrategyListener.html b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/RetryStrategyListener.html index 608234ebdd2..99a30f8d87e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/RetryStrategyListener.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/RetryStrategyListener.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.calls.RetryStrategyListener (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.calls.RetryStrategyListener (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.calls.RetryStrategyListener

    @@ -150,5 +145,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/SynchronousCallDispatcher.html b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/SynchronousCallDispatcher.html index 1ed15833123..2c842e941aa 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/SynchronousCallDispatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/SynchronousCallDispatcher.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.calls.SynchronousCallDispatcher (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.calls.SynchronousCallDispatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.calls.SynchronousCallDispatcher

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/SynchronousCallFactory.html b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/SynchronousCallFactory.html index 81120fa6021..46d19a74a1d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/SynchronousCallFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/SynchronousCallFactory.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.calls.SynchronousCallFactory (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.calls.SynchronousCallFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.calls.SynchronousCallFactory

    @@ -149,5 +144,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/UnrecoverableErrorBuilder.html b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/UnrecoverableErrorBuilder.html index 93aabb70f22..7ed6030f320 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/class-use/UnrecoverableErrorBuilder.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/class-use/UnrecoverableErrorBuilder.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.calls.UnrecoverableErrorBuilder (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.calls.UnrecoverableErrorBuilder (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.calls.UnrecoverableErrorBuilder

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/calls/package-summary.html index 5c50562c450..5cce0910cf8 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.calls (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.calls (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.calls

    @@ -148,16 +143,10 @@

    Package oracle.kubernetes.operator.calls< -OtherUnrecoverableErrorBuilder - -
    A builder for 'forbidden' and other unrecoverable async results.
    - - - RequestParams   - + UnrecoverableErrorBuilder   @@ -216,5 +205,7 @@

    Package oracle.kubernetes.operator.calls<

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/calls/package-tree.html index f0379d74b01..043b765ac36 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.calls Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.calls Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.calls

    @@ -81,7 +76,6 @@

    Class Hierarchy

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/package-use.html b/docs/apidocs/oracle/kubernetes/operator/calls/package-use.html index a6b91de9700..868e0963d4b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.calls (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.calls (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.calls

    @@ -169,20 +164,14 @@

    Uses   -OtherUnrecoverableErrorBuilder - -
    A builder for 'forbidden' and other unrecoverable async results.
    - - - RequestParams   - + RetryStrategyListener   - + SynchronousCallFactory   @@ -311,5 +300,7 @@

    Uses

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/Cause.html b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/Cause.html index f9edff9affb..4a1e47eab21 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/Cause.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/Cause.html @@ -2,10 +2,10 @@ - -Cause (weblogic-kubernetes-operator 2.6.0 API) + +Cause (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class Cause

    @@ -234,8 +229,8 @@

    getField

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/ErrorBody.html b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/ErrorBody.html index 997dc3e2564..52993dd8f4d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/ErrorBody.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/ErrorBody.html @@ -2,10 +2,10 @@ - -ErrorBody (weblogic-kubernetes-operator 2.6.0 API) + +ErrorBody (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ErrorBody

    @@ -234,8 +229,8 @@

    setMessage

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/UnprocessableEntityBuilder.html b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/UnrecoverableErrorBuilderImpl.html similarity index 79% rename from docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/UnprocessableEntityBuilder.html rename to docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/UnrecoverableErrorBuilderImpl.html index 00f7601eb4a..f1daa0d031d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/UnprocessableEntityBuilder.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/UnrecoverableErrorBuilderImpl.html @@ -2,11 +2,11 @@ - -UnprocessableEntityBuilder (weblogic-kubernetes-operator 2.6.0 API) + +UnrecoverableErrorBuilderImpl (weblogic-kubernetes-operator 3.0.0 API) - - + + @@ -31,9 +31,9 @@ -
    +
    +
    - - +
    - +
    +
    -

    Class UnprocessableEntityBuilder

    +

    Class UnrecoverableErrorBuilderImpl

    java.lang.Object -
    oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder
    +
    oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl
    @@ -102,7 +97,7 @@

    Class UnprocessableEn
    FailureStatusSource


    -
    public class UnprocessableEntityBuilder
    +
    public class UnrecoverableErrorBuilderImpl
     extends java.lang.Object
     implements FailureStatusSource
    @@ -125,8 +120,10 @@

    Constructor Summary

    -UnprocessableEntityBuilder() -  +UnrecoverableErrorBuilderImpl() + +
    Create unrecoverable error builder.
    + @@ -157,10 +154,10 @@

    Method Summary

      -static UnprocessableEntityBuilder +static FailureStatusSource fromFailedCall​(CallResponse callResponse) -
    Create an UnprocessableEntityBuilder from the provided failed call.
    +
    Create an UnrecoverableErrorBuilder from the provided failed call.
    @@ -175,16 +172,16 @@

    Method Summary

    static boolean -isUnprocessableEntity​(io.kubernetes.client.openapi.ApiException exception) +isUnrecoverable​(io.kubernetes.client.openapi.ApiException e)   -UnprocessableEntityBuilder +UnrecoverableErrorBuilderImpl withMessage​(java.lang.String message)   -UnprocessableEntityBuilder +UnrecoverableErrorBuilderImpl withReason​(java.lang.String reason)
    Build with reason.
    @@ -214,8 +211,9 @@

    Constructor Details

    @@ -231,20 +229,20 @@

    Method Details

  • fromFailedCall

    -
    public static UnprocessableEntityBuilder fromFailedCall​(CallResponse callResponse)
    -
    Create an UnprocessableEntityBuilder from the provided failed call.
    +
    public static FailureStatusSource fromFailedCall​(CallResponse callResponse)
    +
    Create an UnrecoverableErrorBuilder from the provided failed call.
    Parameters:
    callResponse - the failed call
    Returns:
    -
    the UnprocessableEntityBuilder
    +
    the FailureStatusSource
  • -

    isUnprocessableEntity

    -
    public static boolean isUnprocessableEntity​(io.kubernetes.client.openapi.ApiException exception)
    +

    isUnrecoverable

    +
    public static boolean isUnrecoverable​(io.kubernetes.client.openapi.ApiException e)
  • @@ -270,7 +268,7 @@

    getReason

  • withReason

    -
    public UnprocessableEntityBuilder withReason​(java.lang.String reason)
    +
    public UnrecoverableErrorBuilderImpl withReason​(java.lang.String reason)
    Build with reason.
    Parameters:
    @@ -283,7 +281,7 @@

    withReason

  • withMessage

    -
    public UnprocessableEntityBuilder withMessage​(java.lang.String message)
    +
    public UnrecoverableErrorBuilderImpl withMessage​(java.lang.String message)
  • @@ -298,8 +296,8 @@

    build

  • -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/Cause.html b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/Cause.html index 6fc64df6fee..e0409ed3e9f 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/Cause.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/Cause.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.calls.unprocessable.Cause (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.calls.unprocessable.Cause (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.calls.unprocessable.Cause

    @@ -147,5 +142,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/ErrorBody.html b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/ErrorBody.html index 42c8af19ed5..5873edaebb5 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/ErrorBody.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/ErrorBody.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.calls.unprocessable.ErrorBody (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.calls.unprocessable.ErrorBody (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.calls.unprocessable.ErrorBody

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/UnprocessableEntityBuilder.html b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/UnrecoverableErrorBuilderImpl.html similarity index 60% rename from docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/UnprocessableEntityBuilder.html rename to docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/UnrecoverableErrorBuilderImpl.html index 2db2f4dbfcb..c6dda98f308 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/UnprocessableEntityBuilder.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/class-use/UnrecoverableErrorBuilderImpl.html @@ -2,11 +2,11 @@ - -Uses of Class oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl (weblogic-kubernetes-operator 3.0.0 API) - - + + @@ -25,9 +25,9 @@ -
    + - - +
    +
    -

    Uses of Class
    oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder

    +

    Uses of Class
    oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl

    - + @@ -93,10 +88,10 @@

    -

    Uses of UnprocessableEntityBuilder in oracle.kubernetes.operator.calls.unprocessable

    +

    Uses of UnrecoverableErrorBuilderImpl in oracle.kubernetes.operator.calls.unprocessable

    Packages that use UnprocessableEntityBuilder Packages that use UnrecoverableErrorBuilderImpl 
    Package
    - + @@ -106,20 +101,13 @@

    Uses of -

    - - - - - - + + - - - + + + @@ -146,7 +134,7 @@

    Uses of
  • Overview
  • Package
  • -
  • Class
  • +
  • Class
  • Tree
  • Deprecated
  • @@ -161,5 +149,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/package-summary.html index fcbf354514d..f3689947dd8 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.calls.unprocessable (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.calls.unprocessable (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.calls.unprocessable

    @@ -92,7 +87,7 @@

    Package oracle.kubernetes.operator.calls.

    - + @@ -131,5 +126,7 @@

    Package oracle.kubernetes.operator.calls.

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/package-tree.html index 42b03bcb497..aad73192540 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.calls.unprocessable Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.calls.unprocessable Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.calls.unprocessable

    @@ -81,7 +76,7 @@

    Class Hierarchy

    @@ -116,5 +111,7 @@

    Class Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/package-use.html b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/package-use.html index 39c486dc6fa..1643edf74b6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/calls/unprocessable/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.calls.unprocessable (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.calls.unprocessable (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.calls.unprocessable

    @@ -108,7 +103,7 @@

     

    - + @@ -148,5 +143,7 @@

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/ConfigMapWatcher.html b/docs/apidocs/oracle/kubernetes/operator/class-use/ConfigMapWatcher.html index d0c0e82fb86..77e3a316d34 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/ConfigMapWatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/ConfigMapWatcher.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.ConfigMapWatcher (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.ConfigMapWatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.ConfigMapWatcher

    @@ -190,5 +185,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/DomainPresence.html b/docs/apidocs/oracle/kubernetes/operator/class-use/DomainPresence.html index 3f6966ee350..f7f688fb003 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/DomainPresence.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/DomainPresence.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.DomainPresence (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.DomainPresence (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.DomainPresence

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/DomainProcessor.html b/docs/apidocs/oracle/kubernetes/operator/class-use/DomainProcessor.html index f40858f5b25..73c76eb3ac6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/DomainProcessor.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/DomainProcessor.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.DomainProcessor (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.DomainProcessor (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.DomainProcessor

    @@ -149,5 +144,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/DomainProcessorDelegate.html b/docs/apidocs/oracle/kubernetes/operator/class-use/DomainProcessorDelegate.html index 3795d621fe8..325e78c298d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/DomainProcessorDelegate.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/DomainProcessorDelegate.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.DomainProcessorDelegate (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.DomainProcessorDelegate (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.DomainProcessorDelegate

    @@ -147,5 +142,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/DomainProcessorImpl.html b/docs/apidocs/oracle/kubernetes/operator/class-use/DomainProcessorImpl.html index 547710a909a..dbeabd0f351 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/DomainProcessorImpl.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/DomainProcessorImpl.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.DomainProcessorImpl (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.DomainProcessorImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.DomainProcessorImpl

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/DomainSourceType.html b/docs/apidocs/oracle/kubernetes/operator/class-use/DomainSourceType.html index cd361b23aa4..7c3c68546fa 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/DomainSourceType.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/DomainSourceType.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.DomainSourceType (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.DomainSourceType (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.DomainSourceType

    @@ -86,6 +81,22 @@

    The main classes for the Oracle WebLogic Server Kubernetes Operator.

    +

    + + + + + + + + + + +
    Methods in oracle.kubernetes.operator.calls.unprocessable that return UnprocessableEntityBuilder Methods in oracle.kubernetes.operator.calls.unprocessable that return UnrecoverableErrorBuilderImpl 
    Modifier and Typestatic UnprocessableEntityBuilderUnprocessableEntityBuilder.fromFailedCall​(CallResponse callResponse) -
    Create an UnprocessableEntityBuilder from the provided failed call.
    -
    UnprocessableEntityBuilderUnprocessableEntityBuilder.withMessage​(java.lang.String message)UnrecoverableErrorBuilderImplUnrecoverableErrorBuilderImpl.withMessage​(java.lang.String message)  
    UnprocessableEntityBuilderUnprocessableEntityBuilder.withReason​(java.lang.String reason)
    UnrecoverableErrorBuilderImplUnrecoverableErrorBuilderImpl.withReason​(java.lang.String reason)
    Build with reason.
     
    UnprocessableEntityBuilderUnrecoverableErrorBuilderImpl  
    UnprocessableEntityBuilderUnrecoverableErrorBuilderImpl  
    oracle.kubernetes.operator.helpers +
    Helper classes that provide easy access to various Kubernetes features.
    +
    oracle.kubernetes.weblogic.domain 
    oracle.kubernetes.weblogic.domain.model +
    Model classes that are part of the WebLogic Custom Resource extensions to the Kubernetes API.
    +
    @@ -127,6 +138,105 @@

    Uses of +
    + + +

    Uses of DomainSourceType in oracle.kubernetes.operator.helpers

    +
    + + + + + + + + + + + + + + + + +
    Methods in oracle.kubernetes.operator.helpers that return DomainSourceType 
    Modifier and TypeMethodDescription
    protected DomainSourceTypeJobStepContext.getDomainHomeSourceType() 
    +
    +
    + +
  • +
    + + +

    Uses of DomainSourceType in oracle.kubernetes.weblogic.domain

    +
    + + + + + + + + + + + + + + + + +
    Methods in oracle.kubernetes.weblogic.domain with parameters of type DomainSourceType 
    Modifier and TypeMethodDescription
    DomainConfiguratorDomainConfigurator.withDomainHomeSourceType​(DomainSourceType domainHomeSourceType) 
    +
    +
    +
  • +
  • +
    + + +

    Uses of DomainSourceType in oracle.kubernetes.weblogic.domain.model

    +
    + + + + + + + + + + + + + + + + +
    Methods in oracle.kubernetes.weblogic.domain.model that return DomainSourceType 
    Modifier and TypeMethodDescription
    DomainSourceTypeDomain.getDomainHomeSourceType() +
    Returns a description of how the domain is defined.
    +
    +
    +
    + + + + + + + + + + + + + + + + +
    Methods in oracle.kubernetes.weblogic.domain.model with parameters of type DomainSourceType 
    Modifier and TypeMethodDescription
    voidDomainSpec.setDomainHomeSourceType​(DomainSourceType domainHomeSourceType) 
    +
    +
    +
  • @@ -159,5 +269,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    + diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/DomainStatusUpdater.html b/docs/apidocs/oracle/kubernetes/operator/class-use/DomainStatusUpdater.html index cc3af7354fd..0b202ff8580 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/DomainStatusUpdater.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/DomainStatusUpdater.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.DomainStatusUpdater (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.DomainStatusUpdater (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.DomainStatusUpdater

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/DomainWatcher.html b/docs/apidocs/oracle/kubernetes/operator/class-use/DomainWatcher.html index 5051811f992..8ba551b5f87 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/DomainWatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/DomainWatcher.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.DomainWatcher (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.DomainWatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.DomainWatcher

    @@ -156,5 +151,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/EventWatcher.html b/docs/apidocs/oracle/kubernetes/operator/class-use/EventWatcher.html index 29e46d9ddb4..abffaa386c2 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/EventWatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/EventWatcher.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.EventWatcher (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.EventWatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.EventWatcher

    @@ -157,5 +152,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/ImagePullPolicy.html b/docs/apidocs/oracle/kubernetes/operator/class-use/ImagePullPolicy.html index a5d1ca0b647..743176ba040 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/ImagePullPolicy.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/ImagePullPolicy.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.ImagePullPolicy (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.ImagePullPolicy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.ImagePullPolicy

    @@ -159,5 +154,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/VersionConstants.html b/docs/apidocs/oracle/kubernetes/operator/class-use/IntrospectorConfigMapKeys.html similarity index 78% rename from docs/apidocs/oracle/kubernetes/operator/class-use/VersionConstants.html rename to docs/apidocs/oracle/kubernetes/operator/class-use/IntrospectorConfigMapKeys.html index 20f84d2b8d2..4ef1d3a6c74 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/VersionConstants.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/IntrospectorConfigMapKeys.html @@ -2,11 +2,11 @@ - -Uses of Interface oracle.kubernetes.operator.VersionConstants (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.IntrospectorConfigMapKeys (weblogic-kubernetes-operator 3.0.0 API) - - + + @@ -25,9 +25,9 @@ -
    + - - +
    +
    -

    Uses of Interface
    oracle.kubernetes.operator.VersionConstants

    +

    Uses of Interface
    oracle.kubernetes.operator.IntrospectorConfigMapKeys

    -
    No usage of oracle.kubernetes.operator.VersionConstants
    +
    No usage of oracle.kubernetes.operator.IntrospectorConfigMapKeys
    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/JobWatcher.html b/docs/apidocs/oracle/kubernetes/operator/class-use/JobWatcher.html index fe6fc98e07d..6dcc532b638 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/JobWatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/JobWatcher.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.JobWatcher (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.JobWatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.JobWatcher

    @@ -162,5 +157,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/KubernetesConstants.html b/docs/apidocs/oracle/kubernetes/operator/class-use/KubernetesConstants.html index 8f7fb108aaa..9734068eff0 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/KubernetesConstants.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/KubernetesConstants.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.KubernetesConstants (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.KubernetesConstants (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.KubernetesConstants

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/LabelConstants.html b/docs/apidocs/oracle/kubernetes/operator/class-use/LabelConstants.html index f8e844ffd46..e307c13555a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/LabelConstants.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/LabelConstants.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.LabelConstants (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.LabelConstants (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.LabelConstants

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/Main.html b/docs/apidocs/oracle/kubernetes/operator/class-use/Main.html index 3cb0492fe19..77eb85d69a2 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/Main.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/Main.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.Main (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.Main (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.Main

    @@ -99,5 +94,7 @@

    Uses of

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/MakeRightDomainOperation.html b/docs/apidocs/oracle/kubernetes/operator/class-use/MakeRightDomainOperation.html new file mode 100644 index 00000000000..74a08de60ac --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/MakeRightDomainOperation.html @@ -0,0 +1,182 @@ + + + + + +Uses of Interface oracle.kubernetes.operator.MakeRightDomainOperation (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Uses of Interface
    oracle.kubernetes.operator.MakeRightDomainOperation

    +
    +
    +
    + + + + + + + + + + + + + + +
    Packages that use MakeRightDomainOperation 
    PackageDescription
    oracle.kubernetes.operator +
    The main classes for the Oracle WebLogic Server Kubernetes Operator.
    +
    +
    +
    + +
    +
    +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/ModelInImageDomainType.html b/docs/apidocs/oracle/kubernetes/operator/class-use/ModelInImageDomainType.html new file mode 100644 index 00000000000..4884e6f6c05 --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/ModelInImageDomainType.html @@ -0,0 +1,160 @@ + + + + + +Uses of Class oracle.kubernetes.operator.ModelInImageDomainType (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Uses of Class
    oracle.kubernetes.operator.ModelInImageDomainType

    +
    +
    +
    + + + + + + + + + + + + + + +
    Packages that use ModelInImageDomainType 
    PackageDescription
    oracle.kubernetes.operator +
    The main classes for the Oracle WebLogic Server Kubernetes Operator.
    +
    +
    +
    + +
    +
    +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/NamespaceStatus.html b/docs/apidocs/oracle/kubernetes/operator/class-use/NamespaceStatus.html index 8c55e4f8b0c..637a1e2f487 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/NamespaceStatus.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/NamespaceStatus.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.NamespaceStatus (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.NamespaceStatus (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.NamespaceStatus

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/NamespaceWatcher.html b/docs/apidocs/oracle/kubernetes/operator/class-use/NamespaceWatcher.html index 69f73f3a823..d85b80ee7ec 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/NamespaceWatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/NamespaceWatcher.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.NamespaceWatcher (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.NamespaceWatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.NamespaceWatcher

    @@ -155,5 +150,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/OperatorLiveness.html b/docs/apidocs/oracle/kubernetes/operator/class-use/OperatorLiveness.html index 25a8b4ab1b6..ef2e5d39089 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/OperatorLiveness.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/OperatorLiveness.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.OperatorLiveness (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.OperatorLiveness (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.OperatorLiveness

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/OperatorReady.html b/docs/apidocs/oracle/kubernetes/operator/class-use/OperatorReady.html index c8a824edb0f..816c68e2ade 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/OperatorReady.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/OperatorReady.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.OperatorReady (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.OperatorReady (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.OperatorReady

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/OverrideDistributionStrategy.html b/docs/apidocs/oracle/kubernetes/operator/class-use/OverrideDistributionStrategy.html new file mode 100644 index 00000000000..af16d804636 --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/OverrideDistributionStrategy.html @@ -0,0 +1,279 @@ + + + + + +Uses of Class oracle.kubernetes.operator.OverrideDistributionStrategy (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Uses of Class
    oracle.kubernetes.operator.OverrideDistributionStrategy

    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Packages that use OverrideDistributionStrategy 
    PackageDescription
    oracle.kubernetes.operator +
    The main classes for the Oracle WebLogic Server Kubernetes Operator.
    +
    oracle.kubernetes.weblogic.domain 
    oracle.kubernetes.weblogic.domain.model +
    Model classes that are part of the WebLogic Custom Resource extensions to the Kubernetes API.
    +
    +
    +
    + +
    +
    +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/Pair.html b/docs/apidocs/oracle/kubernetes/operator/class-use/Pair.html index dd2885885fb..6726ce1138e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/Pair.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/Pair.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.Pair (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.Pair (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.Pair

    @@ -99,5 +94,7 @@

    Uses of

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/PodAwaiterStepFactory.html b/docs/apidocs/oracle/kubernetes/operator/class-use/PodAwaiterStepFactory.html index 2efee0a1817..95c72fabcd6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/PodAwaiterStepFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/PodAwaiterStepFactory.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.PodAwaiterStepFactory (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.PodAwaiterStepFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.PodAwaiterStepFactory

    @@ -201,5 +196,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/PodWatcher.html b/docs/apidocs/oracle/kubernetes/operator/class-use/PodWatcher.html index a257de70763..22f5256bc8a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/PodWatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/PodWatcher.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.PodWatcher (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.PodWatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.PodWatcher

    @@ -156,5 +151,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/ProcessingConstants.html b/docs/apidocs/oracle/kubernetes/operator/class-use/ProcessingConstants.html index 8a3aa78aa86..6d4a78c2dc6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/ProcessingConstants.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/ProcessingConstants.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.ProcessingConstants (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.ProcessingConstants (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.ProcessingConstants

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/ServerStartPolicy.html b/docs/apidocs/oracle/kubernetes/operator/class-use/ServerStartPolicy.html index 0891c7ef3eb..f24d0c18671 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/ServerStartPolicy.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/ServerStartPolicy.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.ServerStartPolicy (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.ServerStartPolicy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.ServerStartPolicy

    @@ -164,5 +159,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/ServerStartState.html b/docs/apidocs/oracle/kubernetes/operator/class-use/ServerStartState.html index 0b1cc3e1cda..3521b74c3ec 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/ServerStartState.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/ServerStartState.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.ServerStartState (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.ServerStartState (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.ServerStartState

    @@ -159,5 +154,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/ServerStatusReader.html b/docs/apidocs/oracle/kubernetes/operator/class-use/ServerStatusReader.html index 9a7617b2729..08efebe4cfb 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/ServerStatusReader.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/ServerStatusReader.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.ServerStatusReader (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.ServerStatusReader (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.ServerStatusReader

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/ServiceWatcher.html b/docs/apidocs/oracle/kubernetes/operator/class-use/ServiceWatcher.html index 0aeafa2b8ea..fb037f98595 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/ServiceWatcher.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/ServiceWatcher.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.ServiceWatcher (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.ServiceWatcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.ServiceWatcher

    @@ -156,5 +151,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/ShutdownType.html b/docs/apidocs/oracle/kubernetes/operator/class-use/ShutdownType.html index 2efca8425c1..e09c44f02c9 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/ShutdownType.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/ShutdownType.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.ShutdownType (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.ShutdownType (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.ShutdownType

    @@ -159,5 +154,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/SwaggerBuildHelper.html b/docs/apidocs/oracle/kubernetes/operator/class-use/SwaggerBuildHelper.html index ef591ba7649..7b5ab89c080 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/SwaggerBuildHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/SwaggerBuildHelper.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.SwaggerBuildHelper (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.SwaggerBuildHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.SwaggerBuildHelper

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.CallBuilderTuning.html b/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.CallBuilderTuning.html index 0a01e41653a..faab2e6a5ce 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.CallBuilderTuning.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.CallBuilderTuning.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.TuningParameters.CallBuilderTuning (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.TuningParameters.CallBuilderTuning (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.TuningParameters.CallBuilderTuning

    @@ -154,5 +149,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.MainTuning.html b/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.MainTuning.html index dee8a391b09..062b52af61c 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.MainTuning.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.MainTuning.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.TuningParameters.MainTuning (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.TuningParameters.MainTuning (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.TuningParameters.MainTuning

    @@ -154,5 +149,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.PodTuning.html b/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.PodTuning.html index 7a24968f611..29c49d1510f 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.PodTuning.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.PodTuning.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.TuningParameters.PodTuning (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.TuningParameters.PodTuning (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.TuningParameters.PodTuning

    @@ -154,5 +149,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.WatchTuning.html b/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.WatchTuning.html index 71afbc27078..33f09814f14 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.WatchTuning.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.WatchTuning.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.TuningParameters.WatchTuning (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.TuningParameters.WatchTuning (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.TuningParameters.WatchTuning

    @@ -285,5 +280,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.html b/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.html index aa412373d54..f5f97efe0f6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParameters.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.TuningParameters (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.TuningParameters (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.TuningParameters

    @@ -171,27 +166,27 @@

    Uses of protected io.kubernetes.client.openapi.models.V1Container -JobStepContext.createContainer​(TuningParameters tuningParameters) +BasePodStepContext.createContainer​(TuningParameters tuningParameters)   protected io.kubernetes.client.openapi.models.V1Container -PodStepContext.createContainer​(TuningParameters tuningParameters) +JobStepContext.createContainer​(TuningParameters tuningParameters)   protected io.kubernetes.client.openapi.models.V1Container -StepContextBase.createContainer​(TuningParameters tuningParameters) +PodStepContext.createContainer​(TuningParameters tuningParameters)   protected io.kubernetes.client.openapi.models.V1PodSpec -JobStepContext.createPodSpec​(TuningParameters tuningParameters) +BasePodStepContext.createPodSpec​(TuningParameters tuningParameters)   protected io.kubernetes.client.openapi.models.V1PodSpec -StepContextBase.createPodSpec​(TuningParameters tuningParameters) +JobStepContext.createPodSpec​(TuningParameters tuningParameters)   @@ -236,5 +231,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParametersImpl.html b/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParametersImpl.html index 8c4589ea830..963edfb6057 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParametersImpl.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/TuningParametersImpl.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.TuningParametersImpl (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.TuningParametersImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.TuningParametersImpl

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/class-use/WebLogicConstants.html b/docs/apidocs/oracle/kubernetes/operator/class-use/WebLogicConstants.html index 7f54f5b0be0..7fdd17e4b78 100644 --- a/docs/apidocs/oracle/kubernetes/operator/class-use/WebLogicConstants.html +++ b/docs/apidocs/oracle/kubernetes/operator/class-use/WebLogicConstants.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.WebLogicConstants (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.WebLogicConstants (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.WebLogicConstants

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/AnnotationHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/AnnotationHelper.html index af76547ed3d..6159f246fb5 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/AnnotationHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/AnnotationHelper.html @@ -2,10 +2,10 @@ - -AnnotationHelper (weblogic-kubernetes-operator 2.6.0 API) + +AnnotationHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/AsyncRequestStepFactory.html b/docs/apidocs/oracle/kubernetes/operator/helpers/AsyncRequestStepFactory.html index 622b539c337..8f5b3b9fb57 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/AsyncRequestStepFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/AsyncRequestStepFactory.html @@ -2,10 +2,10 @@ - -AsyncRequestStepFactory (weblogic-kubernetes-operator 2.6.0 API) + +AsyncRequestStepFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/AuthenticationProxy.html b/docs/apidocs/oracle/kubernetes/operator/helpers/AuthenticationProxy.html index 23243a1e629..c4c80c98409 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/AuthenticationProxy.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/AuthenticationProxy.html @@ -2,10 +2,10 @@ - -AuthenticationProxy (weblogic-kubernetes-operator 2.6.0 API) + +AuthenticationProxy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class AuthenticationProxy

    @@ -215,8 +210,8 @@

    check

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.Operation.html b/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.Operation.html index aa1279111cc..cb173abe645 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.Operation.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.Operation.html @@ -2,10 +2,10 @@ - -AuthorizationProxy.Operation (weblogic-kubernetes-operator 2.6.0 API) + +AuthorizationProxy.Operation (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Enum AuthorizationProxy.Operation

    @@ -364,8 +359,8 @@

    valueOf

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.Resource.html b/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.Resource.html index 5ed406b1c88..0c98cae723d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.Resource.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.Resource.html @@ -2,10 +2,10 @@ - -AuthorizationProxy.Resource (weblogic-kubernetes-operator 2.6.0 API) + +AuthorizationProxy.Resource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Enum AuthorizationProxy.Resource

    @@ -547,8 +542,8 @@

    getApiGroup

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.Scope.html b/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.Scope.html index 35c069e3ce4..96e4eab95f1 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.Scope.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.Scope.html @@ -2,10 +2,10 @@ - -AuthorizationProxy.Scope (weblogic-kubernetes-operator 2.6.0 API) + +AuthorizationProxy.Scope (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Enum AuthorizationProxy.Scope

    @@ -274,8 +269,8 @@

    valueOf

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.html b/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.html index b483e108698..22c6f6f44fe 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/AuthorizationProxy.html @@ -2,10 +2,10 @@ - -AuthorizationProxy (weblogic-kubernetes-operator 2.6.0 API) + +AuthorizationProxy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/BasePodStepContext.html b/docs/apidocs/oracle/kubernetes/operator/helpers/BasePodStepContext.html index d8cc0b43cbe..92acd84227b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/BasePodStepContext.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/BasePodStepContext.html @@ -2,10 +2,10 @@ - -BasePodStepContext (weblogic-kubernetes-operator 2.6.0 API) + +BasePodStepContext (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    + @@ -170,30 +145,90 @@

    Method Summary

    +protected void +addDefaultEnvVarIfMissing​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, +java.lang.String name, +java.lang.String value) +  + + +protected void +addEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, +java.lang.String name, +java.lang.String value) +  + + +protected void +addEnvVarIfTrue​(boolean condition, +java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, +java.lang.String name) +  + + +protected void +addOrReplaceEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, +java.lang.String name, +java.lang.String value) +  + + protected java.util.Map<java.lang.String,​java.lang.String> augmentSubVars​(java.util.Map<java.lang.String,​java.lang.String> vars)   - + +protected io.kubernetes.client.openapi.models.V1Container +createContainer​(TuningParameters tuningParameters) +  + + +protected io.kubernetes.client.openapi.models.V1PodSpec +createPodSpec​(TuningParameters tuningParameters) +  + + +protected io.kubernetes.client.openapi.models.V1EnvVar +findEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, +java.lang.String name) +  + + protected java.util.Optional<io.kubernetes.client.openapi.models.V1Container> getContainer​(io.kubernetes.client.openapi.models.V1Pod v1Pod)   - + protected java.util.Optional<io.kubernetes.client.openapi.models.V1Container> getContainer​(io.kubernetes.client.openapi.models.V1PodSpec v1PodSpec)   - + protected java.lang.String getMainContainerName()   - + +protected boolean +hasEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, +java.lang.String name) +  + + +protected void +hideAdminUserCredentials​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars) +  + + protected boolean isK8sContainer​(io.kubernetes.client.openapi.models.V1Container c)   + +protected java.util.Map<java.lang.String,​java.lang.String> +varsToSubVariables​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars) +  +
    @@ -202,7 +237,7 @@

    Method Summary

    Methods inherited from class oracle.kubernetes.operator.helpers.StepContextBase

    -addDefaultEnvVarIfMissing, addEnvVar, addOrReplaceEnvVar, createContainer, createPodSpec, doDeepSubstitution, doDeepSubstitution, findEnvVar, hasEnvVar, hideAdminUserCredentials, varsToSubVariables +doDeepSubstitution, doDeepSubstitution, updateForOwnerReference

    Methods inherited from class java.lang.Object

    @@ -214,29 +249,83 @@

    Methods inherited from class java.lang.Object

      - +
    • -
      +
      -

      Constructor Details

      +

      Method Details

      +
    • +
      +

      createPodSpec

      +
      protected io.kubernetes.client.openapi.models.V1PodSpec createPodSpec​(TuningParameters tuningParameters)
    • -
    • -
      - - -

      Method Details

      -
        +
        +

        addEnvVar

        +
        protected void addEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, +java.lang.String name, +java.lang.String value)
        +
        + +
      • +
        +

        addEnvVarIfTrue

        +
        protected void addEnvVarIfTrue​(boolean condition, +java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, +java.lang.String name)
        +
        +
      • +
      • +
        +

        hasEnvVar

        +
        protected boolean hasEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, +java.lang.String name)
        +
        +
      • +
      • +
        +

        addDefaultEnvVarIfMissing

        +
        protected void addDefaultEnvVarIfMissing​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, +java.lang.String name, +java.lang.String value)
        +
        +
      • +
      • +
        +

        findEnvVar

        +
        protected io.kubernetes.client.openapi.models.V1EnvVar findEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, +java.lang.String name)
        +
        +
      • +
      • +
        +

        addOrReplaceEnvVar

        +
        protected void addOrReplaceEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, +java.lang.String name, +java.lang.String value)
        +
        +
      • +
      • +
        +

        hideAdminUserCredentials

        +
        protected void hideAdminUserCredentials​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars)
        +
        +
      • +
      • +
        +

        varsToSubVariables

        +
        protected java.util.Map<java.lang.String,​java.lang.String> varsToSubVariables​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars)
        +
        +
      • augmentSubVars

        @@ -273,8 +362,8 @@

        getMainContainerName

    - + + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/CallBuilder.html b/docs/apidocs/oracle/kubernetes/operator/helpers/CallBuilder.html index 563ada882e2..c2f2b07e427 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/CallBuilder.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/CallBuilder.html @@ -2,10 +2,10 @@ - -CallBuilder (weblogic-kubernetes-operator 2.6.0 API) + +CallBuilder (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class CallBuilder

    @@ -423,6 +418,16 @@

    Method Summary

    +Step +patchConfigMapAsync​(java.lang.String name, +java.lang.String namespace, +io.kubernetes.client.custom.V1Patch patchBody, +ResponseStep<io.kubernetes.client.openapi.models.V1ConfigMap> responseStep) + +
    Asynchronous step for patching a config map.
    + + + Domain patchDomain​(java.lang.String uid, java.lang.String namespace, @@ -431,7 +436,7 @@

    Method Summary

    Patch domain.
    - + Step patchDomainAsync​(java.lang.String name, java.lang.String namespace, @@ -441,7 +446,7 @@

    Method Summary

    Asynchronous step for patching a domain.
    - + Step patchPodAsync​(java.lang.String name, java.lang.String namespace, @@ -451,7 +456,7 @@

    Method Summary

    Asynchronous step for patching a pod.
    - + Step readBetaCustomResourceDefinitionAsync​(java.lang.String name, ResponseStep<io.kubernetes.client.openapi.models.V1beta1CustomResourceDefinition> responseStep) @@ -459,7 +464,7 @@

    Method Summary

    Asynchronous step for reading CRD.
    - + Step readConfigMapAsync​(java.lang.String name, java.lang.String namespace, @@ -468,7 +473,7 @@

    Method Summary

    Asynchronous step for reading config map.
    - + Step readCustomResourceDefinitionAsync​(java.lang.String name, ResponseStep<io.kubernetes.client.openapi.models.V1CustomResourceDefinition> responseStep) @@ -476,7 +481,7 @@

    Method Summary

    Asynchronous step for reading CRD.
    - + Step readDomainAsync​(java.lang.String name, java.lang.String namespace, @@ -485,7 +490,7 @@

    Method Summary

    Asynchronous step for reading domain.
    - + Step readJobAsync​(java.lang.String name, java.lang.String namespace, @@ -494,14 +499,14 @@

    Method Summary

    Asynchronous step for reading job.
    - + io.kubernetes.client.openapi.models.V1Namespace readNamespace​(java.lang.String name)
    Read namespace.
    - + Step readPodAsync​(java.lang.String name, java.lang.String namespace, @@ -510,14 +515,14 @@

    Method Summary

    Asynchronous step for reading pod.
    - + Step readPodLogAsync​(java.lang.String name, java.lang.String namespace, ResponseStep<java.lang.String> responseStep)   - + io.kubernetes.client.openapi.models.V1Secret readSecret​(java.lang.String name, java.lang.String namespace) @@ -525,7 +530,7 @@

    Method Summary

    Read secret.
    - + Step readSecretAsync​(java.lang.String name, java.lang.String namespace, @@ -534,7 +539,7 @@

    Method Summary

    Asynchronous step for reading secret.
    - + io.kubernetes.client.openapi.models.V1Service readService​(java.lang.String name, java.lang.String namespace) @@ -542,7 +547,7 @@

    Method Summary

    Read service.
    - + Step readServiceAsync​(java.lang.String name, java.lang.String namespace, @@ -551,14 +556,14 @@

    Method Summary

    Asynchronous step for reading service.
    - + io.kubernetes.client.openapi.models.VersionInfo readVersionCode()
    Read Kubernetes version code.
    - + Step replaceBetaCustomResourceDefinitionAsync​(java.lang.String name, io.kubernetes.client.openapi.models.V1beta1CustomResourceDefinition body, @@ -567,7 +572,7 @@

    Method Summary

    Asynchronous step for replacing CRD.
    - + Step replaceConfigMapAsync​(java.lang.String name, java.lang.String namespace, @@ -577,7 +582,7 @@

    Method Summary

    Asynchronous step for replacing config map.
    - + Step replaceCustomResourceDefinitionAsync​(java.lang.String name, io.kubernetes.client.openapi.models.V1CustomResourceDefinition body, @@ -586,7 +591,7 @@

    Method Summary

    Asynchronous step for replacing CRD.
    - + Domain replaceDomain​(java.lang.String uid, java.lang.String namespace, @@ -595,7 +600,7 @@

    Method Summary

    Replace domain.
    - + Step replaceDomainAsync​(java.lang.String name, java.lang.String namespace, @@ -605,7 +610,7 @@

    Method Summary

    Asynchronous step for replacing domain.
    - + Step replaceDomainStatusAsync​(java.lang.String name, java.lang.String namespace, @@ -615,19 +620,19 @@

    Method Summary

    Asynchronous step for replacing domain status.
    - + CallBuilder with​(java.util.function.Consumer<CallBuilder> builderFunction)
    Consumer for lambda-based builder pattern.
    - + CallBuilder withFieldSelector​(java.lang.String fieldSelector)   - + CallBuilder withLabelSelectors​(java.lang.String... selectors)   @@ -1090,6 +1095,25 @@

    +

    patchConfigMapAsync

    +
    public Step patchConfigMapAsync​(java.lang.String name, +java.lang.String namespace, +io.kubernetes.client.custom.V1Patch patchBody, +ResponseStep<io.kubernetes.client.openapi.models.V1ConfigMap> responseStep)
    +
    Asynchronous step for patching a config map.
    +
    +
    Parameters:
    +
    name - Name
    +
    namespace - Namespace
    +
    patchBody - instructions on what to patch
    +
    responseStep - Response step for when call completes
    +
    Returns:
    +
    Asynchronous step
    +
    +
    + +
  • +

    listPodAsync

    public Step listPodAsync​(java.lang.String namespace, ResponseStep<io.kubernetes.client.openapi.models.V1PodList> responseStep)
    @@ -1589,8 +1613,8 @@

  • +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/CallBuilderFactory.html b/docs/apidocs/oracle/kubernetes/operator/helpers/CallBuilderFactory.html index 462cfc0afc0..855154ab9df 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/CallBuilderFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/CallBuilderFactory.html @@ -2,10 +2,10 @@ - -CallBuilderFactory (weblogic-kubernetes-operator 2.6.0 API) + +CallBuilderFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class CallBuilderFactory

    @@ -201,8 +196,8 @@

    create

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/ClientFactory.html b/docs/apidocs/oracle/kubernetes/operator/helpers/ClientFactory.html index 69ed72da9ce..6a9610152e7 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/ClientFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/ClientFactory.html @@ -2,10 +2,10 @@ - -ClientFactory (weblogic-kubernetes-operator 2.6.0 API) + +ClientFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Interface ClientFactory

    @@ -114,8 +109,8 @@

    Methods inherited from interface java.util.function.Supplier

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/ClientPool.html b/docs/apidocs/oracle/kubernetes/operator/helpers/ClientPool.html index cfb4bbe12a0..b196f0dbcea 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/ClientPool.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/ClientPool.html @@ -2,10 +2,10 @@ - -ClientPool (weblogic-kubernetes-operator 2.6.0 API) + +ClientPool (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ClientPool

    @@ -241,8 +236,8 @@

    create

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/ClusterConfig.html b/docs/apidocs/oracle/kubernetes/operator/helpers/ClusterConfig.html index c339ed6f54d..9ab7eb0dc76 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/ClusterConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/ClusterConfig.html @@ -2,10 +2,10 @@ - -ClusterConfig (weblogic-kubernetes-operator 2.6.0 API) + +ClusterConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ClusterConfig

    @@ -562,8 +557,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/ClusteredServerConfig.html b/docs/apidocs/oracle/kubernetes/operator/helpers/ClusteredServerConfig.html index b2ab1b558d0..7fb494d4a0b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/ClusteredServerConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/ClusteredServerConfig.html @@ -2,10 +2,10 @@ - -ClusteredServerConfig (weblogic-kubernetes-operator 2.6.0 API) + +ClusteredServerConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ClusteredServerConfig

    @@ -601,8 +596,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapConsumer.html b/docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapConsumer.html index f2b92b3c69c..57c09951d05 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapConsumer.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapConsumer.html @@ -2,10 +2,10 @@ - -ConfigMapConsumer (weblogic-kubernetes-operator 2.6.0 API) + +ConfigMapConsumer (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ConfigMapConsumer

    @@ -438,8 +433,8 @@

    entrySet

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapHelper.SitConfigMapContext.html b/docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapHelper.IntrospectorConfigMapContext.html similarity index 55% rename from docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapHelper.SitConfigMapContext.html rename to docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapHelper.IntrospectorConfigMapContext.html index 94e30a8b516..a39c1032cba 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapHelper.SitConfigMapContext.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapHelper.IntrospectorConfigMapContext.html @@ -2,11 +2,11 @@ - -ConfigMapHelper.SitConfigMapContext (weblogic-kubernetes-operator 2.6.0 API) + +ConfigMapHelper.IntrospectorConfigMapContext (weblogic-kubernetes-operator 3.0.0 API) - - + + @@ -20,8 +20,8 @@ - + - +
    +
    -

    Class ConfigMapHelper.SitConfigMapContext

    +

    Class ConfigMapHelper.IntrospectorConfigMapContext

    java.lang.Object -
    oracle.kubernetes.operator.helpers.ConfigMapHelper.SitConfigMapContext
    +
    oracle.kubernetes.operator.helpers.StepContextBase +
    oracle.kubernetes.operator.helpers.ConfigMapHelper.IntrospectorConfigMapContext
    +
    +
    All Implemented Interfaces:
    +
    StepContextConstants
    +
    +
    Enclosing class:
    ConfigMapHelper

    -
    public static class ConfigMapHelper.SitConfigMapContext
    -extends java.lang.Object
    +
    public static class ConfigMapHelper.IntrospectorConfigMapContext
    +extends StepContextBase
    @@ -156,7 +133,7 @@

    Field Summary

    Method Summary

    -
    +
    @@ -168,18 +145,18 @@

    Method Summary

    - - + + - - + + - - + + @@ -187,6 +164,11 @@

    Method Summary

    +

    Methods inherited from class oracle.kubernetes.operator.helpers.StepContextBase

    + + +doDeepSubstitution, doDeepSubstitution, updateForOwnerReference
    +

    Methods inherited from class java.lang.Object

    @@ -197,40 +179,6 @@

    Methods inherited from class java.lang.Object

      - -
    • -
      - - -

      Field Details

      -
        -
      • -
        -

        conflictStep

        -
        protected final Step conflictStep
        -
        -
      • -
      • -
        -

        operatorNamespace

        -
        protected final java.lang.String operatorNamespace
        -
        -
      • -
      • -
        -

        domainNamespace

        -
        protected final java.lang.String domainNamespace
        -
        -
      • -
      • -
        -

        model

        -
        protected io.kubernetes.client.openapi.models.V1ConfigMap model
        -
        -
      • -
      -
      -
    • @@ -240,20 +188,20 @@

      Method Details

      • -

        getConfigMapName

        -
        public static java.lang.String getConfigMapName​(java.lang.String domainUid)
        +

        getName

        +
        protected java.lang.String getName()
      • -

        createMetadata

        -
        protected io.kubernetes.client.openapi.models.V1ObjectMeta createMetadata​(java.lang.String configMapName)
        +

        getModel

        +
        protected io.kubernetes.client.openapi.models.V1ConfigMap getModel()
      • -

        isCompatibleMap

        -
        protected boolean isCompatibleMap​(io.kubernetes.client.openapi.models.V1ConfigMap existingMap)
        +

        createModel

        +
        protected final io.kubernetes.client.openapi.models.V1ConfigMap createModel​(java.util.Map<java.lang.String,​java.lang.String> data)
      @@ -262,8 +210,8 @@

      isC

    - + + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapHelper.html index 2c7e44a20ab..2c302440101 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapHelper.html @@ -2,10 +2,10 @@ - -ConfigMapHelper (weblogic-kubernetes-operator 2.6.0 API) + +ConfigMapHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class ConfigMapHelper

    @@ -122,14 +117,7 @@

    Nested Class Summary

    - - - - - - + @@ -157,39 +145,66 @@

    Method Summary

    - + - + - - - + + + + + + + + + + + + - + + + + + @@ -231,51 +246,107 @@

    createS
  • -

    createSitConfigMapStep

    -
    public static Step createSitConfigMapStep​(Step next)
    -
    Factory for Step that creates config map containing sit config.
    +

    getModelInImageSpecHash

    +
    public static int getModelInImageSpecHash​(java.lang.String imageName)
    +
    getModelInImageSpecHash returns the hash for the fields that should be compared for changes.
    +
    +
    Parameters:
    +
    imageName - image name
    +
    Returns:
    +
    int hash value of the fields
    +
    +
    +
  • +
  • +
    +

    getIntrospectorConfigMapName

    +
    public static java.lang.String getIntrospectorConfigMapName​(java.lang.String domainUid)
    +
    Returns the standard name for the generated domain config map.
    +
    +
    Parameters:
    +
    domainUid - the unique ID of the domain
    +
    Returns:
    +
    map name
    +
    +
    +
  • +
  • +
    +

    createIntrospectorConfigMapStep

    +
    public static Step createIntrospectorConfigMapStep​(Step next)
    +
    Factory for a step that creates or updates the generated domain config map from introspection results. + Reads the following packet fields: + DOMAIN_INTROSPECTOR_LOG_RESULT the introspection result + and updates: + DOMAIN_TOPOLOGY the parsed topology + DOMAIN_HASH a hash of the topology + SECRETS_HASH a hash of the override secrets + DOMAIN_RESTART_VERSION a field from the domain to force rolling when changed + DOMAIN_INPUTS_HASH a hash of the image used in the domain
    Parameters:
    next - Next step
    Returns:
    -
    Step for creating config map containing sit config
    +
    Step for creating config map containing introspection results
  • -

    deleteDomainIntrospectorConfigMapStep

    -
    public static Step deleteDomainIntrospectorConfigMapStep​(java.lang.String domainUid, +

    reportTopologyErrorsAndStop

    +
    public static Step reportTopologyErrorsAndStop()
    +
    +
  • +
  • +
    +

    deleteIntrospectorConfigMapStep

    +
    public static Step deleteIntrospectorConfigMapStep​(java.lang.String domainUid, java.lang.String namespace, Step next)
    -
    Factory for Step that deletes introspector config map.
    +
    Factory for a step that deletes the generated introspector config map.
    Parameters:
    domainUid - The unique identifier assigned to the WebLogic domain when it was registered
    -
    namespace - Namespace
    -
    next - Next processing step
    +
    namespace - the domain namespace
    +
    next - the next step to run after the map is deleted
    Returns:
    -
    Step for deleting introspector config map
    +
    the created step
  • -

    readExistingSituConfigMap

    -
    public static Step readExistingSituConfigMap​(java.lang.String ns, +

    readExistingIntrospectorConfigMap

    +
    public static Step readExistingIntrospectorConfigMap​(java.lang.String ns, java.lang.String domainUid)
    +
    Reads the introspector config map for the specified domain, populating the following packet entries: + DOMAIN_TOPOLOGY the parsed topology + DOMAIN_HASH a hash of the topology + SECRETS_HASH a hash of the override secrets + DOMAIN_RESTART_VERSION a field from the domain to force rolling when changed + DOMAIN_INPUTS_HASH a hash of the image used in the domain.
    +
    +
    Parameters:
    +
    ns - the namespace of the domain
    +
    domainUid - the unique domain ID
    +
    Returns:
    +
    a step to do the processing.
    +
  • -

    parseDomainTopologyYaml

    -
    public static ConfigMapHelper.DomainTopology parseDomainTopologyYaml​(java.lang.String topologyYaml)
    -
    parse domain topology yaml.
    +

    readIntrospectionVersionStep

    +
    public static Step readIntrospectionVersionStep​(java.lang.String ns, +java.lang.String domainUid)
    +
    Reads the introspector config map for the specified domain, populating the following packet entries. + INTROSPECTION_STATE_LABEL the value of the domain's 'introspectVersion' when this map was created
    Parameters:
    -
    topologyYaml - topology yaml.
    +
    ns - the namespace of the domain
    +
    domainUid - the unique domain ID
    Returns:
    -
    parsed object hierarchy
    +
    a step to do the processing.
  • @@ -285,8 +356,8 @@

    parseDomainTopologyYaml - + + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/ConflictRetry.html b/docs/apidocs/oracle/kubernetes/operator/helpers/ConflictRetry.html index 106077fac93..576fa01a3c1 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/ConflictRetry.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/ConflictRetry.html @@ -2,10 +2,10 @@ - -ConflictRetry (weblogic-kubernetes-operator 2.6.0 API) + +ConflictRetry (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface ConflictRetry<T>

    @@ -169,8 +164,8 @@

    getUpdatedObject

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/CrdHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/CrdHelper.html index 445f051cc2f..b91a533ad84 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/CrdHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/CrdHelper.html @@ -2,10 +2,10 @@ - -CrdHelper (weblogic-kubernetes-operator 2.6.0 API) + +CrdHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class CrdHelper

    @@ -124,7 +119,8 @@

    Method Summary

    - - + + + + + + - + - + @@ -289,8 +289,11 @@

    ServerStartupInfo

    -
    public ServerStartupInfo​(WlsServerConfig serverConfig, +
    public ServerStartupInfo​(@Nonnull +WlsServerConfig serverConfig, +@Nullable java.lang.String clusterName, +@Nonnull ServerSpec serverSpec, boolean isServiceOnly)
    Create server startup info.
    @@ -315,6 +318,12 @@

    Method Details

    • +

      getName

      +
      public java.lang.String getName()
      +
      +
    • +
    • +

      getServerName

      public java.lang.String getServerName()
      @@ -384,8 +393,8 @@

      hashCode

    - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/DomainPresenceInfo.html b/docs/apidocs/oracle/kubernetes/operator/helpers/DomainPresenceInfo.html index f9a20e78778..3bffef01306 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/DomainPresenceInfo.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/DomainPresenceInfo.html @@ -2,10 +2,10 @@ - -DomainPresenceInfo (weblogic-kubernetes-operator 2.6.0 API) + +DomainPresenceInfo (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,8 +20,8 @@ - + - +
    +

    Class DomainPresenceInfo

    @@ -175,7 +170,7 @@

    Constructor Summary

    Method Summary

    -
    +

    protected io.kubernetes.client.openapi.models.V1ObjectMetacreateMetadata​(java.lang.String configMapName)protected io.kubernetes.client.openapi.models.V1ConfigMapcreateModel​(java.util.Map<java.lang.String,​java.lang.String> data)  
    static java.lang.StringgetConfigMapName​(java.lang.String domainUid)protected io.kubernetes.client.openapi.models.V1ConfigMapgetModel()  
    protected booleanisCompatibleMap​(io.kubernetes.client.openapi.models.V1ConfigMap existingMap)protected java.lang.StringgetName()  
    static class ConfigMapHelper.DomainTopology -
    Domain topology.
    -
    static class ConfigMapHelper.SitConfigMapContextConfigMapHelper.IntrospectorConfigMapContext  
    static StepcreateScriptConfigMapStep​(java.lang.String operatorNamespace, -java.lang.String domainNamespace)createIntrospectorConfigMapStep​(Step next) -
    Factory for Step that creates config map containing scripts.
    +
    Factory for a step that creates or updates the generated domain config map from introspection results.
    static StepcreateSitConfigMapStep​(Step next)createScriptConfigMapStep​(java.lang.String operatorNamespace, +java.lang.String domainNamespace) -
    Factory for Step that creates config map containing sit config.
    +
    Factory for Step that creates config map containing scripts.
    static StepdeleteDomainIntrospectorConfigMapStep​(java.lang.String domainUid, +deleteIntrospectorConfigMapStep​(java.lang.String domainUid, java.lang.String namespace, Step next) -
    Factory for Step that deletes introspector config map.
    +
    Factory for a step that deletes the generated introspector config map.
    static ConfigMapHelper.DomainTopologyparseDomainTopologyYaml​(java.lang.String topologyYaml)static java.lang.StringgetIntrospectorConfigMapName​(java.lang.String domainUid) -
    parse domain topology yaml.
    +
    Returns the standard name for the generated domain config map.
    static intgetModelInImageSpecHash​(java.lang.String imageName) +
    getModelInImageSpecHash returns the hash for the fields that should be compared for changes.
    +
    static StepreadExistingIntrospectorConfigMap​(java.lang.String ns, +java.lang.String domainUid) +
    Reads the introspector config map for the specified domain, populating the following packet entries: + DOMAIN_TOPOLOGY the parsed topology + DOMAIN_HASH a hash of the topology + SECRETS_HASH a hash of the override secrets + DOMAIN_RESTART_VERSION a field from the domain to force rolling when changed + DOMAIN_INPUTS_HASH a hash of the image used in the domain.
    +
    static StepreadExistingSituConfigMap​(java.lang.String ns, +readIntrospectionVersionStep​(java.lang.String ns, java.lang.String domainUid) +
    Reads the introspector config map for the specified domain, populating the following packet entries.
    +
    static StepreportTopologyErrorsAndStop()  
    static StepcreateDomainCrdStep​(KubernetesVersion version, +createDomainCrdStep​(KubernetesVersion version, +SemanticVersion productVersion, Step next)
    Factory for Step that creates Domain CRD.
    @@ -172,13 +168,15 @@

    main

  • -

    createDomainCrdStep

    +

    createDomainCrdStep

    public static Step createDomainCrdStep​(KubernetesVersion version, +SemanticVersion productVersion, Step next)
    Factory for Step that creates Domain CRD.
    Parameters:
    version - Version of the Kubernetes API Server
    +
    productVersion - Version of the operator
    next - Next step
    Returns:
    Step for creating Domain custom resource definition
    @@ -191,8 +189,8 @@

    - +
    +

    Class DomainConfig

    @@ -436,8 +431,8 @@

    equals

    - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/DomainPresenceInfo.ServerStartupInfo.html b/docs/apidocs/oracle/kubernetes/operator/helpers/DomainPresenceInfo.ServerStartupInfo.html index e7a4fa946a4..3e98e5eab49 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/DomainPresenceInfo.ServerStartupInfo.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/DomainPresenceInfo.ServerStartupInfo.html @@ -2,10 +2,10 @@ - -DomainPresenceInfo.ServerStartupInfo (weblogic-kubernetes-operator 2.6.0 API) + +DomainPresenceInfo.ServerStartupInfo (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class DomainPresenceInfo.ServerStartupInfo

    @@ -215,20 +210,25 @@

    Method Summary

  • java.lang.StringgetServerName()getName()  
    java.lang.StringgetServerName() 
    int hashCode()  
    boolean isServiceOnly()  
    java.lang.String toString()  
    @@ -216,133 +211,138 @@

    Method Summary

    + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -350,13 +350,13 @@

    Method Summary

    Specifies the pod associated with an operator-managed server.
    - + - + @@ -364,25 +364,25 @@

    Method Summary

    Applies an add or modify event for a server pod.
    - + - + - + - + @@ -467,6 +467,12 @@

    removeServerService

  • +

    fromPacket

    +
    public static java.util.Optional<DomainPresenceInfo> fromPacket​(Packet packet)
    +
    +
  • +
  • +

    setServerPod

    public void setServerPod​(java.lang.String serverName, io.kubernetes.client.openapi.models.V1Pod pod)
    @@ -753,8 +759,8 @@

    getValidationWarningsAsString

    - + + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/DomainStatusPatch.html b/docs/apidocs/oracle/kubernetes/operator/helpers/DomainStatusPatch.html index 091fd83b20c..d82cbf79c9f 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/DomainStatusPatch.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/DomainStatusPatch.html @@ -2,10 +2,10 @@ - -DomainStatusPatch (weblogic-kubernetes-operator 2.6.0 API) + +DomainStatusPatch (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapHelper.DomainTopology.html b/docs/apidocs/oracle/kubernetes/operator/helpers/DomainTopology.html similarity index 71% rename from docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapHelper.DomainTopology.html rename to docs/apidocs/oracle/kubernetes/operator/helpers/DomainTopology.html index b0c9998dab2..62529bddff4 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/ConfigMapHelper.DomainTopology.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/DomainTopology.html @@ -2,11 +2,11 @@ - -ConfigMapHelper.DomainTopology (weblogic-kubernetes-operator 2.6.0 API) + +DomainTopology (weblogic-kubernetes-operator 3.0.0 API) - - + + @@ -20,8 +20,8 @@ - + - +
    +
    -

    Class ConfigMapHelper.DomainTopology

    +

    Class DomainTopology

    java.lang.Object -
    oracle.kubernetes.operator.helpers.ConfigMapHelper.DomainTopology
    +
    oracle.kubernetes.operator.helpers.DomainTopology
    -
    -
    Enclosing class:
    -
    ConfigMapHelper
    -

    -
    public static class ConfigMapHelper.DomainTopology
    +
    public class DomainTopology
     extends java.lang.Object
    Domain topology.
    @@ -128,6 +119,10 @@

    Constructor Summary

  • + + + +
    static java.util.Optional<DomainPresenceInfo>fromPacket​(Packet packet) 
    io.kubernetes.client.openapi.models.V1Service getClusterService​(java.lang.String clusterName)  
    Domain getDomain()
    Gets the domain.
    java.lang.String getDomainUid()
    Gets the Domain UID.
    io.kubernetes.client.openapi.models.V1Service getExternalService​(java.lang.String serverName)  
    LastKnownStatus getLastKnownServerStatus​(java.lang.String serverName)
    Returns the last status reported for the specified server.
    java.lang.String getNamespace()
    Gets the namespace.
    java.util.Collection<java.lang.String> getServerNames()
    Returns a collection of all servers defined.
    io.kubernetes.client.openapi.models.V1Pod getServerPod​(java.lang.String serverName)
    Returns the pod associated with an operator-managed server.
    java.util.stream.Stream<io.kubernetes.client.openapi.models.V1Pod> getServerPods()
    Returns a stream of all server pods present.
    java.util.concurrent.ConcurrentMap<java.lang.String,​oracle.kubernetes.operator.helpers.ServerKubernetesObjects> getServers()
    Map from server name to server objects (Pods and Services).
    io.kubernetes.client.openapi.models.V1Service getServerService​(java.lang.String serverName)  
    java.util.Collection<DomainPresenceInfo.ServerStartupInfo> getServerStartupInfo()
    Server startup info.
    java.lang.String getValidationWarningsAsString()
    Return all validation warnings as a String.
    int incrementAndGetFailureCount()  
    boolean isNotDeleting()  
    boolean isPopulated()  
    java.lang.Boolean isServerPodBeingDeleted​(java.lang.String serverName)  
    io.kubernetes.client.openapi.models.V1Service removeServerService​(java.lang.String serverName)  
    void setDeleting​(boolean deleting)  
    void setDomain​(Domain domain)
    Sets the domain.
    void setPopulated​(boolean populated)  
    void setServerPod​(java.lang.String serverName, io.kubernetes.client.openapi.models.V1Pod pod)
    void setServerPodBeingDeleted​(java.lang.String serverName, java.lang.Boolean isBeingDeleted)  
    void setServerPodFromEvent​(java.lang.String serverName, io.kubernetes.client.openapi.models.V1Pod event)
    void setServerService​(java.lang.String serverName, io.kubernetes.client.openapi.models.V1Service service)  
    void setServerStartupInfo​(java.util.Collection<DomainPresenceInfo.ServerStartupInfo> serverStartupInfo)
    Sets server startup info.
    java.lang.String toString()  
    void updateLastKnownServerStatus​(java.lang.String serverName, java.lang.String status) DomainTopology()  
    DomainTopology​(WlsDomainConfig domain) 
    @@ -140,7 +135,7 @@

    Constructor Summary

    Method Summary

    -
    +
    @@ -171,21 +166,36 @@

    Method Summary

    + + + + + + + + + + - + - + - + - + + + + + + - + - + + + + + + + + + + + + + + + + @@ -210,12 +230,12 @@

    Method Summary

    Methods inherited from class oracle.kubernetes.operator.helpers.BasePodStepContext

    -getContainer, getContainer, isK8sContainer +addDefaultEnvVarIfMissing, addEnvVar, addEnvVarIfTrue, addOrReplaceEnvVar, findEnvVar, getContainer, getContainer, hasEnvVar, hideAdminUserCredentials, isK8sContainer, varsToSubVariables +doDeepSubstitution, doDeepSubstitution, updateForOwnerReference

    Methods inherited from class java.lang.Object

    @@ -262,8 +282,14 @@

    getDataHome

  • +

    getWdtDomainType

    +
    protected java.lang.String getWdtDomainType()
    +
    +
  • +
  • +

    getDomainHomeSourceType

    -
    protected java.lang.String getDomainHomeSourceType()
    +
    protected DomainSourceType getDomainHomeSourceType()
  • @@ -284,7 +310,7 @@

    createPod
    Overrides:
    -
    createPodSpec in class StepContextBase
    +
    createPodSpec in class BasePodStepContext

  • @@ -294,7 +320,7 @@

    createC
    Overrides:
    -
    createContainer in class StepContextBase
    +
    createContainer in class BasePodStepContext
    @@ -322,14 +348,32 @@

    getDomainHome

    protected java.lang.String getDomainHome()
    +
  • +
    +

    getIntrospectMD5VolumeSource

    +
    protected io.kubernetes.client.openapi.models.V1ConfigMapVolumeSource getIntrospectMD5VolumeSource()
    +
    +
  • +
  • +
    +

    getWdtConfigMapVolumeSource

    +
    protected io.kubernetes.client.openapi.models.V1ConfigMapVolumeSource getWdtConfigMapVolumeSource​(java.lang.String name)
    +
    +
  • +
  • +
    +

    getOpssKeyWalletVolumeSource

    +
    protected io.kubernetes.client.openapi.models.V1ConfigMapVolumeSource getOpssKeyWalletVolumeSource​(java.lang.String name)
    +
    +
  • - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/KubernetesUtils.html b/docs/apidocs/oracle/kubernetes/operator/helpers/KubernetesUtils.html index 3c3d554eaf9..c20c7078351 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/KubernetesUtils.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/KubernetesUtils.html @@ -2,10 +2,10 @@ - -KubernetesUtils (weblogic-kubernetes-operator 2.6.0 API) + +KubernetesUtils (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class KubernetesUtils

    @@ -147,6 +142,20 @@

    Method Summary

    + + + + + + + + + + @@ -154,7 +163,7 @@

    Method Summary

    Returns true if the first metadata indicates a newer resource than does the second.
    - + @@ -217,6 +226,44 @@

    +

    getResourceVersion

    +
    public static java.math.BigInteger getResourceVersion​(io.kubernetes.client.openapi.models.V1ObjectMeta metadata)
    +
    Parse the resource version from the metadata. According to the Kubernetes design documentation, + https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/ + api-conventions.md#concurrency-control-and-consistency, the resource version is technically opaque; however, + the Kubernetes design also requires that clients be able to list changes to resources "after" the last + change to the same or different resource. Therefore, all Kubernetes implementations use a increasing positive + integer value for the resource version. This can be useful to detect out-of-order watch events. This method + parses the metadata's resource version into a big integer or to 0, if the value is not parsable.
    +
    +
    Parameters:
    +
    metadata - Meta data containing resource version
    +
    Returns:
    +
    The integer value of the resource version or 0, if the value is not parsable
    +
    +
    + +
  • +
    +

    getResourceVersion

    +
    public static java.math.BigInteger getResourceVersion​(java.lang.String resVersion)
    +
    Parse the resource version. According to the Kubernetes design documentation, + https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/ + api-conventions.md#concurrency-control-and-consistency, the resource version is technically opaque; however, + the Kubernetes design also requires that clients be able to list changes to resources "after" the last + change to the same or different resource. Therefore, all Kubernetes implementations use a increasing positive + integer value for the resource version. This can be useful to detect out-of-order watch events. This method + parses the metadata's resource version into a big integer or to 0, if the value is not parsable.
    +
    +
    Parameters:
    +
    resVersion - resource version
    +
    Returns:
    +
    The integer value of the resource version or 0, if the value is not parsable
    +
    +
    +
  • +
  • +

    withOperatorLabels

    public static io.kubernetes.client.openapi.models.V1ObjectMeta withOperatorLabels​(java.lang.String uid, io.kubernetes.client.openapi.models.V1ObjectMeta meta)
    @@ -228,8 +275,8 @@

    - +
    +

    Class KubernetesVersion

    java.lang.Object +
    oracle.kubernetes.operator.helpers.SemanticVersion
    oracle.kubernetes.operator.helpers.KubernetesVersion
    +
    +
    +
    All Implemented Interfaces:
    +
    java.lang.Comparable<SemanticVersion>
    +

    public class KubernetesVersion
    -extends java.lang.Object
    +extends SemanticVersion
    Major and minor version of Kubernetes API Server.
    @@ -183,11 +184,6 @@

    Method Summary

  • - - - - - @@ -197,6 +193,11 @@

    Method Summary

    +

    Methods inherited from class oracle.kubernetes.operator.helpers.SemanticVersion

    + + +compareTo, getCompatibilityWith, getMajor, getMinor, getNumericPortion, getRevision, hashCode
    +

    Methods inherited from class java.lang.Object

    @@ -259,17 +260,7 @@

    equals

    public boolean equals​(java.lang.Object o)
    Overrides:
    -
    equals in class java.lang.Object
    -
    - - -
  • -
    -

    hashCode

    -
    public int hashCode()
    -
    -
    Overrides:
    -
    hashCode in class java.lang.Object
    +
    equals in class SemanticVersion
  • @@ -279,7 +270,7 @@

    toString

    public java.lang.String toString()
    Overrides:
    -
    toString in class java.lang.Object
    +
    toString in class SemanticVersion
    @@ -289,8 +280,8 @@

    toString

    - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/LastKnownStatus.html b/docs/apidocs/oracle/kubernetes/operator/helpers/LastKnownStatus.html index a75afff3c93..4844de9a8eb 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/LastKnownStatus.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/LastKnownStatus.html @@ -2,10 +2,10 @@ - -LastKnownStatus (weblogic-kubernetes-operator 2.6.0 API) + +LastKnownStatus (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class LastKnownStatus

    @@ -288,8 +283,8 @@

    hashCode

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/LegalNames.html b/docs/apidocs/oracle/kubernetes/operator/helpers/LegalNames.html index 39c24331a13..6ae0025db73 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/LegalNames.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/LegalNames.html @@ -2,10 +2,10 @@ - -LegalNames (weblogic-kubernetes-operator 2.6.0 API) + +LegalNames (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class LegalNames

    @@ -126,6 +121,11 @@

    Field Summary

    + + + + +
    static DomainTopologyparseDomainTopologyYaml​(java.lang.String topologyYaml) +
    parse domain topology yaml.
    +
    static DomainTopologyparseDomainTopologyYaml​(java.lang.String topologyYaml, +java.util.function.Consumer<java.util.List<java.lang.String>> errorReporter) +
    Parses a topology yaml.
    +
    void setDomain​(WlsDomainConfig domain)  
    void setDomainValid​(boolean domainValid)  
    void setValidationErrors​(java.util.List<java.lang.String> validationErrors)  
    java.lang.String toString() @@ -220,6 +230,12 @@

    DomainTopology

    public DomainTopology()
    +
  • +
    +

    DomainTopology

    +
    public DomainTopology​(WlsDomainConfig domain)
    +
    +
  • @@ -232,6 +248,34 @@

    Method Details

    • +

      parseDomainTopologyYaml

      +
      public static DomainTopology parseDomainTopologyYaml​(java.lang.String topologyYaml, +java.util.function.Consumer<java.util.List<java.lang.String>> errorReporter)
      +
      Parses a topology yaml. If validation errors occur, logs them and returns null.
      +
      +
      Parameters:
      +
      topologyYaml - the YAML to parse
      +
      errorReporter - processing for the validation errors
      +
      Returns:
      +
      a valid topology or null
      +
      +
      +
    • +
    • +
      +

      parseDomainTopologyYaml

      +
      public static DomainTopology parseDomainTopologyYaml​(java.lang.String topologyYaml)
      +
      parse domain topology yaml.
      +
      +
      Parameters:
      +
      topologyYaml - topology yaml.
      +
      Returns:
      +
      parsed object hierarchy
      +
      +
      +
    • +
    • +

      getDomainValid

      public boolean getDomainValid()
      check if domain is valid.
      @@ -249,6 +293,12 @@

      setDomainValid

    • +

      setValidationErrors

      +
      public void setValidationErrors​(java.util.List<java.lang.String> validationErrors)
      +
      +
    • +
    • +

      getDomain

      public WlsDomainConfig getDomain()
      @@ -272,12 +322,6 @@

      getValidationErrors

    • -

      setValidationErrors

      -
      public void setValidationErrors​(java.util.List<java.lang.String> validationErrors)
      -
      -
    • -
    • -

      toString

      public java.lang.String toString()
      to string.
      @@ -295,8 +339,8 @@

      toString

    - + + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/DomainValidationSteps.html b/docs/apidocs/oracle/kubernetes/operator/helpers/DomainValidationSteps.html index 292b98d6312..ea8f7481fb8 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/DomainValidationSteps.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/DomainValidationSteps.html @@ -2,10 +2,10 @@ - -DomainValidationSteps (weblogic-kubernetes-operator 2.6.0 API) + +DomainValidationSteps (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/HealthCheckHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/HealthCheckHelper.html index bd0a72d1895..6bdbf80b11f 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/HealthCheckHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/HealthCheckHelper.html @@ -2,10 +2,10 @@ - -HealthCheckHelper (weblogic-kubernetes-operator 2.6.0 API) + +HealthCheckHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class HealthCheckHelper

    @@ -220,8 +215,8 @@

    performK8sVersionCheck

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/JobHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/JobHelper.html index 79eae17dc11..2a8f9e7983c 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/JobHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/JobHelper.html @@ -2,10 +2,10 @@ - -JobHelper (weblogic-kubernetes-operator 2.6.0 API) + +JobHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class JobHelper

    @@ -161,7 +156,12 @@

    Method Details

    createDomainIntrospectorJobStep

    public static Step createDomainIntrospectorJobStep​(Step next)
    -
    Factory for Step that creates WebLogic domain introspector job.
    +
    Factory for Step that creates WebLogic domain introspector job. + Uses the following packet values: + ProcessingConstants.DOMAIN_TOPOLOGY - the domain topology + ProcessingConstants.DOMAIN_RESTART_VERSION - the restart version from the domain + ProcessingConstants.DOMAIN_INPUTS_HASH + ProcessingConstants.DOMAIN_INTROSPECT_VERSION - the introspect version from the old domain spec
    Parameters:
    next - Next processing step
    @@ -189,8 +189,8 @@

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/JobStepContext.html b/docs/apidocs/oracle/kubernetes/operator/helpers/JobStepContext.html index 921e19976d1..428e65127f4 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/JobStepContext.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/JobStepContext.html @@ -2,10 +2,10 @@ - -JobStepContext (weblogic-kubernetes-operator 2.6.0 API) + +JobStepContext (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
     
    protected java.lang.Stringprotected DomainSourceType getDomainHomeSourceType()  
    protected io.kubernetes.client.openapi.models.V1ConfigMapVolumeSourcegetIntrospectMD5VolumeSource() 
    int getIstioReadinessPort()  
    protected java.lang.String getMainContainerName()  
    protected io.kubernetes.client.openapi.models.V1ConfigMapVolumeSourcegetOpssKeyWalletVolumeSource​(java.lang.String name) 
    protected io.kubernetes.client.openapi.models.V1ConfigMapVolumeSourcegetWdtConfigMapVolumeSource​(java.lang.String name) 
    protected java.lang.StringgetWdtDomainType() 
    boolean isIstioEnabled()  
    static java.math.BigIntegergetResourceVersion​(io.kubernetes.client.openapi.models.V1ObjectMeta metadata) +
    Parse the resource version from the metadata.
    +
    static java.math.BigIntegergetResourceVersion​(java.lang.String resVersion) +
    Parse the resource version.
    +
    static boolean isFirstNewer​(io.kubernetes.client.openapi.models.V1ObjectMeta first, io.kubernetes.client.openapi.models.V1ObjectMeta second)
    static io.kubernetes.client.openapi.models.V1ObjectMeta withOperatorLabels​(java.lang.String uid, io.kubernetes.client.openapi.models.V1ObjectMeta meta) 
    inthashCode() 
    java.lang.String toString()   DNS_1123_FIELDS_PARAM  
    static java.lang.StringDOMAIN_INTROSPECTOR_JOB_SUFFIX 
    @@ -247,6 +247,16 @@

    Field Details

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/NonClusteredServerConfig.html b/docs/apidocs/oracle/kubernetes/operator/helpers/NonClusteredServerConfig.html index 4390c36729c..5a812a28422 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/NonClusteredServerConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/NonClusteredServerConfig.html @@ -2,10 +2,10 @@ - -NonClusteredServerConfig (weblogic-kubernetes-operator 2.6.0 API) + +NonClusteredServerConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class NonClusteredServerConfig

    @@ -473,8 +468,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/OperatorServiceType.html b/docs/apidocs/oracle/kubernetes/operator/helpers/OperatorServiceType.html index f6b2f168b97..5c666d8528e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/OperatorServiceType.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/OperatorServiceType.html @@ -2,10 +2,10 @@ - -OperatorServiceType (weblogic-kubernetes-operator 2.6.0 API) + +OperatorServiceType (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/PodHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/PodHelper.html index 97841461cb2..0c9d5131081 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/PodHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/PodHelper.html @@ -2,10 +2,10 @@ - -PodHelper (weblogic-kubernetes-operator 2.6.0 API) + +PodHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class PodHelper

    @@ -129,13 +124,27 @@

    Method Summary

    +static io.kubernetes.client.openapi.models.V1Pod +createAdminServerPodModel​(Packet packet) + +
    Creates an admin server pod resource, based on the specified packet.
    + + + static Step createManagedPodStep​(Step next)
    Factory for Step that creates managed server pod.
    - + +static io.kubernetes.client.openapi.models.V1Pod +createManagedServerPodModel​(Packet packet) + +
    Creates a managed server pod resource, based on the specified packet.
    + + + static Step deletePodStep​(java.lang.String serverName, Step next) @@ -143,42 +152,42 @@

    Method Summary

    Factory for Step that deletes server pod.
    - + static java.lang.String getPodDomainUid​(io.kubernetes.client.openapi.models.V1Pod pod)
    get pod domain UID.
    - + static java.lang.String getPodServerName​(io.kubernetes.client.openapi.models.V1Pod pod)
    get pod's server name.
    - + static boolean getReadyStatus​(io.kubernetes.client.openapi.models.V1Pod pod)
    get if pod is in ready state.
    - + static boolean isDeleting​(io.kubernetes.client.openapi.models.V1Pod pod)
    Check if pod is deleting.
    - + static boolean isFailed​(io.kubernetes.client.openapi.models.V1Pod pod)
    Check if pod is in failed state.
    - + static boolean isReady​(io.kubernetes.client.openapi.models.V1Pod pod) @@ -209,6 +218,39 @@

    Method Details

    • +

      createAdminServerPodModel

      +
      public static io.kubernetes.client.openapi.models.V1Pod createAdminServerPodModel​(Packet packet)
      +
      Creates an admin server pod resource, based on the specified packet. + Expects the packet to contain a domain presence info as well as: + SCAN the topology for the server (WlsServerConfig) + DOMAIN_TOPOLOGY the topology for the domain (WlsDomainConfig)
      +
      +
      Parameters:
      +
      packet - a packet describing the domain model and topology.
      +
      Returns:
      +
      an appropriate Kubernetes resource
      +
      +
      +
    • +
    • +
      +

      createManagedServerPodModel

      +
      public static io.kubernetes.client.openapi.models.V1Pod createManagedServerPodModel​(Packet packet)
      +
      Creates a managed server pod resource, based on the specified packet. + Expects the packet to contain a domain presence info as well as: + CLUSTER_NAME (optional) the name of the cluster to which the server is assigned + SCAN the topology for the server (WlsServerConfig) + DOMAIN_TOPOLOGY the topology for the domain (WlsDomainConfig)
      +
      +
      Parameters:
      +
      packet - a packet describing the domain model and topology.
      +
      Returns:
      +
      an appropriate Kubernetes resource
      +
      +
      +
    • +
    • +

      isReady

      public static boolean isReady​(io.kubernetes.client.openapi.models.V1Pod pod)
      check if pod is ready.
      @@ -332,8 +374,8 @@

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/PodStepContext.html b/docs/apidocs/oracle/kubernetes/operator/helpers/PodStepContext.html index 6b2d5f87c97..a0fb1a8daad 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/PodStepContext.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/PodStepContext.html @@ -2,10 +2,10 @@ - -PodStepContext (weblogic-kubernetes-operator 2.6.0 API) + +PodStepContext (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + +addDefaultEnvVarIfMissing, addEnvVar, addEnvVarIfTrue, addOrReplaceEnvVar, createPodSpec, findEnvVar, getContainer, getContainer, getMainContainerName, hasEnvVar, hideAdminUserCredentials, isK8sContainer, varsToSubVariables +doDeepSubstitution, doDeepSubstitution, updateForOwnerReference - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/Pool.html b/docs/apidocs/oracle/kubernetes/operator/helpers/Pool.html index d1000718b29..a9569030487 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/Pool.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/Pool.html @@ -2,10 +2,10 @@ - -Pool (weblogic-kubernetes-operator 2.6.0 API) + +Pool (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class Pool<T>

    @@ -277,8 +272,8 @@

    create

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/ResourceVersion.html b/docs/apidocs/oracle/kubernetes/operator/helpers/ResourceVersion.html index 366d6e1349b..4bf6522ca11 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/ResourceVersion.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/ResourceVersion.html @@ -2,10 +2,10 @@ - -ResourceVersion (weblogic-kubernetes-operator 2.6.0 API) + +ResourceVersion (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ResourceVersion

    @@ -357,8 +352,8 @@

    hashCode

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/ResponseStep.html b/docs/apidocs/oracle/kubernetes/operator/helpers/ResponseStep.html index 71488248269..a0c4c1aed37 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/ResponseStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/ResponseStep.html @@ -2,10 +2,10 @@ - -ResponseStep (weblogic-kubernetes-operator 2.6.0 API) + +ResponseStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/RollingHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/RollingHelper.html index 37149d78c0b..4b78b17e13c 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/RollingHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/RollingHelper.html @@ -2,10 +2,10 @@ - -RollingHelper (weblogic-kubernetes-operator 2.6.0 API) + +RollingHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/SecretHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/SecretHelper.html index 92929dc5f75..351ea4ddd11 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/SecretHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/SecretHelper.html @@ -2,10 +2,10 @@ - -SecretHelper (weblogic-kubernetes-operator 2.6.0 API) + +SecretHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/SecretType.html b/docs/apidocs/oracle/kubernetes/operator/helpers/SecretType.html index 8dea0aa395d..73422e56338 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/SecretType.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/SecretType.html @@ -2,10 +2,10 @@ - -SecretType (weblogic-kubernetes-operator 2.6.0 API) + +SecretType (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Enum SecretType

    @@ -148,6 +143,18 @@

    Enum Constant Summary

      +OpssWalletFile +  + + +OpssWalletPassword +  + + +RuntimeEncryption +  + + WebLogicCredentials   @@ -234,6 +241,24 @@

    ConfigOverride

    public static final SecretType ConfigOverride
    +
  • +
    +

    RuntimeEncryption

    +
    public static final SecretType RuntimeEncryption
    +
    +
  • +
  • +
    +

    OpssWalletPassword

    +
    public static final SecretType OpssWalletPassword
    +
    +
  • +
  • +
    +

    OpssWalletFile

    +
    public static final SecretType OpssWalletFile
    +
    +
  • @@ -281,8 +306,8 @@

    valueOf

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/SemanticVersion.html b/docs/apidocs/oracle/kubernetes/operator/helpers/SemanticVersion.html new file mode 100644 index 00000000000..2b57a8f4cb3 --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/SemanticVersion.html @@ -0,0 +1,423 @@ + + + + + +SemanticVersion (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    + +
    + +

    Class SemanticVersion

    +
    +
    +
    java.lang.Object +
    oracle.kubernetes.operator.helpers.SemanticVersion
    +
    +
    +
    +
    All Implemented Interfaces:
    +
    java.lang.Comparable<SemanticVersion>
    +
    +
    +
    Direct Known Subclasses:
    +
    KubernetesVersion
    +
    +
    +
    public class SemanticVersion
    +extends java.lang.Object
    +implements java.lang.Comparable<SemanticVersion>
    +
    Major, minor and revision version specification for a product.
    +
    +
    +
      + +
    • +
      + + +

      Constructor Summary

      +
      + + + + + + + + + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      SemanticVersion​(int major, +int minor) +
      Construct semantic version.
      +
      SemanticVersion​(int major, +int minor, +int revision) +
      Construct semantic version.
      +
      SemanticVersion​(java.lang.String fullVersion) +
      Construct semantic version.
      +
      +
      +
      +
    • + +
    • +
      + + +

      Method Summary

      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Modifier and TypeMethodDescription
      intcompareTo​(@NotNull SemanticVersion o) 
      booleanequals​(java.lang.Object o) 
      oracle.kubernetes.operator.helpers.SemanticVersion.CompatibilitygetCompatibilityWith​(java.lang.String minimumVersion) +
      Compatibility check, similar to compare, but that reports more details on revision comparision.
      +
      intgetMajor() 
      intgetMinor() 
      protected static intgetNumericPortion​(java.lang.String numericString) 
      intgetRevision() 
      inthashCode() 
      java.lang.StringtoString() 
      +
      +
      +
      +

      Methods inherited from class java.lang.Object

      + + +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
      +
      +
    • +
    +
    +
    +
      + +
    • +
      + + +

      Constructor Details

      +
        +
      • +
        +

        SemanticVersion

        +
        public SemanticVersion​(int major, +int minor)
        +
        Construct semantic version.
        +
        +
        Parameters:
        +
        major - major
        +
        minor - minor
        +
        +
        +
      • +
      • +
        +

        SemanticVersion

        +
        public SemanticVersion​(int major, +int minor, +int revision)
        +
        Construct semantic version.
        +
        +
        Parameters:
        +
        major - major
        +
        minor - minor
        +
        revision - revision
        +
        +
        +
      • +
      • +
        +

        SemanticVersion

        +
        public SemanticVersion​(java.lang.String fullVersion)
        +
        Construct semantic version.
        +
        +
        Parameters:
        +
        fullVersion - Version formatted like "1.2[.3[+abcd]]
        +
        +
        +
      • +
      +
      +
    • + +
    • +
      + + +

      Method Details

      +
        +
      • +
        +

        getNumericPortion

        +
        protected static int getNumericPortion​(java.lang.String numericString)
        +
        +
      • +
      • +
        +

        getMajor

        +
        public int getMajor()
        +
        +
      • +
      • +
        +

        getMinor

        +
        public int getMinor()
        +
        +
      • +
      • +
        +

        getRevision

        +
        public int getRevision()
        +
        +
      • +
      • +
        +

        getCompatibilityWith

        +
        public oracle.kubernetes.operator.helpers.SemanticVersion.Compatibility getCompatibilityWith​(java.lang.String minimumVersion)
        +
        Compatibility check, similar to compare, but that reports more details on revision comparision.
        +
        +
        Parameters:
        +
        minimumVersion - Minimum version
        +
        Returns:
        +
        Compatibility statement
        +
        +
        +
      • +
      • +
        +

        equals

        +
        public boolean equals​(java.lang.Object o)
        +
        +
        Overrides:
        +
        equals in class java.lang.Object
        +
        +
        +
      • +
      • +
        +

        hashCode

        +
        public int hashCode()
        +
        +
        Overrides:
        +
        hashCode in class java.lang.Object
        +
        +
        +
      • +
      • +
        +

        toString

        +
        public java.lang.String toString()
        +
        +
        Overrides:
        +
        toString in class java.lang.Object
        +
        +
        +
      • +
      • +
        +

        compareTo

        +
        public int compareTo​(@NotNull +@NotNull SemanticVersion o)
        +
        +
        Specified by:
        +
        compareTo in interface java.lang.Comparable<SemanticVersion>
        +
        +
        +
      • +
      +
      +
    • +
    +
    +
    + +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/ServerConfig.html b/docs/apidocs/oracle/kubernetes/operator/helpers/ServerConfig.html index d0834dfa046..efc33aec5db 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/ServerConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/ServerConfig.html @@ -2,10 +2,10 @@ - -ServerConfig (weblogic-kubernetes-operator 2.6.0 API) + +ServerConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ServerConfig

    @@ -704,8 +699,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/ServiceHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/ServiceHelper.html index 96b790b3d63..93bad6c337a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/ServiceHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/ServiceHelper.html @@ -2,10 +2,10 @@ - -ServiceHelper (weblogic-kubernetes-operator 2.6.0 API) + +ServiceHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/StepContextBase.html b/docs/apidocs/oracle/kubernetes/operator/helpers/StepContextBase.html index 980f97cd458..22bf99de8ca 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/StepContextBase.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/StepContextBase.html @@ -2,10 +2,10 @@ - -StepContextBase (weblogic-kubernetes-operator 2.6.0 API) + +StepContextBase (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class StepContextBase

    @@ -103,7 +98,7 @@

    Class StepContextBase

    Direct Known Subclasses:
    -
    BasePodStepContext
    +
    BasePodStepContext, ConfigMapHelper.IntrospectorConfigMapContext

    public abstract class StepContextBase
    @@ -118,36 +113,30 @@ 

    Class StepContextBase

    Field Summary

    - - - - -
  • -
    - - -

    Constructor Summary

    - + - + + - + +
    Constructors Fields 
    ConstructorModifier and TypeField Description
    StepContextBase()protected DomainPresenceInfoinfo  
    +
  • @@ -169,69 +158,21 @@

    Method Summary

    -protected void -addDefaultEnvVarIfMissing​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, -java.lang.String name, -java.lang.String value) -  - - -protected void -addEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, -java.lang.String name, -java.lang.String value) -  - - -protected void -addOrReplaceEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, -java.lang.String name, -java.lang.String value) -  - - -protected io.kubernetes.client.openapi.models.V1Container -createContainer​(TuningParameters tuningParameters) -  - - -protected io.kubernetes.client.openapi.models.V1PodSpec -createPodSpec​(TuningParameters tuningParameters) -  - - protected <T> T doDeepSubstitution​(java.util.Map<java.lang.String,​java.lang.String> substitutionVariables, T obj)   - + protected <T> T doDeepSubstitution​(java.util.Map<java.lang.String,​java.lang.String> substitutionVariables, T obj, boolean requiresDns1123)   - -protected io.kubernetes.client.openapi.models.V1EnvVar -findEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, -java.lang.String name) -  - - -protected boolean -hasEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, -java.lang.String name) -  - - -protected void -hideAdminUserCredentials​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars) -  - - -protected java.util.Map<java.lang.String,​java.lang.String> -varsToSubVariables​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars) + +protected io.kubernetes.client.openapi.models.V1ObjectMeta +updateForOwnerReference​(io.kubernetes.client.openapi.models.V1ObjectMeta metadata)   @@ -249,17 +190,17 @@

    Methods inherited from class java.lang.Object

      - +
    • -
      +
      -

      Constructor Details

      +

      Field Details

      @@ -274,24 +215,6 @@

      Method Details

      • -

        createContainer

        -
        protected io.kubernetes.client.openapi.models.V1Container createContainer​(TuningParameters tuningParameters)
        -
        -
      • -
      • -
        -

        createPodSpec

        -
        protected io.kubernetes.client.openapi.models.V1PodSpec createPodSpec​(TuningParameters tuningParameters)
        -
        -
      • -
      • -
        -

        varsToSubVariables

        -
        protected java.util.Map<java.lang.String,​java.lang.String> varsToSubVariables​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars)
        -
        -
      • -
      • -

        doDeepSubstitution

        @@ -311,46 +234,8 @@

      • -

        addEnvVar

        -
        protected void addEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, -java.lang.String name, -java.lang.String value)
        -
        -
      • -
      • -
        -

        hasEnvVar

        -
        protected boolean hasEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, -java.lang.String name)
        -
        -
      • -
      • -
        -

        addDefaultEnvVarIfMissing

        -
        protected void addDefaultEnvVarIfMissing​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, -java.lang.String name, -java.lang.String value)
        -
        -
      • -
      • -
        -

        findEnvVar

        -
        protected io.kubernetes.client.openapi.models.V1EnvVar findEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, -java.lang.String name)
        -
        -
      • -
      • -
        -

        addOrReplaceEnvVar

        -
        protected void addOrReplaceEnvVar​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars, -java.lang.String name, -java.lang.String value)
        -
        -
      • -
      • -
        -

        hideAdminUserCredentials

        -
        protected void hideAdminUserCredentials​(java.util.List<io.kubernetes.client.openapi.models.V1EnvVar> vars)
        +

        updateForOwnerReference

        +
        protected io.kubernetes.client.openapi.models.V1ObjectMeta updateForOwnerReference​(io.kubernetes.client.openapi.models.V1ObjectMeta metadata)
      @@ -359,8 +244,8 @@

      hideAdminUserCredentials

    -
    +
    @@ -406,5 +291,7 @@

    hideAdminUserCredentials

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/StepContextConstants.html b/docs/apidocs/oracle/kubernetes/operator/helpers/StepContextConstants.html index 8f7967a321f..3556c99965e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/StepContextConstants.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/StepContextConstants.html @@ -2,10 +2,10 @@ - -StepContextConstants (weblogic-kubernetes-operator 2.6.0 API) + +StepContextConstants (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Interface StepContextConstants

    @@ -90,7 +85,7 @@

    Interface StepContextCo
    All Known Implementing Classes:
    -
    BasePodStepContext, JobStepContext, PodStepContext, StepContextBase
    +
    BasePodStepContext, ConfigMapHelper.IntrospectorConfigMapContext, JobStepContext, PodStepContext, StepContextBase

    public interface StepContextConstants
    @@ -141,6 +136,26 @@

    Field Summary

    static java.lang.String +OPSS_KEY_MOUNT_PATH +  + + +static java.lang.String +OPSS_KEYPASSPHRASE_VOLUME +  + + +static java.lang.String +OPSS_WALLETFILE_MOUNT_PATH +  + + +static java.lang.String +OPSS_WALLETFILE_VOLUME +  + + +static java.lang.String OVERRIDE_SECRETS_MOUNT_PATH   @@ -151,6 +166,16 @@

    Field Summary

    static java.lang.String +RUNTIME_ENCRYPTION_SECRET_MOUNT_PATH +  + + +static java.lang.String +RUNTIME_ENCRYPTION_SECRET_VOLUME +  + + +static java.lang.String SCRIPTS_MOUNTS_PATH   @@ -174,6 +199,31 @@

    Field Summary

    SIT_CONFIG_MAP_VOLUME   + +static java.lang.String +STORAGE_VOLUME +  + + +static java.lang.String +WDT_CONFIG_MAP_VOLUME +  + + +static java.lang.String +WDT_ENCRYPT_KEY_MOUNT_PATH +  + + +static java.lang.String +WDT_ENCRYPT_PASSPHRASE_VOLUME +  + + +static java.lang.String +WDTCONFIGMAP_MOUNT_PATH +  +

    @@ -192,6 +242,36 @@

    Field Details

    - + + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AnnotationHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AnnotationHelper.html index 2980ecdec31..06159c4fc3d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AnnotationHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AnnotationHelper.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.AnnotationHelper (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.AnnotationHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.AnnotationHelper

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AsyncRequestStepFactory.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AsyncRequestStepFactory.html index 1bc12417b25..15818fe2da2 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AsyncRequestStepFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AsyncRequestStepFactory.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.helpers.AsyncRequestStepFactory (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.helpers.AsyncRequestStepFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.helpers.AsyncRequestStepFactory

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthenticationProxy.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthenticationProxy.html index 87cd49be309..edbe1e1f1fe 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthenticationProxy.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthenticationProxy.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.AuthenticationProxy (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.AuthenticationProxy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.AuthenticationProxy

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.Operation.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.Operation.html index 2643cb1ea6e..e92d90ff55b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.Operation.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.Operation.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.AuthorizationProxy.Operation

    @@ -220,5 +215,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.Resource.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.Resource.html index 47c72ec1d8a..905d5ce29ab 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.Resource.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.Resource.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.AuthorizationProxy.Resource

    @@ -220,5 +215,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.Scope.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.Scope.html index f8d62ae199c..0bd3229e254 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.Scope.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.Scope.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.AuthorizationProxy.Scope (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.AuthorizationProxy.Scope (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.AuthorizationProxy.Scope

    @@ -211,5 +206,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.html index 70a3a379892..40e52f1d512 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/AuthorizationProxy.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.AuthorizationProxy (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.AuthorizationProxy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.AuthorizationProxy

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/BasePodStepContext.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/BasePodStepContext.html index 7983490c49a..4061c710921 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/BasePodStepContext.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/BasePodStepContext.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.BasePodStepContext (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.BasePodStepContext (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.BasePodStepContext

    @@ -154,5 +149,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/CallBuilder.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/CallBuilder.html index b445507e369..94a3fcf6a65 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/CallBuilder.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/CallBuilder.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.CallBuilder (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.CallBuilder (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.CallBuilder

    @@ -187,5 +182,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/CallBuilderFactory.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/CallBuilderFactory.html index 21006046ebd..f3583cf53d5 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/CallBuilderFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/CallBuilderFactory.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.CallBuilderFactory (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.CallBuilderFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.CallBuilderFactory

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClientFactory.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClientFactory.html index 23bdfba50d3..7c778e5d3da 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClientFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClientFactory.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.helpers.ClientFactory (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.helpers.ClientFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.helpers.ClientFactory

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClientPool.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClientPool.html index c15987df0f6..db94a1330e8 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClientPool.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClientPool.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.ClientPool (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.ClientPool (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.ClientPool

    @@ -214,5 +209,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClusterConfig.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClusterConfig.html index 58a6c8017d8..604f303aaa1 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClusterConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClusterConfig.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.ClusterConfig (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.ClusterConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.ClusterConfig

    @@ -266,5 +261,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClusteredServerConfig.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClusteredServerConfig.html index d4099942256..86239e448a8 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClusteredServerConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ClusteredServerConfig.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.ClusteredServerConfig (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.ClusteredServerConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.ClusteredServerConfig

    @@ -272,5 +267,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapConsumer.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapConsumer.html index 71c2957239d..ebe7cbd62b3 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapConsumer.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapConsumer.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.ConfigMapConsumer (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.ConfigMapConsumer (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.ConfigMapConsumer

    @@ -149,5 +144,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapHelper.SitConfigMapContext.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapHelper.IntrospectorConfigMapContext.html similarity index 78% rename from docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapHelper.SitConfigMapContext.html rename to docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapHelper.IntrospectorConfigMapContext.html index b7119c22a7a..47ec6266303 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapHelper.SitConfigMapContext.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapHelper.IntrospectorConfigMapContext.html @@ -2,11 +2,11 @@ - -Uses of Class oracle.kubernetes.operator.helpers.ConfigMapHelper.SitConfigMapContext (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.ConfigMapHelper.IntrospectorConfigMapContext (weblogic-kubernetes-operator 3.0.0 API) - - + + @@ -25,9 +25,9 @@ -
    + - - +
    +
    -

    Uses of Class
    oracle.kubernetes.operator.helpers.ConfigMapHelper.SitConfigMapContext

    +

    Uses of Class
    oracle.kubernetes.operator.helpers.ConfigMapHelper.IntrospectorConfigMapContext

    -
    No usage of oracle.kubernetes.operator.helpers.ConfigMapHelper.SitConfigMapContext
    +
    No usage of oracle.kubernetes.operator.helpers.ConfigMapHelper.IntrospectorConfigMapContext
    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapHelper.html index e2cf258f058..609c8710930 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapHelper.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.ConfigMapHelper (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.ConfigMapHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.ConfigMapHelper

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConflictRetry.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConflictRetry.html index abd53328453..45137df4077 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConflictRetry.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConflictRetry.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.helpers.ConflictRetry (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.helpers.ConflictRetry (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.helpers.ConflictRetry

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/CrdHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/CrdHelper.html index c119ee096bb..a3be0be03e8 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/CrdHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/CrdHelper.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.CrdHelper (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.CrdHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.CrdHelper

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainConfig.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainConfig.html index 21403d6e50e..5ebbf2e8992 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainConfig.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.DomainConfig (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.DomainConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.DomainConfig

    @@ -174,5 +169,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainPresenceInfo.ServerStartupInfo.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainPresenceInfo.ServerStartupInfo.html index acf2bbfe6de..d619011a8cc 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainPresenceInfo.ServerStartupInfo.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainPresenceInfo.ServerStartupInfo.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.DomainPresenceInfo.ServerStartupInfo (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.DomainPresenceInfo.ServerStartupInfo (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.DomainPresenceInfo.ServerStartupInfo

    @@ -160,7 +155,7 @@

    Uses of -ManagedServerUpIteratorStep​(java.util.Collection<DomainPresenceInfo.ServerStartupInfo> cols, +ManagedServerUpIteratorStep​(java.util.Collection<DomainPresenceInfo.ServerStartupInfo> startupInfos, Step next)   @@ -201,5 +196,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainPresenceInfo.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainPresenceInfo.html index 2976c19e606..684507b8e7f 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainPresenceInfo.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainPresenceInfo.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.DomainPresenceInfo (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.DomainPresenceInfo (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.DomainPresenceInfo

    @@ -118,22 +113,14 @@

    Uses of -void -DomainProcessor.makeRightDomainPresence​(DomainPresenceInfo info, -boolean explicitRecheck, -boolean isDeleting, -boolean isWillInterrupt) +MakeRightDomainOperation +DomainProcessor.createMakeRightOperation​(DomainPresenceInfo liveInfo)   -void -DomainProcessorImpl.makeRightDomainPresence​(DomainPresenceInfo info, -boolean explicitRecheck, -boolean isDeleting, -boolean isWillInterrupt) - -
    Begin activity to align domain status with domain resource.
    - +oracle.kubernetes.operator.DomainProcessorImpl.MakeRightDomainOperationImpl +DomainProcessorImpl.createMakeRightOperation​(DomainPresenceInfo liveInfo) +  @@ -147,6 +134,44 @@

    Uses of DomainPresenceInfo in oracle.kubernetes.operator.helpers

    + + + + + + + + + + + + + + + +
    Fields in oracle.kubernetes.operator.helpers declared as DomainPresenceInfo 
    Modifier and TypeFieldDescription
    protected DomainPresenceInfoStepContextBase.info 
    +
    +
    + + + + + + + + + + + + + + + + +
    Methods in oracle.kubernetes.operator.helpers that return types with arguments of type DomainPresenceInfo 
    Modifier and TypeMethodDescription
    static java.util.Optional<DomainPresenceInfo>DomainPresenceInfo.fromPacket​(Packet packet) 
    +
    +
    + @@ -258,5 +283,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainStatusPatch.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainStatusPatch.html index 5a093549eb9..12be151ef65 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainStatusPatch.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainStatusPatch.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.DomainStatusPatch (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.DomainStatusPatch (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.DomainStatusPatch

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapHelper.DomainTopology.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainTopology.html similarity index 64% rename from docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapHelper.DomainTopology.html rename to docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainTopology.html index d40e77565d5..181784e9441 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ConfigMapHelper.DomainTopology.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainTopology.html @@ -2,11 +2,11 @@ - -Uses of Class oracle.kubernetes.operator.helpers.ConfigMapHelper.DomainTopology (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.DomainTopology (weblogic-kubernetes-operator 3.0.0 API) - - + + @@ -25,9 +25,9 @@ -
    + - - +
    +
    -

    Uses of Class
    oracle.kubernetes.operator.helpers.ConfigMapHelper.DomainTopology

    +

    Uses of Class
    oracle.kubernetes.operator.helpers.DomainTopology

    Methods in oracle.kubernetes.operator.helpers with parameters of type DomainPresenceInfo 
    - + @@ -95,10 +90,10 @@

    -

    Uses of ConfigMapHelper.DomainTopology in oracle.kubernetes.operator.helpers

    +

    Uses of DomainTopology in oracle.kubernetes.operator.helpers

    Packages that use ConfigMapHelper.DomainTopology Packages that use DomainTopology 
    Package
    - + @@ -108,12 +103,20 @@

    Uses of -

    - + + + + + + +
    Methods in oracle.kubernetes.operator.helpers that return ConfigMapHelper.DomainTopology Methods in oracle.kubernetes.operator.helpers that return DomainTopology 
    Modifier and Typestatic ConfigMapHelper.DomainTopologyConfigMapHelper.parseDomainTopologyYaml​(java.lang.String topologyYaml)static DomainTopologyDomainTopology.parseDomainTopologyYaml​(java.lang.String topologyYaml)
    parse domain topology yaml.
    static DomainTopologyDomainTopology.parseDomainTopologyYaml​(java.lang.String topologyYaml, +java.util.function.Consumer<java.util.List<java.lang.String>> errorReporter) +
    Parses a topology yaml.
    +
    @@ -136,7 +139,7 @@

    Uses of
  • Overview
  • Package
  • -
  • Class
  • +
  • Class
  • Tree
  • Deprecated
  • @@ -151,5 +154,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainValidationSteps.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainValidationSteps.html index 2464687d0c4..8b7b517169f 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainValidationSteps.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainValidationSteps.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.DomainValidationSteps (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.DomainValidationSteps (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.DomainValidationSteps

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/HealthCheckHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/HealthCheckHelper.html index a148db3c5ba..b97b2ede605 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/HealthCheckHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/HealthCheckHelper.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.HealthCheckHelper (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.HealthCheckHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.HealthCheckHelper

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/JobHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/JobHelper.html index 3dc0473d3f1..559711ddd02 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/JobHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/JobHelper.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.JobHelper (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.JobHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.JobHelper

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/JobStepContext.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/JobStepContext.html index 0bd9e3d97c4..4192ffa66a7 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/JobStepContext.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/JobStepContext.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.JobStepContext (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.JobStepContext (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.JobStepContext

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/KubernetesUtils.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/KubernetesUtils.html index a58e46819ce..95bf53694e5 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/KubernetesUtils.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/KubernetesUtils.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.KubernetesUtils (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.KubernetesUtils (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.KubernetesUtils

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/KubernetesVersion.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/KubernetesVersion.html index 69b12aa5bce..4044b166bb4 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/KubernetesVersion.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/KubernetesVersion.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.KubernetesVersion (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.KubernetesVersion (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.KubernetesVersion

    @@ -183,7 +178,8 @@

    Uses of static Step -CrdHelper.createDomainCrdStep​(KubernetesVersion version, +CrdHelper.createDomainCrdStep​(KubernetesVersion version, +SemanticVersion productVersion, Step next)
    Factory for Step that creates Domain CRD.
    @@ -235,5 +231,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/LastKnownStatus.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/LastKnownStatus.html index e6392a85d71..ca35a8ad1c6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/LastKnownStatus.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/LastKnownStatus.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.LastKnownStatus (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.LastKnownStatus (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.LastKnownStatus

    @@ -151,5 +146,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/LegalNames.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/LegalNames.html index e72657f0819..0a3fd086ab1 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/LegalNames.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/LegalNames.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.LegalNames (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.LegalNames (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.LegalNames

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/NonClusteredServerConfig.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/NonClusteredServerConfig.html index 047f5a9013c..f06576ecd16 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/NonClusteredServerConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/NonClusteredServerConfig.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.NonClusteredServerConfig (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.NonClusteredServerConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.NonClusteredServerConfig

    @@ -258,5 +253,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/OperatorServiceType.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/OperatorServiceType.html index e6bbf424add..edd6dff0c59 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/OperatorServiceType.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/OperatorServiceType.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.OperatorServiceType (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.OperatorServiceType (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.OperatorServiceType

    @@ -159,5 +154,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/PodHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/PodHelper.html index afc269fe0e9..268a4c98916 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/PodHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/PodHelper.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.PodHelper (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.PodHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.PodHelper

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/PodStepContext.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/PodStepContext.html index e1a149fc3d0..c79543bdd1a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/PodStepContext.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/PodStepContext.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.PodStepContext (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.PodStepContext (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.PodStepContext

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/Pool.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/Pool.html index 31372f9b4ac..24b017a8089 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/Pool.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/Pool.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.Pool (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.Pool (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.Pool

    @@ -216,5 +211,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ResourceVersion.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ResourceVersion.html index 6ac93a1a33c..93fb79065b1 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ResourceVersion.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ResourceVersion.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.ResourceVersion (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.ResourceVersion (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.ResourceVersion

    @@ -149,5 +144,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ResponseStep.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ResponseStep.html index 8d226a3c07c..acb62232902 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ResponseStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ResponseStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.ResponseStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.ResponseStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.ResponseStep

    @@ -335,6 +330,16 @@

    Uses of Step +CallBuilder.patchConfigMapAsync​(java.lang.String name, +java.lang.String namespace, +io.kubernetes.client.custom.V1Patch patchBody, +ResponseStep<io.kubernetes.client.openapi.models.V1ConfigMap> responseStep) + +
    Asynchronous step for patching a config map.
    + + + +Step CallBuilder.patchDomainAsync​(java.lang.String name, java.lang.String namespace, io.kubernetes.client.custom.V1Patch patchBody, @@ -343,7 +348,7 @@

    Uses of Asynchronous step for patching a domain.

    - + Step CallBuilder.patchPodAsync​(java.lang.String name, java.lang.String namespace, @@ -353,7 +358,7 @@

    Uses of Asynchronous step for patching a pod.

    - + Step CallBuilder.readBetaCustomResourceDefinitionAsync​(java.lang.String name, ResponseStep<io.kubernetes.client.openapi.models.V1beta1CustomResourceDefinition> responseStep) @@ -361,7 +366,7 @@

    Uses of Asynchronous step for reading CRD. - + Step CallBuilder.readConfigMapAsync​(java.lang.String name, java.lang.String namespace, @@ -370,7 +375,7 @@

    Uses of Asynchronous step for reading config map. - + Step CallBuilder.readCustomResourceDefinitionAsync​(java.lang.String name, ResponseStep<io.kubernetes.client.openapi.models.V1CustomResourceDefinition> responseStep) @@ -378,7 +383,7 @@

    Uses of Asynchronous step for reading CRD. - + Step CallBuilder.readDomainAsync​(java.lang.String name, java.lang.String namespace, @@ -387,7 +392,7 @@

    Uses of Asynchronous step for reading domain. - + Step CallBuilder.readJobAsync​(java.lang.String name, java.lang.String namespace, @@ -396,7 +401,7 @@

    Uses of Asynchronous step for reading job. - + Step CallBuilder.readPodAsync​(java.lang.String name, java.lang.String namespace, @@ -405,14 +410,14 @@

    Uses of Asynchronous step for reading pod. - + Step CallBuilder.readPodLogAsync​(java.lang.String name, java.lang.String namespace, ResponseStep<java.lang.String> responseStep)   - + Step CallBuilder.readSecretAsync​(java.lang.String name, java.lang.String namespace, @@ -421,7 +426,7 @@

    Uses of Asynchronous step for reading secret. - + Step CallBuilder.readServiceAsync​(java.lang.String name, java.lang.String namespace, @@ -430,7 +435,7 @@

    Uses of Asynchronous step for reading service. - + Step CallBuilder.replaceBetaCustomResourceDefinitionAsync​(java.lang.String name, io.kubernetes.client.openapi.models.V1beta1CustomResourceDefinition body, @@ -439,7 +444,7 @@

    Uses of Asynchronous step for replacing CRD. - + Step CallBuilder.replaceConfigMapAsync​(java.lang.String name, java.lang.String namespace, @@ -449,7 +454,7 @@

    Uses of Asynchronous step for replacing config map. - + Step CallBuilder.replaceCustomResourceDefinitionAsync​(java.lang.String name, io.kubernetes.client.openapi.models.V1CustomResourceDefinition body, @@ -458,7 +463,7 @@

    Uses of Asynchronous step for replacing CRD. - + Step CallBuilder.replaceDomainAsync​(java.lang.String name, java.lang.String namespace, @@ -468,7 +473,7 @@

    Uses of Asynchronous step for replacing domain. - + Step CallBuilder.replaceDomainStatusAsync​(java.lang.String name, java.lang.String namespace, @@ -543,5 +548,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/RollingHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/RollingHelper.html index 19c787f901d..2fc3ffb7c9e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/RollingHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/RollingHelper.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.RollingHelper (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.RollingHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.RollingHelper

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/SecretHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/SecretHelper.html index 45d5497c363..379103c3b1d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/SecretHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/SecretHelper.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.SecretHelper (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.SecretHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.SecretHelper

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/SecretType.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/SecretType.html index 30bd7be72e0..205f1a5769d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/SecretType.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/SecretType.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.SecretType (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.SecretType (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.SecretType

    @@ -183,5 +178,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/SemanticVersion.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/SemanticVersion.html new file mode 100644 index 00000000000..3526d6122a2 --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/SemanticVersion.html @@ -0,0 +1,214 @@ + + + + + +Uses of Class oracle.kubernetes.operator.helpers.SemanticVersion (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.SemanticVersion

    +
    +
    +
    + + + + + + + + + + + + + + + + + + +
    Packages that use SemanticVersion 
    PackageDescription
    oracle.kubernetes.operator +
    The main classes for the Oracle WebLogic Server Kubernetes Operator.
    +
    oracle.kubernetes.operator.helpers +
    Helper classes that provide easy access to various Kubernetes features.
    +
    +
    +
    + +
    +
    +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ServerConfig.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ServerConfig.html index 86c2dcba8d9..6359ea62250 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ServerConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ServerConfig.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.ServerConfig (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.ServerConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.ServerConfig

    @@ -222,5 +217,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ServiceHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ServiceHelper.html index 991acffc850..c3adefd96a1 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ServiceHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/ServiceHelper.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.ServiceHelper (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.ServiceHelper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.ServiceHelper

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/StepContextBase.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/StepContextBase.html index 4a8343ecb53..84822f114a2 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/StepContextBase.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/StepContextBase.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.helpers.StepContextBase (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.helpers.StepContextBase (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.helpers.StepContextBase

    @@ -113,11 +108,16 @@

    Uses of   +static class  +ConfigMapHelper.IntrospectorConfigMapContext +  + + class  JobStepContext   - + class  PodStepContext   @@ -159,5 +159,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/StepContextConstants.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/StepContextConstants.html index c1378c9683f..00e29fa9181 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/StepContextConstants.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/StepContextConstants.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.helpers.StepContextConstants (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.helpers.StepContextConstants (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.helpers.StepContextConstants

    @@ -113,16 +108,21 @@

    Uses of   +static class  +ConfigMapHelper.IntrospectorConfigMapContext +  + + class  JobStepContext   - + class  PodStepContext   - + class  StepContextBase   @@ -164,5 +164,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/VersionHelper.html b/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/VersionHelper.html deleted file mode 100644 index 91a39c23482..00000000000 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/class-use/VersionHelper.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - -Uses of Class oracle.kubernetes.operator.helpers.VersionHelper (weblogic-kubernetes-operator 2.6.0 API) - - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    oracle.kubernetes.operator.helpers.VersionHelper

    -
    -
    No usage of oracle.kubernetes.operator.helpers.VersionHelper
    -
    - - - diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/helpers/package-summary.html index 44ee0dbc6f0..f1d5dec6364 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.helpers (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.helpers (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.helpers

    @@ -182,44 +177,44 @@

    Package oracle.kubernetes.operator.helper   -ConfigMapHelper.DomainTopology - -
    Domain topology.
    - - - -ConfigMapHelper.SitConfigMapContext +ConfigMapHelper.IntrospectorConfigMapContext   - + CrdHelper
    Helper class to ensure Domain CRD is created.
    - + DomainConfig
    DomainConfig describes the desired state of a domain.
    - + DomainPresenceInfo
    Operator's mapping between custom resource Domain and runtime details about that domain, including the scan and the Pods and Services for servers.
    - + DomainPresenceInfo.ServerStartupInfo
    Details about a specific managed server that will be started up.
    - + DomainStatusPatch   + +DomainTopology + +
    Domain topology.
    + + DomainValidationSteps   @@ -302,25 +297,25 @@

    Package oracle.kubernetes.operator.helper +SemanticVersion + +
    Major, minor and revision version specification for a product.
    + + + ServerConfig
    ServerConfig describes the desired state of a server.
    - + ServiceHelper   - + StepContextBase   - -VersionHelper - -
    Helper methods for managing versions.
    - -

    @@ -396,5 +391,7 @@

    Package oracle.kubernetes.operator.helper

    Copyright © 2017–2020. All rights reserved.

    +

    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/helpers/package-tree.html index 8701c753a95..60ad23eb24c 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.helpers Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.helpers Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.helpers

    @@ -87,18 +82,16 @@

    Class Hierarchy

  • oracle.kubernetes.operator.helpers.ClusterConfig
  • oracle.kubernetes.operator.helpers.ConfigMapConsumer (implements java.util.Map<K,​V>)
  • oracle.kubernetes.operator.helpers.ConfigMapHelper
  • -
  • oracle.kubernetes.operator.helpers.ConfigMapHelper.DomainTopology
  • -
  • oracle.kubernetes.operator.helpers.ConfigMapHelper.SitConfigMapContext
  • oracle.kubernetes.operator.helpers.CrdHelper
  • oracle.kubernetes.operator.helpers.DomainConfig
  • oracle.kubernetes.operator.helpers.DomainPresenceInfo
  • oracle.kubernetes.operator.helpers.DomainPresenceInfo.ServerStartupInfo
  • oracle.kubernetes.operator.helpers.DomainStatusPatch
  • +
  • oracle.kubernetes.operator.helpers.DomainTopology
  • oracle.kubernetes.operator.helpers.DomainValidationSteps
  • oracle.kubernetes.operator.helpers.HealthCheckHelper
  • oracle.kubernetes.operator.helpers.JobHelper
  • oracle.kubernetes.operator.helpers.KubernetesUtils
  • -
  • oracle.kubernetes.operator.helpers.KubernetesVersion
  • oracle.kubernetes.operator.helpers.LastKnownStatus
  • oracle.kubernetes.operator.helpers.LegalNames
  • oracle.kubernetes.operator.helpers.PodHelper
  • @@ -110,6 +103,11 @@

    Class Hierarchy

  • oracle.kubernetes.operator.helpers.ResourceVersion (implements java.lang.Comparable<T>)
  • oracle.kubernetes.operator.helpers.RollingHelper
  • oracle.kubernetes.operator.helpers.SecretHelper
  • +
  • oracle.kubernetes.operator.helpers.SemanticVersion (implements java.lang.Comparable<T>) + +
  • oracle.kubernetes.operator.helpers.ServerConfig
  • +
  • oracle.kubernetes.operator.helpers.ConfigMapHelper.IntrospectorConfigMapContext
  • -
  • oracle.kubernetes.operator.helpers.VersionHelper
  • @@ -198,5 +196,7 @@

    Enum Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/package-use.html b/docs/apidocs/oracle/kubernetes/operator/helpers/package-use.html index 824959438e1..7b21c200b8d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/helpers/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.helpers (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.helpers (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.helpers

    @@ -145,6 +140,12 @@

    Use
    Major and minor version of Kubernetes API Server.
    + +SemanticVersion + +
    Major, minor and revision version specification for a product.
    + +

    @@ -263,30 +264,30 @@

    Use -ConfigMapHelper.DomainTopology - -
    Domain topology.
    - - - DomainConfig
    DomainConfig describes the desired state of a domain.
    - + DomainPresenceInfo
    Operator's mapping between custom resource Domain and runtime details about that domain, including the scan and the Pods and Services for servers.
    - + DomainPresenceInfo.ServerStartupInfo
    Details about a specific managed server that will be started up.
    + +DomainTopology + +
    Domain topology.
    + + KubernetesVersion @@ -332,16 +333,22 @@

    Use +SemanticVersion + +
    Major, minor and revision version specification for a product.
    + + + ServerConfig
    ServerConfig describes the desired state of a server.
    - + StepContextBase   - + StepContextConstants   @@ -420,5 +427,7 @@

    Use

    Copyright © 2017–2020. All rights reserved.

    +

    + diff --git a/docs/apidocs/oracle/kubernetes/operator/http/HttpAsyncRequestStep.html b/docs/apidocs/oracle/kubernetes/operator/http/HttpAsyncRequestStep.html index c8ccd2620d7..66c0b83ed3a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/http/HttpAsyncRequestStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/http/HttpAsyncRequestStep.html @@ -2,10 +2,10 @@ - -HttpAsyncRequestStep (weblogic-kubernetes-operator 2.6.0 API) + +HttpAsyncRequestStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class HttpAsyncRequestStep

    @@ -262,8 +257,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/http/HttpResponseStep.html b/docs/apidocs/oracle/kubernetes/operator/http/HttpResponseStep.html index c9c455ca762..df6adf2fa4c 100644 --- a/docs/apidocs/oracle/kubernetes/operator/http/HttpResponseStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/http/HttpResponseStep.html @@ -2,10 +2,10 @@ - -HttpResponseStep (weblogic-kubernetes-operator 2.6.0 API) + +HttpResponseStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/http/class-use/HttpAsyncRequestStep.html b/docs/apidocs/oracle/kubernetes/operator/http/class-use/HttpAsyncRequestStep.html index 4a70048ef39..ce7d5effc77 100644 --- a/docs/apidocs/oracle/kubernetes/operator/http/class-use/HttpAsyncRequestStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/http/class-use/HttpAsyncRequestStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.http.HttpAsyncRequestStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.http.HttpAsyncRequestStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.http.HttpAsyncRequestStep

    @@ -167,5 +162,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/http/class-use/HttpResponseStep.html b/docs/apidocs/oracle/kubernetes/operator/http/class-use/HttpResponseStep.html index d4979c37ef1..8f1f8a9d156 100644 --- a/docs/apidocs/oracle/kubernetes/operator/http/class-use/HttpResponseStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/http/class-use/HttpResponseStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.http.HttpResponseStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.http.HttpResponseStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.http.HttpResponseStep

    @@ -160,5 +155,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/http/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/http/package-summary.html index fbe29797de3..37af7f670b6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/http/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/http/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.http (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.http (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.http

    @@ -134,5 +129,7 @@

    Package oracle.kubernetes.operator.http

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/http/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/http/package-tree.html index 43db5f6a6ec..8b0bb837cb3 100644 --- a/docs/apidocs/oracle/kubernetes/operator/http/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/http/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.http Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.http Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.http

    @@ -119,5 +114,7 @@

    Class Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/http/package-use.html b/docs/apidocs/oracle/kubernetes/operator/http/package-use.html index 1318ce2e617..40afcc29c01 100644 --- a/docs/apidocs/oracle/kubernetes/operator/http/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/http/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.http (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.http (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.http

    @@ -152,5 +147,7 @@

    Uses o

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/LoggingContext.html b/docs/apidocs/oracle/kubernetes/operator/logging/LoggingContext.html new file mode 100644 index 00000000000..d2b3a0a0efa --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/operator/logging/LoggingContext.html @@ -0,0 +1,387 @@ + + + + + +LoggingContext (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    + +
    + +

    Class LoggingContext

    +
    +
    +
    java.lang.Object +
    oracle.kubernetes.operator.logging.LoggingContext
    +
    +
    +
    +
    All Implemented Interfaces:
    +
    java.lang.AutoCloseable
    +
    +
    +
    public class LoggingContext
    +extends java.lang.Object
    +implements java.lang.AutoCloseable
    +
    Necessary additional context information for Operator log messages.
    +
    +
    +
      + +
    • +
      + + +

      Field Summary

      +
      + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeFieldDescription
      static java.lang.StringLOGGING_CONTEXT_KEY 
      +
      +
      +
    • + +
    • +
      + + +

      Constructor Summary

      +
      + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      LoggingContext() 
      +
      +
      +
    • + +
    • +
      + + +

      Method Summary

      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Modifier and TypeMethodDescription
      voidclose() 
      java.lang.StringdomainUid() 
      LoggingContextdomainUid​(java.lang.String domainUid) 
      java.lang.Stringnamespace() 
      LoggingContextnamespace​(java.lang.String namespace) 
      static java.util.Optional<LoggingContext>optionalContext() +
      Gets the current logging context on the thread.
      +
      static LoggingContextsetThreadContext() +
      Creates a new LoggingContext and sets it as the current thread context.
      +
      +
      +
      +
      +

      Methods inherited from class java.lang.Object

      + + +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      +
      +
    • +
    +
    +
    +
      + +
    • +
      + + +

      Field Details

      + +
      +
    • + +
    • +
      + + +

      Constructor Details

      + +
      +
    • + +
    • +
      + + +

      Method Details

      +
        +
      • +
        +

        setThreadContext

        +
        public static LoggingContext setThreadContext()
        +
        Creates a new LoggingContext and sets it as the current thread context. Returns the created context + in order to append parameters.
        +
        +
        Returns:
        +
        a new logging context
        +
        +
        +
      • +
      • +
        +

        optionalContext

        +
        public static java.util.Optional<LoggingContext> optionalContext()
        +
        Gets the current logging context on the thread.
        +
        +
        Returns:
        +
        current logging context
        +
        +
        +
      • +
      • +
        +

        namespace

        +
        public LoggingContext namespace​(java.lang.String namespace)
        +
        +
      • +
      • +
        +

        namespace

        +
        public java.lang.String namespace()
        +
        +
      • +
      • +
        +

        domainUid

        +
        public LoggingContext domainUid​(java.lang.String domainUid)
        +
        +
      • +
      • +
        +

        domainUid

        +
        public java.lang.String domainUid()
        +
        +
      • +
      • +
        +

        close

        +
        public void close()
        +
        +
        Specified by:
        +
        close in interface java.lang.AutoCloseable
        +
        +
        +
      • +
      +
      +
    • +
    +
    +
    + +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFacade.html b/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFacade.html index 8db3e1201db..01144297635 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFacade.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFacade.html @@ -2,10 +2,10 @@ - -LoggingFacade (weblogic-kubernetes-operator 2.6.0 API) + +LoggingFacade (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class LoggingFacade

    @@ -1256,8 +1251,8 @@

    formatMessage

    -
    +
    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFactory.html b/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFactory.html index d7a980e5558..361fa41424f 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFactory.html @@ -2,10 +2,10 @@ - -LoggingFactory (weblogic-kubernetes-operator 2.6.0 API) + +LoggingFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class LoggingFactory

    @@ -195,8 +190,8 @@

    getLogger

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFilter.html b/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFilter.html index 1075ec3f5d6..a181a6d21db 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFilter.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFilter.html @@ -2,10 +2,10 @@ - -LoggingFilter (weblogic-kubernetes-operator 2.6.0 API) + +LoggingFilter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface LoggingFilter

    @@ -237,8 +232,8 @@

    canLog

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFormatter.html b/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFormatter.html index 0e427151ecf..1bdac636ecd 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFormatter.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/LoggingFormatter.html @@ -2,10 +2,10 @@ - -LoggingFormatter (weblogic-kubernetes-operator 2.6.0 API) + +LoggingFormatter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class LoggingFormatter

    @@ -213,8 +208,8 @@

    format

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/MessageKeys.html b/docs/apidocs/oracle/kubernetes/operator/logging/MessageKeys.html index 38d5dbd9e31..213f19ddf02 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/MessageKeys.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/MessageKeys.html @@ -2,10 +2,10 @@ - -MessageKeys (weblogic-kubernetes-operator 2.6.0 API) + +MessageKeys (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Class MessageKeys

    @@ -258,14 +253,24 @@

    Field Summary

    static java.lang.String -CM_REPLACED +CM_PATCHED   static java.lang.String +CM_REPLACED +  + + +static java.lang.String COULD_NOT_CREATE_LIVENESS_FILE   + +static java.lang.String +CREATE_CRD_FAILED +  + static java.lang.String CREATING_API_CLIENT @@ -298,179 +303,199 @@

    Field Summary

    static java.lang.String -DOMAIN_STATUS_IGNORED +DOMAIN_UID_UNIQUENESS_FAILED   static java.lang.String -DOMAIN_UID_UNIQUENESS_FAILED +DOMAIN_VALIDATION_FAILED   static java.lang.String -DOMAIN_VALIDATION_FAILED +DUPLICATE_CLUSTER_NAME_FOUND   static java.lang.String -DUPLICATE_CLUSTER_NAME_FOUND +DUPLICATE_SERVER_NAME_FOUND   static java.lang.String -DUPLICATE_SERVER_NAME_FOUND +EXCEPTION   static java.lang.String -EXCEPTION +EXTERNAL_CHANNEL_SERVICE_CREATED   static java.lang.String -EXTERNAL_CHANNEL_SERVICE_CREATED +EXTERNAL_CHANNEL_SERVICE_EXISTS   static java.lang.String -EXTERNAL_CHANNEL_SERVICE_EXISTS +EXTERNAL_CHANNEL_SERVICE_REPLACED   static java.lang.String -EXTERNAL_CHANNEL_SERVICE_REPLACED +HTTP_METHOD_FAILED   static java.lang.String -HTTP_METHOD_FAILED +HTTP_REQUEST_TIMED_OUT   static java.lang.String -HTTP_REQUEST_TIMED_OUT +ILLEGAL_SECRET_NAMESPACE   static java.lang.String -ILLEGAL_SECRET_NAMESPACE +ILLEGAL_SIT_CONFIG_MII   static java.lang.String -INVALID_DOMAIN_UID +INTROSPECTOR_JOB_FAILED   static java.lang.String -INVALID_MANAGE_SERVER_COUNT +INTROSPECTOR_JOB_FAILED_DETAIL   static java.lang.String -JOB_CREATED +INTROSPECTOR_POD_FAILED   static java.lang.String -JOB_CREATION_TIMESTAMP_MESSAGE +INVALID_DOMAIN_UID   static java.lang.String -JOB_DEADLINE_EXCEEDED_MESSAGE +INVALID_MANAGE_SERVER_COUNT   static java.lang.String -JOB_DELETED +JOB_CREATED   static java.lang.String -JOB_IS_COMPLETE +JOB_CREATION_TIMESTAMP_MESSAGE   static java.lang.String -JOB_IS_FAILED +JOB_DEADLINE_EXCEEDED_MESSAGE   static java.lang.String -JSON_PARSING_FAILED +JOB_DELETED   static java.lang.String -K8S_MASTER_URL +JOB_IS_COMPLETE   static java.lang.String -K8S_VERSION_CHECK +JOB_IS_FAILED   static java.lang.String -K8S_VERSION_CHECK_FAILURE +JSON_PARSING_FAILED   static java.lang.String -K8S_VERSION_TOO_LOW +K8S_MASTER_URL   static java.lang.String -LISTING_DOMAINS +K8S_VERSION_CHECK   static java.lang.String -LOG_HOME_NOT_MOUNTED +K8S_VERSION_CHECK_FAILURE   static java.lang.String -MANAGED_POD_CREATED +K8S_VERSION_TOO_LOW   static java.lang.String -MANAGED_POD_EXISTS +LISTING_DOMAINS   static java.lang.String -MANAGED_POD_PATCHED +LOG_HOME_NOT_MOUNTED   static java.lang.String -MANAGED_POD_REPLACED +MANAGED_POD_CREATED   static java.lang.String -MANAGED_SERVICE_CREATED +MANAGED_POD_EXISTS   static java.lang.String -MANAGED_SERVICE_EXISTS +MANAGED_POD_PATCHED   static java.lang.String -MANAGED_SERVICE_REPLACED +MANAGED_POD_REPLACED   static java.lang.String +MANAGED_SERVICE_CREATED +  + + +static java.lang.String +MANAGED_SERVICE_EXISTS +  + + +static java.lang.String +MANAGED_SERVICE_REPLACED +  + + +static java.lang.String MATCHING_DOMAIN_NOT_FOUND   + +static java.lang.String +MODEL_CONFIGMAP_NOT_FOUND +  + static java.lang.String NAMESPACE_IS_DEFAULT @@ -553,39 +578,49 @@

    Field Summary

    static java.lang.String -POD_DELETED +OPSS_SECRET_NOT_SPECIFIED   static java.lang.String -POD_DUMP +POD_DELETED   static java.lang.String -POD_IS_FAILED +POD_DUMP   static java.lang.String -POD_IS_READY +POD_IS_FAILED   static java.lang.String -PROCESSING_DOMAIN +POD_IS_READY   static java.lang.String -PV_ACCESS_MODE_FAILED +PROCESSING_DOMAIN   static java.lang.String +PV_ACCESS_MODE_FAILED +  + + +static java.lang.String PV_NOT_FOUND_FOR_DOMAIN_UID   + +static java.lang.String +REPLACE_CRD_FAILED +  + static java.lang.String REPLICA_MORE_THAN_WLS_SERVERS @@ -663,101 +698,106 @@

    Field Summary

    static java.lang.String -SERVICE_URL +SECRET_NOT_SPECIFIED   static java.lang.String -STARTING_LIVENESS_THREAD +SERVICE_URL   static java.lang.String -TUNING_PARAMETERS +STARTING_LIVENESS_THREAD   static java.lang.String -VERIFY_ACCESS_DENIED +TUNING_PARAMETERS   static java.lang.String -VERIFY_ACCESS_DENIED_WITH_NS +VERIFY_ACCESS_DENIED   static java.lang.String -VERIFY_ACCESS_START +VERIFY_ACCESS_DENIED_WITH_NS   static java.lang.String -VERIFY_K8S_MIN_VERSION +VERIFY_ACCESS_START   static java.lang.String -WAITING_FOR_JOB_READY +VERIFY_K8S_MIN_VERSION   static java.lang.String -WAITING_FOR_POD_READY +WAITING_FOR_JOB_READY   static java.lang.String -WATCH_DOMAIN +WAITING_FOR_POD_READY   static java.lang.String -WATCH_DOMAIN_DELETED +WATCH_DOMAIN   static java.lang.String -WATCH_EVENT +WATCH_DOMAIN_DELETED   static java.lang.String -WLS_CLUSTER_SIZE_UPDATED +WATCH_EVENT   static java.lang.String -WLS_CONFIGURATION_READ +WLS_CLUSTER_SIZE_UPDATED   static java.lang.String -WLS_HEALTH_READ_FAILED +WLS_CONFIGURATION_READ   static java.lang.String -WLS_HEALTH_READ_FAILED_NO_HTTPCLIENT +WLS_HEALTH_READ_FAILED   static java.lang.String -WLS_SERVER_TEMPLATE_NOT_FOUND +WLS_HEALTH_READ_FAILED_NO_HTTPCLIENT   static java.lang.String -WLS_UPDATE_CLUSTER_SIZE_FAILED +WLS_SERVER_TEMPLATE_NOT_FOUND   static java.lang.String -WLS_UPDATE_CLUSTER_SIZE_INVALID_CLUSTER +WLS_UPDATE_CLUSTER_SIZE_FAILED   static java.lang.String +WLS_UPDATE_CLUSTER_SIZE_INVALID_CLUSTER +  + + +static java.lang.String WLS_UPDATE_CLUSTER_SIZE_STARTING   @@ -852,16 +892,6 @@

    CREATING_CRD

  • -

    DOMAIN_STATUS_IGNORED

    -
    public static final java.lang.String DOMAIN_STATUS_IGNORED
    -
    -
    See Also:
    -
    Constant Field Values
    -
    -
    -
  • -
  • -

    LISTING_DOMAINS

    public static final java.lang.String LISTING_DOMAINS
    @@ -1992,6 +2022,66 @@

    NAMESPACE_IS_MISSING

  • +

    CM_PATCHED

    +
    public static final java.lang.String CM_PATCHED
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    REPLACE_CRD_FAILED

    +
    public static final java.lang.String REPLACE_CRD_FAILED
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    CREATE_CRD_FAILED

    +
    public static final java.lang.String CREATE_CRD_FAILED
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    INTROSPECTOR_JOB_FAILED

    +
    public static final java.lang.String INTROSPECTOR_JOB_FAILED
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    INTROSPECTOR_JOB_FAILED_DETAIL

    +
    public static final java.lang.String INTROSPECTOR_JOB_FAILED_DETAIL
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    INTROSPECTOR_POD_FAILED

    +
    public static final java.lang.String INTROSPECTOR_POD_FAILED
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +

    DUPLICATE_SERVER_NAME_FOUND

    public static final java.lang.String DUPLICATE_SERVER_NAME_FOUND
    @@ -2052,6 +2142,46 @@

    ILLEGAL_SECRET_NAMESPACE

  • +

    ILLEGAL_SIT_CONFIG_MII

    +
    public static final java.lang.String ILLEGAL_SIT_CONFIG_MII
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    MODEL_CONFIGMAP_NOT_FOUND

    +
    public static final java.lang.String MODEL_CONFIGMAP_NOT_FOUND
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    SECRET_NOT_SPECIFIED

    +
    public static final java.lang.String SECRET_NOT_SPECIFIED
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    OPSS_SECRET_NOT_SPECIFIED

    +
    public static final java.lang.String OPSS_SECRET_NOT_SPECIFIED
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +

    NO_CLUSTER_IN_DOMAIN

    public static final java.lang.String NO_CLUSTER_IN_DOMAIN
    @@ -2086,8 +2216,8 @@

    CANNOT_EXPOSE_DEFAULT_CHANNEL_IS

  • -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/OncePerMessageLoggingFilter.html b/docs/apidocs/oracle/kubernetes/operator/logging/OncePerMessageLoggingFilter.html index ca1e01c3485..a29df350fdb 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/OncePerMessageLoggingFilter.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/OncePerMessageLoggingFilter.html @@ -2,10 +2,10 @@ - -OncePerMessageLoggingFilter (weblogic-kubernetes-operator 2.6.0 API) + +OncePerMessageLoggingFilter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class OncePerMessageLoggingFilter

    @@ -272,8 +267,8 @@

    canLog

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/class-use/WlsDomainConfigSupport.html b/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingContext.html similarity index 51% rename from docs/apidocs/oracle/kubernetes/operator/utils/class-use/WlsDomainConfigSupport.html rename to docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingContext.html index 6f9194a8870..de5ad3b1caa 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/class-use/WlsDomainConfigSupport.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingContext.html @@ -2,11 +2,11 @@ - -Uses of Class oracle.kubernetes.operator.utils.WlsDomainConfigSupport (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.logging.LoggingContext (weblogic-kubernetes-operator 3.0.0 API) - - + + @@ -25,9 +25,9 @@ -
    + - - +
    +
    -

    Uses of Class
    oracle.kubernetes.operator.utils.WlsDomainConfigSupport

    +

    Uses of Class
    oracle.kubernetes.operator.logging.LoggingContext

    - + @@ -81,8 +76,10 @@

    -

    - + +
    Packages that use WlsDomainConfigSupport Packages that use LoggingContext 
    Packageoracle.kubernetes.operator.utils oracle.kubernetes.operator.logging +
    Logging infrastructure for the Operator.
    +
    @@ -90,13 +87,13 @@

    diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFacade.html b/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFacade.html index 9bae3f81daf..13668f69157 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFacade.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFacade.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.logging.LoggingFacade (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.logging.LoggingFacade (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.logging.LoggingFacade

    @@ -184,5 +179,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFactory.html b/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFactory.html index f9a35ce2a51..d7b41e88ed4 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFactory.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.logging.LoggingFactory (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.logging.LoggingFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.logging.LoggingFactory

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFilter.html b/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFilter.html index 5fab6d09daa..3fea904a635 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFilter.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFilter.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.logging.LoggingFilter (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.logging.LoggingFilter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.logging.LoggingFilter

    @@ -209,5 +204,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFormatter.html b/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFormatter.html index c841bf7a3d4..8f894b13d98 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFormatter.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/class-use/LoggingFormatter.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.logging.LoggingFormatter (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.logging.LoggingFormatter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.logging.LoggingFormatter

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/class-use/MessageKeys.html b/docs/apidocs/oracle/kubernetes/operator/logging/class-use/MessageKeys.html index 4cc12f82438..237ed6ae9bb 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/class-use/MessageKeys.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/class-use/MessageKeys.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.logging.MessageKeys (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.logging.MessageKeys (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.logging.MessageKeys

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/class-use/OncePerMessageLoggingFilter.html b/docs/apidocs/oracle/kubernetes/operator/logging/class-use/OncePerMessageLoggingFilter.html index 200d76b9638..435827deb03 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/class-use/OncePerMessageLoggingFilter.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/class-use/OncePerMessageLoggingFilter.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.logging.OncePerMessageLoggingFilter (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.logging.OncePerMessageLoggingFilter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.logging.OncePerMessageLoggingFilter

    @@ -159,5 +154,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/logging/package-summary.html index e2135f58805..536b3ae6867 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.logging (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.logging (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.logging

    @@ -110,30 +105,36 @@

    Package oracle.kubernetes.operator.loggin +LoggingContext + +
    Necessary additional context information for Operator log messages.
    + + + LoggingFacade
    Centralized logging for the operator.
    - + LoggingFactory
    A factory to create Loggers.
    - + LoggingFormatter
    Custom log formatter to format log messages in JSON format.
    - + MessageKeys
    Message keys used to look up log messages from the resource bundle.
    - + OncePerMessageLoggingFilter
    A LoggingFilter that logs each log message, which are typically message keys, at most once.
    @@ -175,5 +176,7 @@

    Package oracle.kubernetes.operator.loggin

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/logging/package-tree.html index a5ea8752307..26d3bc74d0f 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.logging Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.logging Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.logging

    @@ -84,6 +79,7 @@

    Class Hierarchy

  • oracle.kubernetes.operator.logging.LoggingFormatter
  • +
  • oracle.kubernetes.operator.logging.LoggingContext (implements java.lang.AutoCloseable)
  • oracle.kubernetes.operator.logging.LoggingFacade
  • oracle.kubernetes.operator.logging.LoggingFactory
  • oracle.kubernetes.operator.logging.MessageKeys
  • @@ -128,5 +124,7 @@

    Interface Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/logging/package-use.html b/docs/apidocs/oracle/kubernetes/operator/logging/package-use.html index ca337e12364..2d77da7d667 100644 --- a/docs/apidocs/oracle/kubernetes/operator/logging/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/logging/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.logging (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.logging (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.logging

    @@ -112,18 +107,24 @@

    Use +LoggingContext + +
    Necessary additional context information for Operator log messages.
    + + + LoggingFacade
    Centralized logging for the operator.
    - + LoggingFilter
    A filter to control whether a log message should be logged.
    - + OncePerMessageLoggingFilter
    A LoggingFilter that logs each log message, which are typically message keys, at most once.
    @@ -191,5 +192,7 @@

    Use

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/package-summary.html index 1c0b69bcc5e..028ee4f1b8e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator

    @@ -99,15 +94,27 @@

    Package oracle.kubernetes.operator

    +IntrospectorConfigMapKeys + +
    Keys in the generated introspector config map.
    + + + KubernetesConstants
    Kubernetes constants.
    - + LabelConstants   + +MakeRightDomainOperation + +
    Defines the operation to bring a running domain into compliance with its domain resource and introspection result.
    + + PodAwaiterStepFactory   @@ -123,10 +130,6 @@

    Package oracle.kubernetes.operator

      -VersionConstants -  - - WebLogicConstants   @@ -285,6 +288,14 @@

    Package oracle.kubernetes.operator

      +ModelInImageDomainType +  + + +OverrideDistributionStrategy +  + + ServerStartPolicy   @@ -332,5 +343,7 @@

    Package oracle.kubernetes.operator

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/package-tree.html index 4f755018563..34997018bed 100644 --- a/docs/apidocs/oracle/kubernetes/operator/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator

    @@ -114,8 +109,10 @@

    Interface Hierarchy

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/package-use.html b/docs/apidocs/oracle/kubernetes/operator/package-use.html index 2d5e7ada491..c3cb492c33d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator

    @@ -96,6 +91,16 @@

    Uses of Pac oracle.kubernetes.operator.steps   + +oracle.kubernetes.weblogic.domain +  + + +oracle.kubernetes.weblogic.domain.model + +
    Model classes that are part of the WebLogic Custom Resource extensions to the Kubernetes API.
    + +

    @@ -158,56 +163,70 @@

    Uses of Pac +MakeRightDomainOperation + +
    Defines the operation to bring a running domain into compliance with its domain resource and introspection result.
    + + + +ModelInImageDomainType +  + + NamespaceWatcher
    This class handles Namespace watching.
    -PodAwaiterStepFactory +OverrideDistributionStrategy   +PodAwaiterStepFactory +  + + PodWatcher
    Watches for changes to pods.
    - + ServerStartPolicy   - + ServerStartState   - + ServiceWatcher
    This class handles Service watching.
    - + ShutdownType   - + TuningParameters   - + TuningParameters.CallBuilderTuning   - + TuningParameters.MainTuning   - + TuningParameters.PodTuning   - + TuningParameters.WatchTuning   @@ -231,6 +250,10 @@

    Uses of Pac +DomainSourceType +  + + TuningParameters   @@ -272,6 +295,60 @@

    Uses of Pac

    +
  • +
    + + +
    + + + + + + + + + + + + + + + + + + +
    Classes in oracle.kubernetes.operator used by oracle.kubernetes.weblogic.domain 
    ClassDescription
    DomainSourceType 
    OverrideDistributionStrategy 
    +
    +
    +
  • +
  • +
    + + +
    + + + + + + + + + + + + + + + + + + +
    Classes in oracle.kubernetes.operator used by oracle.kubernetes.weblogic.domain.model 
    ClassDescription
    DomainSourceType 
    OverrideDistributionStrategy 
    +
    +
    +
  • @@ -304,5 +381,7 @@

    Uses of Pac

    Copyright © 2017–2020. All rights reserved.

    +

    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/AuthenticationFilter.html b/docs/apidocs/oracle/kubernetes/operator/rest/AuthenticationFilter.html index 76b68dc134d..5980233ac89 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/AuthenticationFilter.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/AuthenticationFilter.html @@ -2,10 +2,10 @@ - -AuthenticationFilter (weblogic-kubernetes-operator 2.6.0 API) + +AuthenticationFilter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class AuthenticationFilter

    @@ -298,8 +293,8 @@

    filter

    -
    +
    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/BaseDebugLoggingFilter.html b/docs/apidocs/oracle/kubernetes/operator/rest/BaseDebugLoggingFilter.html index b48dd7ea450..11082ec6954 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/BaseDebugLoggingFilter.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/BaseDebugLoggingFilter.html @@ -2,10 +2,10 @@ - -BaseDebugLoggingFilter (weblogic-kubernetes-operator 2.6.0 API) + +BaseDebugLoggingFilter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/ErrorFilter.html b/docs/apidocs/oracle/kubernetes/operator/rest/ErrorFilter.html index a4a7cdb517f..5637a6b5471 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/ErrorFilter.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/ErrorFilter.html @@ -2,10 +2,10 @@ - -ErrorFilter (weblogic-kubernetes-operator 2.6.0 API) + +ErrorFilter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/ExceptionMapper.html b/docs/apidocs/oracle/kubernetes/operator/rest/ExceptionMapper.html index 8022b407691..2ebf226485a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/ExceptionMapper.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/ExceptionMapper.html @@ -2,10 +2,10 @@ - -ExceptionMapper (weblogic-kubernetes-operator 2.6.0 API) + +ExceptionMapper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ExceptionMapper

    @@ -216,8 +211,8 @@

    toResponse

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/FilterPriorities.html b/docs/apidocs/oracle/kubernetes/operator/rest/FilterPriorities.html index 1227a9dda66..e6998804035 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/FilterPriorities.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/FilterPriorities.html @@ -2,10 +2,10 @@ - -FilterPriorities (weblogic-kubernetes-operator 2.6.0 API) + +FilterPriorities (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/RequestDebugLoggingFilter.html b/docs/apidocs/oracle/kubernetes/operator/rest/RequestDebugLoggingFilter.html index 56e0cfbfbee..1ca89228995 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/RequestDebugLoggingFilter.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/RequestDebugLoggingFilter.html @@ -2,10 +2,10 @@ - -RequestDebugLoggingFilter (weblogic-kubernetes-operator 2.6.0 API) + +RequestDebugLoggingFilter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class RequestDebugLoggingFilter

    @@ -236,8 +231,8 @@

    filter

    -
    +
    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/ResponseDebugLoggingFilter.html b/docs/apidocs/oracle/kubernetes/operator/rest/ResponseDebugLoggingFilter.html index 3c9dfa81317..d5edbd38524 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/ResponseDebugLoggingFilter.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/ResponseDebugLoggingFilter.html @@ -2,10 +2,10 @@ - -ResponseDebugLoggingFilter (weblogic-kubernetes-operator 2.6.0 API) + +ResponseDebugLoggingFilter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/RestBackendImpl.html b/docs/apidocs/oracle/kubernetes/operator/rest/RestBackendImpl.html index 0c5bf80f981..2063c5bc9d8 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/RestBackendImpl.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/RestBackendImpl.html @@ -2,10 +2,10 @@ - -RestBackendImpl (weblogic-kubernetes-operator 2.6.0 API) + +RestBackendImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class RestBackendImpl

    @@ -111,6 +106,33 @@

    Class RestBackendImpl

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/RestConfig.html b/docs/apidocs/oracle/kubernetes/operator/rest/RestConfig.html index 807c881a95e..52845070022 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/RestConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/RestConfig.html @@ -2,10 +2,10 @@ - -RestConfig (weblogic-kubernetes-operator 2.6.0 API) + +RestConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface RestConfig

    @@ -428,8 +423,8 @@

    getBackend

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/RestConfigImpl.html b/docs/apidocs/oracle/kubernetes/operator/rest/RestConfigImpl.html index 727ebf01819..f532c33bdfe 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/RestConfigImpl.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/RestConfigImpl.html @@ -2,10 +2,10 @@ - -RestConfigImpl (weblogic-kubernetes-operator 2.6.0 API) + +RestConfigImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class RestConfigImpl

    @@ -486,8 +481,8 @@

    getBackend

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/RestServer.html b/docs/apidocs/oracle/kubernetes/operator/rest/RestServer.html index 514ebfd3f92..ccc7500b306 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/RestServer.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/RestServer.html @@ -2,10 +2,10 @@ - -RestServer (weblogic-kubernetes-operator 2.6.0 API) + +RestServer (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class RestServer

    @@ -255,8 +250,8 @@

    stop

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/Scan.html b/docs/apidocs/oracle/kubernetes/operator/rest/Scan.html index 7fc8e7fb71b..57595c9669a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/Scan.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/Scan.html @@ -2,10 +2,10 @@ - -Scan (weblogic-kubernetes-operator 2.6.0 API) + +Scan (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class Scan

    @@ -268,8 +263,8 @@

    getLastScanTime

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/ScanCache.html b/docs/apidocs/oracle/kubernetes/operator/rest/ScanCache.html index 8b59e0f5b79..e1ab0982571 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/ScanCache.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/ScanCache.html @@ -2,10 +2,10 @@ - -ScanCache (weblogic-kubernetes-operator 2.6.0 API) + +ScanCache (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface ScanCache

    @@ -211,8 +206,8 @@

    lookupScan

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/backend/RestBackend.html b/docs/apidocs/oracle/kubernetes/operator/rest/backend/RestBackend.html index 4f031077f27..d4d2090ec52 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/backend/RestBackend.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/backend/RestBackend.html @@ -2,10 +2,10 @@ - -RestBackend (weblogic-kubernetes-operator 2.6.0 API) + +RestBackend (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Interface RestBackend

    @@ -156,6 +151,14 @@

    Method Summary

    void +performDomainAction​(java.lang.String domainUid, +DomainAction params) + +
    Applies the specified command to the specified domain.
    + + + +void scaleCluster​(java.lang.String domainUid, java.lang.String cluster, int managedServerCount) @@ -207,6 +210,19 @@

    isDomainUid

  • +

    performDomainAction

    +
    void performDomainAction​(java.lang.String domainUid, +DomainAction params)
    +
    Applies the specified command to the specified domain.
    +
    +
    Parameters:
    +
    domainUid - the unique ID of a domain
    +
    params - an update command with optional parameters
    +
    +
    +
  • +
  • +

    getClusters

    java.util.Set<java.lang.String> getClusters​(java.lang.String domainUid)
    Get the names of the clusters in a WebLogic domain.
    @@ -264,8 +280,8 @@

    scaleCluster

  • -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/backend/VersionUtils.html b/docs/apidocs/oracle/kubernetes/operator/rest/backend/VersionUtils.html index 3bb72a4194b..6beecef0349 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/backend/VersionUtils.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/backend/VersionUtils.html @@ -2,10 +2,10 @@ - -VersionUtils (weblogic-kubernetes-operator 2.6.0 API) + +VersionUtils (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class VersionUtils

    @@ -250,8 +245,8 @@

    isLatest

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/backend/class-use/RestBackend.html b/docs/apidocs/oracle/kubernetes/operator/rest/backend/class-use/RestBackend.html index b84ad711d95..87fe7d608ed 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/backend/class-use/RestBackend.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/backend/class-use/RestBackend.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.rest.backend.RestBackend (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.rest.backend.RestBackend (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.rest.backend.RestBackend

    @@ -211,5 +206,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/backend/class-use/VersionUtils.html b/docs/apidocs/oracle/kubernetes/operator/rest/backend/class-use/VersionUtils.html index 1cae53f1e6a..71e7f3f31dd 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/backend/class-use/VersionUtils.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/backend/class-use/VersionUtils.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.backend.VersionUtils (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.backend.VersionUtils (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.backend.VersionUtils

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/backend/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/rest/backend/package-summary.html index 2dd5428ebc9..aaeb204ea05 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/backend/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/backend/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.rest.backend (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.rest.backend (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.rest.backend

    @@ -152,5 +147,7 @@

    Package oracle.kubernetes.operator.rest.b

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/backend/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/rest/backend/package-tree.html index 0e095044395..9ffa2c4ae83 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/backend/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/backend/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.rest.backend Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.rest.backend Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.rest.backend

    @@ -120,5 +115,7 @@

    Interface Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/backend/package-use.html b/docs/apidocs/oracle/kubernetes/operator/rest/backend/package-use.html index bb9b103548a..df76ecb2b4e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/backend/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/backend/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.rest.backend (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.rest.backend (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.rest.backend

    @@ -181,5 +176,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/AuthenticationFilter.html b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/AuthenticationFilter.html index 02ac087064a..30c3ae00b30 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/AuthenticationFilter.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/AuthenticationFilter.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.AuthenticationFilter (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.AuthenticationFilter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.AuthenticationFilter

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/BaseDebugLoggingFilter.html b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/BaseDebugLoggingFilter.html index 0c9fc2a7a0d..37412376004 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/BaseDebugLoggingFilter.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/BaseDebugLoggingFilter.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.BaseDebugLoggingFilter (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.BaseDebugLoggingFilter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.BaseDebugLoggingFilter

    @@ -166,5 +161,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ErrorFilter.html b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ErrorFilter.html index 24afff547b7..54ddbf8135d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ErrorFilter.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ErrorFilter.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.ErrorFilter (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.ErrorFilter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.ErrorFilter

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ExceptionMapper.html b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ExceptionMapper.html index 081ea62f644..325be353952 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ExceptionMapper.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ExceptionMapper.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.ExceptionMapper (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.ExceptionMapper (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.ExceptionMapper

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/FilterPriorities.html b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/FilterPriorities.html index 72d556d0689..230ff01b48a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/FilterPriorities.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/FilterPriorities.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.FilterPriorities (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.FilterPriorities (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.FilterPriorities

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RequestDebugLoggingFilter.html b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RequestDebugLoggingFilter.html index dacad37be42..d21b445358b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RequestDebugLoggingFilter.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RequestDebugLoggingFilter.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.RequestDebugLoggingFilter (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.RequestDebugLoggingFilter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.RequestDebugLoggingFilter

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ResponseDebugLoggingFilter.html b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ResponseDebugLoggingFilter.html index c481ca9e523..b3ad1cf6feb 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ResponseDebugLoggingFilter.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ResponseDebugLoggingFilter.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.ResponseDebugLoggingFilter (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.ResponseDebugLoggingFilter (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.ResponseDebugLoggingFilter

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestBackendImpl.html b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestBackendImpl.html index f2c7f0b5a06..812c65ec98a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestBackendImpl.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestBackendImpl.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.RestBackendImpl (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.RestBackendImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.RestBackendImpl

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestConfig.html b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestConfig.html index 01940203b98..a2de5bc27c6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestConfig.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.rest.RestConfig (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.rest.RestConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.rest.RestConfig

    @@ -172,5 +167,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestConfigImpl.html b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestConfigImpl.html index abe1bca77ef..84bd54106b6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestConfigImpl.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestConfigImpl.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.RestConfigImpl (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.RestConfigImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.RestConfigImpl

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestServer.html b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestServer.html index fe3d0c61d42..42d43e8ba5f 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestServer.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/RestServer.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.RestServer (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.RestServer (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.RestServer

    @@ -151,5 +146,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/Scan.html b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/Scan.html index 821aa2d49ac..b79ab2d455e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/Scan.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/Scan.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.Scan (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.Scan (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.Scan

    @@ -171,5 +166,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ScanCache.html b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ScanCache.html index 987e02ffcdb..4f6a86a1670 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ScanCache.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/class-use/ScanCache.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.rest.ScanCache (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.rest.ScanCache (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.rest.ScanCache

    @@ -149,5 +144,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/BaseModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/BaseModel.html index 52229330f5d..636414d8005 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/BaseModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/BaseModel.html @@ -2,10 +2,10 @@ - -BaseModel (weblogic-kubernetes-operator 2.6.0 API) + +BaseModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class BaseModel

    @@ -222,8 +217,8 @@

    toString

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/ClusterModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/ClusterModel.html index db3788ace3e..f215cd81603 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/ClusterModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/ClusterModel.html @@ -2,10 +2,10 @@ - -ClusterModel (weblogic-kubernetes-operator 2.6.0 API) + +ClusterModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ClusterModel

    @@ -278,8 +273,8 @@

    propertiesToString

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/CollectionModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/CollectionModel.html index 9803c5da4de..ac99c2c6c10 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/CollectionModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/CollectionModel.html @@ -2,10 +2,10 @@ - -CollectionModel (weblogic-kubernetes-operator 2.6.0 API) + +CollectionModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class CollectionModel<T extends ItemModel>

    @@ -276,8 +271,8 @@

    propertiesToString

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/helpers/VersionHelper.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/DomainAction.html similarity index 60% rename from docs/apidocs/oracle/kubernetes/operator/helpers/VersionHelper.html rename to docs/apidocs/oracle/kubernetes/operator/rest/model/DomainAction.html index 86d6ac9c5c3..346c58cd48a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/helpers/VersionHelper.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/DomainAction.html @@ -2,38 +2,38 @@ - -VersionHelper (weblogic-kubernetes-operator 2.6.0 API) + +DomainAction (weblogic-kubernetes-operator 3.0.0 API) - - + + - - - - - + + + + + - - + + - -
    + - - +
    - +
    +
    - -

    Class VersionHelper

    + +

    Class DomainAction

    java.lang.Object -
    oracle.kubernetes.operator.helpers.VersionHelper
    +
    oracle.kubernetes.operator.rest.model.DomainAction

    -
    public class VersionHelper
    +
    public class DomainAction
     extends java.lang.Object
    -
    Helper methods for managing versions.
    +
    Describes an action to the domain that the operation should take.
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/DomainActionType.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/DomainActionType.html new file mode 100644 index 00000000000..a10ba146feb --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/DomainActionType.html @@ -0,0 +1,328 @@ + + + + + +DomainActionType (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    + +
    + +

    Enum DomainActionType

    +
    +
    +
    java.lang.Object +
    java.lang.Enum<DomainActionType> +
    oracle.kubernetes.operator.rest.model.DomainActionType
    +
    +
    +
    +
    +
    All Implemented Interfaces:
    +
    java.io.Serializable, java.lang.Comparable<DomainActionType>, java.lang.constant.Constable
    +
    +
    +
    public enum DomainActionType
    +extends java.lang.Enum<DomainActionType>
    +
    +
    +
      + +
    • +
      + + +

      Nested Class Summary

      +
      +

      Nested classes/interfaces inherited from class java.lang.Enum

      + + +java.lang.Enum.EnumDesc<E extends java.lang.Enum<E>>
      +
      +
    • + +
    • +
      + + +

      Enum Constant Summary

      +
      + + + + + + + + + + + + + + + + + + + + + + +
      Enum Constants 
      Enum ConstantDescription
      INTROSPECT 
      RESTART 
      UNKNOWN 
      +
      +
      +
    • + +
    • +
      + + +

      Method Summary

      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + +
      Modifier and TypeMethodDescription
      static DomainActionTypevalueOf​(java.lang.String name) +
      Returns the enum constant of this type with the specified name.
      +
      static DomainActionType[]values() +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      +
      +
      +

      Methods inherited from class java.lang.Enum

      + + +clone, compareTo, describeConstable, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
      +
      +

      Methods inherited from class java.lang.Object

      + + +getClass, notify, notifyAll, wait, wait, wait
      +
      +
    • +
    +
    +
    +
      + +
    • +
      + + +

      Enum Constant Details

      + +
      +
    • + +
    • +
      + + +

      Method Details

      +
        +
      • +
        +

        values

        +
        public static DomainActionType[] values()
        +
        Returns an array containing the constants of this enum type, in +the order they are declared.
        +
        +
        Returns:
        +
        an array containing the constants of this enum type, in the order they are declared
        +
        +
        +
      • +
      • +
        +

        valueOf

        +
        public static DomainActionType valueOf​(java.lang.String name)
        +
        Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
        +
        +
        Parameters:
        +
        name - the name of the enum constant to be returned.
        +
        Returns:
        +
        the enum constant with the specified name
        +
        Throws:
        +
        java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
        +
        java.lang.NullPointerException - if the argument is null
        +
        +
        +
      • +
      +
      +
    • +
    +
    +
    + +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/DomainModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/DomainModel.html index ce5adf91483..2a8b44d4401 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/DomainModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/DomainModel.html @@ -2,10 +2,10 @@ - -DomainModel (weblogic-kubernetes-operator 2.6.0 API) + +DomainModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class DomainModel

    @@ -279,8 +274,8 @@

    propertiesToString

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/ErrorModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/ErrorModel.html index 9bbc118d81b..5db48bdd7ee 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/ErrorModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/ErrorModel.html @@ -2,10 +2,10 @@ - -ErrorModel (weblogic-kubernetes-operator 2.6.0 API) + +ErrorModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ErrorModel

    @@ -380,8 +375,8 @@

    propertiesToString

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/ItemModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/ItemModel.html index b74e7f5f985..68058c05a88 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/ItemModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/ItemModel.html @@ -2,10 +2,10 @@ - -ItemModel (weblogic-kubernetes-operator 2.6.0 API) + +ItemModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Class ItemModel

    @@ -177,8 +172,8 @@

    ItemModel

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/LinkContainerModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/LinkContainerModel.html index 9eba1aa9848..e9a0b21cfb0 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/LinkContainerModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/LinkContainerModel.html @@ -2,10 +2,10 @@ - -LinkContainerModel (weblogic-kubernetes-operator 2.6.0 API) + +LinkContainerModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class LinkContainerModel

    @@ -359,8 +354,8 @@

    propertiesToString

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/LinkModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/LinkModel.html index 5c9baf7e3e0..d377f68dd70 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/LinkModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/LinkModel.html @@ -2,10 +2,10 @@ - -LinkModel (weblogic-kubernetes-operator 2.6.0 API) + +LinkModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class LinkModel

    @@ -367,8 +362,8 @@

    propertiesToString

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/ScaleClusterParamsModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/ScaleClusterParamsModel.html index 105acbf2c7c..e8d4f253983 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/ScaleClusterParamsModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/ScaleClusterParamsModel.html @@ -2,10 +2,10 @@ - -ScaleClusterParamsModel (weblogic-kubernetes-operator 2.6.0 API) + +ScaleClusterParamsModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ScaleClusterParamsModel

    @@ -249,8 +244,8 @@

    propertiesToString

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/VersionModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/VersionModel.html index c26825bba4a..619474bc721 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/VersionModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/VersionModel.html @@ -2,10 +2,10 @@ - -VersionModel (weblogic-kubernetes-operator 2.6.0 API) + +VersionModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class VersionModel

    @@ -357,8 +352,8 @@

    propertiesToString

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/BaseModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/BaseModel.html index 82272b6a2cd..beaf0ac0498 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/BaseModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/BaseModel.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.model.BaseModel (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.model.BaseModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.model.BaseModel

    @@ -208,5 +203,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ClusterModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ClusterModel.html index 6a1ef80d3f8..eb4be9b4ebe 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ClusterModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ClusterModel.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.model.ClusterModel (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.model.ClusterModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.model.ClusterModel

    @@ -172,5 +167,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/CollectionModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/CollectionModel.html index 93866e027bc..a8a2dc8629b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/CollectionModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/CollectionModel.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.model.CollectionModel (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.model.CollectionModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.model.CollectionModel

    @@ -165,5 +160,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/DomainAction.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/DomainAction.html new file mode 100644 index 00000000000..58955bebd83 --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/DomainAction.html @@ -0,0 +1,220 @@ + + + + + +Uses of Class oracle.kubernetes.operator.rest.model.DomainAction (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.model.DomainAction

    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Packages that use DomainAction 
    PackageDescription
    oracle.kubernetes.operator.rest +
    The Operator's built-in REST server.
    +
    oracle.kubernetes.operator.rest.backend +
    REST Backend classes.
    +
    oracle.kubernetes.operator.rest.resource +
    REST resources.
    +
    +
    +
    + +
    +
    +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/DomainActionType.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/DomainActionType.html new file mode 100644 index 00000000000..d717ea9aec9 --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/DomainActionType.html @@ -0,0 +1,182 @@ + + + + + +Uses of Class oracle.kubernetes.operator.rest.model.DomainActionType (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.model.DomainActionType

    +
    +
    +
    + + + + + + + + + + + + + + +
    Packages that use DomainActionType 
    PackageDescription
    oracle.kubernetes.operator.rest.model +
    Model classes used by the REST server.
    +
    +
    +
    + +
    +
    +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/DomainModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/DomainModel.html index a5f249c4807..f6ceb224641 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/DomainModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/DomainModel.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.model.DomainModel (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.model.DomainModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.model.DomainModel

    @@ -172,5 +167,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ErrorModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ErrorModel.html index 9b49a430d41..2f980d5b783 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ErrorModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ErrorModel.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.model.ErrorModel (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.model.ErrorModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.model.ErrorModel

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ItemModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ItemModel.html index 08cc0f166e8..ec7be4d8206 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ItemModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ItemModel.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.model.ItemModel (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.model.ItemModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.model.ItemModel

    @@ -186,5 +181,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/LinkContainerModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/LinkContainerModel.html index 58716a53a38..3e394c9dea1 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/LinkContainerModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/LinkContainerModel.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.model.LinkContainerModel (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.model.LinkContainerModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.model.LinkContainerModel

    @@ -223,5 +218,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/LinkModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/LinkModel.html index d8fd5067c1f..5580326aa50 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/LinkModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/LinkModel.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.model.LinkModel (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.model.LinkModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.model.LinkModel

    @@ -172,5 +167,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ScaleClusterParamsModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ScaleClusterParamsModel.html index 4ecd3b1309c..70f1de7c5fd 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ScaleClusterParamsModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/ScaleClusterParamsModel.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.model.ScaleClusterParamsModel (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.model.ScaleClusterParamsModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.model.ScaleClusterParamsModel

    @@ -151,5 +146,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/VersionModel.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/VersionModel.html index c3bd4ed406c..479ac2ff9a2 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/VersionModel.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/class-use/VersionModel.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.model.VersionModel (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.model.VersionModel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.model.VersionModel

    @@ -172,5 +167,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/package-summary.html index bcabf7ef2f8..b394c421e62 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.rest.model (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.rest.model (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.rest.model

    @@ -107,43 +102,49 @@

    Package oracle.kubernetes.operator.rest.m +DomainAction + +
    Describes an action to the domain that the operation should take.
    + + + DomainModel
    DomainModel describes a WebLogic domain that has been registered with the WebLogic operator.
    - + ErrorModel
    ErrorModel describes an error response from a WebLogic operator REST resource.
    - + ItemModel
    ItemModel is the base class for all singular resources (singletons and collection children).
    - + LinkContainerModel
    LinkContainerModel is the base class of WebLogic operator model classes that support links to related REST endpoints.
    - + LinkModel
    LinkModel describes a link to a WebLogic operator REST resource.
    - + ScaleClusterParamsModel
    ScaleClusterParamsModel describes the input parameters to the WebLogic cluster scaling operation.
    - + VersionModel
    VersionModel describes a version of the WebLogic operator REST api.
    @@ -153,6 +154,25 @@

    Package oracle.kubernetes.operator.rest.m

    +
  • +
    + + + + + + + + + + + + + + +
    Enum Summary 
    EnumDescription
    DomainActionType 
    +
    +
  • @@ -185,5 +205,7 @@

    Package oracle.kubernetes.operator.rest.m

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/package-tree.html index c5d361e6780..353fc1312a8 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.rest.model Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.rest.model Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.rest.model

    @@ -98,6 +93,21 @@

    Class Hierarchy

  • oracle.kubernetes.operator.rest.model.ScaleClusterParamsModel
  • +
  • oracle.kubernetes.operator.rest.model.DomainAction
  • + + + + +
    +

    Enum Hierarchy

    +
      +
    • java.lang.Object +
        +
      • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.lang.constant.Constable, java.io.Serializable) + +
    @@ -132,5 +142,7 @@

    Class Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/model/package-use.html b/docs/apidocs/oracle/kubernetes/operator/rest/model/package-use.html index 4369a47d6e7..18e4e23c24b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/model/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/model/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.rest.model (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.rest.model (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.rest.model

    @@ -81,6 +76,18 @@

    +oracle.kubernetes.operator.rest + +
    The Operator's built-in REST server.
    + + + +oracle.kubernetes.operator.rest.backend + +
    REST Backend classes.
    + + + oracle.kubernetes.operator.rest.model
    Model classes used by the REST server.
    @@ -98,6 +105,56 @@

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/rest/package-summary.html index 0c5a4e041e3..d3932c8f8c6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.rest (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.rest (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.rest

    @@ -218,5 +213,7 @@

    Package oracle.kubernetes.operator.rest

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/rest/package-tree.html index 692a69de85a..fcd6aa02f9b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.rest Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.rest Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.rest

    @@ -134,5 +129,7 @@

    Interface Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/package-use.html b/docs/apidocs/oracle/kubernetes/operator/rest/package-use.html index 4bd0121926c..34453709c2a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.rest (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.rest (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.rest

    @@ -170,5 +165,7 @@

    Uses o

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/BaseResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/BaseResource.html index 37cf2ae9df0..7eaebcfc6dd 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/BaseResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/BaseResource.html @@ -2,10 +2,10 @@ - -BaseResource (weblogic-kubernetes-operator 2.6.0 API) + +BaseResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class BaseResource

    @@ -325,8 +320,8 @@

    href

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/ClusterResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/ClusterResource.html index 65d5515998f..fe28d53c769 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/ClusterResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/ClusterResource.html @@ -2,10 +2,10 @@ - -ClusterResource (weblogic-kubernetes-operator 2.6.0 API) + +ClusterResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ClusterResource

    @@ -249,8 +244,8 @@

    getScaleClusterResource

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/ClustersResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/ClustersResource.html index ca5a9d55d70..3747044be1a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/ClustersResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/ClustersResource.html @@ -2,10 +2,10 @@ - -ClustersResource (weblogic-kubernetes-operator 2.6.0 API) + +ClustersResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ClustersResource

    @@ -252,8 +247,8 @@

    getClusterResource

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/DomainResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/DomainResource.html index 0b54cc878d2..1bc9a99a306 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/DomainResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/DomainResource.html @@ -2,10 +2,10 @@ - -DomainResource (weblogic-kubernetes-operator 2.6.0 API) + +DomainResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class DomainResource

    @@ -168,6 +163,13 @@

    Method Summary

    Construct and return the 'clusters' jaxrs child resource.
    + +void +post​(DomainAction params) + +
    Apply changes to this domain.
    + +
    @@ -233,6 +235,19 @@

    get

  • +

    post

    +
    @POST +@Consumes("application/json") +public void post​(DomainAction params)
    +
    Apply changes to this domain. The changes depend on the details of the specified instructions
    +
    +
    Parameters:
    +
    params - - an update command, including a command type and optional parameters
    +
    +
    +
  • +
  • +

    getClustersResource

    @Path("clusters") public ClustersResource getClustersResource()
    @@ -249,8 +264,8 @@

    getClustersResource

  • - + + + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/DomainsResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/DomainsResource.html index 8bc62610f3f..a4a8d0968e7 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/DomainsResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/DomainsResource.html @@ -2,10 +2,10 @@ - -DomainsResource (weblogic-kubernetes-operator 2.6.0 API) + +DomainsResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class DomainsResource

    @@ -254,8 +249,8 @@

    getDomainResource

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/ScaleClusterResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/ScaleClusterResource.html index eefef818b31..645f008ee79 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/ScaleClusterResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/ScaleClusterResource.html @@ -2,10 +2,10 @@ - -ScaleClusterResource (weblogic-kubernetes-operator 2.6.0 API) + +ScaleClusterResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/SwaggerResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/SwaggerResource.html index 9adbc79f887..550651bd2ac 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/SwaggerResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/SwaggerResource.html @@ -2,10 +2,10 @@ - -SwaggerResource (weblogic-kubernetes-operator 2.6.0 API) + +SwaggerResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class SwaggerResource

    @@ -230,8 +225,8 @@

    get

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/VersionResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/VersionResource.html index da7b3876eeb..1e8bf843153 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/VersionResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/VersionResource.html @@ -2,10 +2,10 @@ - -VersionResource (weblogic-kubernetes-operator 2.6.0 API) + +VersionResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class VersionResource

    @@ -268,8 +263,8 @@

    getSwaggerResource

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/VersionsResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/VersionsResource.html index 6a39d90c2f5..a658da59855 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/VersionsResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/VersionsResource.html @@ -2,10 +2,10 @@ - -VersionsResource (weblogic-kubernetes-operator 2.6.0 API) + +VersionsResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class VersionsResource

    @@ -246,8 +241,8 @@

    getVersionResource

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/BaseResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/BaseResource.html index 723211e8ff8..2e9ed2e0b0e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/BaseResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/BaseResource.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.resource.BaseResource (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.resource.BaseResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.resource.BaseResource

    @@ -298,5 +293,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/ClusterResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/ClusterResource.html index b968214c294..075784cb4b6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/ClusterResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/ClusterResource.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.resource.ClusterResource (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.resource.ClusterResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.resource.ClusterResource

    @@ -151,5 +146,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/ClustersResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/ClustersResource.html index 26bfe209350..54e5e7b5f86 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/ClustersResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/ClustersResource.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.resource.ClustersResource (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.resource.ClustersResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.resource.ClustersResource

    @@ -151,5 +146,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/DomainResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/DomainResource.html index 48cb565b939..80dd7c4d9ae 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/DomainResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/DomainResource.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.resource.DomainResource (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.resource.DomainResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.resource.DomainResource

    @@ -151,5 +146,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/DomainsResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/DomainsResource.html index a1cb95d893e..f90a81082d4 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/DomainsResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/DomainsResource.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.resource.DomainsResource (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.resource.DomainsResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.resource.DomainsResource

    @@ -151,5 +146,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/ScaleClusterResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/ScaleClusterResource.html index 1038f2a2369..c1123358dcf 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/ScaleClusterResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/ScaleClusterResource.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.resource.ScaleClusterResource (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.resource.ScaleClusterResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.resource.ScaleClusterResource

    @@ -151,5 +146,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/SwaggerResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/SwaggerResource.html index a794f9e0460..187b8cadd9c 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/SwaggerResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/SwaggerResource.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.resource.SwaggerResource (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.resource.SwaggerResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.resource.SwaggerResource

    @@ -151,5 +146,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/VersionResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/VersionResource.html index f6400a2ba34..5c091a1270e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/VersionResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/VersionResource.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.resource.VersionResource (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.resource.VersionResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.resource.VersionResource

    @@ -151,5 +146,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/VersionsResource.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/VersionsResource.html index 642c4d6e1c0..0a9e255a658 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/VersionsResource.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/class-use/VersionsResource.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.rest.resource.VersionsResource (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.rest.resource.VersionsResource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.rest.resource.VersionsResource

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/package-summary.html index 639ee859d42..79a9a3b8606 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.rest.resource (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.rest.resource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.rest.resource

    @@ -185,5 +180,7 @@

    Package oracle.kubernetes.operator.rest.r

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/package-tree.html index d4a0977a179..c7394c35546 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.rest.resource Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.rest.resource Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.rest.resource

    @@ -125,5 +120,7 @@

    Class Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/rest/resource/package-use.html b/docs/apidocs/oracle/kubernetes/operator/rest/resource/package-use.html index 2cfa80c71c3..0f4e6180d3a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/rest/resource/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/rest/resource/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.rest.resource (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.rest.resource (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.rest.resource

    @@ -197,5 +192,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/AbstractListStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/AbstractListStep.html index 78390e9ea28..b898c8e0ba4 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/AbstractListStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/AbstractListStep.html @@ -2,10 +2,10 @@ - -AbstractListStep (weblogic-kubernetes-operator 2.6.0 API) + +AbstractListStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class AbstractListStep<T>

    @@ -199,8 +194,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/BeforeAdminServiceStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/BeforeAdminServiceStep.html index e1e929a3a61..9b220cffbf8 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/BeforeAdminServiceStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/BeforeAdminServiceStep.html @@ -2,10 +2,10 @@ - -BeforeAdminServiceStep (weblogic-kubernetes-operator 2.6.0 API) + +BeforeAdminServiceStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class BeforeAdminServiceStep

    @@ -234,8 +229,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/ClusterServicesStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/ClusterServicesStep.html index e6b952c5608..ac52e663ae4 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/ClusterServicesStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/ClusterServicesStep.html @@ -2,10 +2,10 @@ - -ClusterServicesStep (weblogic-kubernetes-operator 2.6.0 API) + +ClusterServicesStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ClusterServicesStep

    @@ -234,8 +229,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/ConfigMapAfterStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/ConfigMapAfterStep.html index 5836d80da1b..46f042c386c 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/ConfigMapAfterStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/ConfigMapAfterStep.html @@ -2,10 +2,10 @@ - -ConfigMapAfterStep (weblogic-kubernetes-operator 2.6.0 API) + +ConfigMapAfterStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ConfigMapAfterStep

    @@ -253,8 +248,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/DefaultResponseStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/DefaultResponseStep.html index 223ac4caba0..10ae940aa77 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/DefaultResponseStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/DefaultResponseStep.html @@ -2,10 +2,10 @@ - -DefaultResponseStep (weblogic-kubernetes-operator 2.6.0 API) + +DefaultResponseStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/DeleteDomainStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/DeleteDomainStep.html index c41cc262bff..4d76e979a29 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/DeleteDomainStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/DeleteDomainStep.html @@ -2,10 +2,10 @@ - -DeleteDomainStep (weblogic-kubernetes-operator 2.6.0 API) + +DeleteDomainStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class DeleteDomainStep

    @@ -247,8 +242,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/DeleteServiceListStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/DeleteServiceListStep.html index 1cd2bc06ea8..f888bc1059f 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/DeleteServiceListStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/DeleteServiceListStep.html @@ -2,10 +2,10 @@ - -DeleteServiceListStep (weblogic-kubernetes-operator 2.6.0 API) + +DeleteServiceListStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Class DeleteServiceListStep

    @@ -142,8 +137,8 @@

    Methods inherited from class java.lang.Object

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/DomainPresenceStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/DomainPresenceStep.html index 3fbabd94877..5de0b6ea4c8 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/DomainPresenceStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/DomainPresenceStep.html @@ -2,10 +2,10 @@ - -DomainPresenceStep (weblogic-kubernetes-operator 2.6.0 API) + +DomainPresenceStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class DomainPresenceStep

    @@ -146,7 +141,7 @@

    Method Summary

    static DomainPresenceStep createDomainPresenceStep​(Domain dom, -Step adminStep, +Step domainUpSteps, Step managedServerStep)   @@ -181,7 +176,7 @@

    Method Details

    createDomainPresenceStep

    public static DomainPresenceStep createDomainPresenceStep​(Domain dom, -Step adminStep, +Step domainUpSteps, Step managedServerStep)
    @@ -208,8 +203,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/ManagedServerUpAfterStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/ManagedServerUpAfterStep.html index 096105dc303..ce5eac7ea44 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/ManagedServerUpAfterStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/ManagedServerUpAfterStep.html @@ -2,10 +2,10 @@ - -ManagedServerUpAfterStep (weblogic-kubernetes-operator 2.6.0 API) + +ManagedServerUpAfterStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ManagedServerUpAfterStep

    @@ -234,8 +229,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/ManagedServerUpIteratorStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/ManagedServerUpIteratorStep.html index ae102d4b73b..6de75f51ced 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/ManagedServerUpIteratorStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/ManagedServerUpIteratorStep.html @@ -2,10 +2,10 @@ - -ManagedServerUpIteratorStep (weblogic-kubernetes-operator 2.6.0 API) + +ManagedServerUpIteratorStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ManagedServerUpIteratorStep

    @@ -102,6 +97,14 @@

    Class ManagedServerU
    public class ManagedServerUpIteratorStep
     extends Step
    +
    A step which will bring up the specified managed servers in parallel. + Adds to packet: + SERVERS_TO_ROLL a collection of servers to be rolled, updated in parallel by the server-up steps. + and for each server: + SERVER_NAME the name of the server to bring up + CLUSTER_NAME the name of the cluster of which it is a member, if any + ENVVARS the associated environment variables + SERVER_SCAN the configuration for the server

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/ManagedServersUpStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/ManagedServersUpStep.html index 86eb3cdd5c1..09a943d2c06 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/ManagedServersUpStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/ManagedServersUpStep.html @@ -2,10 +2,10 @@ - -ManagedServersUpStep (weblogic-kubernetes-operator 2.6.0 API) + +ManagedServersUpStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ManagedServersUpStep

    @@ -245,8 +240,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/ReadHealthStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/ReadHealthStep.html index 694f937c487..c9d87e02750 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/ReadHealthStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/ReadHealthStep.html @@ -2,10 +2,10 @@ - -ReadHealthStep (weblogic-kubernetes-operator 2.6.0 API) + +ReadHealthStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ReadHealthStep

    @@ -275,8 +270,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/ServerDownIteratorStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/ServerDownIteratorStep.html index add00f599ad..414378c3f47 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/ServerDownIteratorStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/ServerDownIteratorStep.html @@ -2,10 +2,10 @@ - -ServerDownIteratorStep (weblogic-kubernetes-operator 2.6.0 API) + +ServerDownIteratorStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ServerDownIteratorStep

    @@ -208,8 +203,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/ServerDownStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/ServerDownStep.html index f13caa37177..e9b3f6a670e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/ServerDownStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/ServerDownStep.html @@ -2,10 +2,10 @@ - -ServerDownStep (weblogic-kubernetes-operator 2.6.0 API) + +ServerDownStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ServerDownStep

    @@ -193,8 +188,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/WatchDomainIntrospectorJobReadyStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/WatchDomainIntrospectorJobReadyStep.html index ce2b9316a02..fd05913b861 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/WatchDomainIntrospectorJobReadyStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/WatchDomainIntrospectorJobReadyStep.html @@ -2,10 +2,10 @@ - -WatchDomainIntrospectorJobReadyStep (weblogic-kubernetes-operator 2.6.0 API) + +WatchDomainIntrospectorJobReadyStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class WatchDomainIntrospectorJobReadyStep

    @@ -234,8 +229,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/WatchPodReadyAdminStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/WatchPodReadyAdminStep.html index 420fb3721bf..598c6703f7b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/WatchPodReadyAdminStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/WatchPodReadyAdminStep.html @@ -2,10 +2,10 @@ - -WatchPodReadyAdminStep (weblogic-kubernetes-operator 2.6.0 API) + +WatchPodReadyAdminStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class WatchPodReadyAdminStep

    @@ -236,8 +231,8 @@

    apply

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/AbstractListStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/AbstractListStep.html index 75f0f02ffa6..1d0b43cfb2f 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/AbstractListStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/AbstractListStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.AbstractListStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.AbstractListStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.AbstractListStep

    @@ -149,5 +144,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/BeforeAdminServiceStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/BeforeAdminServiceStep.html index 4b1f39c34b9..dee5d0659cc 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/BeforeAdminServiceStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/BeforeAdminServiceStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.BeforeAdminServiceStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.BeforeAdminServiceStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.BeforeAdminServiceStep

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ClusterServicesStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ClusterServicesStep.html index 5809dd24337..0dce13c5d37 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ClusterServicesStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ClusterServicesStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.ClusterServicesStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.ClusterServicesStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.ClusterServicesStep

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ConfigMapAfterStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ConfigMapAfterStep.html index 4cab9808eff..795ccf1e659 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ConfigMapAfterStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ConfigMapAfterStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.ConfigMapAfterStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.ConfigMapAfterStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.ConfigMapAfterStep

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DefaultResponseStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DefaultResponseStep.html index eefffd386a2..6bb5dddc385 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DefaultResponseStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DefaultResponseStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.DefaultResponseStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.DefaultResponseStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.DefaultResponseStep

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DeleteDomainStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DeleteDomainStep.html index cce1f3339ba..974d725baef 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DeleteDomainStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DeleteDomainStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.DeleteDomainStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.DeleteDomainStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.DeleteDomainStep

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DeleteServiceListStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DeleteServiceListStep.html index 3fc98851439..3acc22e9503 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DeleteServiceListStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DeleteServiceListStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.DeleteServiceListStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.DeleteServiceListStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.DeleteServiceListStep

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DomainPresenceStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DomainPresenceStep.html index 6d7f91aaf07..3b355fc82d9 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DomainPresenceStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/DomainPresenceStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.DomainPresenceStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.DomainPresenceStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.DomainPresenceStep

    @@ -108,7 +103,7 @@

    Uses of static DomainPresenceStep DomainPresenceStep.createDomainPresenceStep​(Domain dom, -Step adminStep, +Step domainUpSteps, Step managedServerStep)   @@ -149,5 +144,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ManagedServerUpAfterStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ManagedServerUpAfterStep.html index 0c2a10041d8..6235ff5df36 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ManagedServerUpAfterStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ManagedServerUpAfterStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.ManagedServerUpAfterStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.ManagedServerUpAfterStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.ManagedServerUpAfterStep

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ManagedServerUpIteratorStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ManagedServerUpIteratorStep.html index 8c7a8f6e248..3b3502fa73e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ManagedServerUpIteratorStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ManagedServerUpIteratorStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.ManagedServerUpIteratorStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.ManagedServerUpIteratorStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.ManagedServerUpIteratorStep

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ManagedServersUpStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ManagedServersUpStep.html index 0d6cc317b7a..48be5e66864 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ManagedServersUpStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ManagedServersUpStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.ManagedServersUpStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.ManagedServersUpStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.ManagedServersUpStep

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ReadHealthStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ReadHealthStep.html index 80a7b6612a3..910c8eaf5df 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ReadHealthStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ReadHealthStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.ReadHealthStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.ReadHealthStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.ReadHealthStep

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ServerDownIteratorStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ServerDownIteratorStep.html index df48e19a796..31dd50c0ee1 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ServerDownIteratorStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ServerDownIteratorStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.ServerDownIteratorStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.ServerDownIteratorStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.ServerDownIteratorStep

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ServerDownStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ServerDownStep.html index d11f42776de..974e6451541 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ServerDownStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/ServerDownStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.ServerDownStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.ServerDownStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.ServerDownStep

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/WatchDomainIntrospectorJobReadyStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/WatchDomainIntrospectorJobReadyStep.html index a69a8d0b20c..4473bebc298 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/WatchDomainIntrospectorJobReadyStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/WatchDomainIntrospectorJobReadyStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.WatchDomainIntrospectorJobReadyStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.WatchDomainIntrospectorJobReadyStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.WatchDomainIntrospectorJobReadyStep

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/WatchPodReadyAdminStep.html b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/WatchPodReadyAdminStep.html index 748f3a42079..2ea00143bcc 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/class-use/WatchPodReadyAdminStep.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/class-use/WatchPodReadyAdminStep.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.steps.WatchPodReadyAdminStep (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.steps.WatchPodReadyAdminStep (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.steps.WatchPodReadyAdminStep

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/steps/package-summary.html index d95b6a33354..e2563a8ae8f 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.steps (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.steps (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.steps

    @@ -131,7 +126,9 @@

    Package oracle.kubernetes.operator.steps< ManagedServerUpIteratorStep -  + +
    A step which will bring up the specified managed servers in parallel.
    + ReadHealthStep @@ -189,5 +186,7 @@

    Package oracle.kubernetes.operator.steps<

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/steps/package-tree.html index 818e3a6e551..349ae0441ce 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.steps Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.steps Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.steps

    @@ -140,5 +135,7 @@

    Class Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/steps/package-use.html b/docs/apidocs/oracle/kubernetes/operator/steps/package-use.html index 447b60a19fb..af740d8617a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/steps/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/steps/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.steps (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.steps (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.steps

    @@ -150,5 +145,7 @@

    Uses

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/Certificates.html b/docs/apidocs/oracle/kubernetes/operator/utils/Certificates.html index 4fcdf643a97..fcc99ede9a2 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/Certificates.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/Certificates.html @@ -2,10 +2,10 @@ - -Certificates (weblogic-kubernetes-operator 2.6.0 API) + +Certificates (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExec.html b/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExec.html index 5fed8b9afcf..80409572ce8 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExec.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExec.html @@ -2,10 +2,10 @@ - -KubernetesExec (weblogic-kubernetes-operator 2.6.0 API) + +KubernetesExec (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class KubernetesExec

    @@ -242,8 +237,8 @@

    exec

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExecFactory.html b/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExecFactory.html index ffc70c340a0..9f8e0738812 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExecFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExecFactory.html @@ -2,10 +2,10 @@ - -KubernetesExecFactory (weblogic-kubernetes-operator 2.6.0 API) + +KubernetesExecFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExecFactoryImpl.KubernetesExecImpl.html b/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExecFactoryImpl.KubernetesExecImpl.html index d185132bf0e..90cb338c035 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExecFactoryImpl.KubernetesExecImpl.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExecFactoryImpl.KubernetesExecImpl.html @@ -2,10 +2,10 @@ - -KubernetesExecFactoryImpl.KubernetesExecImpl (weblogic-kubernetes-operator 2.6.0 API) + +KubernetesExecFactoryImpl.KubernetesExecImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class KubernetesExecFactoryImpl.KubernetesExecImpl

    @@ -188,8 +183,8 @@

    exec

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExecFactoryImpl.html b/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExecFactoryImpl.html index 3c5a30aed07..eb30faa752e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExecFactoryImpl.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/KubernetesExecFactoryImpl.html @@ -2,10 +2,10 @@ - -KubernetesExecFactoryImpl (weblogic-kubernetes-operator 2.6.0 API) + +KubernetesExecFactoryImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/PatchUtils.html b/docs/apidocs/oracle/kubernetes/operator/utils/PatchUtils.html index 5073ab16a39..564ca1eee81 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/PatchUtils.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/PatchUtils.html @@ -2,10 +2,10 @@ - -PatchUtils (weblogic-kubernetes-operator 2.6.0 API) + +PatchUtils (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class PatchUtils

    @@ -210,8 +205,8 @@

    toKubernetesPatch

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/WlsDomainConfigSupport.html b/docs/apidocs/oracle/kubernetes/operator/utils/WlsDomainConfigSupport.html deleted file mode 100644 index 163f943b0ed..00000000000 --- a/docs/apidocs/oracle/kubernetes/operator/utils/WlsDomainConfigSupport.html +++ /dev/null @@ -1,468 +0,0 @@ - - - - - -WlsDomainConfigSupport (weblogic-kubernetes-operator 2.6.0 API) - - - - - - - - - - - - - - - - -
    - -
    - -
    -
    - -

    Class WlsDomainConfigSupport

    -
    -
    -
    java.lang.Object -
    oracle.kubernetes.operator.utils.WlsDomainConfigSupport
    -
    -
    -
    -
    public class WlsDomainConfigSupport
    -extends java.lang.Object
    -
    -
    -
      - -
    • -
      - - -

      Constructor Summary

      -
      - - - - - - - - - - - - - - -
      Constructors 
      ConstructorDescription
      WlsDomainConfigSupport​(java.lang.String domain) 
      -
      -
      -
    • - -
    • -
      - - -

      Method Summary

      -
      -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Modifier and TypeMethodDescription
      voidaddDynamicWlsCluster​(java.lang.String clusterName, -java.lang.String... serverNames) -
      Adds a dynamic WLS cluster to the configuration, including its member servers.
      -
      voidaddWlsCluster​(java.lang.String clusterName, -java.lang.String... serverNames) -
      Adds a WLS cluster to the configuration, including its member servers.
      -
      voidaddWlsServer​(java.lang.String serverName) -
      Adds a WLS server to the configuration.
      -
      WlsServerConfigaddWlsServer​(java.lang.String serverName, -java.lang.Integer listenPort) -
      Adds a WLS server to the configuration.
      -
      WlsDomainConfigcreateDomainConfig() -
      Creates a domain configuration, based on the defined servers and clusters.
      -
      WlsClusterConfiggetWlsCluster​(java.lang.String clusterName) -
      Returns the configuration for the named cluster, if any has been defined.
      -
      WlsServerConfiggetWlsServer​(java.lang.String serverName) -
      Returns the configuration for the named server, if any has been defined.
      -
      WlsServerConfiggetWlsServer​(java.lang.String clusterName, -java.lang.String serverName) -
      Returns the configuration for the named clustered server.
      -
      voidsetAdminServerName​(java.lang.String adminServerName) 
      WlsDomainConfigSupportwithAdminServerName​(java.lang.String adminServerName) 
      WlsDomainConfigSupportwithDynamicWlsCluster​(java.lang.String clusterName, -java.lang.String... serverNames) 
      WlsDomainConfigSupportwithWlsCluster​(java.lang.String clusterName, -java.lang.String... serverNames) 
      WlsDomainConfigSupportwithWlsServer​(java.lang.String serverName, -java.lang.Integer listenPort) 
      -
      -
      -
      -

      Methods inherited from class java.lang.Object

      - - -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      -
      -
    • -
    -
    -
    -
      - -
    • -
      - - -

      Constructor Details

      - -
      -
    • - -
    • -
      - - -

      Method Details

      -
        -
      • -
        -

        withWlsServer

        -
        public WlsDomainConfigSupport withWlsServer​(java.lang.String serverName, -java.lang.Integer listenPort)
        -
        -
      • -
      • -
        -

        withWlsCluster

        -
        public WlsDomainConfigSupport withWlsCluster​(java.lang.String clusterName, -java.lang.String... serverNames)
        -
        -
      • -
      • -
        -

        withDynamicWlsCluster

        -
        public WlsDomainConfigSupport withDynamicWlsCluster​(java.lang.String clusterName, -java.lang.String... serverNames)
        -
        -
      • -
      • -
        -

        withAdminServerName

        -
        public WlsDomainConfigSupport withAdminServerName​(java.lang.String adminServerName)
        -
        -
      • -
      • -
        -

        setAdminServerName

        -
        public void setAdminServerName​(java.lang.String adminServerName)
        -
        -
      • -
      • -
        -

        addWlsServer

        -
        public void addWlsServer​(java.lang.String serverName)
        -
        Adds a WLS server to the configuration. Any non-clustered server must be added explicitly. - Clustered servers may be added, or may be added simply as part of their cluster.
        -
        -
        Parameters:
        -
        serverName - the name of the server.
        -
        -
        -
      • -
      • -
        -

        addWlsServer

        -
        public WlsServerConfig addWlsServer​(java.lang.String serverName, -java.lang.Integer listenPort)
        -
        Adds a WLS server to the configuration. Any non-clustered server must be added explicitly. - Clustered servers may be added, or may be added simply as part of their cluster.
        -
        -
        Parameters:
        -
        serverName - the name of the server.
        -
        listenPort - the listen port
        -
        Returns:
        -
        Server configuration
        -
        -
        -
      • -
      • -
        -

        getWlsServer

        -
        public WlsServerConfig getWlsServer​(java.lang.String serverName)
        -
        Returns the configuration for the named server, if any has been defined.
        -
        -
        Parameters:
        -
        serverName - the name of the server.
        -
        Returns:
        -
        a server configuration, or null.
        -
        -
        -
      • -
      • -
        -

        getWlsServer

        -
        public WlsServerConfig getWlsServer​(java.lang.String clusterName, -java.lang.String serverName)
        -
        Returns the configuration for the named clustered server.
        -
        -
        Parameters:
        -
        clusterName - the name of the cluster containing the server
        -
        serverName - the name of the server
        -
        Returns:
        -
        a server configuration, or null
        -
        -
        -
      • -
      • -
        -

        addWlsCluster

        -
        public void addWlsCluster​(java.lang.String clusterName, -java.lang.String... serverNames)
        -
        Adds a WLS cluster to the configuration, including its member servers.
        -
        -
        Parameters:
        -
        clusterName - the name of the cluster
        -
        serverNames - the names of the servers
        -
        -
        -
      • -
      • -
        -

        getWlsCluster

        -
        public WlsClusterConfig getWlsCluster​(java.lang.String clusterName)
        -
        Returns the configuration for the named cluster, if any has been defined.
        -
        -
        Parameters:
        -
        clusterName - the name of the cluster
        -
        Returns:
        -
        a cluster configuration, or null.
        -
        -
        -
      • -
      • -
        -

        addDynamicWlsCluster

        -
        public void addDynamicWlsCluster​(java.lang.String clusterName, -java.lang.String... serverNames)
        -
        Adds a dynamic WLS cluster to the configuration, including its member servers.
        -
        -
        Parameters:
        -
        clusterName - the name of the cluster
        -
        serverNames - the names of the servers
        -
        -
        -
      • -
      • -
        -

        createDomainConfig

        -
        public WlsDomainConfig createDomainConfig()
        -
        Creates a domain configuration, based on the defined servers and clusters.
        -
        -
        Returns:
        -
        a domain configuration, or null
        -
        -
        -
      • -
      -
      -
    • -
    -
    -
    -
    - - - - diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/class-use/Certificates.html b/docs/apidocs/oracle/kubernetes/operator/utils/class-use/Certificates.html index 78ccbf2177d..af1266e7c68 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/class-use/Certificates.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/class-use/Certificates.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.utils.Certificates (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.utils.Certificates (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.utils.Certificates

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExec.html b/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExec.html index dba5546fbbb..3dd6da36781 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExec.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExec.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.utils.KubernetesExec (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.utils.KubernetesExec (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.utils.KubernetesExec

    @@ -177,5 +172,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExecFactory.html b/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExecFactory.html index 10b97c8dbfe..bef00c045da 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExecFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExecFactory.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.utils.KubernetesExecFactory (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.utils.KubernetesExecFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.utils.KubernetesExecFactory

    @@ -149,5 +144,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExecFactoryImpl.KubernetesExecImpl.html b/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExecFactoryImpl.KubernetesExecImpl.html index bfd00f1b2db..e53692e1fd8 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExecFactoryImpl.KubernetesExecImpl.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExecFactoryImpl.KubernetesExecImpl.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.utils.KubernetesExecFactoryImpl.KubernetesExecImpl (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.utils.KubernetesExecFactoryImpl.KubernetesExecImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.utils.KubernetesExecFactoryImpl.KubernetesExecImpl

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExecFactoryImpl.html b/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExecFactoryImpl.html index 361b17a7843..6ba51881734 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExecFactoryImpl.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/class-use/KubernetesExecFactoryImpl.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.utils.KubernetesExecFactoryImpl (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.utils.KubernetesExecFactoryImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.utils.KubernetesExecFactoryImpl

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/class-use/PatchUtils.html b/docs/apidocs/oracle/kubernetes/operator/utils/class-use/PatchUtils.html index 71ef816bffb..e75614d72cd 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/class-use/PatchUtils.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/class-use/PatchUtils.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.utils.PatchUtils (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.utils.PatchUtils (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.utils.PatchUtils

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/utils/package-summary.html index f4719492e56..e6e6e9a147d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.utils (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.utils (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.utils

    @@ -128,10 +123,6 @@

    Package oracle.kubernetes.operator.utils< PatchUtils   - -WlsDomainConfigSupport -  -

    @@ -168,5 +159,7 @@

    Package oracle.kubernetes.operator.utils<

    Copyright © 2017–2020. All rights reserved.

    +

    + diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/utils/package-tree.html index 4efde604d6c..a96610f6a9a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.utils Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.utils Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.utils

    @@ -87,7 +82,6 @@

    Class Hierarchy

  • oracle.kubernetes.operator.utils.KubernetesExecFactoryImpl (implements oracle.kubernetes.operator.utils.KubernetesExecFactory)
  • oracle.kubernetes.operator.utils.PatchUtils
  • -
  • oracle.kubernetes.operator.utils.WlsDomainConfigSupport
  • @@ -128,5 +122,7 @@

    Interface Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/utils/package-use.html b/docs/apidocs/oracle/kubernetes/operator/utils/package-use.html index ef4bf5fa3bd..555207bca49 100644 --- a/docs/apidocs/oracle/kubernetes/operator/utils/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/utils/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.utils (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.utils (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.utils

    @@ -115,10 +110,6 @@

    Uses
    A factory for objects which can execute commands in Kubertenes containers.
    - -WlsDomainConfigSupport -  -

    @@ -156,5 +147,7 @@

    Uses

    Copyright © 2017–2020. All rights reserved.

    +

    + diff --git a/docs/apidocs/oracle/kubernetes/operator/watcher/WatchListener.html b/docs/apidocs/oracle/kubernetes/operator/watcher/WatchListener.html index bfc057e2bf4..551a1dd45bc 100644 --- a/docs/apidocs/oracle/kubernetes/operator/watcher/WatchListener.html +++ b/docs/apidocs/oracle/kubernetes/operator/watcher/WatchListener.html @@ -2,10 +2,10 @@ - -WatchListener (weblogic-kubernetes-operator 2.6.0 API) + +WatchListener (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/operator/watcher/class-use/WatchListener.html b/docs/apidocs/oracle/kubernetes/operator/watcher/class-use/WatchListener.html index 74329dbbb83..fb80ca9e7e5 100644 --- a/docs/apidocs/oracle/kubernetes/operator/watcher/class-use/WatchListener.html +++ b/docs/apidocs/oracle/kubernetes/operator/watcher/class-use/WatchListener.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.watcher.WatchListener (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.watcher.WatchListener (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.watcher.WatchListener

    @@ -278,5 +273,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/watcher/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/watcher/package-summary.html index ecd2eb053a1..c70ce65feb2 100644 --- a/docs/apidocs/oracle/kubernetes/operator/watcher/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/watcher/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.watcher (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.watcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.watcher

    @@ -130,5 +125,7 @@

    Package oracle.kubernetes.operator.watche

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/watcher/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/watcher/package-tree.html index b078c481bf2..2b31b7ecd89 100644 --- a/docs/apidocs/oracle/kubernetes/operator/watcher/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/watcher/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.watcher Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.watcher Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.watcher

    @@ -110,5 +105,7 @@

    Interface Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/watcher/package-use.html b/docs/apidocs/oracle/kubernetes/operator/watcher/package-use.html index c7b9457254c..87ccd3a50eb 100644 --- a/docs/apidocs/oracle/kubernetes/operator/watcher/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/watcher/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.watcher (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.watcher (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.watcher

    @@ -177,5 +172,7 @@

    Use

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/MacroSubstitutor.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/MacroSubstitutor.html index c00f49affe9..a7b1c0c5160 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/MacroSubstitutor.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/MacroSubstitutor.html @@ -2,10 +2,10 @@ - -MacroSubstitutor (weblogic-kubernetes-operator 2.6.0 API) + +MacroSubstitutor (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/NetworkAccessPoint.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/NetworkAccessPoint.html index 7a8a61da861..8b63e7b6649 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/NetworkAccessPoint.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/NetworkAccessPoint.html @@ -2,10 +2,10 @@ - -NetworkAccessPoint (weblogic-kubernetes-operator 2.6.0 API) + +NetworkAccessPoint (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class NetworkAccessPoint

    @@ -317,8 +312,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsClusterConfig.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsClusterConfig.html index 7e21222e703..f30d594b894 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsClusterConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsClusterConfig.html @@ -2,10 +2,10 @@ - -WlsClusterConfig (weblogic-kubernetes-operator 2.6.0 API) + +WlsClusterConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class WlsClusterConfig

    @@ -648,8 +643,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsDomainConfig.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsDomainConfig.html index 1f0dc29e366..50b92711cb2 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsDomainConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsDomainConfig.html @@ -2,10 +2,10 @@ - -WlsDomainConfig (weblogic-kubernetes-operator 2.6.0 API) + +WlsDomainConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class WlsDomainConfig

    @@ -769,8 +764,8 @@

    processDynamicClusters

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsDynamicServerConfig.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsDynamicServerConfig.html index e2985132036..ca503ede970 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsDynamicServerConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsDynamicServerConfig.html @@ -2,10 +2,10 @@ - -WlsDynamicServerConfig (weblogic-kubernetes-operator 2.6.0 API) + +WlsDynamicServerConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class WlsDynamicServerConfig

    @@ -177,8 +172,8 @@

    isDynamicServer

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsDynamicServersConfig.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsDynamicServersConfig.html index a6550aabd18..7ff7e4758b4 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsDynamicServersConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsDynamicServersConfig.html @@ -2,10 +2,10 @@ - -WlsDynamicServersConfig (weblogic-kubernetes-operator 2.6.0 API) + +WlsDynamicServersConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class WlsDynamicServersConfig

    @@ -565,8 +560,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsMachineConfig.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsMachineConfig.html index d085db78375..e5e707fe29e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsMachineConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsMachineConfig.html @@ -2,10 +2,10 @@ - -WlsMachineConfig (weblogic-kubernetes-operator 2.6.0 API) + +WlsMachineConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class WlsMachineConfig

    @@ -299,8 +294,8 @@

    toString

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsServerConfig.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsServerConfig.html index 8e3bba840ff..280bde2dc26 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsServerConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/WlsServerConfig.html @@ -2,10 +2,10 @@ - -WlsServerConfig (weblogic-kubernetes-operator 2.6.0 API) + +WlsServerConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class WlsServerConfig

    @@ -637,8 +632,8 @@

    toString

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/MacroSubstitutor.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/MacroSubstitutor.html index 70ef7346ca2..f4dd5244b32 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/MacroSubstitutor.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/MacroSubstitutor.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.wlsconfig.MacroSubstitutor (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.wlsconfig.MacroSubstitutor (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.wlsconfig.MacroSubstitutor

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/NetworkAccessPoint.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/NetworkAccessPoint.html index ce3bd1c686e..e4eb8dcda58 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/NetworkAccessPoint.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/NetworkAccessPoint.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.wlsconfig.NetworkAccessPoint (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.wlsconfig.NetworkAccessPoint (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.wlsconfig.NetworkAccessPoint

    @@ -197,5 +192,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsClusterConfig.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsClusterConfig.html index 2fba257dd53..5fff540efa6 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsClusterConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsClusterConfig.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.wlsconfig.WlsClusterConfig (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.wlsconfig.WlsClusterConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.wlsconfig.WlsClusterConfig

    @@ -81,10 +76,6 @@

    -oracle.kubernetes.operator.utils -  - - oracle.kubernetes.operator.wlsconfig
    Classes used to retrieve configuration of a WebLogic Domain or health from individual servers.
    @@ -96,34 +87,6 @@

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsDomainConfig.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsDomainConfig.html index 5079d47a561..c6b1dd40188 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsDomainConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsDomainConfig.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.wlsconfig.WlsDomainConfig (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.wlsconfig.WlsDomainConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.wlsconfig.WlsDomainConfig

    @@ -93,10 +88,6 @@

    -oracle.kubernetes.operator.utils -  - - oracle.kubernetes.operator.wlsconfig
    Classes used to retrieve configuration of a WebLogic Domain or health from individual servers.
    @@ -125,7 +116,7 @@

    Uses of WlsDomainConfig -ConfigMapHelper.DomainTopology.getDomain() +DomainTopology.getDomain()   @@ -144,7 +135,24 @@

    Uses of void -ConfigMapHelper.DomainTopology.setDomain​(WlsDomainConfig domain) +DomainTopology.setDomain​(WlsDomainConfig domain) +  + + + +

    +
    + + + + + + + + + + + @@ -216,34 +224,6 @@

    Uses of -
    - - -

    Uses of WlsDomainConfig in oracle.kubernetes.operator.utils

    -
    -

    Constructors in oracle.kubernetes.operator.helpers with parameters of type WlsDomainConfig 
    ConstructorDescription
    DomainTopology​(WlsDomainConfig domain)  
    - - - - - - - - - - - - - - - -
    Methods in oracle.kubernetes.operator.utils that return WlsDomainConfig 
    Modifier and TypeMethodDescription
    WlsDomainConfigWlsDomainConfigSupport.createDomainConfig() -
    Creates a domain configuration, based on the defined servers and clusters.
    -
    -
    - - -
  • @@ -353,5 +333,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

  • + diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsDynamicServerConfig.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsDynamicServerConfig.html index cb10641c3f9..1cf70c95c4b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsDynamicServerConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsDynamicServerConfig.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.wlsconfig.WlsDynamicServerConfig (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.wlsconfig.WlsDynamicServerConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.wlsconfig.WlsDynamicServerConfig

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsDynamicServersConfig.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsDynamicServersConfig.html index 62f69d04249..c2dedd2aed8 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsDynamicServersConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsDynamicServersConfig.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.wlsconfig.WlsDynamicServersConfig (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.wlsconfig.WlsDynamicServersConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.wlsconfig.WlsDynamicServersConfig

    @@ -188,5 +183,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsMachineConfig.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsMachineConfig.html index e59f97e446d..5c557e8f73c 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsMachineConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsMachineConfig.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.wlsconfig.WlsMachineConfig (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.wlsconfig.WlsMachineConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.wlsconfig.WlsMachineConfig

    @@ -172,5 +167,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsServerConfig.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsServerConfig.html index fd67eea6c81..479c60c8ebc 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsServerConfig.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/class-use/WlsServerConfig.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.wlsconfig.WlsServerConfig (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.wlsconfig.WlsServerConfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.wlsconfig.WlsServerConfig

    @@ -87,10 +82,6 @@

    -oracle.kubernetes.operator.utils -  - - oracle.kubernetes.operator.wlsconfig
    Classes used to retrieve configuration of a WebLogic Domain or health from individual servers.
    @@ -158,50 +149,6 @@

    Uses of -
    - - -

    Uses of WlsServerConfig in oracle.kubernetes.operator.utils

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Methods in oracle.kubernetes.operator.utils that return WlsServerConfig 
    Modifier and TypeMethodDescription
    WlsServerConfigWlsDomainConfigSupport.addWlsServer​(java.lang.String serverName, -java.lang.Integer listenPort) -
    Adds a WLS server to the configuration.
    -
    WlsServerConfigWlsDomainConfigSupport.getWlsServer​(java.lang.String serverName) -
    Returns the configuration for the named server, if any has been defined.
    -
    WlsServerConfigWlsDomainConfigSupport.getWlsServer​(java.lang.String clusterName, -java.lang.String serverName) -
    Returns the configuration for the named clustered server.
    -
    -
    -
    - -
  • @@ -482,5 +429,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

  • +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/package-summary.html index 808dd7f7206..9e31723f6cb 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.wlsconfig (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.wlsconfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.wlsconfig

    @@ -172,5 +167,7 @@

    Package oracle.kubernetes.operator.wlscon

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/package-tree.html index e4d4dd7cf75..7582470a789 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.wlsconfig Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.wlsconfig Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.wlsconfig

    @@ -124,5 +119,7 @@

    Class Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/package-use.html b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/package-use.html index 1f2f3a223b9..c14ddcdf597 100644 --- a/docs/apidocs/oracle/kubernetes/operator/wlsconfig/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/wlsconfig/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.wlsconfig (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.wlsconfig (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.wlsconfig

    @@ -93,10 +88,6 @@

    U -oracle.kubernetes.operator.utils -  - - oracle.kubernetes.operator.wlsconfig
    Classes used to retrieve configuration of a WebLogic Domain or health from individual servers.
    @@ -164,43 +155,6 @@

    U
  • -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - -
    Classes in oracle.kubernetes.operator.wlsconfig used by oracle.kubernetes.operator.utils 
    ClassDescription
    WlsClusterConfig -
    Contains configuration of a WLS cluster.
    -
    WlsDomainConfig -
    Contains a snapshot of configuration for a WebLogic Domain.
    -
    WlsServerConfig -
    Contains configuration of a WebLogic server.
    -
    -
    -
    -
  • -
  • @@ -287,5 +241,7 @@

    U

    Copyright © 2017–2020. All rights reserved.

    +

  • +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/AsyncFiber.html b/docs/apidocs/oracle/kubernetes/operator/work/AsyncFiber.html index a7bfbbbe1cb..82f4106cbae 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/AsyncFiber.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/AsyncFiber.html @@ -2,10 +2,10 @@ - -AsyncFiber (weblogic-kubernetes-operator 2.6.0 API) + +AsyncFiber (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface AsyncFiber

    @@ -226,8 +221,8 @@

    createChildFiber

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/Component.html b/docs/apidocs/oracle/kubernetes/operator/work/Component.html index 8b2a59f507f..e75c13faad3 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/Component.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/Component.html @@ -2,10 +2,10 @@ - -Component (weblogic-kubernetes-operator 2.6.0 API) + +Component (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface Component

    @@ -200,8 +195,8 @@

    getSpi

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/ComponentEx.html b/docs/apidocs/oracle/kubernetes/operator/work/ComponentEx.html index 270e62baae7..c92d2f86a44 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/ComponentEx.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/ComponentEx.html @@ -2,10 +2,10 @@ - -ComponentEx (weblogic-kubernetes-operator 2.6.0 API) + +ComponentEx (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface ComponentEx

    @@ -185,8 +180,8 @@

    getIterableSpi

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/ComponentRegistry.html b/docs/apidocs/oracle/kubernetes/operator/work/ComponentRegistry.html index 2553dbf71c6..5b43e32a03c 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/ComponentRegistry.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/ComponentRegistry.html @@ -2,10 +2,10 @@ - -ComponentRegistry (weblogic-kubernetes-operator 2.6.0 API) + +ComponentRegistry (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface ComponentRegistry

    @@ -175,8 +170,8 @@

    getComponents

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/Container.html b/docs/apidocs/oracle/kubernetes/operator/work/Container.html index 44df0ea8568..12e6650ee38 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/Container.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/Container.html @@ -2,10 +2,10 @@ - -Container (weblogic-kubernetes-operator 2.6.0 API) + +Container (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class Container

    @@ -323,8 +318,8 @@

    getIterableSpi

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/ContainerResolver.html b/docs/apidocs/oracle/kubernetes/operator/work/ContainerResolver.html index cc25f653ed4..4fe2313222d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/ContainerResolver.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/ContainerResolver.html @@ -2,10 +2,10 @@ - -ContainerResolver (weblogic-kubernetes-operator 2.6.0 API) + +ContainerResolver (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ContainerResolver

    @@ -270,8 +265,8 @@

    getContainer

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/Engine.html b/docs/apidocs/oracle/kubernetes/operator/work/Engine.html index 9215110f7c8..15ef40a617b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/Engine.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/Engine.html @@ -2,10 +2,10 @@ - -Engine (weblogic-kubernetes-operator 2.6.0 API) + +Engine (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class Engine

    @@ -277,8 +272,8 @@

    createFiber

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/Fiber.CompletionCallback.html b/docs/apidocs/oracle/kubernetes/operator/work/Fiber.CompletionCallback.html index 90e4f7bdca8..d2c0bb768ed 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/Fiber.CompletionCallback.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/Fiber.CompletionCallback.html @@ -2,10 +2,10 @@ - -Fiber.CompletionCallback (weblogic-kubernetes-operator 2.6.0 API) + +Fiber.CompletionCallback (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/Fiber.ExitCallback.html b/docs/apidocs/oracle/kubernetes/operator/work/Fiber.ExitCallback.html index 9b19811b423..91d60897490 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/Fiber.ExitCallback.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/Fiber.ExitCallback.html @@ -2,10 +2,10 @@ - -Fiber.ExitCallback (weblogic-kubernetes-operator 2.6.0 API) + +Fiber.ExitCallback (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface Fiber.ExitCallback

    @@ -160,8 +155,8 @@

    onExit

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/Fiber.html b/docs/apidocs/oracle/kubernetes/operator/work/Fiber.html index 8123a77123a..0d361adf8b1 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/Fiber.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/Fiber.html @@ -2,10 +2,10 @@ - -Fiber (weblogic-kubernetes-operator 2.6.0 API) + +Fiber (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class Fiber

    @@ -696,8 +691,8 @@

    getComponents

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/FiberGate.html b/docs/apidocs/oracle/kubernetes/operator/work/FiberGate.html index 6c3db1b9363..6bb34fddcfb 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/FiberGate.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/FiberGate.html @@ -2,10 +2,10 @@ - -FiberGate (weblogic-kubernetes-operator 2.6.0 API) + +FiberGate (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/FiberGateFactory.html b/docs/apidocs/oracle/kubernetes/operator/work/FiberGateFactory.html index d625f0e8e8c..1549c785eab 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/FiberGateFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/FiberGateFactory.html @@ -2,10 +2,10 @@ - -FiberGateFactory (weblogic-kubernetes-operator 2.6.0 API) + +FiberGateFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Interface FiberGateFactory

    @@ -114,8 +109,8 @@

    Methods inherited from interface java.util.function.Supplier

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/NextAction.Kind.html b/docs/apidocs/oracle/kubernetes/operator/work/NextAction.Kind.html index 53f7923c739..cc9c46b2254 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/NextAction.Kind.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/NextAction.Kind.html @@ -2,10 +2,10 @@ - -NextAction.Kind (weblogic-kubernetes-operator 2.6.0 API) + +NextAction.Kind (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Enum NextAction.Kind

    @@ -284,8 +279,8 @@

    valueOf

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/NextAction.html b/docs/apidocs/oracle/kubernetes/operator/work/NextAction.html index 2ca9a18bb9a..4750c2928c4 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/NextAction.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/NextAction.html @@ -2,10 +2,10 @@ - -NextAction (weblogic-kubernetes-operator 2.6.0 API) + +NextAction (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class NextAction

    @@ -411,8 +406,8 @@

    toString

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/Packet.html b/docs/apidocs/oracle/kubernetes/operator/work/Packet.html index 2df5fa8ea6b..3fada294bba 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/Packet.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/Packet.html @@ -2,10 +2,10 @@ - -Packet (weblogic-kubernetes-operator 2.6.0 API) + +Packet (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class Packet

    @@ -370,8 +365,8 @@

    getValue

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/Step.MultiThrowable.html b/docs/apidocs/oracle/kubernetes/operator/work/Step.MultiThrowable.html index f4223b1dade..bc1b306f84b 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/Step.MultiThrowable.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/Step.MultiThrowable.html @@ -2,10 +2,10 @@ - -Step.MultiThrowable (weblogic-kubernetes-operator 2.6.0 API) + +Step.MultiThrowable (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class Step.MultiThrowable

    @@ -191,8 +186,8 @@

    getThrowables

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/Step.StepAndPacket.html b/docs/apidocs/oracle/kubernetes/operator/work/Step.StepAndPacket.html index 48dbbe8f788..1d874866fbe 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/Step.StepAndPacket.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/Step.StepAndPacket.html @@ -2,10 +2,10 @@ - -Step.StepAndPacket (weblogic-kubernetes-operator 2.6.0 API) + +Step.StepAndPacket (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/Step.html b/docs/apidocs/oracle/kubernetes/operator/work/Step.html index 5b26d14475e..311189d9a58 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/Step.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/Step.html @@ -2,10 +2,10 @@ - -Step (weblogic-kubernetes-operator 2.6.0 API) + +Step (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/ThreadFactorySingleton.html b/docs/apidocs/oracle/kubernetes/operator/work/ThreadFactorySingleton.html index 73c38efea77..44bd8536507 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/ThreadFactorySingleton.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/ThreadFactorySingleton.html @@ -2,10 +2,10 @@ - -ThreadFactorySingleton (weblogic-kubernetes-operator 2.6.0 API) + +ThreadFactorySingleton (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ThreadFactorySingleton

    @@ -201,8 +196,8 @@

    getInstance

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/ThreadLocalContainerResolver.html b/docs/apidocs/oracle/kubernetes/operator/work/ThreadLocalContainerResolver.html index f49ec876949..6ee0b5dd4d2 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/ThreadLocalContainerResolver.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/ThreadLocalContainerResolver.html @@ -2,10 +2,10 @@ - -ThreadLocalContainerResolver (weblogic-kubernetes-operator 2.6.0 API) + +ThreadLocalContainerResolver (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/AsyncFiber.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/AsyncFiber.html index 4cbb6b5b792..0ab4ac7368a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/AsyncFiber.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/AsyncFiber.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.work.AsyncFiber (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.work.AsyncFiber (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.work.AsyncFiber

    @@ -195,5 +190,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Component.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Component.html index c38634720bd..c9b05ee2e31 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Component.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Component.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.work.Component (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.work.Component (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.work.Component

    @@ -250,5 +245,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/ComponentEx.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/ComponentEx.html index f96e305e0bf..55dbeb7c7c4 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/ComponentEx.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/ComponentEx.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.work.ComponentEx (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.work.ComponentEx (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.work.ComponentEx

    @@ -158,5 +153,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/ComponentRegistry.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/ComponentRegistry.html index 0112f9a3087..31f2b03ca7d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/ComponentRegistry.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/ComponentRegistry.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.work.ComponentRegistry (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.work.ComponentRegistry (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.work.ComponentRegistry

    @@ -165,5 +160,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Container.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Container.html index 5772beed4af..2cf87300339 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Container.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Container.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.work.Container (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.work.Container (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.work.Container

    @@ -254,5 +249,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/ContainerResolver.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/ContainerResolver.html index d7cc770b1ac..f1b1695a28d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/ContainerResolver.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/ContainerResolver.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.work.ContainerResolver (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.work.ContainerResolver (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.work.ContainerResolver

    @@ -193,5 +188,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Engine.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Engine.html index a928c9b46b2..7183da1e3e1 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Engine.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Engine.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.work.Engine (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.work.Engine (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.work.Engine

    @@ -168,5 +163,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Fiber.CompletionCallback.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Fiber.CompletionCallback.html index 416cb9db77d..3a1f3615c54 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Fiber.CompletionCallback.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Fiber.CompletionCallback.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.work.Fiber.CompletionCallback (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.work.Fiber.CompletionCallback (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.work.Fiber.CompletionCallback

    @@ -205,5 +200,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Fiber.ExitCallback.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Fiber.ExitCallback.html index 76729393d9c..29a980238f2 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Fiber.ExitCallback.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Fiber.ExitCallback.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.work.Fiber.ExitCallback (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.work.Fiber.ExitCallback (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.work.Fiber.ExitCallback

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Fiber.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Fiber.html index f34dc6c6223..d08c3be909d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Fiber.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Fiber.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.work.Fiber (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.work.Fiber (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.work.Fiber

    @@ -256,5 +251,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/FiberGate.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/FiberGate.html index 3b278af5b51..d050e93837d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/FiberGate.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/FiberGate.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.work.FiberGate (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.work.FiberGate (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.work.FiberGate

    @@ -151,5 +146,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/FiberGateFactory.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/FiberGateFactory.html index f372e3807d2..2516902bc6a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/FiberGateFactory.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/FiberGateFactory.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.operator.work.FiberGateFactory (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.operator.work.FiberGateFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.operator.work.FiberGateFactory

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/NextAction.Kind.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/NextAction.Kind.html index fb30a53511c..7c4acdbe02d 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/NextAction.Kind.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/NextAction.Kind.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.work.NextAction.Kind (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.work.NextAction.Kind (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.work.NextAction.Kind

    @@ -159,5 +154,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/NextAction.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/NextAction.html index 804fa36f9b3..80354912505 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/NextAction.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/NextAction.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.work.NextAction (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.work.NextAction (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.work.NextAction

    @@ -517,5 +512,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Packet.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Packet.html index 7810871b90a..d39be196c3e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Packet.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Packet.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.work.Packet (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.work.Packet (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.work.Packet

    @@ -81,26 +76,32 @@

    U +oracle.kubernetes.operator + +
    The main classes for the Oracle WebLogic Server Kubernetes Operator.
    + + + oracle.kubernetes.operator.calls   - + oracle.kubernetes.operator.helpers
    Helper classes that provide easy access to various Kubernetes features.
    - + oracle.kubernetes.operator.http
    An HTTP client that is used when making REST calls to WebLogic Administration Servers.
    - + oracle.kubernetes.operator.steps   - + oracle.kubernetes.operator.work
    User-level thread infrastructure for the Operator.
    @@ -112,6 +113,42 @@

    U

    - + NextAction ResponseStep.onFailure​(Step conflictStep, Packet packet, @@ -193,13 +249,13 @@

    Uses of Callback for API server call failure.

    - + protected NextAction ResponseStep.onFailureNoRetry​(Packet packet, CallResponse<T> callResponse)   - + NextAction ResponseStep.onSuccess​(Packet packet, CallResponse<T> callResponse) @@ -686,5 +742,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Step.MultiThrowable.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Step.MultiThrowable.html index bfbe0de75b0..d8e85a17cb9 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Step.MultiThrowable.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Step.MultiThrowable.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.work.Step.MultiThrowable (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.work.Step.MultiThrowable (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.work.Step.MultiThrowable

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Step.StepAndPacket.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Step.StepAndPacket.html index f7a69cf3ac8..6db3f7cb6f7 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Step.StepAndPacket.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Step.StepAndPacket.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.work.Step.StepAndPacket (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.work.Step.StepAndPacket (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.work.Step.StepAndPacket

    @@ -199,5 +194,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Step.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Step.html index 42dd63e5cac..24a8f87809e 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/Step.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/Step.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.work.Step (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.work.Step (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.work.Step

    @@ -176,6 +171,16 @@

    Uses of Step +MakeRightDomainOperation.createSteps() +  + + +static Step +MakeRightDomainOperation.createStepsToRerunWithIntrospection​(Packet packet) +  + + +Step PodAwaiterStepFactory.waitForDelete​(io.kubernetes.client.openapi.models.V1Pod pod, Step next) @@ -402,25 +407,6 @@

    Uses of - - - - - - - - - - - - - - - -
    Fields in oracle.kubernetes.operator.helpers declared as Step 
    Modifier and TypeFieldDescription
    protected StepConfigMapHelper.ConfigMapContext.conflictStep 
    -

    -
    - @@ -464,7 +450,8 @@

    Uses of

    - + + + + - + - + - + - + @@ -558,7 +552,7 @@

    Uses of Factory for Step that creates config map containing scripts.

    - + @@ -566,7 +560,7 @@

    Uses of Asynchronous step for creating self subject rules review.

    - + - - - - - - + - + @@ -742,6 +729,16 @@

    Uses of

    + + + + + - + - + @@ -768,7 +765,7 @@

    Uses of Asynchronous step for reading CRD.

    - + - + @@ -785,7 +782,7 @@

    Uses of Asynchronous step for reading CRD.

    - + + + + + + - - + @@ -893,6 +905,11 @@

    Uses of

    + + + + + - - + - + @@ -991,18 +1009,18 @@

    Uses of

    - + - + @@ -1204,7 +1222,9 @@

    Uses of

    - + @@ -1269,7 +1289,7 @@

    Uses of

    @@ -1319,7 +1339,7 @@

    Uses of  

    - @@ -1602,5 +1622,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/ThreadFactorySingleton.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/ThreadFactorySingleton.html index f1300be9953..da792bf4a79 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/ThreadFactorySingleton.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/ThreadFactorySingleton.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.work.ThreadFactorySingleton (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.work.ThreadFactorySingleton (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.work.ThreadFactorySingleton

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/class-use/ThreadLocalContainerResolver.html b/docs/apidocs/oracle/kubernetes/operator/work/class-use/ThreadLocalContainerResolver.html index 53e540f845e..a30c35c6190 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/class-use/ThreadLocalContainerResolver.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/class-use/ThreadLocalContainerResolver.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.operator.work.ThreadLocalContainerResolver (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.operator.work.ThreadLocalContainerResolver (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.operator.work.ThreadLocalContainerResolver

    @@ -151,5 +146,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/package-summary.html b/docs/apidocs/oracle/kubernetes/operator/work/package-summary.html index b17f27f6b05..3434026b02a 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.work (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.work (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.operator.work

    @@ -281,5 +276,7 @@

    Package oracle.kubernetes.operator.work

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/package-tree.html b/docs/apidocs/oracle/kubernetes/operator/work/package-tree.html index deb59ac65d5..ef28d3a7a87 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.operator.work Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.operator.work Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.operator.work

    @@ -177,5 +172,7 @@

    Enum Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/operator/work/package-use.html b/docs/apidocs/oracle/kubernetes/operator/work/package-use.html index f34cc607438..0052f851a15 100644 --- a/docs/apidocs/oracle/kubernetes/operator/work/package-use.html +++ b/docs/apidocs/oracle/kubernetes/operator/work/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.operator.work (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.operator.work (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.operator.work

    @@ -144,6 +139,12 @@

    Uses o

    + + + + - + + + + + + - + - + - + - + @@ -177,24 +177,29 @@

    Method Summary

    Add a resource limit at cluster level, the requests for memory are measured in bytes.
    - + - + + + + + + - + - + @@ -202,19 +207,19 @@

    Method Summary

    Add a node label to the Cluster's node selector.
    - + - + - + - + - + - + - + - + @@ -252,51 +257,51 @@

    Method Summary

    Add a resource requirement at cluster level.
    - + - + - + - + - + - + - + - + - + @@ -582,14 +587,26 @@

    withPrecreateServerServiceClusterConfigurator withPrecreateServerService​(boolean precreateServerService) +
  • +
    +

    withAllowReplicasBelowDynClusterSize

    +
    ClusterConfigurator withAllowReplicasBelowDynClusterSize​(boolean allowReplicasBelowDynClusterSize)
    +
    +
  • +
  • +
    +

    withMaxConcurrentStartup

    +
    ClusterConfigurator withMaxConcurrentStartup​(java.lang.Integer maxConcurrentStartup)
    +
    +
  • - + + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/ConfigurationNotSupportedException.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/ConfigurationNotSupportedException.html index 45fac794da0..8cc92d80996 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/ConfigurationNotSupportedException.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/ConfigurationNotSupportedException.html @@ -2,10 +2,10 @@ - -ConfigurationNotSupportedException (weblogic-kubernetes-operator 2.6.0 API) + +ConfigurationNotSupportedException (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ConfigurationNotSupportedException

    @@ -228,8 +223,8 @@

    getMessage

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/DomainConfigurator.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/DomainConfigurator.html index 95c34f53829..9940a2ba885 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/DomainConfigurator.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/DomainConfigurator.html @@ -2,10 +2,10 @@ - -DomainConfigurator (weblogic-kubernetes-operator 2.6.0 API) + +DomainConfigurator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class DomainConfigurator

    @@ -222,25 +217,35 @@

    Method Summary

    + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + - + @@ -342,19 +359,41 @@

    Method Summary

    Add an environment variable with the given name and value to the domain.
    - + + + + + + - + + + + + + + + + + + - + @@ -362,28 +401,40 @@

    Method Summary

    Add a resource limit at domain level, the requests for memory are measured in bytes.
    - + - + - + + + + + + + + + + + - + @@ -391,19 +442,33 @@

    Method Summary

    Add a node label to the Domain's node selector.
    - + + + + + + + + + + + - + - + - + - + - + @@ -433,49 +498,56 @@

    Method Summary

    Add a resource requirement at domain level.
    - + - + - + - + + + + + + - + - + - + @@ -561,13 +633,8 @@

    withDomainHomeInImage

  • -

    withIstio

    -
    public abstract DomainConfigurator withIstio()
    -
    Add Istio for the domain resource.
    -
    -
    Returns:
    -
    this object
    -
    +

    withDomainHomeSourceType

    +
    public DomainConfigurator withDomainHomeSourceType​(DomainSourceType domainHomeSourceType)
  • @@ -680,6 +747,33 @@

    withDataHome

  • +

    withHttpAccessLogInLogHome

    +
    public DomainConfigurator withHttpAccessLogInLogHome​(boolean httpAccessLogInLogHome)
    +
    Sets whether to write server HTTP access log files to the directory specified in + logHome.
    +
    +
    Parameters:
    +
    httpAccessLogInLogHome - boolean specifying whether to write server HTTP + access log files to the logHome directory
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +
    +

    withAllowReplicasBelowMinDynClusterSize

    +
    public DomainConfigurator withAllowReplicasBelowMinDynClusterSize​(java.lang.Boolean allowReplicasBelowMinDynClusterSize)
    +
    +
  • +
  • +
    +

    withMaxConcurrentStartup

    +
    public DomainConfigurator withMaxConcurrentStartup​(java.lang.Integer maxConcurrentStartup)
    +
    +
  • +
  • +

    withConfigOverrides

    public abstract DomainConfigurator withConfigOverrides​(java.lang.String configMapName)
    Sets the WebLogic configuration overrides configmap name for the domain.
    @@ -706,6 +800,12 @@

    withConfigOverrideSec

  • +

    withConfigOverrideDistributionStrategy

    +
    public abstract DomainConfigurator withConfigOverrideDistributionStrategy​(OverrideDistributionStrategy strategy)
    +
    +
  • +
  • +

    withDefaultReadinessProbeSettings

    public abstract void withDefaultReadinessProbeSettings​(java.lang.Integer initialDelay, java.lang.Integer timeout, @@ -980,6 +1080,22 @@

    withRestartVersion

  • +

    withIntrospectVersion

    +
    public abstract DomainConfigurator withIntrospectVersion​(java.lang.String introspectVersion)
    +
    Tells the operator to start the introspect domain job.
    +
    +
    Parameters:
    +
    introspectVersion - If present, every time this value is updated the operator will start + the introspect domain job.
    +
    Returns:
    +
    this object
    +
    Since:
    +
    2.0
    +
    +
    +
  • +
  • +

    withWebLogicCredentialsSecret

    public abstract DomainConfigurator withWebLogicCredentialsSecret​(java.lang.String secretName, java.lang.String namespace)
    @@ -1097,14 +1213,103 @@

    wit

  • +
  • +
    +

    withIntrospectorJobActiveDeadlineSeconds

    +
    public abstract DomainConfigurator withIntrospectorJobActiveDeadlineSeconds​(long deadline)
    +
    Add the introspector job active deadline.
    +
    +
    Parameters:
    +
    deadline - the deadline value to be set to this DomainConfigurator
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +
    +

    withModelConfigMap

    +
    public abstract DomainConfigurator withModelConfigMap​(java.lang.String configmap)
    +
    Add WDT model config map for the domain resource.
    +
    +
    Parameters:
    +
    configmap - the configmap for WDT model
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +
    +

    withRuntimeEncryptionSecret

    +
    public abstract DomainConfigurator withRuntimeEncryptionSecret​(java.lang.String secret)
    +
    Add model runtime encryption secret for the domain resource.
    +
    +
    Parameters:
    +
    secret - the runtime encryption secret for WDT model
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +
    +

    withOpssWalletPasswordSecret

    +
    public abstract DomainConfigurator withOpssWalletPasswordSecret​(java.lang.String secret)
    +
    Add OPSS wallet password secret for the domain resource.
    +
    +
    Parameters:
    +
    secret - the OPSS wallet password secret
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +
    +

    withOpssWalletFileSecret

    +
    public abstract DomainConfigurator withOpssWalletFileSecret​(java.lang.String secret)
    +
    Add OPSS wallet file secret for the domain resource.
    +
    +
    Parameters:
    +
    secret - the OPSS wallet file secret
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +
    +

    withIstio

    +
    public abstract DomainConfigurator withIstio()
    +
    Add Istio for the domain resource.
    +
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +
    +

    withDomainType

    +
    public abstract DomainConfigurator withDomainType​(java.lang.String type)
    +
    Add domain type for the domain resource.
    +
    +
    Parameters:
    +
    type - the domain type
    +
    Returns:
    +
    this object
    +
    +
    +
  • - + + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/DomainConfiguratorFactory.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/DomainConfiguratorFactory.html index e67afa41326..01cfe5d4def 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/DomainConfiguratorFactory.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/DomainConfiguratorFactory.html @@ -2,10 +2,10 @@ - -DomainConfiguratorFactory (weblogic-kubernetes-operator 2.6.0 API) + +DomainConfiguratorFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class DomainConfiguratorFactory

    @@ -212,8 +207,8 @@

    selectCommonDomainModel

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/EffectiveConfigurationFactory.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/EffectiveConfigurationFactory.html index 6ebc0e0fbb9..a45fae4e84e 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/EffectiveConfigurationFactory.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/EffectiveConfigurationFactory.html @@ -2,10 +2,10 @@ - -EffectiveConfigurationFactory (weblogic-kubernetes-operator 2.6.0 API) + +EffectiveConfigurationFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Interface EffectiveConfigurationFactory

    @@ -136,31 +131,36 @@

    Method Summary

    - + - + + + + + + - + - + - + @@ -239,14 +239,20 @@

    isAllowRepli
    boolean isAllowReplicasBelowMinDynClusterSize​(java.lang.String clusterName)
    +
  • +
    +

    getMaxConcurrentStartup

    +
    int getMaxConcurrentStartup​(java.lang.String clusterName)
    +
    +
  • - + + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/NetworkAccessPointConfigurator.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/NetworkAccessPointConfigurator.html index 90527da3223..97b5374d7a4 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/NetworkAccessPointConfigurator.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/NetworkAccessPointConfigurator.html @@ -2,10 +2,10 @@ - -NetworkAccessPointConfigurator (weblogic-kubernetes-operator 2.6.0 API) + +NetworkAccessPointConfigurator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface NetworkAccessPointConfigurator

    @@ -166,8 +161,8 @@

    withAnnotation

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/ServerConfigurator.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/ServerConfigurator.html index 5bf24ff8a51..82bec2273c9 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/ServerConfigurator.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/ServerConfigurator.html @@ -2,10 +2,10 @@ - -ServerConfigurator (weblogic-kubernetes-operator 2.6.0 API) + +ServerConfigurator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/ServiceConfigurator.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/ServiceConfigurator.html index c936e52130e..4ce4fd817e0 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/ServiceConfigurator.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/ServiceConfigurator.html @@ -2,10 +2,10 @@ - -ServiceConfigurator (weblogic-kubernetes-operator 2.6.0 API) + +ServiceConfigurator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/api/WeblogicApi.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/api/WeblogicApi.html index 10a5c9a3d57..54a521d9bec 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/api/WeblogicApi.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/api/WeblogicApi.html @@ -2,10 +2,10 @@ - -WeblogicApi (weblogic-kubernetes-operator 2.6.0 API) + +WeblogicApi (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/api/class-use/WeblogicApi.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/api/class-use/WeblogicApi.html index 605049c04c9..aa4811e7dd7 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/api/class-use/WeblogicApi.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/api/class-use/WeblogicApi.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.api.WeblogicApi (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.api.WeblogicApi (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.api.WeblogicApi

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/api/package-summary.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/api/package-summary.html index 7b713a5c831..3d4179c998f 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/api/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/api/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.weblogic.domain.api (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.weblogic.domain.api (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.weblogic.domain.api

    @@ -123,5 +118,7 @@

    Package oracle.kubernetes.weblogic.domain

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/api/package-tree.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/api/package-tree.html index e6e8af85577..fb5bffe44cd 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/api/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/api/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.weblogic.domain.api Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.weblogic.domain.api Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.weblogic.domain.api

    @@ -114,5 +109,7 @@

    Class Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/api/package-use.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/api/package-use.html index ccbd4c9af9c..298356f5fc6 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/api/package-use.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/api/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.weblogic.domain.api (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.weblogic.domain.api (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.weblogic.domain.api

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/AdminServerConfigurator.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/AdminServerConfigurator.html index ba4e82cfc80..6491f3e54f6 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/AdminServerConfigurator.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/AdminServerConfigurator.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.weblogic.domain.AdminServerConfigurator (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.weblogic.domain.AdminServerConfigurator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.weblogic.domain.AdminServerConfigurator

    @@ -181,5 +176,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ClusterConfigurator.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ClusterConfigurator.html index 174fbb27c25..b53660022f3 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ClusterConfigurator.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ClusterConfigurator.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.weblogic.domain.ClusterConfigurator (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.weblogic.domain.ClusterConfigurator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.weblogic.domain.ClusterConfigurator

    @@ -137,34 +132,39 @@

    Uses of

    - + + + + + + - + - + - + - + @@ -172,13 +172,18 @@

    Uses of Add a resource limit at cluster level, the requests for memory are measured in bytes.

    - + + + + + + @@ -359,5 +364,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ConfigurationNotSupportedException.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ConfigurationNotSupportedException.html index e113fcf6311..7f237d8e673 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ConfigurationNotSupportedException.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ConfigurationNotSupportedException.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.ConfigurationNotSupportedException (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.ConfigurationNotSupportedException (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.ConfigurationNotSupportedException

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/DomainConfigurator.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/DomainConfigurator.html index 61720b53f36..972d62baec6 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/DomainConfigurator.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/DomainConfigurator.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.DomainConfigurator (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.DomainConfigurator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.DomainConfigurator

    @@ -147,6 +142,16 @@

    Uses of +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -264,28 +303,40 @@

    Uses of Add a resource limit at domain level, the requests for memory are measured in bytes.

    - + - + + + + + + + + + + + - + @@ -293,19 +344,33 @@

    Uses of Add a node label to the Domain's node selector.

    + + + + + + + + + + - + - + - + - + @@ -335,27 +400,34 @@

    Uses of Add a resource requirement at domain level.

    - + - + - + + + + + + @@ -455,31 +527,41 @@

    Uses of

    + + + + + - + - + - + - + + + + + + @@ -498,6 +580,16 @@

    Uses of

    + + + + + + + + + + @@ -509,63 +601,83 @@

    Uses of

    - + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + + + + + + @@ -624,5 +736,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/DomainConfiguratorFactory.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/DomainConfiguratorFactory.html index 1cf68396c8b..57e1ad39dec 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/DomainConfiguratorFactory.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/DomainConfiguratorFactory.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.DomainConfiguratorFactory (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.DomainConfiguratorFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.DomainConfiguratorFactory

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/EffectiveConfigurationFactory.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/EffectiveConfigurationFactory.html index b96a8324b79..256ce7fac72 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/EffectiveConfigurationFactory.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/EffectiveConfigurationFactory.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.weblogic.domain.EffectiveConfigurationFactory (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.weblogic.domain.EffectiveConfigurationFactory (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.weblogic.domain.EffectiveConfigurationFactory

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/NetworkAccessPointConfigurator.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/NetworkAccessPointConfigurator.html index 13df9be3b46..222e067960e 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/NetworkAccessPointConfigurator.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/NetworkAccessPointConfigurator.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.weblogic.domain.NetworkAccessPointConfigurator (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.weblogic.domain.NetworkAccessPointConfigurator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.weblogic.domain.NetworkAccessPointConfigurator

    @@ -154,5 +149,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ServerConfigurator.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ServerConfigurator.html index f6918fc94ff..2db7351c688 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ServerConfigurator.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ServerConfigurator.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.weblogic.domain.ServerConfigurator (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.weblogic.domain.ServerConfigurator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.weblogic.domain.ServerConfigurator

    @@ -368,5 +363,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ServiceConfigurator.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ServiceConfigurator.html index 66ac935bd04..35ec067b45a 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ServiceConfigurator.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/class-use/ServiceConfigurator.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.weblogic.domain.ServiceConfigurator (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.weblogic.domain.ServiceConfigurator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.weblogic.domain.ServiceConfigurator

    @@ -219,5 +214,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminServer.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminServer.html index ba92b35b1a0..49c33677765 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminServer.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminServer.html @@ -2,10 +2,10 @@ - -AdminServer (weblogic-kubernetes-operator 2.6.0 API) + +AdminServer (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class AdminServer

    @@ -337,8 +332,8 @@

    getAdminService

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminServerSpec.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminServerSpec.html index a36d319ff73..38f37674e99 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminServerSpec.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminServerSpec.html @@ -2,10 +2,10 @@ - -AdminServerSpec (weblogic-kubernetes-operator 2.6.0 API) + +AdminServerSpec (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface AdminServerSpec

    @@ -175,8 +170,8 @@

    getAdminService

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminServerSpecCommonImpl.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminServerSpecCommonImpl.html index b787b670c6c..3febb90a5ab 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminServerSpecCommonImpl.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminServerSpecCommonImpl.html @@ -2,10 +2,10 @@ - -AdminServerSpecCommonImpl (weblogic-kubernetes-operator 2.6.0 API) + +AdminServerSpecCommonImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class AdminServerSpecCommonImpl

    @@ -209,8 +204,8 @@

    getAdminService

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminService.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminService.html index 216a7c4bf27..c499677cdde 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminService.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/AdminService.html @@ -2,10 +2,10 @@ - -AdminService (weblogic-kubernetes-operator 2.6.0 API) + +AdminService (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class AdminService

    @@ -392,8 +387,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/BaseConfiguration.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/BaseConfiguration.html index 0ee469aeafb..46bf31f6fd7 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/BaseConfiguration.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/BaseConfiguration.html @@ -2,10 +2,10 @@ - -BaseConfiguration (weblogic-kubernetes-operator 2.6.0 API) + +BaseConfiguration (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class BaseConfiguration

    @@ -490,8 +485,8 @@

    hashCode

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Channel.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Channel.html index da6ade58e83..4129a7c0980 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Channel.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Channel.html @@ -2,10 +2,10 @@ - -Channel (weblogic-kubernetes-operator 2.6.0 API) + +Channel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Cluster.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Cluster.html index 85567a08fdd..7be70cf0c79 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Cluster.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Cluster.html @@ -2,10 +2,10 @@ - -Cluster (weblogic-kubernetes-operator 2.6.0 API) + +Cluster (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class Cluster

    @@ -195,50 +190,65 @@

    Method Summary

    - + + + + + + - + - - + + - + + + + + + - + - + + + + + + - + - + @@ -320,7 +330,7 @@

    setReplicas

  • isAllowReplicasBelowMinDynClusterSize

    -
    public boolean isAllowReplicasBelowMinDynClusterSize()
    +
    public java.lang.Boolean isAllowReplicasBelowMinDynClusterSize()
    Whether to allow number of replicas to drop below the minimum dynamic cluster size configured in the WebLogic domain home configuration.
    @@ -332,6 +342,24 @@

    isAllowReplicasBelowMinDynCl

  • +

    setAllowReplicasBelowMinDynClusterSize

    +
    public void setAllowReplicasBelowMinDynClusterSize​(java.lang.Boolean value)
    +
    +
  • +
  • +
    +

    getMaxConcurrentStartup

    +
    public java.lang.Integer getMaxConcurrentStartup()
    +
    +
  • +
  • +
    +

    setMaxConcurrentStartup

    +
    public void setMaxConcurrentStartup​(java.lang.Integer value)
    +
    +
  • +
  • +

    getServerStartPolicy

    @Nullable public java.lang.String getServerStartPolicy()
    @@ -429,8 +457,8 @@

    compareTo

    - + + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ClusterSpec.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ClusterSpec.html index 1db93b3c4f7..10f23dede89 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ClusterSpec.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ClusterSpec.html @@ -2,10 +2,10 @@ - -ClusterSpec (weblogic-kubernetes-operator 2.6.0 API) + +ClusterSpec (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ClusterSpec

    @@ -446,8 +441,8 @@

    getTolerations

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ClusterSpecCommonImpl.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ClusterSpecCommonImpl.html index dd9b6752d6c..1a814c6d5b3 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ClusterSpecCommonImpl.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ClusterSpecCommonImpl.html @@ -2,10 +2,10 @@ - -ClusterSpecCommonImpl (weblogic-kubernetes-operator 2.6.0 API) + +ClusterSpecCommonImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ClusterSpecCommonImpl

    @@ -499,8 +494,8 @@

    getTolerations

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ClusterStatus.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ClusterStatus.html index a300b147836..b1603d1609e 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ClusterStatus.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ClusterStatus.html @@ -2,10 +2,10 @@ - -ClusterStatus (weblogic-kubernetes-operator 2.6.0 API) + +ClusterStatus (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Configuration.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Configuration.html index e66125fa7bd..ff4e025b17d 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Configuration.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Configuration.html @@ -2,10 +2,10 @@ - -Configuration (weblogic-kubernetes-operator 2.6.0 API) + +Configuration (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class Configuration

    @@ -152,26 +147,86 @@

    Method Summary

  • + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -216,6 +271,78 @@

    Method Details

    - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ConfigurationConstants.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ConfigurationConstants.html index 26fb6de374d..32bb0c01c99 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ConfigurationConstants.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ConfigurationConstants.html @@ -2,10 +2,10 @@ - -ConfigurationConstants (weblogic-kubernetes-operator 2.6.0 API) + +ConfigurationConstants (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Interface ConfigurationConstants

    @@ -176,8 +171,8 @@

    START_IF_NEEDED

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Domain.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Domain.html index 13f589cc905..fd8759e41c7 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Domain.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Domain.html @@ -2,10 +2,10 @@ - -Domain (weblogic-kubernetes-operator 2.6.0 API) + +Domain (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class Domain

    @@ -149,126 +144,183 @@

    Method Summary

    + + + + + - + - + - + - + - + - + - + - - + + - + - + - + + + + + + + + + + + - + - + + + + + + - + - + - + + + + + + - + + + + + + + + + + + + + + + + - + - + + + + + + @@ -276,38 +328,48 @@

    Method Summary

    Returns the specification applicable to a particular server/cluster combination.
    - + - + - + - + + + + + + + + + + + - + - + - + - + - + - + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + - + - + - + - + - + - + - + + + + + + - + @@ -271,19 +278,33 @@

    Method Summary

    Add an environment variable with the given name and value to the domain.
    - + - + + + + + + + + + + + - + @@ -291,14 +312,21 @@

    Method Summary

    Add a resource limit at domain level, the requests for memory are measured in bytes.
    - + + + + + + - + @@ -306,19 +334,33 @@

    Method Summary

    Add a node label to the Domain's node selector.
    - + + + + + + + + + + + - + - + - + - + - + @@ -348,49 +390,56 @@

    Method Summary

    Add a resource requirement at domain level.
    - + - + - + - + + + + + + - + - + - + @@ -406,7 +455,7 @@

    Method Summary

    Methods inherited from class oracle.kubernetes.weblogic.domain.DomainConfigurator

    -getDomainSpec, withDataHome, withDefaultImage, withDefaultImagePullPolicy, withDefaultImagePullSecret, withDefaultImagePullSecrets, withDefaultReplicaCount, withDomainHome, withDomainHomeInImage, withLogHome, withLogHomeEnabled +getDomainSpec, withAllowReplicasBelowMinDynClusterSize, withDataHome, withDefaultImage, withDefaultImagePullPolicy, withDefaultImagePullSecret, withDefaultImagePullSecrets, withDefaultReplicaCount, withDomainHome, withDomainHomeInImage, withDomainHomeSourceType, withHttpAccessLogInLogHome, withLogHome, withLogHomeEnabled, withMaxConcurrentStartup

    Methods inherited from class java.lang.Object

    @@ -624,20 +673,6 @@

    withC
  • -

    withIstio

    -
    public DomainConfigurator withIstio()
    -
    Description copied from class: DomainConfigurator
    -
    Add Istio for the domain resource.
    -
    -
    Specified by:
    -
    withIstio in class DomainConfigurator
    -
    Returns:
    -
    this object
    -
    -
    -
  • -
  • -

    withConfigOverrides

    public DomainConfigurator withConfigOverrides​(java.lang.String configMapName)
    Sets the WebLogic configuration overrides config map name for the domain.
    @@ -670,6 +705,16 @@

    withConfigOverrideSec

  • +

    withConfigOverrideDistributionStrategy

    +
    public DomainConfigurator withConfigOverrideDistributionStrategy​(OverrideDistributionStrategy strategy)
    +
    +
    Specified by:
    +
    withConfigOverrideDistributionStrategy in class DomainConfigurator
    +
    +
    +
  • +
  • +

    withPodLabel

    public DomainConfigurator withPodLabel​(java.lang.String name, java.lang.String value)
    @@ -826,6 +871,23 @@

    withRestartVersion

  • +

    withIntrospectVersion

    +
    public DomainConfigurator withIntrospectVersion​(java.lang.String introspectVersion)
    +
    Description copied from class: DomainConfigurator
    +
    Tells the operator to start the introspect domain job.
    +
    +
    Specified by:
    +
    withIntrospectVersion in class DomainConfigurator
    +
    Parameters:
    +
    introspectVersion - If present, every time this value is updated the operator will start + the introspect domain job.
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +

    withWebLogicCredentialsSecret

    public DomainConfigurator withWebLogicCredentialsSecret​(java.lang.String secretName, java.lang.String namespace)
    @@ -989,6 +1051,116 @@

    wit

  • +

    withIntrospectorJobActiveDeadlineSeconds

    +
    public DomainConfigurator withIntrospectorJobActiveDeadlineSeconds​(long deadline)
    +
    Description copied from class: DomainConfigurator
    +
    Add the introspector job active deadline.
    +
    +
    Specified by:
    +
    withIntrospectorJobActiveDeadlineSeconds in class DomainConfigurator
    +
    Parameters:
    +
    deadline - the deadline value to be set to this DomainConfigurator
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +
    +

    withModelConfigMap

    +
    public DomainConfigurator withModelConfigMap​(java.lang.String configmap)
    +
    Description copied from class: DomainConfigurator
    +
    Add WDT model config map for the domain resource.
    +
    +
    Specified by:
    +
    withModelConfigMap in class DomainConfigurator
    +
    Parameters:
    +
    configmap - the configmap for WDT model
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +
    +

    withRuntimeEncryptionSecret

    +
    public DomainConfigurator withRuntimeEncryptionSecret​(java.lang.String secret)
    +
    Description copied from class: DomainConfigurator
    +
    Add model runtime encryption secret for the domain resource.
    +
    +
    Specified by:
    +
    withRuntimeEncryptionSecret in class DomainConfigurator
    +
    Parameters:
    +
    secret - the runtime encryption secret for WDT model
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +
    +

    withOpssWalletPasswordSecret

    +
    public DomainConfigurator withOpssWalletPasswordSecret​(java.lang.String secret)
    +
    Description copied from class: DomainConfigurator
    +
    Add OPSS wallet password secret for the domain resource.
    +
    +
    Specified by:
    +
    withOpssWalletPasswordSecret in class DomainConfigurator
    +
    Parameters:
    +
    secret - the OPSS wallet password secret
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +
    +

    withOpssWalletFileSecret

    +
    public DomainConfigurator withOpssWalletFileSecret​(java.lang.String secret)
    +
    Description copied from class: DomainConfigurator
    +
    Add OPSS wallet file secret for the domain resource.
    +
    +
    Specified by:
    +
    withOpssWalletFileSecret in class DomainConfigurator
    +
    Parameters:
    +
    secret - the OPSS wallet file secret
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +
    +

    withIstio

    +
    public DomainConfigurator withIstio()
    +
    Description copied from class: DomainConfigurator
    +
    Add Istio for the domain resource.
    +
    +
    Specified by:
    +
    withIstio in class DomainConfigurator
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +
    +

    withDomainType

    +
    public DomainConfigurator withDomainType​(java.lang.String type)
    +
    Description copied from class: DomainConfigurator
    +
    Add domain type for the domain resource.
    +
    +
    Specified by:
    +
    withDomainType in class DomainConfigurator
    +
    Parameters:
    +
    type - the domain type
    +
    Returns:
    +
    this object
    +
    +
    +
  • +
  • +

    setShuttingDown

    public void setShuttingDown​(boolean shuttingDown)
    @@ -1003,8 +1175,8 @@

    setShuttingDown

  • - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainCondition.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainCondition.html index 81aaeec22dc..097848ecf6d 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainCondition.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainCondition.html @@ -2,10 +2,10 @@ - -DomainCondition (weblogic-kubernetes-operator 2.6.0 API) + +DomainCondition (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class DomainCondition

    @@ -194,7 +189,7 @@

    Method Summary

    @@ -258,7 +253,7 @@

    Method Summary

    @@ -397,7 +392,7 @@

    withReason

    getStatus

    public java.lang.String getStatus()
    -
    Status is the status of the condition. Can be True, False, Unknown. Required.
    +
    The status of the condition. Can be True, False, Unknown. Required.
    Returns:
    status
    @@ -408,7 +403,7 @@

    getStatus

    withStatus

    public DomainCondition withStatus​(java.lang.String status)
    -
    Status is the status of the condition. Can be True, False, Unknown. Required.
    +
    The status of the condition. Can be True, False, Unknown. Required.
    Parameters:
    status - status
    @@ -497,8 +492,8 @@

    c

    - + + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainConditionType.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainConditionType.html index 739c9cb12a3..5e29ed3c7ab 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainConditionType.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainConditionType.html @@ -2,10 +2,10 @@ - -DomainConditionType (weblogic-kubernetes-operator 2.6.0 API) + +DomainConditionType (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Enum DomainConditionType

    @@ -280,8 +275,8 @@

    valueOf

    - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainList.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainList.html index 99b1ecc4180..af3f3541ee4 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainList.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainList.html @@ -2,10 +2,10 @@ - -DomainList (weblogic-kubernetes-operator 2.6.0 API) + +DomainList (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class DomainList

    @@ -478,8 +473,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainSpec.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainSpec.html index 123f60a6922..d4d5864fee2 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainSpec.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainSpec.html @@ -2,10 +2,10 @@ - -DomainSpec (weblogic-kubernetes-operator 2.6.0 API) + +DomainSpec (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Class DomainSpec

    @@ -194,35 +189,64 @@

    Method Summary

    + + + + + - + - + - + - + + + + + + - + + + + + + + + + + + + + + + + - + - + + + + + + - + + + + + + + + + + + - + + + + + + - + - + - + + + + + + - + + + + + + - + - + - + - + + + + + + - + - + + + + + + - + - + - + - + - - - - - - + - + - + - + - + + + + + + - + @@ -445,7 +514,8 @@

    Method Details

    withCluster

    public DomainSpec withCluster​(Cluster cluster)
    -
    Adds a Cluster to the DomainSpec.
    +
    /** + Adds a Cluster to the DomainSpec.
    Parameters:
    cluster - The cluster to be added to this DomainSpec
    @@ -542,7 +612,7 @@

    withImage

    withWebLogicCredentialsSecret

    public DomainSpec withWebLogicCredentialsSecret​(io.kubernetes.client.openapi.models.V1SecretReference webLogicCredentialsSecret)
    -
    Reference to secret containing WebLogic startup credentials username and password. Secret must +
    Reference to secret containing WebLogic startup credentials user name and password. Secret must contain keys names 'username' and 'password'. Required.
    Parameters:
    @@ -554,6 +624,20 @@

    +

    withOpssKeyPassPhrase

    +
    public DomainSpec withOpssKeyPassPhrase​(io.kubernetes.client.openapi.models.V1SecretReference opssKeyPassPhrase)
    +
    Reference to secret containing WebLogic startup credentials user name and password. Secret must + contain keys names 'username' and 'password'. Required.
    +
    +
    Parameters:
    +
    opssKeyPassPhrase - WebLogic startup credentials secret
    +
    Returns:
    +
    this
    +
    +
    + +
  • +

    getImage

    public java.lang.String getImage()
    @@ -568,8 +652,7 @@

    setImage

  • getImagePullPolicy

    -
    @Nullable -public java.lang.String getImagePullPolicy()
    +
    public java.lang.String getImagePullPolicy()
  • @@ -638,6 +721,12 @@

    withIncludeServerOutInPodLog
  • +

    setHttpAccessLogInLogHome

    +
    public void setHttpAccessLogInLogHome​(boolean httpAccessLogInLogHome)
    +
    +
  • +
  • +

    setDomainHomeInImage

    public void setDomainHomeInImage​(boolean domainHomeInImage)
    Specifies whether the domain home is stored in the image.
    @@ -655,6 +744,36 @@

    withDomainHomeInImage

  • +

    setDomainHomeSourceType

    +
    public void setDomainHomeSourceType​(DomainSourceType domainHomeSourceType)
    +
    +
  • +
  • +
    +

    getIntrospectVersion

    +
    public java.lang.String getIntrospectVersion()
    +
    +
  • +
  • +
    +

    setIntrospectVersion

    +
    public void setIntrospectVersion​(java.lang.String introspectVersion)
    +
    +
  • +
  • +
    +

    getConfiguration

    +
    public Configuration getConfiguration()
    +
    +
  • +
  • +
    +

    setConfiguration

    +
    public void setConfiguration​(Configuration configuration)
    +
    +
  • +
  • +

    getReplicas

    public java.lang.Integer getReplicas()
    The desired number of running managed servers in each WebLogic cluster that is not explicitly @@ -693,9 +812,14 @@

    withReplicas

  • -

    withConfiguration

    -
    public DomainSpec withConfiguration​(@Nullable -Configuration configuration)
    +

    isAllowReplicasBelowMinDynClusterSize

    +
    public boolean isAllowReplicasBelowMinDynClusterSize()
    +
    +
  • +
  • +
    +

    getMaxClusterConcurrentStartup

    +
    public java.lang.Integer getMaxClusterConcurrentStartup()
  • @@ -714,6 +838,39 @@

    setConfigOverrideSecrets
  • +

    getOverrideDistributionStrategy

    +
    public OverrideDistributionStrategy getOverrideDistributionStrategy()
    +
    Returns the strategy used for distributing changed config overrides.
    +
    +
    Returns:
    +
    the set or computed strategy
    +
    +
    +
  • +
  • +
    +

    getOpssWalletFileSecret

    +
    public java.lang.String getOpssWalletFileSecret()
    +
    Get OPSS wallet file secret.
    +
    +
    Returns:
    +
    wallet file secret
    +
    +
    +
  • +
  • +
    +

    getWdtConfigMap

    +
    public java.lang.String getWdtConfigMap()
    +
    Get WDT config map.
    +
    +
    Returns:
    +
    config map name
    +
    +
    +
  • +
  • +

    toString

    public java.lang.String toString()
    @@ -744,6 +901,18 @@

    equals

  • +

    setAllowReplicasBelowMinDynClusterSize

    +
    public void setAllowReplicasBelowMinDynClusterSize​(java.lang.Boolean allowReplicasBelowMinDynClusterSize)
    +
    +
  • +
  • +
    +

    setMaxClusterConcurrentStartup

    +
    public void setMaxClusterConcurrentStartup​(java.lang.Integer maxClusterConcurrentStartup)
    +
    +
  • +
  • +

    getAdminServer

    public AdminServer getAdminServer()
    @@ -766,8 +935,8 @@

    getClusters

  • - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainStatus.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainStatus.html index caa149e0e7f..5b53290bf44 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainStatus.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/DomainStatus.html @@ -2,10 +2,10 @@ - -DomainStatus (weblogic-kubernetes-operator 2.6.0 API) + +DomainStatus (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class DomainStatus

    @@ -228,7 +223,7 @@

    Method Summary

    @@ -284,7 +279,7 @@

    Method Summary

    @@ -319,7 +314,7 @@

    Method Summary

    @@ -536,10 +531,10 @@

    withReplicas

    getServers

    public java.util.List<ServerStatus> getServers()
    -
    Status of WebLogic servers in this domain.
    +
    Status of WebLogic Servers in this domain.
    Returns:
    -
    a sorted list of ServerStatus containing status of WebLogic servers in this domain
    +
    a sorted list of ServerStatus containing status of WebLogic Servers in this domain
    @@ -547,7 +542,7 @@

    getServers

    setServers

    public void setServers​(java.util.List<ServerStatus> servers)
    -
    Status of WebLogic servers in this domain.
    +
    Status of WebLogic Servers in this domain.
    Parameters:
    servers - servers
    @@ -558,7 +553,7 @@

    setServers

    withServers

    public DomainStatus withServers​(java.util.List<ServerStatus> servers)
    -
    Status of WebLogic servers in this domain.
    +
    Status of WebLogic Servers in this domain.
    Parameters:
    servers - servers
    @@ -659,8 +654,8 @@

    - +
    +

    Class DomainValidationFailure

    @@ -186,8 +181,8 @@

    getMessage

    - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/IntrospectorJobEnvVars.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/IntrospectorJobEnvVars.html index a39e1e289a0..6b128ebb77f 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/IntrospectorJobEnvVars.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/IntrospectorJobEnvVars.html @@ -2,10 +2,10 @@ - -IntrospectorJobEnvVars (weblogic-kubernetes-operator 2.6.0 API) + +IntrospectorJobEnvVars (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Class IntrospectorJobEnvVars

    @@ -145,18 +140,60 @@

    Field Summary

    + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + +
    Methods in oracle.kubernetes.operator.helpers that return Step 
    static StepCrdHelper.createDomainCrdStep​(KubernetesVersion version, +CrdHelper.createDomainCrdStep​(KubernetesVersion version, +SemanticVersion productVersion, Step next)
    Factory for Step that creates Domain CRD.
    @@ -513,6 +500,13 @@

    Uses of +

    static StepConfigMapHelper.createIntrospectorConfigMapStep​(Step next) +
    Factory for a step that creates or updates the generated domain config map from introspection results.
    +
    Step CallBuilder.createJobAsync​(java.lang.String namespace, io.kubernetes.client.openapi.models.V1Job body, @@ -521,14 +515,14 @@

    Uses of Asynchronous step for creating job.

    static Step PodHelper.createManagedPodStep​(Step next)
    Factory for Step that creates managed server pod.
    Step CallBuilder.createPodAsync​(java.lang.String namespace, io.kubernetes.client.openapi.models.V1Pod body, @@ -537,7 +531,7 @@

    Uses of Asynchronous step for creating pod.

    <T> Step AsyncRequestStepFactory.createRequestAsync​(ResponseStep<T> next, RequestParams requestParams, @@ -550,7 +544,7 @@

    Uses of  

    static Step ConfigMapHelper.createScriptConfigMapStep​(java.lang.String operatorNamespace, java.lang.String domainNamespace)
    Step CallBuilder.createSelfSubjectRulesReviewAsync​(io.kubernetes.client.openapi.models.V1SelfSubjectRulesReview body, ResponseStep<io.kubernetes.client.openapi.models.V1SelfSubjectRulesReview> responseStep)
    Step CallBuilder.createServiceAsync​(java.lang.String namespace, io.kubernetes.client.openapi.models.V1Service body, @@ -575,13 +569,6 @@

    Uses of Asynchronous step for creating service.

    static StepConfigMapHelper.createSitConfigMapStep​(Step next) -
    Factory for Step that creates config map containing sit config.
    -
    Step CallBuilder.createSubjectAccessReviewAsync​(io.kubernetes.client.openapi.models.V1SubjectAccessReview body, @@ -615,18 +602,18 @@

    Uses of

    static StepConfigMapHelper.deleteDomainIntrospectorConfigMapStep​(java.lang.String domainUid, -java.lang.String namespace, -Step next)JobHelper.deleteDomainIntrospectorJobStep​(Step next) -
    Factory for Step that deletes introspector config map.
    +
    Factory for Step that deletes WebLogic domain introspector job.
    static StepJobHelper.deleteDomainIntrospectorJobStep​(Step next)ConfigMapHelper.deleteIntrospectorConfigMapStep​(java.lang.String domainUid, +java.lang.String namespace, +Step next) -
    Factory for Step that deletes WebLogic domain introspector job.
    +
    Factory for a step that deletes the generated introspector config map.
    StepCallBuilder.patchConfigMapAsync​(java.lang.String name, +java.lang.String namespace, +io.kubernetes.client.custom.V1Patch patchBody, +ResponseStep<io.kubernetes.client.openapi.models.V1ConfigMap> responseStep) +
    Asynchronous step for patching a config map.
    +
    Step CallBuilder.patchDomainAsync​(java.lang.String name, java.lang.String namespace, io.kubernetes.client.custom.V1Patch patchBody, @@ -750,7 +747,7 @@

    Uses of Asynchronous step for patching a domain.

    Step CallBuilder.patchPodAsync​(java.lang.String name, java.lang.String namespace, @@ -760,7 +757,7 @@

    Uses of Asynchronous step for patching a pod.

    Step CallBuilder.readBetaCustomResourceDefinitionAsync​(java.lang.String name, ResponseStep<io.kubernetes.client.openapi.models.V1beta1CustomResourceDefinition> responseStep)
    Step CallBuilder.readConfigMapAsync​(java.lang.String name, java.lang.String namespace, @@ -777,7 +774,7 @@

    Uses of Asynchronous step for reading config map.

    Step CallBuilder.readCustomResourceDefinitionAsync​(java.lang.String name, ResponseStep<io.kubernetes.client.openapi.models.V1CustomResourceDefinition> responseStep)
    Step CallBuilder.readDomainAsync​(java.lang.String name, java.lang.String namespace, @@ -794,11 +791,26 @@

    Uses of Asynchronous step for reading domain.

    static StepConfigMapHelper.readExistingIntrospectorConfigMap​(java.lang.String ns, +java.lang.String domainUid) +
    Reads the introspector config map for the specified domain, populating the following packet entries: + DOMAIN_TOPOLOGY the parsed topology + DOMAIN_HASH a hash of the topology + SECRETS_HASH a hash of the override secrets + DOMAIN_RESTART_VERSION a field from the domain to force rolling when changed + DOMAIN_INPUTS_HASH a hash of the image used in the domain.
    +
    static StepConfigMapHelper.readExistingSituConfigMap​(java.lang.String ns, +ConfigMapHelper.readIntrospectionVersionStep​(java.lang.String ns, java.lang.String domainUid)  +
    Reads the introspector config map for the specified domain, populating the following packet entries.
    +
    Stepstatic StepConfigMapHelper.reportTopologyErrorsAndStop() 
    static Step RollingHelper.rollServers​(java.util.Map<java.lang.String,​Step.StepAndPacket> rolling, Step next) @@ -922,7 +939,8 @@

    Uses of

    static StepCrdHelper.createDomainCrdStep​(KubernetesVersion version, +CrdHelper.createDomainCrdStep​(KubernetesVersion version, +SemanticVersion productVersion, Step next)
    Factory for Step that creates Domain CRD.
    @@ -972,16 +990,16 @@

    Uses of

    static StepPodHelper.createManagedPodStep​(Step next)ConfigMapHelper.createIntrospectorConfigMapStep​(Step next) -
    Factory for Step that creates managed server pod.
    +
    Factory for a step that creates or updates the generated domain config map from introspection results.
    static StepConfigMapHelper.createSitConfigMapStep​(Step next)PodHelper.createManagedPodStep​(Step next) -
    Factory for Step that creates config map containing sit config.
    +
    Factory for Step that creates managed server pod.
    static StepConfigMapHelper.deleteDomainIntrospectorConfigMapStep​(java.lang.String domainUid, -java.lang.String namespace, -Step next)JobHelper.deleteDomainIntrospectorJobStep​(Step next) -
    Factory for Step that deletes introspector config map.
    +
    Factory for Step that deletes WebLogic domain introspector job.
    static StepJobHelper.deleteDomainIntrospectorJobStep​(Step next)ConfigMapHelper.deleteIntrospectorConfigMapStep​(java.lang.String domainUid, +java.lang.String namespace, +Step next) -
    Factory for Step that deletes WebLogic domain introspector job.
    +
    Factory for a step that deletes the generated introspector config map.
    class  ManagedServerUpIteratorStep  +
    A step which will bring up the specified managed servers in parallel.
    +
    class static DomainPresenceStep DomainPresenceStep.createDomainPresenceStep​(Domain dom, -Step adminStep, +Step domainUpSteps, Step managedServerStep)  
    ManagedServerUpIteratorStep​(java.util.Collection<DomainPresenceInfo.ServerStartupInfo> cols, +ManagedServerUpIteratorStep​(java.util.Collection<DomainPresenceInfo.ServerStartupInfo> startupInfos, Step next)  
    Packet +
    Context of a single processing flow.
    +
    Step
    Individual step in a processing flow.
    @@ -468,5 +469,7 @@

    Uses o

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/utils/OperatorUtils.html b/docs/apidocs/oracle/kubernetes/utils/OperatorUtils.html index f15bdfcb16f..3ff99977515 100644 --- a/docs/apidocs/oracle/kubernetes/utils/OperatorUtils.html +++ b/docs/apidocs/oracle/kubernetes/utils/OperatorUtils.html @@ -2,10 +2,10 @@ - -OperatorUtils (weblogic-kubernetes-operator 2.6.0 API) + +OperatorUtils (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class OperatorUtils

    @@ -272,9 +267,9 @@

    getSortingString

    Handles up to 20 digits... - otherwise it doesn't zero fill...

    Parameters:
    -
    orig - non-normalized value
    +
    orig - original value
    Returns:
    -
    Normalized value ready for sorting
    +
    munged value
    @@ -284,8 +279,8 @@

    getSortingString

    - +

    Copyright © 2017–2020. All rights reserved.

    + + diff --git a/docs/apidocs/oracle/kubernetes/utils/SystemClock.html b/docs/apidocs/oracle/kubernetes/utils/SystemClock.html index 2a091b91029..b833fba8bee 100644 --- a/docs/apidocs/oracle/kubernetes/utils/SystemClock.html +++ b/docs/apidocs/oracle/kubernetes/utils/SystemClock.html @@ -2,10 +2,10 @@ - -SystemClock (weblogic-kubernetes-operator 2.6.0 API) + +SystemClock (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class SystemClock

    @@ -227,8 +222,8 @@

    getCurrentTime

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/utils/class-use/OperatorUtils.html b/docs/apidocs/oracle/kubernetes/utils/class-use/OperatorUtils.html index d7de7f65a3f..12af2915eee 100644 --- a/docs/apidocs/oracle/kubernetes/utils/class-use/OperatorUtils.html +++ b/docs/apidocs/oracle/kubernetes/utils/class-use/OperatorUtils.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.utils.OperatorUtils (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.utils.OperatorUtils (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.utils.OperatorUtils

    @@ -99,5 +94,7 @@

    Us

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/utils/class-use/SystemClock.html b/docs/apidocs/oracle/kubernetes/utils/class-use/SystemClock.html index 0e7705223f0..9dda2f6c139 100644 --- a/docs/apidocs/oracle/kubernetes/utils/class-use/SystemClock.html +++ b/docs/apidocs/oracle/kubernetes/utils/class-use/SystemClock.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.utils.SystemClock (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.utils.SystemClock (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.utils.SystemClock

    @@ -99,5 +94,7 @@

    Uses

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/utils/package-summary.html b/docs/apidocs/oracle/kubernetes/utils/package-summary.html index 66b9c2f428d..972ff257bc8 100644 --- a/docs/apidocs/oracle/kubernetes/utils/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/utils/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.utils (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.utils (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.utils

    @@ -129,5 +124,7 @@

    Package oracle.kubernetes.utils

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/utils/package-tree.html b/docs/apidocs/oracle/kubernetes/utils/package-tree.html index e8362b3091e..3438155c3de 100644 --- a/docs/apidocs/oracle/kubernetes/utils/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/utils/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.utils Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.utils Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.utils

    @@ -115,5 +110,7 @@

    Class Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/utils/package-use.html b/docs/apidocs/oracle/kubernetes/utils/package-use.html index 165eec83cf2..988b6f970b8 100644 --- a/docs/apidocs/oracle/kubernetes/utils/package-use.html +++ b/docs/apidocs/oracle/kubernetes/utils/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.utils (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.utils (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.utils

    @@ -99,5 +94,7 @@

    Uses of Packag

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/AdminServerConfigurator.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/AdminServerConfigurator.html index 7861348e1c5..f0e72babeb5 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/AdminServerConfigurator.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/AdminServerConfigurator.html @@ -2,10 +2,10 @@ - -AdminServerConfigurator (weblogic-kubernetes-operator 2.6.0 API) + +AdminServerConfigurator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface AdminServerConfigurator

    @@ -161,8 +156,8 @@

    configureAdminService

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/ClusterConfigurator.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/ClusterConfigurator.html index cec447e68a7..1296fb40a4a 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/ClusterConfigurator.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/ClusterConfigurator.html @@ -2,10 +2,10 @@ - -ClusterConfigurator (weblogic-kubernetes-operator 2.6.0 API) + +ClusterConfigurator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -20,7 +20,7 @@ - + - +
    +

    Interface ClusterConfigurator

    @@ -142,34 +137,39 @@

    Method Summary

    ClusterConfiguratorwithContainer​(io.kubernetes.client.openapi.models.V1Container container)withAllowReplicasBelowDynClusterSize​(boolean allowReplicasBelowDynClusterSize)  
    ClusterConfiguratorwithContainer​(io.kubernetes.client.openapi.models.V1Container container) 
    ClusterConfigurator withContainerSecurityContext​(io.kubernetes.client.openapi.models.V1SecurityContext containerSecurityContext)
    Add security constraints at container level, if the same constraint is also defined at pod level then container constraint take precedence.
    ClusterConfigurator withDesiredState​(java.lang.String state)  
    ClusterConfigurator withEnvironmentVariable​(java.lang.String name, java.lang.String value)  
    ClusterConfigurator withInitContainer​(io.kubernetes.client.openapi.models.V1Container initContainer)  
    ClusterConfigurator withLimitRequirement​(java.lang.String resource, java.lang.String quantity)
    ClusterConfigurator withLivenessProbeSettings​(java.lang.Integer initialDelay, java.lang.Integer timeout, java.lang.Integer period)  
    ClusterConfiguratorwithMaxConcurrentStartup​(java.lang.Integer maxConcurrentStartup) 
    ClusterConfigurator withMaxUnavailable​(int maxUnavailable)  
    ClusterConfigurator withNodeName​(java.lang.String nodeName)  
    ClusterConfigurator withNodeSelector​(java.lang.String labelKey, java.lang.String labelValue)
    ClusterConfigurator withPodAnnotation​(java.lang.String name, java.lang.String value)  
    ClusterConfigurator withPodLabel​(java.lang.String name, java.lang.String value)  
    ClusterConfigurator withPodSecurityContext​(io.kubernetes.client.openapi.models.V1PodSecurityContext podSecurityContext) @@ -222,29 +227,29 @@

    Method Summary

    level then container constraint take precedence.
    ClusterConfigurator withPrecreateServerService​(boolean precreateServerService)  
    ClusterConfigurator withPriorityClassName​(java.lang.String priorityClassName)  
    ClusterConfigurator withReadinessProbeSettings​(java.lang.Integer initialDelay, java.lang.Integer timeout, java.lang.Integer period)  
    ClusterConfigurator withReplicas​(int replicas)  
    ClusterConfigurator withRequestRequirement​(java.lang.String resource, java.lang.String quantity)
    ClusterConfigurator withRestartPolicy​(java.lang.String restartPolicy)  
    ClusterConfigurator withRestartVersion​(java.lang.String restartVersion)
    Tells the operator whether the customer wants to restart the server pods.
    ClusterConfigurator withRuntimeClassName​(java.lang.String runtimeClassName)  
    ClusterConfigurator withSchedulerName​(java.lang.String schedulerName)  
    ClusterConfigurator withServerStartPolicy​(java.lang.String policy)  
    ClusterConfigurator withServerStartState​(java.lang.String cluster)  
    ClusterConfigurator withServiceAnnotation​(java.lang.String name, java.lang.String value)  
    ClusterConfigurator withServiceLabel​(java.lang.String name, java.lang.String value)  
    ClusterConfigurator withToleration​(io.kubernetes.client.openapi.models.V1Toleration toleration)  
    DomainConfiguratorwithAllowReplicasBelowMinDynClusterSize​(java.lang.Boolean allowReplicasBelowMinDynClusterSize) 
    abstract DomainConfiguratorwithConfigOverrideDistributionStrategy​(OverrideDistributionStrategy strategy) 
    abstract DomainConfigurator withConfigOverrides​(java.lang.String configMapName)
    Sets the WebLogic configuration overrides configmap name for the domain.
    abstract DomainConfigurator withConfigOverrideSecrets​(java.lang.String... secretNames)
    Sets the WebLogic configuration overrides secret names for the domain.
    abstract DomainConfigurator withContainer​(io.kubernetes.client.openapi.models.V1Container container)  
    abstract DomainConfigurator withContainerSecurityContext​(io.kubernetes.client.openapi.models.V1SecurityContext containerSecurityContext) @@ -248,42 +253,42 @@

    Method Summary

    level then container constraint take precedence.
    DomainConfigurator withDataHome​(java.lang.String dataHome)
    Sets the data home value.
    DomainConfigurator withDefaultImage​(java.lang.String image)
    Sets the default image for the domain.
    DomainConfigurator withDefaultImagePullPolicy​(java.lang.String imagepullpolicy)
    Sets the default image pull policy for the domain.
    DomainConfigurator withDefaultImagePullSecret​(io.kubernetes.client.openapi.models.V1LocalObjectReference secretReference)
    Sets the default image pull secret for the domain.
    DomainConfigurator withDefaultImagePullSecrets​(io.kubernetes.client.openapi.models.V1LocalObjectReference... secretReferences)
    Sets the image pull secrets for the domain.
    abstract void withDefaultLivenessProbeSettings​(java.lang.Integer initialDelay, java.lang.Integer timeout, @@ -292,7 +297,7 @@

    Method Summary

    Sets the default settings for the liveness probe.
    abstract void withDefaultReadinessProbeSettings​(java.lang.Integer initialDelay, java.lang.Integer timeout, @@ -301,40 +306,52 @@

    Method Summary

    Sets the default settings for the readiness probe.
    void withDefaultReplicaCount​(int replicas)  
    abstract DomainConfigurator withDefaultServerStartPolicy​(java.lang.String startPolicy)
    Sets the default server start policy ("ALWAYS", "NEVER" or "IF_NEEDED") for the domain.
    DomainConfigurator withDomainHome​(java.lang.String domainHome)
    Sets the home for the domain.
    DomainConfigurator withDomainHomeInImage​(boolean domainHomeInImage)
    Specifies whether the domain home is stored in the image.
    DomainConfiguratorwithDomainHomeSourceType​(DomainSourceType domainHomeSourceType) 
    abstract DomainConfiguratorwithDomainType​(java.lang.String type) +
    Add domain type for the domain resource.
    +
    abstract DomainConfigurator withEnvironmentVariable​(io.kubernetes.client.openapi.models.V1EnvVar envVar)
    Add an environment variable to the domain.
    abstract DomainConfigurator withEnvironmentVariable​(java.lang.String name, java.lang.String value)
    DomainConfiguratorwithHttpAccessLogInLogHome​(boolean httpAccessLogInLogHome) +
    Sets whether to write server HTTP access log files to the directory specified in + logHome.
    +
    abstract DomainConfigurator withInitContainer​(io.kubernetes.client.openapi.models.V1Container initContainer)  
    abstract DomainConfiguratorwithIntrospectorJobActiveDeadlineSeconds​(long deadline) +
    Add the introspector job active deadline.
    +
    abstract DomainConfiguratorwithIntrospectVersion​(java.lang.String introspectVersion) +
    Tells the operator to start the introspect domain job.
    +
    abstract DomainConfigurator withIstio()
    Add Istio for the domain resource.
    abstract DomainConfigurator withLimitRequirement​(java.lang.String resource, java.lang.String quantity)
    DomainConfigurator withLogHome​(java.lang.String logHome)
    Sets the log home value.
    DomainConfigurator withLogHomeEnabled​(boolean logHomeEnabled)
    Sets the log home enabled flag.
    DomainConfiguratorwithMaxConcurrentStartup​(java.lang.Integer maxConcurrentStartup) 
    abstract DomainConfiguratorwithModelConfigMap​(java.lang.String configmap) +
    Add WDT model config map for the domain resource.
    +
    abstract DomainConfigurator withNodeName​(java.lang.String nodeName)
    Set node name for the pod configuration.
    abstract DomainConfigurator withNodeSelector​(java.lang.String labelKey, java.lang.String labelValue)
    abstract DomainConfiguratorwithOpssWalletFileSecret​(java.lang.String secret) +
    Add OPSS wallet file secret for the domain resource.
    +
    abstract DomainConfiguratorwithOpssWalletPasswordSecret​(java.lang.String secret) +
    Add OPSS wallet password secret for the domain resource.
    +
    abstract DomainConfigurator withPodAnnotation​(java.lang.String name, java.lang.String value)  
    abstract DomainConfigurator withPodLabel​(java.lang.String name, java.lang.String value)  
    abstract DomainConfigurator withPodSecurityContext​(io.kubernetes.client.openapi.models.V1PodSecurityContext podSecurityContext) @@ -411,21 +476,21 @@

    Method Summary

    level then container constraint take precedence.
    abstract DomainConfigurator withPriorityClassName​(java.lang.String priorityClassName)
    Set priority class name for the pod configuration.
    abstract DomainConfigurator withReadinessGate​(io.kubernetes.client.openapi.models.V1PodReadinessGate readinessGate)
    Add readiness gate to the pod configuration.
    abstract DomainConfigurator withRequestRequirement​(java.lang.String resource, java.lang.String quantity)
    abstract DomainConfigurator withRestartPolicy​(java.lang.String restartPolicy)
    Set restart policy for the pod configuration.
    abstract DomainConfigurator withRestartVersion​(java.lang.String restartVersion)
    Tells the operator whether the customer wants to restart the server pods.
    abstract DomainConfigurator withRuntimeClassName​(java.lang.String runtimeClassName)
    Set runtime class name for the pod configuration.
    abstract DomainConfiguratorwithRuntimeEncryptionSecret​(java.lang.String secret) +
    Add model runtime encryption secret for the domain resource.
    +
    abstract DomainConfigurator withSchedulerName​(java.lang.String schedulerName)
    Set scheduler name for the pod configuration.
    abstract DomainConfigurator withServerStartState​(java.lang.String startState)
    Sets the server start state ("RUNNING" or "ADMIN") for the domain.
    abstract DomainConfigurator withToleration​(io.kubernetes.client.openapi.models.V1Toleration toleration)
    Add a toleration to the pod configuration.
    abstract DomainConfigurator withWebLogicCredentialsSecret​(java.lang.String secretName, java.lang.String namespace)
    intgetMaxUnavailable​(java.lang.String clusterName)getMaxConcurrentStartup​(java.lang.String clusterName)  
    intgetReplicaCount​(java.lang.String clusterName)getMaxUnavailable​(java.lang.String clusterName)  
    intgetReplicaCount​(java.lang.String clusterName) 
    ServerSpec getServerSpec​(java.lang.String serverName, java.lang.String clusterName)  
    boolean isAllowReplicasBelowMinDynClusterSize​(java.lang.String clusterName)  
    boolean isShuttingDown()  
    void setReplicaCount​(java.lang.String clusterName, int replicaCount)ClusterConfiguratorClusterConfigurator.withContainer​(io.kubernetes.client.openapi.models.V1Container container)ClusterConfigurator.withAllowReplicasBelowDynClusterSize​(boolean allowReplicasBelowDynClusterSize)  
    ClusterConfiguratorClusterConfigurator.withContainer​(io.kubernetes.client.openapi.models.V1Container container) 
    ClusterConfigurator ClusterConfigurator.withContainerSecurityContext​(io.kubernetes.client.openapi.models.V1SecurityContext containerSecurityContext)
    Add security constraints at container level, if the same constraint is also defined at pod level then container constraint take precedence.
    ClusterConfigurator ClusterConfigurator.withDesiredState​(java.lang.String state)  
    ClusterConfigurator ClusterConfigurator.withEnvironmentVariable​(java.lang.String name, java.lang.String value)  
    ClusterConfigurator ClusterConfigurator.withInitContainer​(io.kubernetes.client.openapi.models.V1Container initContainer)  
    ClusterConfigurator ClusterConfigurator.withLimitRequirement​(java.lang.String resource, java.lang.String quantity)
    ClusterConfigurator ClusterConfigurator.withLivenessProbeSettings​(java.lang.Integer initialDelay, java.lang.Integer timeout, java.lang.Integer period)  
    ClusterConfiguratorClusterConfigurator.withMaxConcurrentStartup​(java.lang.Integer maxConcurrentStartup) 
    ClusterConfigurator ClusterConfigurator.withMaxUnavailable​(int maxUnavailable)DomainConfiguratorDomainConfigurator.withAllowReplicasBelowMinDynClusterSize​(java.lang.Boolean allowReplicasBelowMinDynClusterSize) 
    abstract DomainConfiguratorDomainConfigurator.withConfigOverrideDistributionStrategy​(OverrideDistributionStrategy strategy) 
    abstract DomainConfigurator DomainConfigurator.withConfigOverrides​(java.lang.String configMapName) @@ -230,6 +235,18 @@

    Uses of +

    DomainConfiguratorDomainConfigurator.withDomainHomeSourceType​(DomainSourceType domainHomeSourceType) 
    abstract DomainConfiguratorDomainConfigurator.withDomainType​(java.lang.String type) +
    Add domain type for the domain resource.
    +
    abstract DomainConfigurator DomainConfigurator.withEnvironmentVariable​(io.kubernetes.client.openapi.models.V1EnvVar envVar) @@ -245,18 +262,40 @@

    Uses of +

    DomainConfiguratorDomainConfigurator.withHttpAccessLogInLogHome​(boolean httpAccessLogInLogHome) +
    Sets whether to write server HTTP access log files to the directory specified in + logHome.
    +
    abstract DomainConfigurator DomainConfigurator.withInitContainer​(io.kubernetes.client.openapi.models.V1Container initContainer)  
    abstract DomainConfiguratorDomainConfigurator.withIntrospectorJobActiveDeadlineSeconds​(long deadline) +
    Add the introspector job active deadline.
    +
    abstract DomainConfiguratorDomainConfigurator.withIntrospectVersion​(java.lang.String introspectVersion) +
    Tells the operator to start the introspect domain job.
    +
    abstract DomainConfigurator DomainConfigurator.withIstio()
    Add Istio for the domain resource.
    abstract DomainConfigurator DomainConfigurator.withLimitRequirement​(java.lang.String resource, java.lang.String quantity)
    DomainConfigurator DomainConfigurator.withLogHome​(java.lang.String logHome)
    Sets the log home value.
    DomainConfigurator DomainConfigurator.withLogHomeEnabled​(boolean logHomeEnabled)
    Sets the log home enabled flag.
    DomainConfiguratorDomainConfigurator.withMaxConcurrentStartup​(java.lang.Integer maxConcurrentStartup) 
    abstract DomainConfiguratorDomainConfigurator.withModelConfigMap​(java.lang.String configmap) +
    Add WDT model config map for the domain resource.
    +
    abstract DomainConfigurator DomainConfigurator.withNodeName​(java.lang.String nodeName)
    Set node name for the pod configuration.
    abstract DomainConfigurator DomainConfigurator.withNodeSelector​(java.lang.String labelKey, java.lang.String labelValue)
    abstract DomainConfiguratorDomainConfigurator.withOpssWalletFileSecret​(java.lang.String secret) +
    Add OPSS wallet file secret for the domain resource.
    +
    abstract DomainConfiguratorDomainConfigurator.withOpssWalletPasswordSecret​(java.lang.String secret) +
    Add OPSS wallet password secret for the domain resource.
    +
    abstract DomainConfigurator DomainConfigurator.withPodAnnotation​(java.lang.String name, java.lang.String value)  
    abstract DomainConfigurator DomainConfigurator.withPodLabel​(java.lang.String name, java.lang.String value)  
    abstract DomainConfigurator DomainConfigurator.withPodSecurityContext​(io.kubernetes.client.openapi.models.V1PodSecurityContext podSecurityContext) @@ -313,21 +378,21 @@

    Uses of +

    abstract DomainConfigurator DomainConfigurator.withPriorityClassName​(java.lang.String priorityClassName)
    Set priority class name for the pod configuration.
    abstract DomainConfigurator DomainConfigurator.withReadinessGate​(io.kubernetes.client.openapi.models.V1PodReadinessGate readinessGate)
    Add readiness gate to the pod configuration.
    abstract DomainConfigurator DomainConfigurator.withRequestRequirement​(java.lang.String resource, java.lang.String quantity)
    abstract DomainConfigurator DomainConfigurator.withRestartPolicy​(java.lang.String restartPolicy)
    Set restart policy for the pod configuration.
    abstract DomainConfigurator DomainConfigurator.withRestartVersion​(java.lang.String restartVersion)
    Tells the operator whether the customer wants to restart the server pods.
    abstract DomainConfigurator DomainConfigurator.withRuntimeClassName​(java.lang.String runtimeClassName)
    Set runtime class name for the pod configuration.
    abstract DomainConfiguratorDomainConfigurator.withRuntimeEncryptionSecret​(java.lang.String secret) +
    Add model runtime encryption secret for the domain resource.
    +
    abstract DomainConfigurator DomainConfigurator.withSchedulerName​(java.lang.String schedulerName)DomainConfiguratorDomainCommonConfigurator.withConfigOverrideDistributionStrategy​(OverrideDistributionStrategy strategy) 
    DomainConfigurator DomainCommonConfigurator.withConfigOverrides​(java.lang.String configMapName)
    Sets the WebLogic configuration overrides config map name for the domain.
    DomainConfigurator DomainCommonConfigurator.withConfigOverrideSecrets​(java.lang.String... secretNames)  
    DomainConfigurator DomainCommonConfigurator.withContainer​(io.kubernetes.client.openapi.models.V1Container container)  
    DomainConfigurator DomainCommonConfigurator.withContainerSecurityContext​(io.kubernetes.client.openapi.models.V1SecurityContext containerSecurityContext)  
    DomainConfigurator DomainCommonConfigurator.withDefaultServerStartPolicy​(java.lang.String startPolicy)  
    DomainConfiguratorDomainCommonConfigurator.withDomainType​(java.lang.String type) 
    DomainConfigurator DomainCommonConfigurator.withEnvironmentVariable​(io.kubernetes.client.openapi.models.V1EnvVar envVar)DomainConfiguratorDomainCommonConfigurator.withIntrospectorJobActiveDeadlineSeconds​(long deadline) 
    DomainConfiguratorDomainCommonConfigurator.withIntrospectVersion​(java.lang.String introspectVersion) 
    DomainConfigurator DomainCommonConfigurator.withIstio()  
    DomainConfiguratorDomainCommonConfigurator.withNodeName​(java.lang.String nodeName)DomainCommonConfigurator.withModelConfigMap​(java.lang.String configmap)  
    DomainConfiguratorDomainCommonConfigurator.withNodeName​(java.lang.String nodeName) 
    DomainConfigurator DomainCommonConfigurator.withNodeSelector​(java.lang.String labelKey, java.lang.String labelValue)  
    DomainConfiguratorDomainCommonConfigurator.withOpssWalletFileSecret​(java.lang.String secret) 
    DomainConfiguratorDomainCommonConfigurator.withOpssWalletPasswordSecret​(java.lang.String secret) 
    DomainConfigurator DomainCommonConfigurator.withPodAnnotation​(java.lang.String name, java.lang.String value)  
    DomainConfigurator DomainCommonConfigurator.withPodLabel​(java.lang.String name, java.lang.String value)  
    DomainConfigurator DomainCommonConfigurator.withPodSecurityContext​(io.kubernetes.client.openapi.models.V1PodSecurityContext podSecurityContext)  
    DomainConfigurator DomainCommonConfigurator.withPriorityClassName​(java.lang.String priorityClassName)  
    DomainConfigurator DomainCommonConfigurator.withReadinessGate​(io.kubernetes.client.openapi.models.V1PodReadinessGate readinessGate)  
    DomainConfigurator DomainCommonConfigurator.withRequestRequirement​(java.lang.String resource, java.lang.String quantity)  
    DomainConfigurator DomainCommonConfigurator.withRestartPolicy​(java.lang.String restartPolicy)  
    DomainConfigurator DomainCommonConfigurator.withRestartVersion​(java.lang.String restartVersion)  
    DomainConfigurator DomainCommonConfigurator.withRuntimeClassName​(java.lang.String runtimeClassName)  
    DomainConfiguratorDomainCommonConfigurator.withRuntimeEncryptionSecret​(java.lang.String secret) 
    DomainConfigurator DomainCommonConfigurator.withSchedulerName​(java.lang.String schedulerName)
    java.lang.IntegergetReplicas()getMaxConcurrentStartup()  
    java.lang.IntegergetReplicas() 
    java.lang.String getServerStartPolicy()  
    int hashCode()  
    boolean
    java.lang.Boolean isAllowReplicasBelowMinDynClusterSize()
    Whether to allow number of replicas to drop below the minimum dynamic cluster size configured in the WebLogic domain home configuration.
    voidsetAllowReplicasBelowMinDynClusterSize​(java.lang.Boolean value) 
    void setClusterName​(java.lang.String clusterName)  
    void setClusterService​(oracle.kubernetes.weblogic.domain.model.KubernetesResource clusterService)  
    voidsetMaxConcurrentStartup​(java.lang.Integer value) 
    void setReplicas​(java.lang.Integer replicas)  
    void setServerStartPolicy​(java.lang.String serverStartPolicy)
    Tells the operator whether the customer wants the server to be running.
    java.lang.String toString()    
    java.lang.LonggetIntrospectorJobActiveDeadlineSeconds() 
    Istio getIstio()  
    ModelgetModel() 
    OpssgetOpss() 
    OverrideDistributionStrategygetOverrideDistributionStrategy() 
    java.lang.StringgetOverridesConfigMap() 
    java.util.List<java.lang.String>getSecrets() 
    int hashCode()  
    voidsetIntrospectorJobActiveDeadlineSeconds​(java.lang.Long introspectorJobActiveDeadlineSeconds) 
    void setIstio​(Istio istio)  
    voidsetModel​(Model model) 
    voidsetOpss​(Opss opss) 
    voidsetOverrideDistributionStrategy​(OverrideDistributionStrategy overrideDistributionStrategy) 
    voidsetOverridesConfigMap​(java.lang.String overridesConfigMap) 
    voidsetSecrets​(java.util.List<java.lang.String> secrets) 
    java.lang.String toString()  
    Configuration withIstio​(Istio istio)  
    booleandistributeOverridesDynamically() +
    Returns the strategy for applying changes to configuration overrides.
    +
    boolean equals​(java.lang.Object other)  
    AdminServerSpec getAdminServerSpec()  
    java.lang.String getApiVersion()
    APIVersion defines the versioned schema of this representation of an object.
    ClusterSpec getCluster​(java.lang.String clusterName)
    Returns the specification applicable to a particular cluster.
    java.lang.String getConfigOverrides()
    Returns the name of the Kubernetes config map that contains optional configuration overrides.
    java.util.List<java.lang.String> getConfigOverrideSecrets()
    Returns a list of Kubernetes secret names used in optional configuration overrides.
    java.lang.String getDataHome()  
    java.lang.String getDomainHome()
    Returns the domain home.
    java.lang.String
    DomainSourceType getDomainHomeSourceType() -
    Get domain home source type.
    +
    Returns a description of how the domain is defined.
    java.lang.String getDomainUid()
    Returns the domain unique identifier.
    java.lang.String getEffectiveLogHome()
    Returns the path to the log home to be used by this domain.
    java.lang.LonggetIntrospectorJobActiveDeadlineSeconds() +
    Returns the value of the introspector job active deadline.
    +
    java.lang.StringgetIntrospectVersion() 
    int getIstioReadinessPort()  
    java.lang.String getKind()
    Kind is a string value representing the REST resource this object represents.
    intgetMaxConcurrentStartup​(java.lang.String clusterName) 
    int getMaxUnavailable​(java.lang.String clusterName)
    Returns the maximum number of unavailable replicas for the specified cluster.
    io.kubernetes.client.openapi.models.V1ObjectMeta getMetadata()
    Standard object's metadata.
    int getMinAvailable​(java.lang.String clusterName)
    Returns the minimum number of replicas for the specified cluster.
    ModelgetModel() 
    java.lang.String getNamespace()  
    java.lang.StringgetOpssWalletFileSecret() +
    Returns the opss wallet file secret.
    +
    java.lang.StringgetOpssWalletPasswordSecret() +
    Reference to secret opss key passphrase.
    +
    OverrideDistributionStrategygetOverrideDistributionStrategy() +
    Returns the strategy for applying changes to configuration overrides.
    +
    int getReplicaCount​(java.lang.String clusterName)
    Returns the number of replicas to start for the specified cluster.
    java.lang.String getRestartVersion()  
    java.lang.StringgetRuntimeEncryptionSecret() +
    Reference to runtime encryption secret.
    +
    ServerSpec getServer​(java.lang.String serverName, java.lang.String clusterName)
    DomainSpec getSpec()
    DomainSpec is a description of a domain.
    DomainStatus getStatus()
    DomainStatus represents information about the status of a domain.
    java.util.List<java.lang.String> getValidationFailures​(KubernetesResourceLookup kubernetesResources)  
    java.lang.StringgetWdtConfigMap() 
    java.lang.StringgetWdtDomainType() 
    java.lang.String getWebLogicCredentialsSecretName() -
    Name of the secret containing WebLogic startup credentials username and password.
    +
    Name of the secret containing WebLogic startup credentials user name and password.
    int hashCode()  
    boolean isAllowReplicasBelowMinDynClusterSize​(java.lang.String clusterName) @@ -315,101 +377,106 @@

    Method Summary

    dynamic cluster size configured in WebLogic domain configuration.
    boolean isHttpAccessLogInLogHome()  
    boolean isIncludeServerOutInPodLog()  
    boolean isIstioEnabled()  
    booleanisNewIntrospectionRequiredForNewServers() 
    boolean isShuttingDown()  
    void setApiVersion​(java.lang.String apiVersion)
    APIVersion defines the versioned schema of this representation of an object.
    void setKind​(java.lang.String kind)
    Kind is a string value representing the REST resource this object represents.
    void setMetadata​(io.kubernetes.client.openapi.models.V1ObjectMeta metadata)
    Standard object's metadata.
    void setReplicaCount​(java.lang.String clusterName, int replicaLimit)  
    void setSpec​(DomainSpec spec)
    DomainSpec is a description of a domain.
    void setStatus​(DomainStatus status)
    DomainStatus represents information about the status of a domain.
    java.lang.String toString()  
    Domain withApiVersion​(java.lang.String apiVersion)
    APIVersion defines the versioned schema of this representation of an object.
    Domain withKind​(java.lang.String kind)
    Kind is a string value representing the REST resource this object represents.
    Domain withMetadata​(io.kubernetes.client.openapi.models.V1ObjectMeta metadata)
    Standard object's metadata.
    Domain withSpec​(DomainSpec spec)
    DomainSpec is a description of a domain.
    Domain withStatus​(DomainStatus status) @@ -596,6 +663,12 @@

    getRestartVersion

  • +

    getIntrospectVersion

    +
    public java.lang.String getIntrospectVersion()
    +
    +
  • +
  • +

    getServer

    public ServerSpec getServer​(java.lang.String serverName, java.lang.String clusterName)
    @@ -685,6 +758,12 @@

    isAllowRepli

  • +

    getMaxConcurrentStartup

    +
    public int getMaxConcurrentStartup​(java.lang.String clusterName)
    +
    +
  • +
  • +

    getSpec

    @Nonnull public DomainSpec getSpec()
    @@ -762,7 +841,7 @@

    wit

    getWebLogicCredentialsSecretName

    public java.lang.String getWebLogicCredentialsSecretName()
    -
    Name of the secret containing WebLogic startup credentials username and password.
    +
    Name of the secret containing WebLogic startup credentials user name and password.
    Returns:
    the secret name
    @@ -771,6 +850,39 @@

    getWebLogicCredentialsSecretName<

  • +

    getOpssWalletPasswordSecret

    +
    public java.lang.String getOpssWalletPasswordSecret()
    +
    Reference to secret opss key passphrase.
    +
    +
    Returns:
    +
    opss key passphrase
    +
    +
    +
  • +
  • +
    +

    getOpssWalletFileSecret

    +
    public java.lang.String getOpssWalletFileSecret()
    +
    Returns the opss wallet file secret.
    +
    +
    Returns:
    +
    opss wallet file secret.
    +
    +
    +
  • +
  • +
    +

    getRuntimeEncryptionSecret

    +
    public java.lang.String getRuntimeEncryptionSecret()
    +
    Reference to runtime encryption secret.
    +
    +
    Returns:
    +
    runtime encryption secret
    +
    +
    +
  • +
  • +

    getDomainUid

    public java.lang.String getDomainUid()
    Returns the domain unique identifier.
    @@ -799,6 +911,12 @@

    getDataHome

  • +

    getWdtDomainType

    +
    public java.lang.String getWdtDomainType()
    +
    +
  • +
  • +

    isIncludeServerOutInPodLog

    public boolean isIncludeServerOutInPodLog()
    @@ -806,8 +924,8 @@

    isIncludeServerOutInPodLog

  • getDomainHomeSourceType

    -
    public java.lang.String getDomainHomeSourceType()
    -
    Get domain home source type.
    +
    public DomainSourceType getDomainHomeSourceType()
    +
    Returns a description of how the domain is defined.
    Returns:
    source type
    @@ -816,6 +934,18 @@

    getDomainHomeSourceType

  • +

    isNewIntrospectionRequiredForNewServers

    +
    public boolean isNewIntrospectionRequiredForNewServers()
    +
    +
  • +
  • +
    +

    getModel

    +
    public Model getModel()
    +
    +
  • +
  • +

    isHttpAccessLogInLogHome

    public boolean isHttpAccessLogInLogHome()
    @@ -836,9 +966,7 @@

    getIstioReadinessPort

    getDomainHome

    public java.lang.String getDomainHome()
    -
    Returns the domain home. - -

    Defaults to either /u01/oracle/user_projects/domains or /shared/domains/domainUID

    +
    Returns the domain home. May be null, but will not be an empty string.
    Returns:
    domain home
    @@ -864,6 +992,45 @@

    getConfigOverrides

  • +

    getOverrideDistributionStrategy

    +
    public OverrideDistributionStrategy getOverrideDistributionStrategy()
    +
    Returns the strategy for applying changes to configuration overrides.
    +
    +
    Returns:
    +
    the selected strategy
    +
    +
    +
  • +
  • +
    +

    distributeOverridesDynamically

    +
    public boolean distributeOverridesDynamically()
    +
    Returns the strategy for applying changes to configuration overrides.
    +
    +
    Returns:
    +
    the selected strategy
    +
    +
    +
  • +
  • +
    +

    getIntrospectorJobActiveDeadlineSeconds

    +
    public java.lang.Long getIntrospectorJobActiveDeadlineSeconds()
    +
    Returns the value of the introspector job active deadline.
    +
    +
    Returns:
    +
    value of the deadline in seconds.
    +
    +
    +
  • +
  • +
    +

    getWdtConfigMap

    +
    public java.lang.String getWdtConfigMap()
    +
    +
  • +
  • +

    getConfigOverrideSecrets

    public java.util.List<java.lang.String> getConfigOverrideSecrets()
    Returns a list of Kubernetes secret names used in optional configuration overrides.
    @@ -915,8 +1082,8 @@

    - +
    +

    Class DomainCommonConfigurator

    @@ -206,24 +201,29 @@

    Method Summary

  • DomainConfiguratorwithConfigOverrideDistributionStrategy​(OverrideDistributionStrategy strategy) 
    DomainConfigurator withConfigOverrides​(java.lang.String configMapName)
    Sets the WebLogic configuration overrides config map name for the domain.
    DomainConfigurator withConfigOverrideSecrets​(java.lang.String... secretNames)
    Sets the WebLogic configuration overrides secret names for the domain.
    DomainConfigurator withContainer​(io.kubernetes.client.openapi.models.V1Container container)  
    DomainConfigurator withContainerSecurityContext​(io.kubernetes.client.openapi.models.V1SecurityContext containerSecurityContext) @@ -231,7 +231,7 @@

    Method Summary

    level then container constraint take precedence.
    void withDefaultLivenessProbeSettings​(java.lang.Integer initialDelay, java.lang.Integer timeout, @@ -240,7 +240,7 @@

    Method Summary

    Sets the default settings for the liveness probe.
    void withDefaultReadinessProbeSettings​(java.lang.Integer initialDelay, java.lang.Integer timeout, @@ -249,21 +249,28 @@

    Method Summary

    Sets the default settings for the readiness probe.
    DomainConfigurator withDefaultServerStartPolicy​(java.lang.String startPolicy)
    Sets the default server start policy ("ALWAYS", "NEVER" or "IF_NEEDED") for the domain.
    DomainConfiguratorwithDomainType​(java.lang.String type) +
    Add domain type for the domain resource.
    +
    DomainConfigurator withEnvironmentVariable​(io.kubernetes.client.openapi.models.V1EnvVar envVar)
    Add an environment variable to the domain.
    DomainConfigurator withEnvironmentVariable​(java.lang.String name, java.lang.String value)
    DomainConfigurator withInitContainer​(io.kubernetes.client.openapi.models.V1Container initContainer)  
    DomainConfiguratorwithIntrospectorJobActiveDeadlineSeconds​(long deadline) +
    Add the introspector job active deadline.
    +
    DomainConfiguratorwithIntrospectVersion​(java.lang.String introspectVersion) +
    Tells the operator to start the introspect domain job.
    +
    DomainConfigurator withIstio()
    Add Istio for the domain resource.
    DomainConfigurator withLimitRequirement​(java.lang.String resource, java.lang.String quantity)
    DomainConfiguratorwithModelConfigMap​(java.lang.String configmap) +
    Add WDT model config map for the domain resource.
    +
    DomainConfigurator withNodeName​(java.lang.String nodeName)
    Set node name for the pod configuration.
    DomainConfigurator withNodeSelector​(java.lang.String labelKey, java.lang.String labelValue)
    DomainConfiguratorwithOpssWalletFileSecret​(java.lang.String secret) +
    Add OPSS wallet file secret for the domain resource.
    +
    DomainConfiguratorwithOpssWalletPasswordSecret​(java.lang.String secret) +
    Add OPSS wallet password secret for the domain resource.
    +
    DomainConfigurator withPodAnnotation​(java.lang.String name, java.lang.String value)  
    DomainConfigurator withPodLabel​(java.lang.String name, java.lang.String value)  
    DomainConfigurator withPodSecurityContext​(io.kubernetes.client.openapi.models.V1PodSecurityContext podSecurityContext) @@ -326,21 +368,21 @@

    Method Summary

    level then container constraint take precedence.
    DomainConfigurator withPriorityClassName​(java.lang.String priorityClassName)
    Set priority class name for the pod configuration.
    DomainConfigurator withReadinessGate​(io.kubernetes.client.openapi.models.V1PodReadinessGate readinessGate)
    Add readiness gate to the pod configuration.
    DomainConfigurator withRequestRequirement​(java.lang.String resource, java.lang.String quantity)
    DomainConfigurator withRestartPolicy​(java.lang.String restartPolicy)
    Set restart policy for the pod configuration.
    DomainConfigurator withRestartVersion​(java.lang.String restartVersion)
    Tells the operator whether the customer wants to restart the server pods.
    DomainConfigurator withRuntimeClassName​(java.lang.String runtimeClassName)
    Set runtime class name for the pod configuration.
    DomainConfiguratorwithRuntimeEncryptionSecret​(java.lang.String secret) +
    Add model runtime encryption secret for the domain resource.
    +
    DomainConfigurator withSchedulerName​(java.lang.String schedulerName)
    Set scheduler name for the pod configuration.
    DomainConfigurator withServerStartState​(java.lang.String startState)
    Sets the server start state ("RUNNING" or "ADMIN") for the domain.
    DomainConfigurator withToleration​(io.kubernetes.client.openapi.models.V1Toleration toleration)
    Add a toleration to the pod configuration.
    DomainConfigurator withWebLogicCredentialsSecret​(java.lang.String secretName, java.lang.String namespace) java.lang.String getStatus() -
    Status is the status of the condition.
    +
    The status of the condition.
    DomainCondition withStatus​(java.lang.String status) -
    Status is the status of the condition.
    +
    The status of the condition.
     
    ConfigurationgetConfiguration() 
    java.lang.String getDomainUid()
    Domain unique identifier.
    java.lang.String getImage()  
    java.lang.String getImagePullPolicy()  
    java.util.List<io.kubernetes.client.openapi.models.V1LocalObjectReference> getImagePullSecrets()
    Gets image pull secrets.
    java.lang.StringgetIntrospectVersion() 
    java.util.List<ManagedServer> getManagedServers()  
    java.lang.IntegergetMaxClusterConcurrentStartup() 
    java.lang.StringgetOpssWalletFileSecret() +
    Get OPSS wallet file secret.
    +
    OverrideDistributionStrategygetOverrideDistributionStrategy() +
    Returns the strategy used for distributing changed config overrides.
    +
    java.lang.Integer getReplicas() @@ -230,80 +254,122 @@

    Method Summary

    configured in clusters.
    java.lang.String getServerStartPolicy()  
    java.lang.StringgetWdtConfigMap() +
    Get WDT config map.
    +
    int hashCode()  
    booleanisAllowReplicasBelowMinDynClusterSize() 
    voidsetAllowReplicasBelowMinDynClusterSize​(java.lang.Boolean allowReplicasBelowMinDynClusterSize) 
    void setConfigOverrideSecrets​(java.util.List<java.lang.String> overridesSecretNames)  
    voidsetConfiguration​(Configuration configuration) 
    void setDataHome​(java.lang.String dataHome)  
    void setDomainHome​(java.lang.String domainHome)
    Domain home.
    void setDomainHomeInImage​(boolean domainHomeInImage)
    Specifies whether the domain home is stored in the image.
    voidsetDomainHomeSourceType​(DomainSourceType domainHomeSourceType) 
    void setDomainUid​(java.lang.String domainUid)
    Domain unique identifier.
    voidsetHttpAccessLogInLogHome​(boolean httpAccessLogInLogHome) 
    void setImage​(java.lang.String image)  
    void setImagePullPolicy​(java.lang.String imagePullPolicy)  
    void setImagePullSecret​(io.kubernetes.client.openapi.models.V1LocalObjectReference imagePullSecret)  
    void setImagePullSecrets​(java.util.List<io.kubernetes.client.openapi.models.V1LocalObjectReference> imagePullSecrets)  
    voidsetIntrospectVersion​(java.lang.String introspectVersion) 
    void setLogHome​(java.lang.String logHome)  
    void setLogHomeEnabled​(java.lang.Boolean logHomeEnabled)
    Log home enabled.
    voidsetMaxClusterConcurrentStartup​(java.lang.Integer maxClusterConcurrentStartup) 
    void setReplicas​(java.lang.Integer replicas) @@ -311,58 +377,61 @@

    Method Summary

    configured in clusters.
    void setServerStartPolicy​(java.lang.String serverStartPolicy)
    Tells the operator whether the customer wants the server to be running.
    java.lang.String toString()  
    DomainSpec withCluster​(Cluster cluster) -
    Adds a Cluster to the DomainSpec.
    +
    /** + Adds a Cluster to the DomainSpec.
    DomainSpec withConfigOverrides​(java.lang.String overrides)  
    DomainSpecwithConfiguration​(Configuration configuration) 
    DomainSpec withDomainHomeInImage​(boolean domainHomeInImage)  
    DomainSpec withDomainUid​(java.lang.String domainUid)
    Domain unique identifier.
    DomainSpec withImage​(java.lang.String image)  
    DomainSpec withIncludeServerOutInPodLog​(boolean includeServerOutInPodLog)  
    DomainSpecwithOpssKeyPassPhrase​(io.kubernetes.client.openapi.models.V1SecretReference opssKeyPassPhrase) +
    Reference to secret containing WebLogic startup credentials user name and password.
    +
    DomainSpec withReplicas​(java.lang.Integer replicas) @@ -370,11 +439,11 @@

    Method Summary

    configured in clusters.
    DomainSpec withWebLogicCredentialsSecret​(io.kubernetes.client.openapi.models.V1SecretReference webLogicCredentialsSecret) -
    Reference to secret containing WebLogic startup credentials username and password.
    +
    Reference to secret containing WebLogic startup credentials user name and password.
    java.util.List<ServerStatus> getServers() -
    Status of WebLogic servers in this domain.
    +
    Status of WebLogic Servers in this domain.
    void setServers​(java.util.List<ServerStatus> servers) -
    Status of WebLogic servers in this domain.
    +
    Status of WebLogic Servers in this domain.
    DomainStatus withServers​(java.util.List<ServerStatus> servers) -
    Status of WebLogic servers in this domain.
    +
    Status of WebLogic Servers in this domain.
    static java.lang.StringISTIO_POD_NAMESPACE +
    Istio pod namespace.
    +
    static java.lang.String ISTIO_READINESS_PORT
    Istio readiness port.
    static java.lang.String NAMESPACE
    The namespace in which the introspection job will run.
    static java.lang.StringOPSS_KEY_SECRET_NAME +
    The credentials used by the introspection job - opss key passphrase.
    +
    static java.lang.StringOPSS_WALLETFILE_SECRET_NAME +
    The credentials used by the introspection job - opss wallet file.
    +
    static java.lang.StringRUNTIME_ENCRYPTION_SECRET_NAME +
    The credentials used by the introspection job - runtime encryption secret name.
    +
    static java.lang.StringWDT_DOMAIN_TYPE +
    The wdt domain type.
    +
    static java.lang.StringWDT_ENCRYPTION_PASSPHRASE_NAME +
    The credentials used by the introspection job - wdt encryption passphrase.
    +
    @@ -246,6 +283,50 @@

    CREDENTIALS_SECRET_NAME

  • +

    OPSS_KEY_SECRET_NAME

    +
    public static final java.lang.String OPSS_KEY_SECRET_NAME
    +
    The credentials used by the introspection job - opss key passphrase.
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    OPSS_WALLETFILE_SECRET_NAME

    +
    public static final java.lang.String OPSS_WALLETFILE_SECRET_NAME
    +
    The credentials used by the introspection job - opss wallet file.
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    WDT_ENCRYPTION_PASSPHRASE_NAME

    +
    public static final java.lang.String WDT_ENCRYPTION_PASSPHRASE_NAME
    +
    The credentials used by the introspection job - wdt encryption passphrase.
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +
    +

    RUNTIME_ENCRYPTION_SECRET_NAME

    +
    public static final java.lang.String RUNTIME_ENCRYPTION_SECRET_NAME
    +
    The credentials used by the introspection job - runtime encryption secret name.
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +

    DOMAIN_SOURCE_TYPE

    public static final java.lang.String DOMAIN_SOURCE_TYPE
    The domain source type.
    @@ -257,6 +338,17 @@

    DOMAIN_SOURCE_TYPE

  • +

    WDT_DOMAIN_TYPE

    +
    public static final java.lang.String WDT_DOMAIN_TYPE
    +
    The wdt domain type.
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +

    ISTIO_ENABLED

    public static final java.lang.String ISTIO_ENABLED
    Istio enabled.
    @@ -277,6 +369,17 @@

    ISTIO_READINESS_PORT

  • +
  • +
    +

    ISTIO_POD_NAMESPACE

    +
    public static final java.lang.String ISTIO_POD_NAMESPACE
    +
    Istio pod namespace.
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • @@ -299,8 +402,8 @@

    IntrospectorJobEnvVars

    - + + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Istio.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Istio.html index 79ee3c48b13..1f0326cbc3c 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Istio.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Istio.html @@ -2,10 +2,10 @@ - -Istio (weblogic-kubernetes-operator 2.6.0 API) + +Istio (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class Istio

    @@ -327,8 +322,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/KubernetesResourceLookup.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/KubernetesResourceLookup.html index 830087f6f2f..a3d300f367f 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/KubernetesResourceLookup.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/KubernetesResourceLookup.html @@ -2,10 +2,10 @@ - -KubernetesResourceLookup (weblogic-kubernetes-operator 2.6.0 API) + +KubernetesResourceLookup (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ManagedServer.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ManagedServer.html index 41b32948ce7..961d7c29342 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ManagedServer.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ManagedServer.html @@ -2,10 +2,10 @@ - -ManagedServer (weblogic-kubernetes-operator 2.6.0 API) + +ManagedServer (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ManagedServerSpecCommonImpl.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ManagedServerSpecCommonImpl.html index a15a055adbf..afce61c68e5 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ManagedServerSpecCommonImpl.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ManagedServerSpecCommonImpl.html @@ -2,10 +2,10 @@ - -ManagedServerSpecCommonImpl (weblogic-kubernetes-operator 2.6.0 API) + +ManagedServerSpecCommonImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ManagedServerSpecCommonImpl

    @@ -263,8 +258,8 @@

    shouldStart

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Model.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Model.html new file mode 100644 index 00000000000..30164f90b0a --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Model.html @@ -0,0 +1,342 @@ + + + + + +Model (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    + +
    + +

    Class Model

    +
    +
    +
    java.lang.Object +
    oracle.kubernetes.weblogic.domain.model.Model
    +
    +
    +
    +
    public class Model
    +extends java.lang.Object
    +
    +
    +
      + +
    • +
      + + +

      Constructor Summary

      +
      + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      Model() 
      +
      +
      +
    • + +
    • +
      + + +

      Method Summary

      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Modifier and TypeMethodDescription
      booleanequals​(java.lang.Object other) 
      java.lang.StringgetDomainType() 
      inthashCode() 
      voidsetDomainType​(java.lang.String domainType) 
      java.lang.StringtoString() 
      ModelwithConfigMap​(java.lang.String configMap) 
      ModelwithDomainType​(java.lang.String domainType) 
      ModelwithRuntimeEncryptionSecret​(java.lang.String runtimeEncryptionSecret) 
      +
      +
      +
      +

      Methods inherited from class java.lang.Object

      + + +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
      +
      +
    • +
    +
    +
    +
      + +
    • +
      + + +

      Constructor Details

      +
        +
      • +
        +

        Model

        +
        public Model()
        +
        +
      • +
      +
      +
    • + +
    • +
      + + +

      Method Details

      +
        +
      • +
        +

        getDomainType

        +
        @Nullable +public java.lang.String getDomainType()
        +
        +
      • +
      • +
        +

        setDomainType

        +
        public void setDomainType​(@Nullable +java.lang.String domainType)
        +
        +
      • +
      • +
        +

        withDomainType

        +
        public Model withDomainType​(@Nullable +java.lang.String domainType)
        +
        +
      • +
      • +
        +

        withConfigMap

        +
        public Model withConfigMap​(@Nullable +java.lang.String configMap)
        +
        +
      • +
      • +
        +

        withRuntimeEncryptionSecret

        +
        public Model withRuntimeEncryptionSecret​(java.lang.String runtimeEncryptionSecret)
        +
        +
      • +
      • +
        +

        toString

        +
        public java.lang.String toString()
        +
        +
        Overrides:
        +
        toString in class java.lang.Object
        +
        +
        +
      • +
      • +
        +

        hashCode

        +
        public int hashCode()
        +
        +
        Overrides:
        +
        hashCode in class java.lang.Object
        +
        +
        +
      • +
      • +
        +

        equals

        +
        public boolean equals​(java.lang.Object other)
        +
        +
        Overrides:
        +
        equals in class java.lang.Object
        +
        +
        +
      • +
      +
      +
    • +
    +
    +
    + +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Opss.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Opss.html new file mode 100644 index 00000000000..a2b608fb931 --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Opss.html @@ -0,0 +1,349 @@ + + + + + +Opss (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    + + +
    +
    java.lang.Object +
    oracle.kubernetes.weblogic.domain.model.Opss
    +
    +
    +
    +
    public class Opss
    +extends java.lang.Object
    +
    +
    +
      + +
    • +
      + + +

      Constructor Summary

      +
      + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      Opss() 
      +
      +
      +
    • + +
    • +
      + + +

      Method Summary

      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Modifier and TypeMethodDescription
      booleanequals​(java.lang.Object other) 
      java.lang.StringgetWalletFileSecret() 
      java.lang.StringgetWalletPasswordSecret() 
      inthashCode() 
      voidsetWalletFileSecret​(java.lang.String walletFileSecret) 
      voidsetWalletPasswordSecret​(java.lang.String walletPasswordSecret) 
      java.lang.StringtoString() 
      OpsswithWalletFileSecret​(java.lang.String walletFileSecret) 
      OpsswithWalletPasswordSecret​(java.lang.String walletPasswordSecret) 
      +
      +
      +
      +

      Methods inherited from class java.lang.Object

      + + +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
      +
      +
    • +
    +
    +
    +
      + +
    • +
      + + +

      Constructor Details

      +
        +
      • +
        +

        Opss

        +
        public Opss()
        +
        +
      • +
      +
      +
    • + +
    • +
      + + +

      Method Details

      +
        +
      • +
        +

        getWalletFileSecret

        +
        public java.lang.String getWalletFileSecret()
        +
        +
      • +
      • +
        +

        setWalletFileSecret

        +
        public void setWalletFileSecret​(java.lang.String walletFileSecret)
        +
        +
      • +
      • +
        +

        withWalletFileSecret

        +
        public Opss withWalletFileSecret​(java.lang.String walletFileSecret)
        +
        +
      • +
      • +
        +

        getWalletPasswordSecret

        +
        public java.lang.String getWalletPasswordSecret()
        +
        +
      • +
      • +
        +

        setWalletPasswordSecret

        +
        public void setWalletPasswordSecret​(java.lang.String walletPasswordSecret)
        +
        +
      • +
      • +
        +

        withWalletPasswordSecret

        +
        public Opss withWalletPasswordSecret​(java.lang.String walletPasswordSecret)
        +
        +
      • +
      • +
        +

        toString

        +
        public java.lang.String toString()
        +
        +
        Overrides:
        +
        toString in class java.lang.Object
        +
        +
        +
      • +
      • +
        +

        hashCode

        +
        public int hashCode()
        +
        +
        Overrides:
        +
        hashCode in class java.lang.Object
        +
        +
        +
      • +
      • +
        +

        equals

        +
        public boolean equals​(java.lang.Object other)
        +
        +
        Overrides:
        +
        equals in class java.lang.Object
        +
        +
        +
      • +
      +
      +
    • +
    +
    +
    + +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/PatchableComponent.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/PatchableComponent.html index 4af7490abdb..f4cd59f0392 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/PatchableComponent.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/PatchableComponent.html @@ -2,10 +2,10 @@ - -PatchableComponent (weblogic-kubernetes-operator 2.6.0 API) + +PatchableComponent (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ProbeTuning.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ProbeTuning.html index 7e27a293321..ee38bf1a04b 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ProbeTuning.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ProbeTuning.html @@ -2,10 +2,10 @@ - -ProbeTuning (weblogic-kubernetes-operator 2.6.0 API) + +ProbeTuning (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ProbeTuning

    @@ -301,8 +296,8 @@

    hashCode

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Server.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Server.html index f2c4bc3d966..eb7bcb42d2d 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Server.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Server.html @@ -2,10 +2,10 @@ - -Server (weblogic-kubernetes-operator 2.6.0 API) + +Server (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class Server

    @@ -296,8 +291,8 @@

    setServerStartPolicy

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerEnvVars.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerEnvVars.html index 1dfe18b4191..d7c95f30cc1 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerEnvVars.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerEnvVars.html @@ -2,10 +2,10 @@ - -ServerEnvVars (weblogic-kubernetes-operator 2.6.0 API) + +ServerEnvVars (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    - +
    +

    Class ServerEnvVars

    @@ -146,37 +141,51 @@

    Field Summary

    static java.lang.String +ADMIN_SERVER_PORT_SECURE + +
    If defined, WebLogic Server sets a secure protocol(https/t3s) in the "AdminURL" property in NM startup.properties.
    + + + +static java.lang.String AS_SERVICE_NAME
    The name of the server service for the admin server.
    - + static java.lang.String DATA_HOME
    The location for the centralized data directory.
    - + static java.lang.String DOMAIN_HOME
    The path to the domain home, either in a PV or image.
    - + static java.lang.String DOMAIN_NAME
    The name of a WebLogic domain.
    - + static java.lang.String DOMAIN_UID   + +static java.lang.String +DYNAMIC_CONFIG_OVERRIDE + +
    If present, pod scripts will watch for changes to override configurations and move them into place.
    + + static java.lang.String LOG_HOME @@ -377,6 +386,18 @@

    ADMIN_PORT_SECURE

  • +

    ADMIN_SERVER_PORT_SECURE

    +
    public static final java.lang.String ADMIN_SERVER_PORT_SECURE
    +
    If defined, WebLogic Server sets a secure protocol(https/t3s) in the "AdminURL" property in NM startup.properties. + WebLogic Node Manager then sets the ADMIN_URL env variable before starting the managed server.
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • +

    LOG_HOME

    public static final java.lang.String LOG_HOME
    The location for the logs.
    @@ -420,6 +441,17 @@

    ACCESS_LOG_IN_LOG_HOME

  • +
  • +
    +

    DYNAMIC_CONFIG_OVERRIDE

    +
    public static final java.lang.String DYNAMIC_CONFIG_OVERRIDE
    +
    If present, pod scripts will watch for changes to override configurations and move them into place.
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • @@ -442,8 +474,8 @@

    ServerEnvVars

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerHealth.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerHealth.html index 9805b247ba0..5116b39dba4 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerHealth.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerHealth.html @@ -2,10 +2,10 @@ - -ServerHealth (weblogic-kubernetes-operator 2.6.0 API) + +ServerHealth (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ServerHealth

    @@ -332,8 +327,8 @@

    equals

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerService.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerService.html index c4982f5bf18..e45e7aed7e2 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerService.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerService.html @@ -2,10 +2,10 @@ - -ServerService (weblogic-kubernetes-operator 2.6.0 API) + +ServerService (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ServerService

    @@ -256,8 +251,8 @@

    hashCode

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerSpec.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerSpec.html index 5c12c194be2..03893a691ae 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerSpec.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerSpec.html @@ -2,10 +2,10 @@ - -ServerSpec (weblogic-kubernetes-operator 2.6.0 API) + +ServerSpec (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface ServerSpec

    @@ -630,8 +625,8 @@

    getServerRestartVersion

    -
    + +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerSpecBase.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerSpecBase.html index 5acc5af8ed5..2a0ff541716 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerSpecBase.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerSpecBase.html @@ -2,10 +2,10 @@ - -ServerSpecBase (weblogic-kubernetes-operator 2.6.0 API) + +ServerSpecBase (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ServerSpecBase

    @@ -573,8 +568,8 @@

    hashCode

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerSpecCommonImpl.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerSpecCommonImpl.html index af2bc2e22bd..c9f17b0f635 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerSpecCommonImpl.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerSpecCommonImpl.html @@ -2,10 +2,10 @@ - -ServerSpecCommonImpl (weblogic-kubernetes-operator 2.6.0 API) + +ServerSpecCommonImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class ServerSpecCommonImpl

    @@ -767,8 +762,8 @@

    hashCode

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerStatus.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerStatus.html index 570f36806e2..ceeb5d60f38 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerStatus.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/ServerStatus.html @@ -2,10 +2,10 @@ - -ServerStatus (weblogic-kubernetes-operator 2.6.0 API) + +ServerStatus (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Shutdown.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Shutdown.html index e72de3160c3..54f29fc67ee 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Shutdown.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/Shutdown.html @@ -2,10 +2,10 @@ - -Shutdown (weblogic-kubernetes-operator 2.6.0 API) + +Shutdown (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Class Shutdown

    @@ -355,8 +350,8 @@

    hashCode

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/SubsystemHealth.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/SubsystemHealth.html index b8844a4ec23..6991a272ce3 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/SubsystemHealth.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/SubsystemHealth.html @@ -2,10 +2,10 @@ - -SubsystemHealth (weblogic-kubernetes-operator 2.6.0 API) + +SubsystemHealth (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/WlsDomain.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/WlsDomain.html index f9bb232f0d4..c83bc4480b2 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/WlsDomain.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/WlsDomain.html @@ -2,10 +2,10 @@ - -WlsDomain (weblogic-kubernetes-operator 2.6.0 API) + +WlsDomain (weblogic-kubernetes-operator 3.0.0 API) - + @@ -31,9 +31,9 @@ -
    + - - +
    - +
    +

    Interface WlsDomain

    @@ -185,8 +180,8 @@

    getReplicaLimit

    -
    +

    Copyright © 2017–2020. All rights reserved.

    +
    + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminServer.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminServer.html index 6e002273b76..3d42404c2c5 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminServer.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminServer.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.AdminServer (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.AdminServer (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.AdminServer

    @@ -157,5 +152,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminServerSpec.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminServerSpec.html index 03b25ea817b..f7d1608a92c 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminServerSpec.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminServerSpec.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.weblogic.domain.model.AdminServerSpec (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.weblogic.domain.model.AdminServerSpec (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.weblogic.domain.model.AdminServerSpec

    @@ -198,5 +193,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminServerSpecCommonImpl.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminServerSpecCommonImpl.html index 3e8bc655111..8c1531fffb8 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminServerSpecCommonImpl.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminServerSpecCommonImpl.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.AdminServerSpecCommonImpl (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.AdminServerSpecCommonImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.AdminServerSpecCommonImpl

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminService.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminService.html index d10f903d29c..0204242a99f 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminService.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/AdminService.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.AdminService (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.AdminService (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.AdminService

    @@ -230,5 +225,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/BaseConfiguration.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/BaseConfiguration.html index d46dbeb0c10..fb5cb1033ec 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/BaseConfiguration.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/BaseConfiguration.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.BaseConfiguration (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.BaseConfiguration (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.BaseConfiguration

    @@ -173,5 +168,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Channel.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Channel.html index 02e39e40398..2b9a6fa1b6c 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Channel.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Channel.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.Channel (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.Channel (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.Channel

    @@ -204,5 +199,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Cluster.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Cluster.html index f3d7d627133..13fb279af47 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Cluster.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Cluster.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.Cluster (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.Cluster (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.Cluster

    @@ -175,7 +170,8 @@

    Uses of DomainSpec DomainSpec.withCluster​(Cluster cluster) -
    Adds a Cluster to the DomainSpec.
    +
    /** + Adds a Cluster to the DomainSpec.
    @@ -242,5 +238,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ClusterSpec.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ClusterSpec.html index e3bfda05e37..d30d9df2d47 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ClusterSpec.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ClusterSpec.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.ClusterSpec (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.ClusterSpec (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.ClusterSpec

    @@ -200,5 +195,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ClusterSpecCommonImpl.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ClusterSpecCommonImpl.html index b6b72d0363c..b41a2af182b 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ClusterSpecCommonImpl.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ClusterSpecCommonImpl.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.ClusterSpecCommonImpl (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.ClusterSpecCommonImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.ClusterSpecCommonImpl

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ClusterStatus.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ClusterStatus.html index f1f1fde252b..890590411c2 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ClusterStatus.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ClusterStatus.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.ClusterStatus (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.ClusterStatus (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.ClusterStatus

    @@ -249,5 +244,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Configuration.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Configuration.html index db537555927..fc147d76550 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Configuration.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Configuration.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.Configuration (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.Configuration (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.Configuration

    @@ -109,6 +104,11 @@

    Uses of Configuration +DomainSpec.getConfiguration() +  + + +Configuration Configuration.withIstio​(Istio istio)   @@ -127,8 +127,8 @@

    Uses of -DomainSpec -DomainSpec.withConfiguration​(Configuration configuration) +void +DomainSpec.setConfiguration​(Configuration configuration)   @@ -168,5 +168,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ConfigurationConstants.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ConfigurationConstants.html index 9c647568798..abd2c7fd0d1 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ConfigurationConstants.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ConfigurationConstants.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.weblogic.domain.model.ConfigurationConstants (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.weblogic.domain.model.ConfigurationConstants (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.weblogic.domain.model.ConfigurationConstants

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Domain.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Domain.html index 13db00a81a6..e03cc05d15b 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Domain.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Domain.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.Domain (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.Domain (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.Domain

    @@ -157,6 +152,16 @@

    Uses of +MakeRightDomainOperation +DomainProcessor.createMakeRightOperation​(Domain liveDomain) +  + + +MakeRightDomainOperation +DomainProcessorImpl.createMakeRightOperation​(Domain liveDomain) +  + + static JobWatcher JobWatcher.getOrCreateFor​(Domain domain) @@ -430,7 +435,7 @@

    Uses of static DomainPresenceStep DomainPresenceStep.createDomainPresenceStep​(Domain dom, -Step adminStep, +Step domainUpSteps, Step managedServerStep)   @@ -1118,5 +1123,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainCommonConfigurator.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainCommonConfigurator.html index bad6305ccf4..76d065159ab 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainCommonConfigurator.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainCommonConfigurator.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.DomainCommonConfigurator

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainCondition.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainCondition.html index b042650fa1f..9a0a9fdf5d0 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainCondition.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainCondition.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.DomainCondition (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.DomainCondition (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.DomainCondition

    @@ -132,7 +127,7 @@

    Uses of DomainCondition DomainCondition.withStatus​(java.lang.String status) -
    Status is the status of the condition.
    +
    The status of the condition.
    @@ -253,5 +248,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainConditionType.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainConditionType.html index 5e357475191..ef1c2c58c8c 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainConditionType.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainConditionType.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.DomainConditionType (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.DomainConditionType (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.DomainConditionType

    @@ -202,5 +197,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainList.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainList.html index a9e82cc5e18..4311f145c8d 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainList.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainList.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.DomainList (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.DomainList (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.DomainList

    @@ -325,5 +320,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainSpec.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainSpec.html index f99d765e2d6..edcb636af7f 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainSpec.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainSpec.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.DomainSpec (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.DomainSpec (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.DomainSpec

    @@ -167,7 +162,8 @@

    Uses of DomainSpec DomainSpec.withCluster​(Cluster cluster) -
    Adds a Cluster to the DomainSpec.
    +
    /** + Adds a Cluster to the DomainSpec.
    @@ -177,31 +173,33 @@

    Uses of DomainSpec -DomainSpec.withConfiguration​(Configuration configuration) -  - - -DomainSpec DomainSpec.withDomainHomeInImage​(boolean domainHomeInImage)   - + DomainSpec DomainSpec.withDomainUid​(java.lang.String domainUid)
    Domain unique identifier.
    - + DomainSpec DomainSpec.withImage​(java.lang.String image)   - + DomainSpec DomainSpec.withIncludeServerOutInPodLog​(boolean includeServerOutInPodLog)   + +DomainSpec +DomainSpec.withOpssKeyPassPhrase​(io.kubernetes.client.openapi.models.V1SecretReference opssKeyPassPhrase) + +
    Reference to secret containing WebLogic startup credentials user name and password.
    + + DomainSpec DomainSpec.withReplicas​(java.lang.Integer replicas) @@ -214,7 +212,7 @@

    Uses of DomainSpec DomainSpec.withWebLogicCredentialsSecret​(io.kubernetes.client.openapi.models.V1SecretReference webLogicCredentialsSecret) -
    Reference to secret containing WebLogic startup credentials username and password.
    +
    Reference to secret containing WebLogic startup credentials user name and password.
    @@ -313,5 +311,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainStatus.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainStatus.html index 93d02668277..443878625cd 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainStatus.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainStatus.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.DomainStatus (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.DomainStatus (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.DomainStatus

    @@ -163,7 +158,7 @@

    Uses of DomainStatus DomainStatus.withServers​(java.util.List<ServerStatus> servers) -
    Status of WebLogic servers in this domain.
    +
    Status of WebLogic Servers in this domain.
    @@ -256,5 +251,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainValidationFailure.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainValidationFailure.html index f6622793cdc..626ec402b27 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainValidationFailure.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/DomainValidationFailure.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.DomainValidationFailure (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.DomainValidationFailure (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.DomainValidationFailure

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/IntrospectorJobEnvVars.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/IntrospectorJobEnvVars.html index 30d4b217fc6..f1ebf138537 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/IntrospectorJobEnvVars.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/IntrospectorJobEnvVars.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.IntrospectorJobEnvVars (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.IntrospectorJobEnvVars (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.IntrospectorJobEnvVars

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Istio.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Istio.html index 0dba166ccff..df716eb5a32 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Istio.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Istio.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.Istio (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.Istio (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.Istio

    @@ -180,5 +175,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/KubernetesResourceLookup.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/KubernetesResourceLookup.html index 03d88b264b8..13f5e934bc9 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/KubernetesResourceLookup.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/KubernetesResourceLookup.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.weblogic.domain.model.KubernetesResourceLookup (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.weblogic.domain.model.KubernetesResourceLookup (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.weblogic.domain.model.KubernetesResourceLookup

    @@ -149,5 +144,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ManagedServer.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ManagedServer.html index 95aa29cf837..6cb819d88ca 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ManagedServer.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ManagedServer.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.ManagedServer (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.ManagedServer (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.ManagedServer

    @@ -187,5 +182,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ManagedServerSpecCommonImpl.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ManagedServerSpecCommonImpl.html index d1d64175785..32706cdf2a6 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ManagedServerSpecCommonImpl.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ManagedServerSpecCommonImpl.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.ManagedServerSpecCommonImpl (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.ManagedServerSpecCommonImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.ManagedServerSpecCommonImpl

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Model.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Model.html new file mode 100644 index 00000000000..b6a746f8c05 --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Model.html @@ -0,0 +1,189 @@ + + + + + +Uses of Class oracle.kubernetes.weblogic.domain.model.Model (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.Model

    +
    +
    +
    + + + + + + + + + + + + + + +
    Packages that use Model 
    PackageDescription
    oracle.kubernetes.weblogic.domain.model +
    Model classes that are part of the WebLogic Custom Resource extensions to the Kubernetes API.
    +
    +
    +
    + +
    +
    +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Opss.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Opss.html new file mode 100644 index 00000000000..46d556f9fce --- /dev/null +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Opss.html @@ -0,0 +1,179 @@ + + + + + +Uses of Class oracle.kubernetes.weblogic.domain.model.Opss (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.Opss

    +
    +
    +
    + + + + + + + + + + + + + + +
    Packages that use Opss 
    PackageDescription
    oracle.kubernetes.weblogic.domain.model +
    Model classes that are part of the WebLogic Custom Resource extensions to the Kubernetes API.
    +
    +
    +
    + +
    +
    +
    + +
    +
    + + diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/PatchableComponent.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/PatchableComponent.html index 316cd1a3b13..0956c75c8e8 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/PatchableComponent.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/PatchableComponent.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.weblogic.domain.model.PatchableComponent (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.weblogic.domain.model.PatchableComponent (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.weblogic.domain.model.PatchableComponent

    @@ -172,5 +167,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ProbeTuning.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ProbeTuning.html index 2cc26aea60f..7b419d118d4 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ProbeTuning.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ProbeTuning.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.ProbeTuning (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.ProbeTuning (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.ProbeTuning

    @@ -189,5 +184,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Server.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Server.html index 1784ac63dbc..f54fc8fca45 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Server.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Server.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.Server (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.Server (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.Server

    @@ -195,5 +190,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerEnvVars.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerEnvVars.html index b03af4ae7ad..41b2d80bb0a 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerEnvVars.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerEnvVars.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.ServerEnvVars (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.ServerEnvVars (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.ServerEnvVars

    @@ -99,5 +94,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerHealth.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerHealth.html index a8ede09f886..a8bd1857991 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerHealth.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerHealth.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.ServerHealth (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.ServerHealth (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.ServerHealth

    @@ -186,5 +181,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerService.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerService.html index 501fe2b5ee6..56495bea36c 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerService.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerService.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.ServerService (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.ServerService (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.ServerService

    @@ -149,5 +144,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerSpec.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerSpec.html index b6ae8e3cfad..00976ead704 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerSpec.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerSpec.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.weblogic.domain.model.ServerSpec (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.weblogic.domain.model.ServerSpec (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.weblogic.domain.model.ServerSpec

    @@ -285,5 +280,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerSpecBase.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerSpecBase.html index 85f08365d83..0c2b6691870 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerSpecBase.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerSpecBase.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.ServerSpecBase (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.ServerSpecBase (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.ServerSpecBase

    @@ -161,5 +156,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerSpecCommonImpl.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerSpecCommonImpl.html index 712e23a1d38..7e355a5b8d8 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerSpecCommonImpl.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerSpecCommonImpl.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.ServerSpecCommonImpl (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.ServerSpecCommonImpl (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.ServerSpecCommonImpl

    @@ -154,5 +149,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerStatus.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerStatus.html index fcd822f56a6..669e68fba89 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerStatus.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/ServerStatus.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.ServerStatus (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.ServerStatus (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.ServerStatus

    @@ -174,7 +169,7 @@

    Uses of java.util.List<ServerStatus> DomainStatus.getServers() -
    Status of WebLogic servers in this domain.
    +
    Status of WebLogic Servers in this domain.
    @@ -226,14 +221,14 @@

    Uses of void DomainStatus.setServers​(java.util.List<ServerStatus> servers) -
    Status of WebLogic servers in this domain.
    +
    Status of WebLogic Servers in this domain.
    DomainStatus DomainStatus.withServers​(java.util.List<ServerStatus> servers) -
    Status of WebLogic servers in this domain.
    +
    Status of WebLogic Servers in this domain.
    @@ -273,5 +268,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Shutdown.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Shutdown.html index da9385bb57e..d1d4078f5e2 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Shutdown.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/Shutdown.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.Shutdown (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.Shutdown (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.Shutdown

    @@ -186,5 +181,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/SubsystemHealth.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/SubsystemHealth.html index fb3cc78ff64..080243643b9 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/SubsystemHealth.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/SubsystemHealth.html @@ -2,10 +2,10 @@ - -Uses of Class oracle.kubernetes.weblogic.domain.model.SubsystemHealth (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Class oracle.kubernetes.weblogic.domain.model.SubsystemHealth (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Class
    oracle.kubernetes.weblogic.domain.model.SubsystemHealth

    @@ -224,5 +219,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/WlsDomain.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/WlsDomain.html index eae21e87fd1..6b2f6097fe7 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/WlsDomain.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/class-use/WlsDomain.html @@ -2,10 +2,10 @@ - -Uses of Interface oracle.kubernetes.weblogic.domain.model.WlsDomain (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Interface oracle.kubernetes.weblogic.domain.model.WlsDomain (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Interface
    oracle.kubernetes.weblogic.domain.model.WlsDomain

    @@ -151,5 +146,7 @@

    Uses of Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/package-summary.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/package-summary.html index 65809b39947..4a6440f2497 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.weblogic.domain.model (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.weblogic.domain.model (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.weblogic.domain.model

    @@ -239,6 +234,14 @@

    Package oracle.kubernetes.weblogic.domain   +Model +  + + +Opss +  + + ProbeTuning   @@ -345,5 +348,7 @@

    Package oracle.kubernetes.weblogic.domain

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/package-tree.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/package-tree.html index a126224ab5b..067dd84cb2c 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.weblogic.domain.model Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.weblogic.domain.model Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.weblogic.domain.model

    @@ -112,6 +107,8 @@

    Class Hierarchy

  • oracle.kubernetes.weblogic.domain.model.DomainValidationFailure
  • oracle.kubernetes.weblogic.domain.model.IntrospectorJobEnvVars
  • oracle.kubernetes.weblogic.domain.model.Istio
  • +
  • oracle.kubernetes.weblogic.domain.model.Model
  • +
  • oracle.kubernetes.weblogic.domain.model.Opss
  • oracle.kubernetes.weblogic.domain.model.ProbeTuning
  • oracle.kubernetes.weblogic.domain.model.ServerEnvVars
  • oracle.kubernetes.weblogic.domain.model.ServerHealth
  • @@ -191,5 +188,7 @@

    Enum Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/package-use.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/package-use.html index 62f96bc378d..cb9be49ff00 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/model/package-use.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/model/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.weblogic.domain.model (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.weblogic.domain.model (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.weblogic.domain.model

    @@ -450,6 +445,14 @@

      +Model +  + + +Opss +  + + PatchableComponent   @@ -540,5 +543,7 @@

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/package-summary.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/package-summary.html index 1706bcd00c4..0b7a0c33afd 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/package-summary.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/package-summary.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.weblogic.domain (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.weblogic.domain (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Package oracle.kubernetes.weblogic.domain

    @@ -196,5 +191,7 @@

    Package oracle.kubernetes.weblogic.domain

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/package-tree.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/package-tree.html index 8da773051d5..e87d239e487 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/package-tree.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/package-tree.html @@ -2,10 +2,10 @@ - -oracle.kubernetes.weblogic.domain Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +oracle.kubernetes.weblogic.domain Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For Package oracle.kubernetes.weblogic.domain

    @@ -145,5 +140,7 @@

    Interface Hierarchy

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/oracle/kubernetes/weblogic/domain/package-use.html b/docs/apidocs/oracle/kubernetes/weblogic/domain/package-use.html index c9dcc32a042..4549f8173c3 100644 --- a/docs/apidocs/oracle/kubernetes/weblogic/domain/package-use.html +++ b/docs/apidocs/oracle/kubernetes/weblogic/domain/package-use.html @@ -2,10 +2,10 @@ - -Uses of Package oracle.kubernetes.weblogic.domain (weblogic-kubernetes-operator 2.6.0 API) + +Uses of Package oracle.kubernetes.weblogic.domain (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Uses of Package
    oracle.kubernetes.weblogic.domain

    @@ -221,5 +216,7 @@

    Uses

    Copyright © 2017–2020. All rights reserved.

    +

    +
    diff --git a/docs/apidocs/overview-summary.html b/docs/apidocs/overview-summary.html index fdb8ec0cc00..b9ee4ab0bf9 100644 --- a/docs/apidocs/overview-summary.html +++ b/docs/apidocs/overview-summary.html @@ -2,10 +2,10 @@ - -weblogic-kubernetes-operator 2.6.0 API + +weblogic-kubernetes-operator 3.0.0 API - + diff --git a/docs/apidocs/overview-tree.html b/docs/apidocs/overview-tree.html index c9b83470f52..985da681487 100644 --- a/docs/apidocs/overview-tree.html +++ b/docs/apidocs/overview-tree.html @@ -2,10 +2,10 @@ - -Class Hierarchy (weblogic-kubernetes-operator 2.6.0 API) + +Class Hierarchy (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Hierarchy For All Packages

    @@ -186,8 +181,6 @@

    Class Hierarchy

  • oracle.kubernetes.operator.helpers.ConfigMapHelper
  • -
  • oracle.kubernetes.operator.helpers.ConfigMapHelper.DomainTopology
  • -
  • oracle.kubernetes.operator.helpers.ConfigMapHelper.SitConfigMapContext
  • oracle.kubernetes.operator.ConfigMapWatcher
  • oracle.kubernetes.weblogic.domain.model.Configuration
  • oracle.kubernetes.operator.work.Container (implements oracle.kubernetes.operator.work.ComponentEx, oracle.kubernetes.operator.work.ComponentRegistry)
  • @@ -198,6 +191,7 @@

    Class Hierarchy

  • oracle.kubernetes.operator.helpers.CrdHelper
  • oracle.kubernetes.weblogic.domain.model.Domain
  • +
  • oracle.kubernetes.operator.rest.model.DomainAction
  • oracle.kubernetes.weblogic.domain.model.DomainCondition (implements java.lang.Comparable<T>, oracle.kubernetes.weblogic.domain.model.PatchableComponent<T>)
  • oracle.kubernetes.operator.helpers.DomainConfig
  • oracle.kubernetes.weblogic.domain.DomainConfigurator @@ -214,6 +208,7 @@

    Class Hierarchy

  • oracle.kubernetes.weblogic.domain.model.DomainStatus
  • oracle.kubernetes.operator.helpers.DomainStatusPatch
  • oracle.kubernetes.operator.DomainStatusUpdater
  • +
  • oracle.kubernetes.operator.helpers.DomainTopology
  • oracle.kubernetes.weblogic.domain.model.DomainValidationFailure
  • oracle.kubernetes.operator.helpers.DomainValidationSteps
  • oracle.kubernetes.operator.DomainWatcher
  • @@ -244,15 +239,16 @@

    Class Hierarchy

  • oracle.kubernetes.operator.utils.KubernetesExecFactoryImpl (implements oracle.kubernetes.operator.utils.KubernetesExecFactory)
  • oracle.kubernetes.json.KubernetesSchemaReference
  • oracle.kubernetes.operator.helpers.KubernetesUtils
  • -
  • oracle.kubernetes.operator.helpers.KubernetesVersion
  • oracle.kubernetes.operator.helpers.LastKnownStatus
  • oracle.kubernetes.operator.helpers.LegalNames
  • +
  • oracle.kubernetes.operator.logging.LoggingContext (implements java.lang.AutoCloseable)
  • oracle.kubernetes.operator.logging.LoggingFacade
  • oracle.kubernetes.operator.logging.LoggingFactory
  • oracle.kubernetes.operator.wlsconfig.MacroSubstitutor
  • oracle.kubernetes.operator.Main
  • oracle.kubernetes.json.mojo.MainImpl (implements oracle.kubernetes.json.mojo.Main)
  • oracle.kubernetes.operator.logging.MessageKeys
  • +
  • oracle.kubernetes.weblogic.domain.model.Model
  • oracle.kubernetes.operator.NamespaceStatus
  • oracle.kubernetes.operator.NamespaceWatcher
  • oracle.kubernetes.operator.wlsconfig.NetworkAccessPoint
  • @@ -261,7 +257,7 @@

    Class Hierarchy

  • oracle.kubernetes.operator.OperatorLiveness (implements java.lang.Runnable)
  • oracle.kubernetes.operator.OperatorReady
  • oracle.kubernetes.utils.OperatorUtils
  • -
  • oracle.kubernetes.operator.calls.OtherUnrecoverableErrorBuilder (implements oracle.kubernetes.operator.calls.FailureStatusSource)
  • +
  • oracle.kubernetes.weblogic.domain.model.Opss
  • oracle.kubernetes.operator.Pair<L,​R>
  • oracle.kubernetes.operator.utils.PatchUtils
  • oracle.kubernetes.operator.helpers.PodHelper
  • @@ -281,6 +277,11 @@

    Class Hierarchy

  • oracle.kubernetes.operator.rest.Scan
  • oracle.kubernetes.json.SchemaGenerator
  • oracle.kubernetes.operator.helpers.SecretHelper
  • +
  • oracle.kubernetes.operator.helpers.SemanticVersion (implements java.lang.Comparable<T>) + +
  • oracle.kubernetes.operator.helpers.ServerConfig
  • +
  • oracle.kubernetes.operator.helpers.ConfigMapHelper.IntrospectorConfigMapContext
  • oracle.kubernetes.weblogic.domain.model.SubsystemHealth (implements java.lang.Comparable<T>, oracle.kubernetes.weblogic.domain.model.PatchableComponent<T>)
  • @@ -369,16 +371,14 @@

    Class Hierarchy

  • oracle.kubernetes.operator.TuningParameters.MainTuning
  • oracle.kubernetes.operator.TuningParameters.PodTuning
  • oracle.kubernetes.operator.TuningParameters.WatchTuning
  • -
  • oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder (implements oracle.kubernetes.operator.calls.FailureStatusSource)
  • oracle.kubernetes.operator.calls.UnrecoverableErrorBuilder
  • -
  • oracle.kubernetes.operator.helpers.VersionHelper
  • +
  • oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl (implements oracle.kubernetes.operator.calls.FailureStatusSource)
  • oracle.kubernetes.operator.rest.backend.VersionUtils
  • oracle.kubernetes.operator.builders.WatchBuilder
  • oracle.kubernetes.operator.builders.WatchImpl<T> (implements oracle.kubernetes.operator.builders.WatchI<T>)
  • oracle.kubernetes.weblogic.domain.api.WeblogicApi
  • oracle.kubernetes.operator.wlsconfig.WlsClusterConfig
  • oracle.kubernetes.operator.wlsconfig.WlsDomainConfig (implements oracle.kubernetes.weblogic.domain.model.WlsDomain)
  • -
  • oracle.kubernetes.operator.utils.WlsDomainConfigSupport
  • oracle.kubernetes.operator.wlsconfig.WlsDynamicServersConfig
  • oracle.kubernetes.operator.wlsconfig.WlsMachineConfig
  • oracle.kubernetes.operator.wlsconfig.WlsServerConfig @@ -422,6 +422,7 @@

    Interface Hierarchy

  • oracle.kubernetes.operator.calls.FailureStatusSource
  • oracle.kubernetes.operator.work.Fiber.CompletionCallback
  • oracle.kubernetes.operator.work.Fiber.ExitCallback
  • +
  • oracle.kubernetes.operator.IntrospectorConfigMapKeys
  • java.lang.Iterable<T>
  • +
    diff --git a/docs/apidocs/package-search-index.zip b/docs/apidocs/package-search-index.zip index a620096c6556cbf7a9c70bcfa06ab5581abc65d1..794e0614ffff8473ddcbe17139a6ac2d1b736251 100644 GIT binary patch delta 30 kcmZo+ZeivP@MdNaVc_84VEA76aU-u9BQubmY{uvZ0B?T?oB#j- delta 30 kcmZo+ZeivP@MdNaVc_84U=VG+wvktjkr_x&He>Vy09(BV$^ZZW diff --git a/docs/apidocs/script-dir/jszip/dist/jszip.js b/docs/apidocs/script-dir/jszip/dist/jszip.js index 02804cdfd06..e53c056b262 100644 --- a/docs/apidocs/script-dir/jszip/dist/jszip.js +++ b/docs/apidocs/script-dir/jszip/dist/jszip.js @@ -1,6 +1,6 @@ /*! -JSZip v3.1.5 - A JavaScript class for generating and reading zip files +JSZip v3.2.1 - A JavaScript class for generating and reading zip files (c) 2009-2016 Stuart Knightley @@ -324,7 +324,7 @@ module.exports = { Promise: ES6Promise }; -},{"lie":58}],7:[function(require,module,exports){ +},{"lie":37}],7:[function(require,module,exports){ 'use strict'; var USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined'); @@ -411,7 +411,7 @@ exports.uncompressWorker = function () { return new FlateWorker("Inflate", {}); }; -},{"./stream/GenericWorker":28,"./utils":32,"pako":59}],8:[function(require,module,exports){ +},{"./stream/GenericWorker":28,"./utils":32,"pako":38}],8:[function(require,module,exports){ 'use strict'; var utils = require('../utils'); @@ -1057,7 +1057,7 @@ JSZip.defaults = require('./defaults'); // TODO find a better way to handle this version, // a require('package.json').version doesn't work with webpack, see #327 -JSZip.version = "3.1.5"; +JSZip.version = "3.2.0"; JSZip.loadAsync = function (content, options) { return new JSZip().loadAsync(content, options); @@ -1287,13 +1287,16 @@ module.exports = { * @return {Buffer} a new Buffer. */ newBufferFrom: function(data, encoding) { - // XXX We can't use `Buffer.from` which comes from `Uint8Array.from` - // in nodejs v4 (< v.4.5). It's not the expected implementation (and - // has a different signature). - // see https://github.com/nodejs/node/issues/8053 - // A condition on nodejs' version won't solve the issue as we don't - // control the Buffer polyfills that may or may not be used. - return new Buffer(data, encoding); + if (Buffer.from && Buffer.from !== Uint8Array.from) { + return Buffer.from(data, encoding); + } else { + if (typeof data === "number") { + // Safeguard for old Node.js versions. On newer versions, + // Buffer.from(number) / Buffer(number, encoding) already throw. + throw new Error("The \"data\" argument must not be a number"); + } + return new Buffer(data, encoding); + } }, /** * Create a new nodejs Buffer with the specified size. @@ -1304,7 +1307,9 @@ module.exports = { if (Buffer.alloc) { return Buffer.alloc(size); } else { - return new Buffer(size); + var buf = new Buffer(size); + buf.fill(0); + return buf; } }, /** @@ -3032,7 +3037,7 @@ exports.Utf8EncodeWorker = Utf8EncodeWorker; var support = require('./support'); var base64 = require('./base64'); var nodejsUtils = require('./nodejsUtils'); -var setImmediate = require('core-js/library/fn/set-immediate'); +var setImmediate = require('set-immediate-shim'); var external = require("./external"); @@ -3504,7 +3509,7 @@ exports.prepareContent = function(name, inputData, isBinary, isOptimizedBinarySt }); }; -},{"./base64":1,"./external":6,"./nodejsUtils":14,"./support":30,"core-js/library/fn/set-immediate":36}],33:[function(require,module,exports){ +},{"./base64":1,"./external":6,"./nodejsUtils":14,"./support":30,"set-immediate-shim":54}],33:[function(require,module,exports){ 'use strict'; var readerFor = require('./reader/readerFor'); var utils = require('./utils'); @@ -4198,296 +4203,6 @@ for(var i = 0; i < removedMethods.length; i++) { module.exports = ZipObject; },{"./compressedObject":2,"./stream/DataWorker":27,"./stream/GenericWorker":28,"./stream/StreamHelper":29,"./utf8":31}],36:[function(require,module,exports){ -require('../modules/web.immediate'); -module.exports = require('../modules/_core').setImmediate; -},{"../modules/_core":40,"../modules/web.immediate":56}],37:[function(require,module,exports){ -module.exports = function(it){ - if(typeof it != 'function')throw TypeError(it + ' is not a function!'); - return it; -}; -},{}],38:[function(require,module,exports){ -var isObject = require('./_is-object'); -module.exports = function(it){ - if(!isObject(it))throw TypeError(it + ' is not an object!'); - return it; -}; -},{"./_is-object":51}],39:[function(require,module,exports){ -var toString = {}.toString; - -module.exports = function(it){ - return toString.call(it).slice(8, -1); -}; -},{}],40:[function(require,module,exports){ -var core = module.exports = {version: '2.3.0'}; -if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef -},{}],41:[function(require,module,exports){ -// optional / simple context binding -var aFunction = require('./_a-function'); -module.exports = function(fn, that, length){ - aFunction(fn); - if(that === undefined)return fn; - switch(length){ - case 1: return function(a){ - return fn.call(that, a); - }; - case 2: return function(a, b){ - return fn.call(that, a, b); - }; - case 3: return function(a, b, c){ - return fn.call(that, a, b, c); - }; - } - return function(/* ...args */){ - return fn.apply(that, arguments); - }; -}; -},{"./_a-function":37}],42:[function(require,module,exports){ -// Thank's IE8 for his funny defineProperty -module.exports = !require('./_fails')(function(){ - return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; -}); -},{"./_fails":45}],43:[function(require,module,exports){ -var isObject = require('./_is-object') - , document = require('./_global').document - // in old IE typeof document.createElement is 'object' - , is = isObject(document) && isObject(document.createElement); -module.exports = function(it){ - return is ? document.createElement(it) : {}; -}; -},{"./_global":46,"./_is-object":51}],44:[function(require,module,exports){ -var global = require('./_global') - , core = require('./_core') - , ctx = require('./_ctx') - , hide = require('./_hide') - , PROTOTYPE = 'prototype'; - -var $export = function(type, name, source){ - var IS_FORCED = type & $export.F - , IS_GLOBAL = type & $export.G - , IS_STATIC = type & $export.S - , IS_PROTO = type & $export.P - , IS_BIND = type & $export.B - , IS_WRAP = type & $export.W - , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) - , expProto = exports[PROTOTYPE] - , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] - , key, own, out; - if(IS_GLOBAL)source = name; - for(key in source){ - // contains in native - own = !IS_FORCED && target && target[key] !== undefined; - if(own && key in exports)continue; - // export native or passed - out = own ? target[key] : source[key]; - // prevent global pollution for namespaces - exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] - // bind timers to global for call from export context - : IS_BIND && own ? ctx(out, global) - // wrap global constructors for prevent change them in library - : IS_WRAP && target[key] == out ? (function(C){ - var F = function(a, b, c){ - if(this instanceof C){ - switch(arguments.length){ - case 0: return new C; - case 1: return new C(a); - case 2: return new C(a, b); - } return new C(a, b, c); - } return C.apply(this, arguments); - }; - F[PROTOTYPE] = C[PROTOTYPE]; - return F; - // make static versions for prototype methods - })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; - // export proto methods to core.%CONSTRUCTOR%.methods.%NAME% - if(IS_PROTO){ - (exports.virtual || (exports.virtual = {}))[key] = out; - // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% - if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out); - } - } -}; -// type bitmap -$export.F = 1; // forced -$export.G = 2; // global -$export.S = 4; // static -$export.P = 8; // proto -$export.B = 16; // bind -$export.W = 32; // wrap -$export.U = 64; // safe -$export.R = 128; // real proto method for `library` -module.exports = $export; -},{"./_core":40,"./_ctx":41,"./_global":46,"./_hide":47}],45:[function(require,module,exports){ -module.exports = function(exec){ - try { - return !!exec(); - } catch(e){ - return true; - } -}; -},{}],46:[function(require,module,exports){ -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -var global = module.exports = typeof window != 'undefined' && window.Math == Math - ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); -if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef -},{}],47:[function(require,module,exports){ -var dP = require('./_object-dp') - , createDesc = require('./_property-desc'); -module.exports = require('./_descriptors') ? function(object, key, value){ - return dP.f(object, key, createDesc(1, value)); -} : function(object, key, value){ - object[key] = value; - return object; -}; -},{"./_descriptors":42,"./_object-dp":52,"./_property-desc":53}],48:[function(require,module,exports){ -module.exports = require('./_global').document && document.documentElement; -},{"./_global":46}],49:[function(require,module,exports){ -module.exports = !require('./_descriptors') && !require('./_fails')(function(){ - return Object.defineProperty(require('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7; -}); -},{"./_descriptors":42,"./_dom-create":43,"./_fails":45}],50:[function(require,module,exports){ -// fast apply, http://jsperf.lnkit.com/fast-apply/5 -module.exports = function(fn, args, that){ - var un = that === undefined; - switch(args.length){ - case 0: return un ? fn() - : fn.call(that); - case 1: return un ? fn(args[0]) - : fn.call(that, args[0]); - case 2: return un ? fn(args[0], args[1]) - : fn.call(that, args[0], args[1]); - case 3: return un ? fn(args[0], args[1], args[2]) - : fn.call(that, args[0], args[1], args[2]); - case 4: return un ? fn(args[0], args[1], args[2], args[3]) - : fn.call(that, args[0], args[1], args[2], args[3]); - } return fn.apply(that, args); -}; -},{}],51:[function(require,module,exports){ -module.exports = function(it){ - return typeof it === 'object' ? it !== null : typeof it === 'function'; -}; -},{}],52:[function(require,module,exports){ -var anObject = require('./_an-object') - , IE8_DOM_DEFINE = require('./_ie8-dom-define') - , toPrimitive = require('./_to-primitive') - , dP = Object.defineProperty; - -exports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){ - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if(IE8_DOM_DEFINE)try { - return dP(O, P, Attributes); - } catch(e){ /* empty */ } - if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!'); - if('value' in Attributes)O[P] = Attributes.value; - return O; -}; -},{"./_an-object":38,"./_descriptors":42,"./_ie8-dom-define":49,"./_to-primitive":55}],53:[function(require,module,exports){ -module.exports = function(bitmap, value){ - return { - enumerable : !(bitmap & 1), - configurable: !(bitmap & 2), - writable : !(bitmap & 4), - value : value - }; -}; -},{}],54:[function(require,module,exports){ -var ctx = require('./_ctx') - , invoke = require('./_invoke') - , html = require('./_html') - , cel = require('./_dom-create') - , global = require('./_global') - , process = global.process - , setTask = global.setImmediate - , clearTask = global.clearImmediate - , MessageChannel = global.MessageChannel - , counter = 0 - , queue = {} - , ONREADYSTATECHANGE = 'onreadystatechange' - , defer, channel, port; -var run = function(){ - var id = +this; - if(queue.hasOwnProperty(id)){ - var fn = queue[id]; - delete queue[id]; - fn(); - } -}; -var listener = function(event){ - run.call(event.data); -}; -// Node.js 0.9+ & IE10+ has setImmediate, otherwise: -if(!setTask || !clearTask){ - setTask = function setImmediate(fn){ - var args = [], i = 1; - while(arguments.length > i)args.push(arguments[i++]); - queue[++counter] = function(){ - invoke(typeof fn == 'function' ? fn : Function(fn), args); - }; - defer(counter); - return counter; - }; - clearTask = function clearImmediate(id){ - delete queue[id]; - }; - // Node.js 0.8- - if(require('./_cof')(process) == 'process'){ - defer = function(id){ - process.nextTick(ctx(run, id, 1)); - }; - // Browsers with MessageChannel, includes WebWorkers - } else if(MessageChannel){ - channel = new MessageChannel; - port = channel.port2; - channel.port1.onmessage = listener; - defer = ctx(port.postMessage, port, 1); - // Browsers with postMessage, skip WebWorkers - // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' - } else if(global.addEventListener && typeof postMessage == 'function' && !global.importScripts){ - defer = function(id){ - global.postMessage(id + '', '*'); - }; - global.addEventListener('message', listener, false); - // IE8- - } else if(ONREADYSTATECHANGE in cel('script')){ - defer = function(id){ - html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){ - html.removeChild(this); - run.call(id); - }; - }; - // Rest old browsers - } else { - defer = function(id){ - setTimeout(ctx(run, id, 1), 0); - }; - } -} -module.exports = { - set: setTask, - clear: clearTask -}; -},{"./_cof":39,"./_ctx":41,"./_dom-create":43,"./_global":46,"./_html":48,"./_invoke":50}],55:[function(require,module,exports){ -// 7.1.1 ToPrimitive(input [, PreferredType]) -var isObject = require('./_is-object'); -// instead of the ES6 spec version, we didn't implement @@toPrimitive case -// and the second argument - flag - preferred type is a string -module.exports = function(it, S){ - if(!isObject(it))return it; - var fn, val; - if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val; - if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - throw TypeError("Can't convert object to primitive value"); -}; -},{"./_is-object":51}],56:[function(require,module,exports){ -var $export = require('./_export') - , $task = require('./_task'); -$export($export.G + $export.B, { - setImmediate: $task.set, - clearImmediate: $task.clear -}); -},{"./_export":44,"./_task":54}],57:[function(require,module,exports){ (function (global){ 'use strict'; var Mutation = global.MutationObserver || global.WebKitMutationObserver; @@ -4560,7 +4275,7 @@ function immediate(task) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],58:[function(require,module,exports){ +},{}],37:[function(require,module,exports){ 'use strict'; var immediate = require('immediate'); @@ -4587,6 +4302,26 @@ function Promise(resolver) { } } +Promise.prototype["finally"] = function (callback) { + if (typeof callback !== 'function') { + return this; + } + var p = this.constructor; + return this.then(resolve, reject); + + function resolve(value) { + function yes () { + return value; + } + return p.resolve(callback()).then(yes); + } + function reject(reason) { + function no () { + throw reason; + } + return p.resolve(callback()).then(no); + } +}; Promise.prototype["catch"] = function (onRejected) { return this.then(null, onRejected); }; @@ -4815,7 +4550,7 @@ function race(iterable) { } } -},{"immediate":57}],59:[function(require,module,exports){ +},{"immediate":36}],38:[function(require,module,exports){ // Top level file is just a mixin of submodules & constants 'use strict'; @@ -4831,7 +4566,7 @@ assign(pako, deflate, inflate, constants); module.exports = pako; -},{"./lib/deflate":60,"./lib/inflate":61,"./lib/utils/common":62,"./lib/zlib/constants":65}],60:[function(require,module,exports){ +},{"./lib/deflate":39,"./lib/inflate":40,"./lib/utils/common":41,"./lib/zlib/constants":44}],39:[function(require,module,exports){ 'use strict'; @@ -5233,7 +4968,7 @@ exports.deflate = deflate; exports.deflateRaw = deflateRaw; exports.gzip = gzip; -},{"./utils/common":62,"./utils/strings":63,"./zlib/deflate":67,"./zlib/messages":72,"./zlib/zstream":74}],61:[function(require,module,exports){ +},{"./utils/common":41,"./utils/strings":42,"./zlib/deflate":46,"./zlib/messages":51,"./zlib/zstream":53}],40:[function(require,module,exports){ 'use strict'; @@ -5653,7 +5388,7 @@ exports.inflate = inflate; exports.inflateRaw = inflateRaw; exports.ungzip = inflate; -},{"./utils/common":62,"./utils/strings":63,"./zlib/constants":65,"./zlib/gzheader":68,"./zlib/inflate":70,"./zlib/messages":72,"./zlib/zstream":74}],62:[function(require,module,exports){ +},{"./utils/common":41,"./utils/strings":42,"./zlib/constants":44,"./zlib/gzheader":47,"./zlib/inflate":49,"./zlib/messages":51,"./zlib/zstream":53}],41:[function(require,module,exports){ 'use strict'; @@ -5757,7 +5492,7 @@ exports.setTyped = function (on) { exports.setTyped(TYPED_OK); -},{}],63:[function(require,module,exports){ +},{}],42:[function(require,module,exports){ // String encode/decode helpers 'use strict'; @@ -5944,7 +5679,7 @@ exports.utf8border = function (buf, max) { return (pos + _utf8len[buf[pos]] > max) ? pos : max; }; -},{"./common":62}],64:[function(require,module,exports){ +},{"./common":41}],43:[function(require,module,exports){ 'use strict'; // Note: adler32 takes 12% for level 0 and 2% for level 6. @@ -5997,7 +5732,7 @@ function adler32(adler, buf, len, pos) { module.exports = adler32; -},{}],65:[function(require,module,exports){ +},{}],44:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -6067,7 +5802,7 @@ module.exports = { //Z_NULL: null // Use -1 or null inline, depending on var type }; -},{}],66:[function(require,module,exports){ +},{}],45:[function(require,module,exports){ 'use strict'; // Note: we can't get significant speed boost here. @@ -6128,7 +5863,7 @@ function crc32(crc, buf, len, pos) { module.exports = crc32; -},{}],67:[function(require,module,exports){ +},{}],46:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -8004,7 +7739,7 @@ exports.deflatePrime = deflatePrime; exports.deflateTune = deflateTune; */ -},{"../utils/common":62,"./adler32":64,"./crc32":66,"./messages":72,"./trees":73}],68:[function(require,module,exports){ +},{"../utils/common":41,"./adler32":43,"./crc32":45,"./messages":51,"./trees":52}],47:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -8064,7 +7799,7 @@ function GZheader() { module.exports = GZheader; -},{}],69:[function(require,module,exports){ +},{}],48:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -8411,7 +8146,7 @@ module.exports = function inflate_fast(strm, start) { return; }; -},{}],70:[function(require,module,exports){ +},{}],49:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -9969,7 +9704,7 @@ exports.inflateSyncPoint = inflateSyncPoint; exports.inflateUndermine = inflateUndermine; */ -},{"../utils/common":62,"./adler32":64,"./crc32":66,"./inffast":69,"./inftrees":71}],71:[function(require,module,exports){ +},{"../utils/common":41,"./adler32":43,"./crc32":45,"./inffast":48,"./inftrees":50}],50:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -10314,7 +10049,7 @@ module.exports = function inflate_table(type, lens, lens_index, codes, table, ta return 0; }; -},{"../utils/common":62}],72:[function(require,module,exports){ +},{"../utils/common":41}],51:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -10348,7 +10083,7 @@ module.exports = { '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ }; -},{}],73:[function(require,module,exports){ +},{}],52:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -11570,7 +11305,7 @@ exports._tr_flush_block = _tr_flush_block; exports._tr_tally = _tr_tally; exports._tr_align = _tr_align; -},{"../utils/common":62}],74:[function(require,module,exports){ +},{"../utils/common":41}],53:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -11619,5 +11354,14 @@ function ZStream() { module.exports = ZStream; +},{}],54:[function(require,module,exports){ +'use strict'; +module.exports = typeof setImmediate === 'function' ? setImmediate : + function setImmediate() { + var args = [].slice.apply(arguments); + args.splice(1, 0, 0); + setTimeout.apply(null, args); + }; + },{}]},{},[10])(10) }); \ No newline at end of file diff --git a/docs/apidocs/script-dir/jszip/dist/jszip.min.js b/docs/apidocs/script-dir/jszip/dist/jszip.min.js index b9188736b73..520db074223 100644 --- a/docs/apidocs/script-dir/jszip/dist/jszip.min.js +++ b/docs/apidocs/script-dir/jszip/dist/jszip.min.js @@ -1,6 +1,6 @@ /*! -JSZip v3.1.5 - A JavaScript class for generating and reading zip files +JSZip v3.2.1 - A JavaScript class for generating and reading zip files (c) 2009-2016 Stuart Knightley @@ -9,7 +9,5 @@ Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/js JSZip uses the library pako released under the MIT license : https://github.com/nodeca/pako/blob/master/LICENSE */ -!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.JSZip=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g>2,h=(3&b)<<4|c>>4,i=n>1?(15&c)<<2|e>>6:64,j=n>2?63&e:64,k.push(f.charAt(g)+f.charAt(h)+f.charAt(i)+f.charAt(j));return k.join("")},c.decode=function(a){var b,c,d,g,h,i,j,k=0,l=0,m="data:";if(a.substr(0,m.length)===m)throw new Error("Invalid base64 input, it looks like a data url.");a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");var n=3*a.length/4;if(a.charAt(a.length-1)===f.charAt(64)&&n--,a.charAt(a.length-2)===f.charAt(64)&&n--,n%1!==0)throw new Error("Invalid base64 input, bad content length.");var o;for(o=e.uint8array?new Uint8Array(0|n):new Array(0|n);k>4,c=(15&h)<<4|i>>2,d=(3&i)<<6|j,o[l++]=b,64!==i&&(o[l++]=c),64!==j&&(o[l++]=d);return o}},{"./support":30,"./utils":32}],2:[function(a,b,c){"use strict";function d(a,b,c,d,e){this.compressedSize=a,this.uncompressedSize=b,this.crc32=c,this.compression=d,this.compressedContent=e}var e=a("./external"),f=a("./stream/DataWorker"),g=a("./stream/DataLengthProbe"),h=a("./stream/Crc32Probe"),g=a("./stream/DataLengthProbe");d.prototype={getContentWorker:function(){var a=new f(e.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new g("data_length")),b=this;return a.on("end",function(){if(this.streamInfo.data_length!==b.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),a},getCompressedWorker:function(){return new f(e.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},d.createWorkerFrom=function(a,b,c){return a.pipe(new h).pipe(new g("uncompressedSize")).pipe(b.compressWorker(c)).pipe(new g("compressedSize")).withStreamInfo("compression",b)},b.exports=d},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(a,b,c){"use strict";var d=a("./stream/GenericWorker");c.STORE={magic:"\0\0",compressWorker:function(a){return new d("STORE compression")},uncompressWorker:function(){return new d("STORE decompression")}},c.DEFLATE=a("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(a,b,c){"use strict";function d(){for(var a,b=[],c=0;c<256;c++){a=c;for(var d=0;d<8;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function e(a,b,c,d){var e=h,f=d+c;a^=-1;for(var g=d;g>>8^e[255&(a^b[g])];return a^-1}function f(a,b,c,d){var e=h,f=d+c;a^=-1;for(var g=d;g>>8^e[255&(a^b.charCodeAt(g))];return a^-1}var g=a("./utils"),h=d();b.exports=function(a,b){if("undefined"==typeof a||!a.length)return 0;var c="string"!==g.getTypeOf(a);return c?e(0|b,a,a.length,0):f(0|b,a,a.length,0)}},{"./utils":32}],5:[function(a,b,c){"use strict";c.base64=!1,c.binary=!1,c.dir=!1,c.createFolders=!0,c.date=null,c.compression=null,c.compressionOptions=null,c.comment=null,c.unixPermissions=null,c.dosPermissions=null},{}],6:[function(a,b,c){"use strict";var d=null;d="undefined"!=typeof Promise?Promise:a("lie"),b.exports={Promise:d}},{lie:58}],7:[function(a,b,c){"use strict";function d(a,b){h.call(this,"FlateWorker/"+a),this._pako=null,this._pakoAction=a,this._pakoOptions=b,this.meta={}}var e="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,f=a("pako"),g=a("./utils"),h=a("./stream/GenericWorker"),i=e?"uint8array":"array";c.magic="\b\0",g.inherits(d,h),d.prototype.processChunk=function(a){this.meta=a.meta,null===this._pako&&this._createPako(),this._pako.push(g.transformTo(i,a.data),!1)},d.prototype.flush=function(){h.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},d.prototype.cleanUp=function(){h.prototype.cleanUp.call(this),this._pako=null},d.prototype._createPako=function(){this._pako=new f[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var a=this;this._pako.onData=function(b){a.push({data:b,meta:a.meta})}},c.compressWorker=function(a){return new d("Deflate",a)},c.uncompressWorker=function(){return new d("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:59}],8:[function(a,b,c){"use strict";function d(a,b,c,d){f.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=b,this.zipPlatform=c,this.encodeFileName=d,this.streamFiles=a,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}var e=a("../utils"),f=a("../stream/GenericWorker"),g=a("../utf8"),h=a("../crc32"),i=a("../signature"),j=function(a,b){var c,d="";for(c=0;c>>=8;return d},k=function(a,b){var c=a;return a||(c=b?16893:33204),(65535&c)<<16},l=function(a,b){return 63&(a||0)},m=function(a,b,c,d,f,m){var n,o,p=a.file,q=a.compression,r=m!==g.utf8encode,s=e.transformTo("string",m(p.name)),t=e.transformTo("string",g.utf8encode(p.name)),u=p.comment,v=e.transformTo("string",m(u)),w=e.transformTo("string",g.utf8encode(u)),x=t.length!==p.name.length,y=w.length!==u.length,z="",A="",B="",C=p.dir,D=p.date,E={crc32:0,compressedSize:0,uncompressedSize:0};b&&!c||(E.crc32=a.crc32,E.compressedSize=a.compressedSize,E.uncompressedSize=a.uncompressedSize);var F=0;b&&(F|=8),r||!x&&!y||(F|=2048);var G=0,H=0;C&&(G|=16),"UNIX"===f?(H=798,G|=k(p.unixPermissions,C)):(H=20,G|=l(p.dosPermissions,C)),n=D.getUTCHours(),n<<=6,n|=D.getUTCMinutes(),n<<=5,n|=D.getUTCSeconds()/2,o=D.getUTCFullYear()-1980,o<<=4,o|=D.getUTCMonth()+1,o<<=5,o|=D.getUTCDate(),x&&(A=j(1,1)+j(h(s),4)+t,z+="up"+j(A.length,2)+A),y&&(B=j(1,1)+j(h(v),4)+w,z+="uc"+j(B.length,2)+B);var I="";I+="\n\0",I+=j(F,2),I+=q.magic,I+=j(n,2),I+=j(o,2),I+=j(E.crc32,4),I+=j(E.compressedSize,4),I+=j(E.uncompressedSize,4),I+=j(s.length,2),I+=j(z.length,2);var J=i.LOCAL_FILE_HEADER+I+s+z,K=i.CENTRAL_FILE_HEADER+j(H,2)+I+j(v.length,2)+"\0\0\0\0"+j(G,4)+j(d,4)+s+z+v;return{fileRecord:J,dirRecord:K}},n=function(a,b,c,d,f){var g="",h=e.transformTo("string",f(d));return g=i.CENTRAL_DIRECTORY_END+"\0\0\0\0"+j(a,2)+j(a,2)+j(b,4)+j(c,4)+j(h.length,2)+h},o=function(a){var b="";return b=i.DATA_DESCRIPTOR+j(a.crc32,4)+j(a.compressedSize,4)+j(a.uncompressedSize,4)};e.inherits(d,f),d.prototype.push=function(a){var b=a.meta.percent||0,c=this.entriesCount,d=this._sources.length;this.accumulate?this.contentBuffer.push(a):(this.bytesWritten+=a.data.length,f.prototype.push.call(this,{data:a.data,meta:{currentFile:this.currentFile,percent:c?(b+100*(c-d-1))/c:100}}))},d.prototype.openedSource=function(a){this.currentSourceOffset=this.bytesWritten,this.currentFile=a.file.name;var b=this.streamFiles&&!a.file.dir;if(b){var c=m(a,b,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:c.fileRecord,meta:{percent:0}})}else this.accumulate=!0},d.prototype.closedSource=function(a){this.accumulate=!1;var b=this.streamFiles&&!a.file.dir,c=m(a,b,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(c.dirRecord),b)this.push({data:o(a),meta:{percent:100}});else for(this.push({data:c.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},d.prototype.flush=function(){for(var a=this.bytesWritten,b=0;b0?a.substring(0,b):""},q=function(a){return"/"!==a.slice(-1)&&(a+="/"),a},r=function(a,b){return b="undefined"!=typeof b?b:i.createFolders,a=q(a),this.files[a]||o.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},s={load:function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},forEach:function(a){var b,c,d;for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],c=b.slice(this.root.length,b.length),c&&b.slice(0,this.root.length)===this.root&&a(c,d))},filter:function(a){var b=[];return this.forEach(function(c,d){a(c,d)&&b.push(d)}),b},file:function(a,b,c){if(1===arguments.length){if(d(a)){var e=a;return this.filter(function(a,b){return!b.dir&&e.test(a)})}var f=this.files[this.root+a];return f&&!f.dir?f:null}return a=this.root+a,o.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(d(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=r.call(this,b),e=this.clone();return e.root=c.name,e},remove:function(a){a=this.root+a;var b=this.files[a];if(b||("/"!==a.slice(-1)&&(a+="/"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var c=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),d=0;d=0;--f)if(this.data[f]===b&&this.data[f+1]===c&&this.data[f+2]===d&&this.data[f+3]===e)return f-this.zero;return-1},d.prototype.readAndCheckSignature=function(a){var b=a.charCodeAt(0),c=a.charCodeAt(1),d=a.charCodeAt(2),e=a.charCodeAt(3),f=this.readData(4);return b===f[0]&&c===f[1]&&d===f[2]&&e===f[3]},d.prototype.readData=function(a){if(this.checkOffset(a),0===a)return[];var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{"../utils":32,"./DataReader":18}],18:[function(a,b,c){"use strict";function d(a){this.data=a,this.length=a.length,this.index=0,this.zero=0}var e=a("../utils");d.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.length=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return e.transformTo("string",this.readData(a))},readData:function(a){},lastIndexOfSignature:function(a){},readAndCheckSignature:function(a){},readDate:function(){var a=this.readInt(4);return new Date(Date.UTC((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1))}},b.exports=d},{"../utils":32}],19:[function(a,b,c){"use strict";function d(a){e.call(this,a)}var e=a("./Uint8ArrayReader"),f=a("../utils");f.inherits(d,e),d.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(a,b,c){"use strict";function d(a){e.call(this,a)}var e=a("./DataReader"),f=a("../utils");f.inherits(d,e),d.prototype.byteAt=function(a){return this.data.charCodeAt(this.zero+a)},d.prototype.lastIndexOfSignature=function(a){return this.data.lastIndexOf(a)-this.zero},d.prototype.readAndCheckSignature=function(a){var b=this.readData(4);return a===b},d.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{"../utils":32,"./DataReader":18}],21:[function(a,b,c){"use strict";function d(a){e.call(this,a)}var e=a("./ArrayReader"),f=a("../utils");f.inherits(d,e),d.prototype.readData=function(a){if(this.checkOffset(a),0===a)return new Uint8Array(0);var b=this.data.subarray(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{"../utils":32,"./ArrayReader":17}],22:[function(a,b,c){"use strict";var d=a("../utils"),e=a("../support"),f=a("./ArrayReader"),g=a("./StringReader"),h=a("./NodeBufferReader"),i=a("./Uint8ArrayReader");b.exports=function(a){var b=d.getTypeOf(a);return d.checkSupport(b),"string"!==b||e.uint8array?"nodebuffer"===b?new h(a):e.uint8array?new i(d.transformTo("uint8array",a)):new f(d.transformTo("array",a)):new g(a)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(a,b,c){"use strict";c.LOCAL_FILE_HEADER="PK",c.CENTRAL_FILE_HEADER="PK",c.CENTRAL_DIRECTORY_END="PK",c.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",c.ZIP64_CENTRAL_DIRECTORY_END="PK",c.DATA_DESCRIPTOR="PK\b"},{}],24:[function(a,b,c){"use strict";function d(a){e.call(this,"ConvertWorker to "+a),this.destType=a}var e=a("./GenericWorker"),f=a("../utils");f.inherits(d,e),d.prototype.processChunk=function(a){this.push({data:f.transformTo(this.destType,a.data),meta:a.meta})},b.exports=d},{"../utils":32,"./GenericWorker":28}],25:[function(a,b,c){"use strict";function d(){e.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}var e=a("./GenericWorker"),f=a("../crc32"),g=a("../utils");g.inherits(d,e),d.prototype.processChunk=function(a){this.streamInfo.crc32=f(a.data,this.streamInfo.crc32||0),this.push(a)},b.exports=d},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(a,b,c){"use strict";function d(a){f.call(this,"DataLengthProbe for "+a),this.propName=a,this.withStreamInfo(a,0)}var e=a("../utils"),f=a("./GenericWorker");e.inherits(d,f),d.prototype.processChunk=function(a){if(a){var b=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=b+a.data.length}f.prototype.processChunk.call(this,a)},b.exports=d},{"../utils":32,"./GenericWorker":28}],27:[function(a,b,c){"use strict";function d(a){f.call(this,"DataWorker");var b=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,a.then(function(a){b.dataIsReady=!0,b.data=a,b.max=a&&a.length||0,b.type=e.getTypeOf(a),b.isPaused||b._tickAndRepeat()},function(a){b.error(a)})}var e=a("../utils"),f=a("./GenericWorker"),g=16384;e.inherits(d,f),d.prototype.cleanUp=function(){f.prototype.cleanUp.call(this),this.data=null},d.prototype.resume=function(){return!!f.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,e.delay(this._tickAndRepeat,[],this)),!0)},d.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(e.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},d.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var a=g,b=null,c=Math.min(this.max,this.index+a);if(this.index>=this.max)return this.end();switch(this.type){case"string":b=this.data.substring(this.index,c);break;case"uint8array":b=this.data.subarray(this.index,c);break;case"array":case"nodebuffer":b=this.data.slice(this.index,c)}return this.index=c,this.push({data:b,meta:{percent:this.max?this.index/this.max*100:0}})},b.exports=d},{"../utils":32,"./GenericWorker":28}],28:[function(a,b,c){"use strict";function d(a){this.name=a||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}d.prototype={push:function(a){this.emit("data",a)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(a){this.emit("error",a)}return!0},error:function(a){return!this.isFinished&&(this.isPaused?this.generatedError=a:(this.isFinished=!0,this.emit("error",a),this.previous&&this.previous.error(a),this.cleanUp()),!0)},on:function(a,b){return this._listeners[a].push(b),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(a,b){if(this._listeners[a])for(var c=0;c "+a:a}},b.exports=d},{}],29:[function(a,b,c){"use strict";function d(a,b,c){switch(a){case"blob":return h.newBlob(h.transformTo("arraybuffer",b),c);case"base64":return k.encode(b);default:return h.transformTo(a,b)}}function e(a,b){var c,d=0,e=null,f=0;for(c=0;c=252?6:k>=248?5:k>=240?4:k>=224?3:k>=192?2:1;j[254]=j[254]=1;var l=function(a){var b,c,d,e,f,h=a.length,i=0;for(e=0;e>>6,b[f++]=128|63&c):c<65536?(b[f++]=224|c>>>12,b[f++]=128|c>>>6&63,b[f++]=128|63&c):(b[f++]=240|c>>>18,b[f++]=128|c>>>12&63,b[f++]=128|c>>>6&63,b[f++]=128|63&c);return b},m=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return c<0?b:0===c?b:c+j[a[c]]>b?c:b},n=function(a){var b,c,d,e,g=a.length,h=new Array(2*g);for(c=0,b=0;b4)h[c++]=65533,b+=e-1;else{for(d&=2===e?31:3===e?15:7;e>1&&b1?h[c++]=65533:d<65536?h[c++]=d:(d-=65536,h[c++]=55296|d>>10&1023,h[c++]=56320|1023&d)}return h.length!==c&&(h.subarray?h=h.subarray(0,c):h.length=c),f.applyFromCharCode(h)};c.utf8encode=function(a){return g.nodebuffer?h.newBufferFrom(a,"utf-8"):l(a)},c.utf8decode=function(a){return g.nodebuffer?f.transformTo("nodebuffer",a).toString("utf-8"):(a=f.transformTo(g.uint8array?"uint8array":"array",a),n(a))},f.inherits(d,i),d.prototype.processChunk=function(a){var b=f.transformTo(g.uint8array?"uint8array":"array",a.data);if(this.leftOver&&this.leftOver.length){if(g.uint8array){var d=b;b=new Uint8Array(d.length+this.leftOver.length),b.set(this.leftOver,0),b.set(d,this.leftOver.length)}else b=this.leftOver.concat(b);this.leftOver=null}var e=m(b),h=b;e!==b.length&&(g.uint8array?(h=b.subarray(0,e),this.leftOver=b.subarray(e,b.length)):(h=b.slice(0,e),this.leftOver=b.slice(e,b.length))),this.push({data:c.utf8decode(h),meta:a.meta})},d.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:c.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},c.Utf8DecodeWorker=d,f.inherits(e,i),e.prototype.processChunk=function(a){this.push({data:c.utf8encode(a.data),meta:a.meta})},c.Utf8EncodeWorker=e},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(a,b,c){"use strict";function d(a){var b=null;return b=i.uint8array?new Uint8Array(a.length):new Array(a.length),f(a,b)}function e(a){return a}function f(a,b){for(var c=0;c1;)try{return n.stringifyByChunk(a,d,b)}catch(f){b=Math.floor(b/2)}return n.stringifyByChar(a)}function h(a,b){for(var c=0;c1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var a,b;for(a=0;a0)this.isSignature(c,g.CENTRAL_FILE_HEADER)||(this.reader.zero=e);else if(e<0)throw new Error("Corrupted zip: missing "+Math.abs(e)+" bytes.")},prepareReader:function(a){this.reader=e(a)},load:function(a){this.prepareReader(a),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},b.exports=d},{"./reader/readerFor":22,"./signature":23,"./support":30,"./utf8":31,"./utils":32,"./zipEntry":34}],34:[function(a,b,c){"use strict";function d(a,b){this.options=a,this.loadOptions=b}var e=a("./reader/readerFor"),f=a("./utils"),g=a("./compressedObject"),h=a("./crc32"),i=a("./utf8"),j=a("./compressions"),k=a("./support"),l=0,m=3,n=function(a){for(var b in j)if(j.hasOwnProperty(b)&&j[b].magic===a)return j[b];return null};d.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},readLocalPart:function(a){var b,c;if(a.skip(22),this.fileNameLength=a.readInt(2),c=a.readInt(2),this.fileName=a.readData(this.fileNameLength),a.skip(c),this.compressedSize===-1||this.uncompressedSize===-1)throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize === -1 || uncompressedSize === -1)");if(b=n(this.compressionMethod),null===b)throw new Error("Corrupted zip : compression "+f.pretty(this.compressionMethod)+" unknown (inner file : "+f.transformTo("string",this.fileName)+")");this.decompressed=new g(this.compressedSize,this.uncompressedSize,this.crc32,b,a.readData(this.compressedSize))},readCentralPart:function(a){this.versionMadeBy=a.readInt(2),a.skip(2),this.bitFlag=a.readInt(2),this.compressionMethod=a.readString(2),this.date=a.readDate(),this.crc32=a.readInt(4),this.compressedSize=a.readInt(4),this.uncompressedSize=a.readInt(4);var b=a.readInt(2);if(this.extraFieldsLength=a.readInt(2),this.fileCommentLength=a.readInt(2),this.diskNumberStart=a.readInt(2),this.internalFileAttributes=a.readInt(2),this.externalFileAttributes=a.readInt(4),this.localHeaderOffset=a.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");a.skip(b),this.readExtraFields(a),this.parseZIP64ExtraField(a),this.fileComment=a.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var a=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),a===l&&(this.dosPermissions=63&this.externalFileAttributes),a===m&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(a){if(this.extraFields[1]){var b=e(this.extraFields[1].value);this.uncompressedSize===f.MAX_VALUE_32BITS&&(this.uncompressedSize=b.readInt(8)),this.compressedSize===f.MAX_VALUE_32BITS&&(this.compressedSize=b.readInt(8)),this.localHeaderOffset===f.MAX_VALUE_32BITS&&(this.localHeaderOffset=b.readInt(8)),this.diskNumberStart===f.MAX_VALUE_32BITS&&(this.diskNumberStart=b.readInt(4))}},readExtraFields:function(a){var b,c,d,e=a.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});a.indexc;)b.push(arguments[c++]);return q[++p]=function(){h("function"==typeof a?a:Function(a),b)},d(p),p},n=function(a){delete q[a]},"process"==a("./_cof")(l)?d=function(a){l.nextTick(g(s,a,1))}:o?(e=new o,f=e.port2,e.port1.onmessage=t,d=g(f.postMessage,f,1)):k.addEventListener&&"function"==typeof postMessage&&!k.importScripts?(d=function(a){k.postMessage(a+"","*")},k.addEventListener("message",t,!1)):d=r in j("script")?function(a){i.appendChild(j("script"))[r]=function(){i.removeChild(this),s.call(a)}}:function(a){setTimeout(g(s,a,1),0)}),b.exports={set:m,clear:n}},{"./_cof":39,"./_ctx":41,"./_dom-create":43,"./_global":46,"./_html":48,"./_invoke":50}],55:[function(a,b,c){var d=a("./_is-object");b.exports=function(a,b){if(!d(a))return a;var c,e;if(b&&"function"==typeof(c=a.toString)&&!d(e=c.call(a)))return e;if("function"==typeof(c=a.valueOf)&&!d(e=c.call(a)))return e;if(!b&&"function"==typeof(c=a.toString)&&!d(e=c.call(a)))return e;throw TypeError("Can't convert object to primitive value")}},{"./_is-object":51}],56:[function(a,b,c){var d=a("./_export"),e=a("./_task");d(d.G+d.B,{setImmediate:e.set,clearImmediate:e.clear})},{"./_export":44,"./_task":54}],57:[function(a,b,c){(function(a){"use strict";function c(){k=!0;for(var a,b,c=l.length;c;){for(b=l,l=[],a=-1;++a0?b.windowBits=-b.windowBits:b.gzip&&b.windowBits>0&&b.windowBits<16&&(b.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var c=h.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(c!==p)throw new Error(k[c]);if(b.header&&h.deflateSetHeader(this.strm,b.header),b.dictionary){var e;if(e="string"==typeof b.dictionary?j.string2buf(b.dictionary):"[object ArrayBuffer]"===m.call(b.dictionary)?new Uint8Array(b.dictionary):b.dictionary,c=h.deflateSetDictionary(this.strm,e),c!==p)throw new Error(k[c]);this._dict_set=!0}}function e(a,b){var c=new d(b);if(c.push(a,!0),c.err)throw c.msg||k[c.err];return c.result}function f(a,b){return b=b||{},b.raw=!0,e(a,b)}function g(a,b){return b=b||{},b.gzip=!0,e(a,b)}var h=a("./zlib/deflate"),i=a("./utils/common"),j=a("./utils/strings"),k=a("./zlib/messages"),l=a("./zlib/zstream"),m=Object.prototype.toString,n=0,o=4,p=0,q=1,r=2,s=-1,t=0,u=8;d.prototype.push=function(a,b){var c,d,e=this.strm,f=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?o:n,"string"==typeof a?e.input=j.string2buf(a):"[object ArrayBuffer]"===m.call(a)?e.input=new Uint8Array(a):e.input=a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new i.Buf8(f),e.next_out=0,e.avail_out=f),c=h.deflate(e,d),c!==q&&c!==p)return this.onEnd(c),this.ended=!0,!1;0!==e.avail_out&&(0!==e.avail_in||d!==o&&d!==r)||("string"===this.options.to?this.onData(j.buf2binstring(i.shrinkBuf(e.output,e.next_out))):this.onData(i.shrinkBuf(e.output,e.next_out)))}while((e.avail_in>0||0===e.avail_out)&&c!==q);return d===o?(c=h.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===p):d!==r||(this.onEnd(p),e.avail_out=0,!0)},d.prototype.onData=function(a){this.chunks.push(a)},d.prototype.onEnd=function(a){a===p&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=d,c.deflate=e,c.deflateRaw=f,c.gzip=g},{"./utils/common":62,"./utils/strings":63,"./zlib/deflate":67,"./zlib/messages":72,"./zlib/zstream":74}],61:[function(a,b,c){"use strict";function d(a){if(!(this instanceof d))return new d(a);this.options=h.assign({chunkSize:16384,windowBits:0,to:""},a||{});var b=this.options;b.raw&&b.windowBits>=0&&b.windowBits<16&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15)),!(b.windowBits>=0&&b.windowBits<16)||a&&a.windowBits||(b.windowBits+=32),b.windowBits>15&&b.windowBits<48&&0===(15&b.windowBits)&&(b.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var c=g.inflateInit2(this.strm,b.windowBits);if(c!==j.Z_OK)throw new Error(k[c]);this.header=new m,g.inflateGetHeader(this.strm,this.header)}function e(a,b){var c=new d(b);if(c.push(a,!0),c.err)throw c.msg||k[c.err];return c.result}function f(a,b){return b=b||{},b.raw=!0,e(a,b)}var g=a("./zlib/inflate"),h=a("./utils/common"),i=a("./utils/strings"),j=a("./zlib/constants"),k=a("./zlib/messages"),l=a("./zlib/zstream"),m=a("./zlib/gzheader"),n=Object.prototype.toString;d.prototype.push=function(a,b){var c,d,e,f,k,l,m=this.strm,o=this.options.chunkSize,p=this.options.dictionary,q=!1;if(this.ended)return!1;d=b===~~b?b:b===!0?j.Z_FINISH:j.Z_NO_FLUSH,"string"==typeof a?m.input=i.binstring2buf(a):"[object ArrayBuffer]"===n.call(a)?m.input=new Uint8Array(a):m.input=a,m.next_in=0,m.avail_in=m.input.length;do{if(0===m.avail_out&&(m.output=new h.Buf8(o),m.next_out=0,m.avail_out=o),c=g.inflate(m,j.Z_NO_FLUSH),c===j.Z_NEED_DICT&&p&&(l="string"==typeof p?i.string2buf(p):"[object ArrayBuffer]"===n.call(p)?new Uint8Array(p):p,c=g.inflateSetDictionary(this.strm,l)),c===j.Z_BUF_ERROR&&q===!0&&(c=j.Z_OK,q=!1),c!==j.Z_STREAM_END&&c!==j.Z_OK)return this.onEnd(c),this.ended=!0,!1;m.next_out&&(0!==m.avail_out&&c!==j.Z_STREAM_END&&(0!==m.avail_in||d!==j.Z_FINISH&&d!==j.Z_SYNC_FLUSH)||("string"===this.options.to?(e=i.utf8border(m.output,m.next_out),f=m.next_out-e,k=i.buf2string(m.output,e),m.next_out=f,m.avail_out=o-f,f&&h.arraySet(m.output,m.output,e,f,0),this.onData(k)):this.onData(h.shrinkBuf(m.output,m.next_out)))),0===m.avail_in&&0===m.avail_out&&(q=!0)}while((m.avail_in>0||0===m.avail_out)&&c!==j.Z_STREAM_END);return c===j.Z_STREAM_END&&(d=j.Z_FINISH),d===j.Z_FINISH?(c=g.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===j.Z_OK):d!==j.Z_SYNC_FLUSH||(this.onEnd(j.Z_OK),m.avail_out=0,!0)},d.prototype.onData=function(a){this.chunks.push(a)},d.prototype.onEnd=function(a){a===j.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=d,c.inflate=e,c.inflateRaw=f,c.ungzip=e},{"./utils/common":62,"./utils/strings":63,"./zlib/constants":65,"./zlib/gzheader":68,"./zlib/inflate":70,"./zlib/messages":72,"./zlib/zstream":74}],62:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;c.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if("object"!=typeof c)throw new TypeError(c+"must be non-object");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a},c.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var e={arraySet:function(a,b,c,d,e){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),e);for(var f=0;f=252?6:j>=248?5:j>=240?4:j>=224?3:j>=192?2:1;i[254]=i[254]=1,c.string2buf=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;f>>6,b[g++]=128|63&c):c<65536?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},c.buf2binstring=function(a){return d(a,a.length)},c.binstring2buf=function(a){for(var b=new e.Buf8(a.length),c=0,d=b.length;c4)j[e++]=65533,c+=g-1;else{for(f&=2===g?31:3===g?15:7;g>1&&c1?j[e++]=65533:f<65536?j[e++]=f:(f-=65536,j[e++]=55296|f>>10&1023,j[e++]=56320|1023&f)}return d(j,e)},c.utf8border=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return c<0?b:0===c?b:c+i[a[c]]>b?c:b}},{"./common":62}],64:[function(a,b,c){"use strict";function d(a,b,c,d){for(var e=65535&a|0,f=a>>>16&65535|0,g=0;0!==c;){g=c>2e3?2e3:c,c-=g;do e=e+b[d++]|0,f=f+e|0;while(--g);e%=65521,f%=65521}return e|f<<16|0; -}b.exports=d},{}],65:[function(a,b,c){"use strict";b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],66:[function(a,b,c){"use strict";function d(){for(var a,b=[],c=0;c<256;c++){a=c;for(var d=0;d<8;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function e(a,b,c,d){var e=f,g=d+c;a^=-1;for(var h=d;h>>8^e[255&(a^b[h])];return a^-1}var f=d();b.exports=e},{}],67:[function(a,b,c){"use strict";function d(a,b){return a.msg=I[b],b}function e(a){return(a<<1)-(a>4?9:0)}function f(a){for(var b=a.length;--b>=0;)a[b]=0}function g(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out),0!==c&&(E.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&(b.pending_out=0))}function h(a,b){F._tr_flush_block(a,a.block_start>=0?a.block_start:-1,a.strstart-a.block_start,b),a.block_start=a.strstart,g(a.strm)}function i(a,b){a.pending_buf[a.pending++]=b}function j(a,b){a.pending_buf[a.pending++]=b>>>8&255,a.pending_buf[a.pending++]=255&b}function k(a,b,c,d){var e=a.avail_in;return e>d&&(e=d),0===e?0:(a.avail_in-=e,E.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=G(a.adler,b,e,c):2===a.state.wrap&&(a.adler=H(a.adler,b,e,c)),a.next_in+=e,a.total_in+=e,e)}function l(a,b){var c,d,e=a.max_chain_length,f=a.strstart,g=a.prev_length,h=a.nice_match,i=a.strstart>a.w_size-la?a.strstart-(a.w_size-la):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ka,n=j[f+g-1],o=j[f+g];a.prev_length>=a.good_match&&(e>>=2),h>a.lookahead&&(h=a.lookahead);do if(c=b,j[c+g]===o&&j[c+g-1]===n&&j[c]===j[f]&&j[++c]===j[f+1]){f+=2,c++;do;while(j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&fg){if(a.match_start=b,g=d,d>=h)break;n=j[f+g-1],o=j[f+g]}}while((b=l[b&k])>i&&0!==--e);return g<=a.lookahead?g:a.lookahead}function m(a){var b,c,d,e,f,g=a.w_size;do{if(e=a.window_size-a.lookahead-a.strstart,a.strstart>=g+(g-la)){E.arraySet(a.window,a.window,g,g,0),a.match_start-=g,a.strstart-=g,a.block_start-=g,c=a.hash_size,b=c;do d=a.head[--b],a.head[b]=d>=g?d-g:0;while(--c);c=g,b=c;do d=a.prev[--b],a.prev[b]=d>=g?d-g:0;while(--c);e+=g}if(0===a.strm.avail_in)break;if(c=k(a.strm,a.window,a.strstart+a.lookahead,e),a.lookahead+=c,a.lookahead+a.insert>=ja)for(f=a.strstart-a.insert,a.ins_h=a.window[f],a.ins_h=(a.ins_h<a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(a.lookahead<=1){if(m(a),0===a.lookahead&&b===J)return ua;if(0===a.lookahead)break}a.strstart+=a.lookahead,a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,h(a,!1),0===a.strm.avail_out))return ua;if(a.strstart-a.block_start>=a.w_size-la&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.strstart>a.block_start&&(h(a,!1),0===a.strm.avail_out)?ua:ua}function o(a,b){for(var c,d;;){if(a.lookahead=ja&&(a.ins_h=(a.ins_h<=ja)if(d=F._tr_tally(a,a.strstart-a.match_start,a.match_length-ja),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=ja){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<=ja&&(a.ins_h=(a.ins_h<4096)&&(a.match_length=ja-1)),a.prev_length>=ja&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-ja,d=F._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-ja),a.lookahead-=a.prev_length-1,a.prev_length-=2;do++a.strstart<=e&&(a.ins_h=(a.ins_h<=ja&&a.strstart>0&&(e=a.strstart-1,d=g[e],d===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ka;do;while(d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&ea.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=ja?(c=F._tr_tally(a,1,a.match_length-ja),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===J)return ua;break}if(a.match_length=0,c=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function s(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e}function t(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=D[a.level].max_lazy,a.good_match=D[a.level].good_length,a.nice_match=D[a.level].nice_length,a.max_chain_length=D[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=ja-1,a.match_available=0,a.ins_h=0}function u(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=$,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new E.Buf16(2*ha),this.dyn_dtree=new E.Buf16(2*(2*fa+1)),this.bl_tree=new E.Buf16(2*(2*ga+1)),f(this.dyn_ltree),f(this.dyn_dtree),f(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new E.Buf16(ia+1),this.heap=new E.Buf16(2*ea+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new E.Buf16(2*ea+1),f(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function v(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=Z,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?na:sa,a.adler=2===b.wrap?0:1,b.last_flush=J,F._tr_init(b),O):d(a,Q)}function w(a){var b=v(a);return b===O&&t(a.state),b}function x(a,b){return a&&a.state?2!==a.state.wrap?Q:(a.state.gzhead=b,O):Q}function y(a,b,c,e,f,g){if(!a)return Q;var h=1;if(b===T&&(b=6),e<0?(h=0,e=-e):e>15&&(h=2,e-=16),f<1||f>_||c!==$||e<8||e>15||b<0||b>9||g<0||g>X)return d(a,Q);8===e&&(e=9);var i=new u;return a.state=i,i.strm=a,i.wrap=h,i.gzhead=null,i.w_bits=e,i.w_size=1<N||b<0)return a?d(a,Q):Q;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===ta&&b!==M)return d(a,0===a.avail_out?S:Q);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===na)if(2===h.wrap)a.adler=0,i(h,31),i(h,139),i(h,8),h.gzhead?(i(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),i(h,255&h.gzhead.time),i(h,h.gzhead.time>>8&255),i(h,h.gzhead.time>>16&255),i(h,h.gzhead.time>>24&255),i(h,9===h.level?2:h.strategy>=V||h.level<2?4:0),i(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(i(h,255&h.gzhead.extra.length),i(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(a.adler=H(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=oa):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=V||h.level<2?4:0),i(h,ya),h.status=sa);else{var m=$+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=V||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=ma),m+=31-m%31,h.status=sa,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===oa)if(h.gzhead.extra){for(k=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending!==h.pending_buf_size));)i(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=pa)}else h.status=pa;if(h.status===pa)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=qa)}else h.status=qa;if(h.status===qa)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=ra)}else h.status=ra;if(h.status===ra&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&g(a),h.pending+2<=h.pending_buf_size&&(i(h,255&a.adler),i(h,a.adler>>8&255),a.adler=0,h.status=sa)):h.status=sa),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,O}else if(0===a.avail_in&&e(b)<=e(c)&&b!==M)return d(a,S);if(h.status===ta&&0!==a.avail_in)return d(a,S);if(0!==a.avail_in||0!==h.lookahead||b!==J&&h.status!==ta){var o=h.strategy===V?r(h,b):h.strategy===W?q(h,b):D[h.level].func(h,b);if(o!==wa&&o!==xa||(h.status=ta),o===ua||o===wa)return 0===a.avail_out&&(h.last_flush=-1),O;if(o===va&&(b===K?F._tr_align(h):b!==N&&(F._tr_stored_block(h,0,0,!1),b===L&&(f(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),g(a),0===a.avail_out))return h.last_flush=-1,O}return b!==M?O:h.wrap<=0?P:(2===h.wrap?(i(h,255&a.adler),i(h,a.adler>>8&255),i(h,a.adler>>16&255),i(h,a.adler>>24&255),i(h,255&a.total_in),i(h,a.total_in>>8&255),i(h,a.total_in>>16&255),i(h,a.total_in>>24&255)):(j(h,a.adler>>>16),j(h,65535&a.adler)),g(a),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?O:P)}function B(a){var b;return a&&a.state?(b=a.state.status,b!==na&&b!==oa&&b!==pa&&b!==qa&&b!==ra&&b!==sa&&b!==ta?d(a,Q):(a.state=null,b===sa?d(a,R):O)):Q}function C(a,b){var c,d,e,g,h,i,j,k,l=b.length;if(!a||!a.state)return Q;if(c=a.state,g=c.wrap,2===g||1===g&&c.status!==na||c.lookahead)return Q;for(1===g&&(a.adler=G(a.adler,b,l,0)),c.wrap=0,l>=c.w_size&&(0===g&&(f(c.head),c.strstart=0,c.block_start=0,c.insert=0),k=new E.Buf8(c.w_size),E.arraySet(k,b,l-c.w_size,c.w_size,0),b=k,l=c.w_size),h=a.avail_in,i=a.next_in,j=a.input,a.avail_in=l,a.next_in=0,a.input=b,m(c);c.lookahead>=ja;){d=c.strstart,e=c.lookahead-(ja-1);do c.ins_h=(c.ins_h<>>24,p>>>=w,q-=w,w=v>>>16&255,0===w)C[h++]=65535&v;else{if(!(16&w)){if(0===(64&w)){v=r[(65535&v)+(p&(1<>>=w,q-=w),q<15&&(p+=B[f++]<>>24,p>>>=w,q-=w,w=v>>>16&255,!(16&w)){if(0===(64&w)){v=s[(65535&v)+(p&(1<k){a.msg="invalid distance too far back",c.mode=d;break a}if(p>>>=w,q-=w,w=h-i,y>w){if(w=y-w,w>m&&c.sane){a.msg="invalid distance too far back",c.mode=d;break a}if(z=0,A=o,0===n){if(z+=l-w,w2;)C[h++]=A[z++],C[h++]=A[z++],C[h++]=A[z++],x-=3;x&&(C[h++]=A[z++],x>1&&(C[h++]=A[z++]))}else{z=h-y;do C[h++]=C[z++],C[h++]=C[z++],C[h++]=C[z++],x-=3;while(x>2);x&&(C[h++]=C[z++],x>1&&(C[h++]=C[z++]))}break}}break}}while(f>3,f-=x,q-=x<<3,p&=(1<>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function e(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new s.Buf16(320),this.work=new s.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg="",b.wrap&&(a.adler=1&b.wrap),b.mode=L,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new s.Buf32(pa),b.distcode=b.distdyn=new s.Buf32(qa),b.sane=1,b.back=-1,D):G}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):G}function h(a,b){var c,d;return a&&a.state?(d=a.state,b<0?(c=0,b=-b):(c=(b>>4)+1,b<48&&(b&=15)),b&&(b<8||b>15)?G:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):G}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==D&&(a.state=null),c):G}function j(a){return i(a,sa)}function k(a){if(ta){var b;for(q=new s.Buf32(512),r=new s.Buf32(32),b=0;b<144;)a.lens[b++]=8;for(;b<256;)a.lens[b++]=9;for(;b<280;)a.lens[b++]=7;for(;b<288;)a.lens[b++]=8;for(w(y,a.lens,0,288,q,0,a.work,{bits:9}),b=0;b<32;)a.lens[b++]=5;w(z,a.lens,0,32,r,0,a.work,{bits:5}),ta=!1}a.lencode=q,a.lenbits=9,a.distcode=r,a.distbits=5}function l(a,b,c,d){var e,f=a.state;return null===f.window&&(f.wsize=1<=f.wsize?(s.arraySet(f.window,b,c-f.wsize,f.wsize,0),f.wnext=0,f.whave=f.wsize):(e=f.wsize-f.wnext,e>d&&(e=d),s.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(s.arraySet(f.window,b,c-d,d,0),f.wnext=d,f.whave=f.wsize):(f.wnext+=e,f.wnext===f.wsize&&(f.wnext=0),f.whave>>8&255,c.check=u(c.check,Ba,2,0),m=0,n=0,c.mode=M;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&m)<<8)+(m>>8))%31){a.msg="incorrect header check",c.mode=ma;break}if((15&m)!==K){a.msg="unknown compression method",c.mode=ma;break}if(m>>>=4,n-=4,wa=(15&m)+8,0===c.wbits)c.wbits=wa;else if(wa>c.wbits){a.msg="invalid window size",c.mode=ma;break}c.dmax=1<>8&1),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0,c.mode=N;case N:for(;n<32;){if(0===i)break a;i--,m+=e[g++]<>>8&255,Ba[2]=m>>>16&255,Ba[3]=m>>>24&255,c.check=u(c.check,Ba,4,0)),m=0,n=0,c.mode=O;case O:for(;n<16;){if(0===i)break a;i--,m+=e[g++]<>8),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0,c.mode=P;case P:if(1024&c.flags){for(;n<16;){if(0===i)break a;i--,m+=e[g++]<>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=Q;case Q:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wa=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),s.arraySet(c.head.extra,e,g,q,wa)),512&c.flags&&(c.check=u(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=R;case R:if(2048&c.flags){if(0===i)break a;q=0;do wa=e[g+q++],c.head&&wa&&c.length<65536&&(c.head.name+=String.fromCharCode(wa));while(wa&&q>9&1,c.head.done=!0),a.adler=c.check=0,c.mode=W;break;case U:for(;n<32;){if(0===i)break a;i--,m+=e[g++]<>>=7&n,n-=7&n,c.mode=ja;break}for(;n<3;){if(0===i)break a;i--,m+=e[g++]<>>=1,n-=1,3&m){case 0:c.mode=Y;break;case 1:if(k(c),c.mode=ca,b===C){m>>>=2,n-=2;break a}break;case 2:c.mode=_;break;case 3:a.msg="invalid block type",c.mode=ma}m>>>=2,n-=2;break;case Y:for(m>>>=7&n,n-=7&n;n<32;){if(0===i)break a;i--,m+=e[g++]<>>16^65535)){a.msg="invalid stored block lengths",c.mode=ma;break}if(c.length=65535&m,m=0,n=0,c.mode=Z,b===C)break a;case Z:c.mode=$;case $:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;s.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=W;break;case _:for(;n<14;){if(0===i)break a;i--,m+=e[g++]<>>=5,n-=5,c.ndist=(31&m)+1,m>>>=5,n-=5,c.ncode=(15&m)+4,m>>>=4,n-=4,c.nlen>286||c.ndist>30){a.msg="too many length or distance symbols",c.mode=ma;break}c.have=0,c.mode=aa;case aa:for(;c.have>>=3,n-=3}for(;c.have<19;)c.lens[Ca[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,ya={bits:c.lenbits},xa=w(x,c.lens,0,19,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg="invalid code lengths set",c.mode=ma;break}c.have=0,c.mode=ba;case ba:for(;c.have>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<>>=qa,n-=qa,c.lens[c.have++]=sa;else{if(16===sa){for(za=qa+2;n>>=qa,n-=qa,0===c.have){a.msg="invalid bit length repeat",c.mode=ma;break}wa=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sa){for(za=qa+3;n>>=qa,n-=qa,wa=0,q=3+(7&m),m>>>=3,n-=3}else{for(za=qa+7;n>>=qa,n-=qa,wa=0,q=11+(127&m),m>>>=7,n-=7}if(c.have+q>c.nlen+c.ndist){a.msg="invalid bit length repeat",c.mode=ma;break}for(;q--;)c.lens[c.have++]=wa}}if(c.mode===ma)break;if(0===c.lens[256]){a.msg="invalid code -- missing end-of-block",c.mode=ma;break}if(c.lenbits=9,ya={bits:c.lenbits},xa=w(y,c.lens,0,c.nlen,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg="invalid literal/lengths set",c.mode=ma;break}if(c.distbits=6,c.distcode=c.distdyn,ya={bits:c.distbits},xa=w(z,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,ya),c.distbits=ya.bits,xa){a.msg="invalid distances set",c.mode=ma;break}if(c.mode=ca,b===C)break a;case ca:c.mode=da;case da:if(i>=6&&j>=258){a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,v(a,p),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,c.mode===W&&(c.back=-1);break}for(c.back=0;Aa=c.lencode[m&(1<>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(ta+qa<=n);){if(0===i)break a;i--,m+=e[g++]<>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,c.length=sa,0===ra){c.mode=ia;break}if(32&ra){c.back=-1,c.mode=W;break}if(64&ra){a.msg="invalid literal/length code",c.mode=ma;break}c.extra=15&ra,c.mode=ea;case ea:if(c.extra){for(za=c.extra;n>>=c.extra,n-=c.extra,c.back+=c.extra}c.was=c.length,c.mode=fa;case fa:for(;Aa=c.distcode[m&(1<>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(ta+qa<=n);){if(0===i)break a;i--,m+=e[g++]<>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,64&ra){a.msg="invalid distance code",c.mode=ma;break}c.offset=sa,c.extra=15&ra,c.mode=ga;case ga:if(c.extra){for(za=c.extra;n>>=c.extra,n-=c.extra,c.back+=c.extra}if(c.offset>c.dmax){a.msg="invalid distance too far back",c.mode=ma;break}c.mode=ha;case ha:if(0===j)break a;if(q=p-j,c.offset>q){if(q=c.offset-q,q>c.whave&&c.sane){a.msg="invalid distance too far back",c.mode=ma;break}q>c.wnext?(q-=c.wnext,r=c.wsize-q):r=c.wnext-q,q>c.length&&(q=c.length),pa=c.window}else pa=f,r=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do f[h++]=pa[r++];while(--q);0===c.length&&(c.mode=da);break;case ia:if(0===j)break a;f[h++]=c.length,j--,c.mode=da;break;case ja:if(c.wrap){for(;n<32;){if(0===i)break a;i--,m|=e[g++]<=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return p[q++]=20971520,p[q++]=20971520,s.bits=1,0;for(F=1;F0&&(a===h||1!==G))return-1;for(Q[1]=0,D=1;Df||a===j&&L>g)return 1;for(;;){z=D-J,r[E]y?(A=R[S+r[E]],B=N[O+r[E]]):(A=96,B=0),t=1<>J)+u]=z<<24|A<<16|B|0;while(0!==u);for(t=1<>=1;if(0!==t?(M&=t-1,M+=t):M=0,E++,0===--P[D]){if(D===G)break;D=b[c+r[E]]}if(D>H&&(M&w)!==v){for(0===J&&(J=H),x+=F,I=D-J,K=1<f||a===j&&L>g)return 1;v=M&w,p[v]=H<<24|I<<16|x-q|0}}return 0!==M&&(p[x+M]=D-J<<24|64<<16|0),s.bits=H,0}},{"../utils/common":62}],72:[function(a,b,c){"use strict";b.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],73:[function(a,b,c){"use strict";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(a,b,c,d,e){this.static_tree=a,this.extra_bits=b,this.extra_base=c,this.elems=d,this.max_length=e,this.has_stree=a&&a.length}function f(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b}function g(a){return a<256?ia[a]:ia[256+(a>>>7)]}function h(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function i(a,b,c){a.bi_valid>X-c?(a.bi_buf|=b<>X-a.bi_valid,a.bi_valid+=c-X):(a.bi_buf|=b<>>=1,c<<=1;while(--b>0);return c>>>1}function l(a){16===a.bi_valid?(h(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):a.bi_valid>=8&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}function m(a,b){var c,d,e,f,g,h,i=b.dyn_tree,j=b.max_code,k=b.stat_desc.static_tree,l=b.stat_desc.has_stree,m=b.stat_desc.extra_bits,n=b.stat_desc.extra_base,o=b.stat_desc.max_length,p=0;for(f=0;f<=W;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0, -c=a.heap_max+1;co&&(f=o,p++),i[2*d+1]=f,d>j||(a.bl_count[f]++,g=0,d>=n&&(g=m[d-n]),h=i[2*d],a.opt_len+=h*(f+g),l&&(a.static_len+=h*(k[2*d+1]+g)));if(0!==p){do{for(f=o-1;0===a.bl_count[f];)f--;a.bl_count[f]--,a.bl_count[f+1]+=2,a.bl_count[o]--,p-=2}while(p>0);for(f=o;0!==f;f--)for(d=a.bl_count[f];0!==d;)e=a.heap[--c],e>j||(i[2*e+1]!==f&&(a.opt_len+=(f-i[2*e+1])*i[2*e],i[2*e+1]=f),d--)}}function n(a,b,c){var d,e,f=new Array(W+1),g=0;for(d=1;d<=W;d++)f[d]=g=g+c[d-1]<<1;for(e=0;e<=b;e++){var h=a[2*e+1];0!==h&&(a[2*e]=k(f[h]++,h))}}function o(){var a,b,c,d,f,g=new Array(W+1);for(c=0,d=0;d>=7;d8?h(a,a.bi_buf):a.bi_valid>0&&(a.pending_buf[a.pending++]=a.bi_buf),a.bi_buf=0,a.bi_valid=0}function r(a,b,c,d){q(a),d&&(h(a,c),h(a,~c)),G.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function s(a,b,c,d){var e=2*b,f=2*c;return a[e]>1;c>=1;c--)t(a,f,c);e=i;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],t(a,f,1),d=a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,f[2*e]=f[2*c]+f[2*d],a.depth[e]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,f[2*c+1]=f[2*d+1]=e,a.heap[1]=e++,t(a,f,1);while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],m(a,b),n(f,j,a.bl_count)}function w(a,b,c){var d,e,f=-1,g=b[1],h=0,i=7,j=4;for(0===g&&(i=138,j=3),b[2*(c+1)+1]=65535,d=0;d<=c;d++)e=g,g=b[2*(d+1)+1],++h=3&&0===a.bl_tree[2*ea[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function z(a,b,c,d){var e;for(i(a,b-257,5),i(a,c-1,5),i(a,d-4,4),e=0;e>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return I;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return J;for(b=32;b0?(a.strm.data_type===K&&(a.strm.data_type=A(a)),v(a,a.l_desc),v(a,a.d_desc),g=y(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,f<=e&&(e=f)):e=f=c+5,c+4<=e&&b!==-1?C(a,b,c,d):a.strategy===H||f===e?(i(a,(M<<1)+(d?1:0),3),u(a,ga,ha)):(i(a,(N<<1)+(d?1:0),3),z(a,a.l_desc.max_code+1,a.d_desc.max_code+1,g+1),u(a,a.dyn_ltree,a.dyn_dtree)),p(a),d&&q(a)}function F(a,b,c){return a.pending_buf[a.d_buf+2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(ja[c]+R+1)]++,a.dyn_dtree[2*g(b)]++),a.last_lit===a.lit_bufsize-1}var G=a("../utils/common"),H=4,I=0,J=1,K=2,L=0,M=1,N=2,O=3,P=258,Q=29,R=256,S=R+1+Q,T=30,U=19,V=2*S+1,W=15,X=16,Y=7,Z=256,$=16,_=17,aa=18,ba=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],ca=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],da=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],ea=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],fa=512,ga=new Array(2*(S+2));d(ga);var ha=new Array(2*T);d(ha);var ia=new Array(fa);d(ia);var ja=new Array(P-O+1);d(ja);var ka=new Array(Q);d(ka);var la=new Array(T);d(la);var ma,na,oa,pa=!1;c._tr_init=B,c._tr_stored_block=C,c._tr_flush_block=E,c._tr_tally=F,c._tr_align=D},{"../utils/common":62}],74:[function(a,b,c){"use strict";function d(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}b.exports=d},{}]},{},[10])(10)}); \ No newline at end of file + +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).JSZip=t()}}(function(){return function s(a,o,h){function u(r,t){if(!o[r]){if(!a[r]){var e="function"==typeof require&&require;if(!t&&e)return e(r,!0);if(l)return l(r,!0);var i=new Error("Cannot find module '"+r+"'");throw i.code="MODULE_NOT_FOUND",i}var n=o[r]={exports:{}};a[r][0].call(n.exports,function(t){var e=a[r][1][t];return u(e||t)},n,n.exports,s,a,o,h)}return o[r].exports}for(var l="function"==typeof require&&require,t=0;t>2,s=(3&e)<<4|r>>4,a=1>6:64,o=2>4,r=(15&n)<<4|(s=p.indexOf(t.charAt(o++)))>>2,i=(3&s)<<6|(a=p.indexOf(t.charAt(o++))),l[h++]=e,64!==s&&(l[h++]=r),64!==a&&(l[h++]=i);return l}},{"./support":30,"./utils":32}],2:[function(t,e,r){"use strict";var i=t("./external"),n=t("./stream/DataWorker"),s=t("./stream/DataLengthProbe"),a=t("./stream/Crc32Probe");s=t("./stream/DataLengthProbe");function o(t,e,r,i,n){this.compressedSize=t,this.uncompressedSize=e,this.crc32=r,this.compression=i,this.compressedContent=n}o.prototype={getContentWorker:function(){var t=new n(i.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new s("data_length")),e=this;return t.on("end",function(){if(this.streamInfo.data_length!==e.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),t},getCompressedWorker:function(){return new n(i.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},o.createWorkerFrom=function(t,e,r){return t.pipe(new a).pipe(new s("uncompressedSize")).pipe(e.compressWorker(r)).pipe(new s("compressedSize")).withStreamInfo("compression",e)},e.exports=o},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(t,e,r){"use strict";var i=t("./stream/GenericWorker");r.STORE={magic:"\0\0",compressWorker:function(t){return new i("STORE compression")},uncompressWorker:function(){return new i("STORE decompression")}},r.DEFLATE=t("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(t,e,r){"use strict";var i=t("./utils");var o=function(){for(var t,e=[],r=0;r<256;r++){t=r;for(var i=0;i<8;i++)t=1&t?3988292384^t>>>1:t>>>1;e[r]=t}return e}();e.exports=function(t,e){return void 0!==t&&t.length?"string"!==i.getTypeOf(t)?function(t,e,r,i){var n=o,s=i+r;t^=-1;for(var a=i;a>>8^n[255&(t^e[a])];return-1^t}(0|e,t,t.length,0):function(t,e,r,i){var n=o,s=i+r;t^=-1;for(var a=i;a>>8^n[255&(t^e.charCodeAt(a))];return-1^t}(0|e,t,t.length,0):0}},{"./utils":32}],5:[function(t,e,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(t,e,r){"use strict";var i=null;i="undefined"!=typeof Promise?Promise:t("lie"),e.exports={Promise:i}},{lie:37}],7:[function(t,e,r){"use strict";var i="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,n=t("pako"),s=t("./utils"),a=t("./stream/GenericWorker"),o=i?"uint8array":"array";function h(t,e){a.call(this,"FlateWorker/"+t),this._pako=null,this._pakoAction=t,this._pakoOptions=e,this.meta={}}r.magic="\b\0",s.inherits(h,a),h.prototype.processChunk=function(t){this.meta=t.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,t.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new n[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var e=this;this._pako.onData=function(t){e.push({data:t,meta:e.meta})}},r.compressWorker=function(t){return new h("Deflate",t)},r.uncompressWorker=function(){return new h("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(t,e,r){"use strict";function A(t,e){var r,i="";for(r=0;r>>=8;return i}function i(t,e,r,i,n,s){var a,o,h=t.file,u=t.compression,l=s!==O.utf8encode,f=I.transformTo("string",s(h.name)),d=I.transformTo("string",O.utf8encode(h.name)),c=h.comment,p=I.transformTo("string",s(c)),m=I.transformTo("string",O.utf8encode(c)),_=d.length!==h.name.length,g=m.length!==c.length,b="",v="",y="",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};e&&!r||(x.crc32=t.crc32,x.compressedSize=t.compressedSize,x.uncompressedSize=t.uncompressedSize);var S=0;e&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),"UNIX"===n?(C=798,z|=function(t,e){var r=t;return t||(r=e?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(t){return 63&(t||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+d,b+="up"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+="uc"+A(y.length,2)+y);var E="";return E+="\n\0",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+"\0\0\0\0"+A(z,4)+A(i,4)+f+b+p}}var I=t("../utils"),n=t("../stream/GenericWorker"),O=t("../utf8"),B=t("../crc32"),R=t("../signature");function s(t,e,r,i){n.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=e,this.zipPlatform=r,this.encodeFileName=i,this.streamFiles=t,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}I.inherits(s,n),s.prototype.push=function(t){var e=t.meta.percent||0,r=this.entriesCount,i=this._sources.length;this.accumulate?this.contentBuffer.push(t):(this.bytesWritten+=t.data.length,n.prototype.push.call(this,{data:t.data,meta:{currentFile:this.currentFile,percent:r?(e+100*(r-i-1))/r:100}}))},s.prototype.openedSource=function(t){this.currentSourceOffset=this.bytesWritten,this.currentFile=t.file.name;var e=this.streamFiles&&!t.file.dir;if(e){var r=i(t,e,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(t){this.accumulate=!1;var e=this.streamFiles&&!t.file.dir,r=i(t,e,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),e)this.push({data:function(t){return R.DATA_DESCRIPTOR+A(t.crc32,4)+A(t.compressedSize,4)+A(t.uncompressedSize,4)}(t),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var t=this.bytesWritten,e=0;e=this.index;e--)r=(r<<8)+this.byteAt(e);return this.index+=t,r},readString:function(t){return i.transformTo("string",this.readData(t))},readData:function(t){},lastIndexOfSignature:function(t){},readAndCheckSignature:function(t){},readDate:function(){var t=this.readInt(4);return new Date(Date.UTC(1980+(t>>25&127),(t>>21&15)-1,t>>16&31,t>>11&31,t>>5&63,(31&t)<<1))}},e.exports=n},{"../utils":32}],19:[function(t,e,r){"use strict";var i=t("./Uint8ArrayReader");function n(t){i.call(this,t)}t("../utils").inherits(n,i),n.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=n},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(t,e,r){"use strict";var i=t("./DataReader");function n(t){i.call(this,t)}t("../utils").inherits(n,i),n.prototype.byteAt=function(t){return this.data.charCodeAt(this.zero+t)},n.prototype.lastIndexOfSignature=function(t){return this.data.lastIndexOf(t)-this.zero},n.prototype.readAndCheckSignature=function(t){return t===this.readData(4)},n.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=n},{"../utils":32,"./DataReader":18}],21:[function(t,e,r){"use strict";var i=t("./ArrayReader");function n(t){i.call(this,t)}t("../utils").inherits(n,i),n.prototype.readData=function(t){if(this.checkOffset(t),0===t)return new Uint8Array(0);var e=this.data.subarray(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=n},{"../utils":32,"./ArrayReader":17}],22:[function(t,e,r){"use strict";var i=t("../utils"),n=t("../support"),s=t("./ArrayReader"),a=t("./StringReader"),o=t("./NodeBufferReader"),h=t("./Uint8ArrayReader");e.exports=function(t){var e=i.getTypeOf(t);return i.checkSupport(e),"string"!==e||n.uint8array?"nodebuffer"===e?new o(t):n.uint8array?new h(i.transformTo("uint8array",t)):new s(i.transformTo("array",t)):new a(t)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(t,e,r){"use strict";r.LOCAL_FILE_HEADER="PK",r.CENTRAL_FILE_HEADER="PK",r.CENTRAL_DIRECTORY_END="PK",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",r.ZIP64_CENTRAL_DIRECTORY_END="PK",r.DATA_DESCRIPTOR="PK\b"},{}],24:[function(t,e,r){"use strict";var i=t("./GenericWorker"),n=t("../utils");function s(t){i.call(this,"ConvertWorker to "+t),this.destType=t}n.inherits(s,i),s.prototype.processChunk=function(t){this.push({data:n.transformTo(this.destType,t.data),meta:t.meta})},e.exports=s},{"../utils":32,"./GenericWorker":28}],25:[function(t,e,r){"use strict";var i=t("./GenericWorker"),n=t("../crc32");function s(){i.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}t("../utils").inherits(s,i),s.prototype.processChunk=function(t){this.streamInfo.crc32=n(t.data,this.streamInfo.crc32||0),this.push(t)},e.exports=s},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(t,e,r){"use strict";var i=t("../utils"),n=t("./GenericWorker");function s(t){n.call(this,"DataLengthProbe for "+t),this.propName=t,this.withStreamInfo(t,0)}i.inherits(s,n),s.prototype.processChunk=function(t){if(t){var e=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=e+t.data.length}n.prototype.processChunk.call(this,t)},e.exports=s},{"../utils":32,"./GenericWorker":28}],27:[function(t,e,r){"use strict";var i=t("../utils"),n=t("./GenericWorker");function s(t){n.call(this,"DataWorker");var e=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,t.then(function(t){e.dataIsReady=!0,e.data=t,e.max=t&&t.length||0,e.type=i.getTypeOf(t),e.isPaused||e._tickAndRepeat()},function(t){e.error(t)})}i.inherits(s,n),s.prototype.cleanUp=function(){n.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!n.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,i.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(i.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var t=null,e=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":t=this.data.substring(this.index,e);break;case"uint8array":t=this.data.subarray(this.index,e);break;case"array":case"nodebuffer":t=this.data.slice(this.index,e)}return this.index=e,this.push({data:t,meta:{percent:this.max?this.index/this.max*100:0}})},e.exports=s},{"../utils":32,"./GenericWorker":28}],28:[function(t,e,r){"use strict";function i(t){this.name=t||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}i.prototype={push:function(t){this.emit("data",t)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(t){this.emit("error",t)}return!0},error:function(t){return!this.isFinished&&(this.isPaused?this.generatedError=t:(this.isFinished=!0,this.emit("error",t),this.previous&&this.previous.error(t),this.cleanUp()),!0)},on:function(t,e){return this._listeners[t].push(e),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(t,e){if(this._listeners[t])for(var r=0;r "+t:t}},e.exports=i},{}],29:[function(t,e,r){"use strict";var h=t("../utils"),n=t("./ConvertWorker"),s=t("./GenericWorker"),u=t("../base64"),i=t("../support"),a=t("../external"),o=null;if(i.nodestream)try{o=t("../nodejs/NodejsStreamOutputAdapter")}catch(t){}function l(t,o){return new a.Promise(function(e,r){var i=[],n=t._internalType,s=t._outputType,a=t._mimeType;t.on("data",function(t,e){i.push(t),o&&o(e)}).on("error",function(t){i=[],r(t)}).on("end",function(){try{var t=function(t,e,r){switch(t){case"blob":return h.newBlob(h.transformTo("arraybuffer",e),r);case"base64":return u.encode(e);default:return h.transformTo(t,e)}}(s,function(t,e){var r,i=0,n=null,s=0;for(r=0;r>>6:(r<65536?e[s++]=224|r>>>12:(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63),e[s++]=128|r>>>6&63),e[s++]=128|63&r);return e}(t)},s.utf8decode=function(t){return h.nodebuffer?o.transformTo("nodebuffer",t).toString("utf-8"):function(t){var e,r,i,n,s=t.length,a=new Array(2*s);for(e=r=0;e>10&1023,a[r++]=56320|1023&i)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(t=o.transformTo(h.uint8array?"uint8array":"array",t))},o.inherits(a,i),a.prototype.processChunk=function(t){var e=o.transformTo(h.uint8array?"uint8array":"array",t.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=e;(e=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),e.set(r,this.leftOver.length)}else e=this.leftOver.concat(e);this.leftOver=null}var i=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;0<=r&&128==(192&t[r]);)r--;return r<0?e:0===r?e:r+u[t[r]]>e?r:e}(e),n=e;i!==e.length&&(h.uint8array?(n=e.subarray(0,i),this.leftOver=e.subarray(i,e.length)):(n=e.slice(0,i),this.leftOver=e.slice(i,e.length))),this.push({data:s.utf8decode(n),meta:t.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,i),l.prototype.processChunk=function(t){this.push({data:s.utf8encode(t.data),meta:t.meta})},s.Utf8EncodeWorker=l},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(t,e,a){"use strict";var o=t("./support"),h=t("./base64"),r=t("./nodejsUtils"),i=t("set-immediate-shim"),u=t("./external");function n(t){return t}function l(t,e){for(var r=0;r>8;this.dir=!!(16&this.externalFileAttributes),0==t&&(this.dosPermissions=63&this.externalFileAttributes),3==t&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(t){if(this.extraFields[1]){var e=i(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(t){var e,r,i,n=t.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});t.index>>6:(r<65536?e[s++]=224|r>>>12:(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63),e[s++]=128|r>>>6&63),e[s++]=128|63&r);return e},r.buf2binstring=function(t){return l(t,t.length)},r.binstring2buf=function(t){for(var e=new h.Buf8(t.length),r=0,i=e.length;r>10&1023,o[i++]=56320|1023&n)}return l(o,i)},r.utf8border=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;0<=r&&128==(192&t[r]);)r--;return r<0?e:0===r?e:r+u[t[r]]>e?r:e}},{"./common":41}],43:[function(t,e,r){"use strict";e.exports=function(t,e,r,i){for(var n=65535&t|0,s=t>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3>>1:t>>>1;e[r]=t}return e}();e.exports=function(t,e,r,i){var n=o,s=i+r;t^=-1;for(var a=i;a>>8^n[255&(t^e[a])];return-1^t}},{}],46:[function(t,e,r){"use strict";var h,d=t("../utils/common"),u=t("./trees"),c=t("./adler32"),p=t("./crc32"),i=t("./messages"),l=0,f=4,m=0,_=-2,g=-1,b=4,n=2,v=8,y=9,s=286,a=30,o=19,w=2*s+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(t,e){return t.msg=i[e],e}function T(t){return(t<<1)-(4t.avail_out&&(r=t.avail_out),0!==r&&(d.arraySet(t.output,e.pending_buf,e.pending_out,r,t.next_out),t.next_out+=r,e.pending_out+=r,t.total_out+=r,t.avail_out-=r,e.pending-=r,0===e.pending&&(e.pending_out=0))}function N(t,e){u._tr_flush_block(t,0<=t.block_start?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,F(t.strm)}function U(t,e){t.pending_buf[t.pending++]=e}function P(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function L(t,e){var r,i,n=t.max_chain_length,s=t.strstart,a=t.prev_length,o=t.nice_match,h=t.strstart>t.w_size-z?t.strstart-(t.w_size-z):0,u=t.window,l=t.w_mask,f=t.prev,d=t.strstart+S,c=u[s+a-1],p=u[s+a];t.prev_length>=t.good_match&&(n>>=2),o>t.lookahead&&(o=t.lookahead);do{if(u[(r=e)+a]===p&&u[r+a-1]===c&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&sh&&0!=--n);return a<=t.lookahead?a:t.lookahead}function j(t){var e,r,i,n,s,a,o,h,u,l,f=t.w_size;do{if(n=t.window_size-t.lookahead-t.strstart,t.strstart>=f+(f-z)){for(d.arraySet(t.window,t.window,f,f,0),t.match_start-=f,t.strstart-=f,t.block_start-=f,e=r=t.hash_size;i=t.head[--e],t.head[e]=f<=i?i-f:0,--r;);for(e=r=f;i=t.prev[--e],t.prev[e]=f<=i?i-f:0,--r;);n+=f}if(0===t.strm.avail_in)break;if(a=t.strm,o=t.window,h=t.strstart+t.lookahead,u=n,l=void 0,l=a.avail_in,u=x)for(s=t.strstart-t.insert,t.ins_h=t.window[s],t.ins_h=(t.ins_h<=x&&(t.ins_h=(t.ins_h<=x)if(i=u._tr_tally(t,t.strstart-t.match_start,t.match_length-x),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=x){for(t.match_length--;t.strstart++,t.ins_h=(t.ins_h<=x&&(t.ins_h=(t.ins_h<=x&&t.match_length<=t.prev_length){for(n=t.strstart+t.lookahead-x,i=u._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-x),t.lookahead-=t.prev_length-1,t.prev_length-=2;++t.strstart<=n&&(t.ins_h=(t.ins_h<t.pending_buf_size-5&&(r=t.pending_buf_size-5);;){if(t.lookahead<=1){if(j(t),0===t.lookahead&&e===l)return A;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var i=t.block_start+r;if((0===t.strstart||t.strstart>=i)&&(t.lookahead=t.strstart-i,t.strstart=i,N(t,!1),0===t.strm.avail_out))return A;if(t.strstart-t.block_start>=t.w_size-z&&(N(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(N(t,!0),0===t.strm.avail_out?O:B):(t.strstart>t.block_start&&(N(t,!1),t.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(t,e){return Y(t,e,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(t,e){return t&&t.state?2!==t.state.wrap?_:(t.state.gzhead=e,m):_},r.deflate=function(t,e){var r,i,n,s;if(!t||!t.state||5>8&255),U(i,i.gzhead.time>>16&255),U(i,i.gzhead.time>>24&255),U(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),U(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(U(i,255&i.gzhead.extra.length),U(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(t.adler=p(t.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69):(U(i,0),U(i,0),U(i,0),U(i,0),U(i,0),U(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),U(i,3),i.status=E);else{var a=v+(i.w_bits-8<<4)<<8;a|=(2<=i.strategy||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(a|=32),a+=31-a%31,i.status=E,P(i,a),0!==i.strstart&&(P(i,t.adler>>>16),P(i,65535&t.adler)),t.adler=1}if(69===i.status)if(i.gzhead.extra){for(n=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),F(t),n=i.pending,i.pending!==i.pending_buf_size));)U(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=73)}else i.status=73;if(73===i.status)if(i.gzhead.name){n=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),F(t),n=i.pending,i.pending===i.pending_buf_size)){s=1;break}s=i.gzindexn&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),0===s&&(i.gzindex=0,i.status=91)}else i.status=91;if(91===i.status)if(i.gzhead.comment){n=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),F(t),n=i.pending,i.pending===i.pending_buf_size)){s=1;break}s=i.gzindexn&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),0===s&&(i.status=103)}else i.status=103;if(103===i.status&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&F(t),i.pending+2<=i.pending_buf_size&&(U(i,255&t.adler),U(i,t.adler>>8&255),t.adler=0,i.status=E)):i.status=E),0!==i.pending){if(F(t),0===t.avail_out)return i.last_flush=-1,m}else if(0===t.avail_in&&T(e)<=T(r)&&e!==f)return R(t,-5);if(666===i.status&&0!==t.avail_in)return R(t,-5);if(0!==t.avail_in||0!==i.lookahead||e!==l&&666!==i.status){var o=2===i.strategy?function(t,e){for(var r;;){if(0===t.lookahead&&(j(t),0===t.lookahead)){if(e===l)return A;break}if(t.match_length=0,r=u._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,r&&(N(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(N(t,!0),0===t.strm.avail_out?O:B):t.last_lit&&(N(t,!1),0===t.strm.avail_out)?A:I}(i,e):3===i.strategy?function(t,e){for(var r,i,n,s,a=t.window;;){if(t.lookahead<=S){if(j(t),t.lookahead<=S&&e===l)return A;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=x&&0t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=x?(r=u._tr_tally(t,1,t.match_length-x),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(r=u._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),r&&(N(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(N(t,!0),0===t.strm.avail_out?O:B):t.last_lit&&(N(t,!1),0===t.strm.avail_out)?A:I}(i,e):h[i.level].func(i,e);if(o!==O&&o!==B||(i.status=666),o===A||o===O)return 0===t.avail_out&&(i.last_flush=-1),m;if(o===I&&(1===e?u._tr_align(i):5!==e&&(u._tr_stored_block(i,0,0,!1),3===e&&(D(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),F(t),0===t.avail_out))return i.last_flush=-1,m}return e!==f?m:i.wrap<=0?1:(2===i.wrap?(U(i,255&t.adler),U(i,t.adler>>8&255),U(i,t.adler>>16&255),U(i,t.adler>>24&255),U(i,255&t.total_in),U(i,t.total_in>>8&255),U(i,t.total_in>>16&255),U(i,t.total_in>>24&255)):(P(i,t.adler>>>16),P(i,65535&t.adler)),F(t),0=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new d.Buf8(r.w_size),d.arraySet(u,e,l-r.w_size,r.w_size,0),e=u,l=r.w_size),a=t.avail_in,o=t.next_in,h=t.input,t.avail_in=l,t.next_in=0,t.input=e,j(r);r.lookahead>=x;){for(i=r.strstart,n=r.lookahead-(x-1);r.ins_h=(r.ins_h<>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(c&(1<>>=y,p-=y),p<15&&(c+=z[i++]<>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(c&(1<>>=y,p-=y,(y=s-a)>3,c&=(1<<(p-=w<<3))-1,t.next_in=i,t.next_out=s,t.avail_in=i>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=P,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new I.Buf32(i),e.distcode=e.distdyn=new I.Buf32(n),e.sane=1,e.back=-1,N):U}function o(t){var e;return t&&t.state?((e=t.state).wsize=0,e.whave=0,e.wnext=0,a(t)):U}function h(t,e){var r,i;return t&&t.state?(i=t.state,e<0?(r=0,e=-e):(r=1+(e>>4),e<48&&(e&=15)),e&&(e<8||15=s.wsize?(I.arraySet(s.window,e,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(i<(n=s.wsize-s.wnext)&&(n=i),I.arraySet(s.window,e,r-i,n,s.wnext),(i-=n)?(I.arraySet(s.window,e,r-i,i,0),s.wnext=i,s.whave=s.wsize):(s.wnext+=n,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){t.msg="incorrect header check",r.mode=30;break}if(8!=(15&u)){t.msg="unknown compression method",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){t.msg="invalid window size",r.mode=30;break}r.dmax=1<>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;l<32;){if(0===o)break t;o--,u+=i[s++]<>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;l<16;){if(0===o)break t;o--,u+=i[s++]<>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;l<16;){if(0===o)break t;o--,u+=i[s++]<>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(c=r.length)&&(c=o),c&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,i,s,c,k)),512&r.flags&&(r.check=B(r.check,i,c,s)),o-=c,s+=c,r.length-=c),r.length))break t;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break t;for(c=0;k=i[s+c++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&c>9&1,r.head.done=!0),t.adler=r.check=0,r.mode=12;break;case 10:for(;l<32;){if(0===o)break t;o--,u+=i[s++]<>>=7&l,l-=7&l,r.mode=27;break}for(;l<3;){if(0===o)break t;o--,u+=i[s++]<>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==e)break;u>>>=2,l-=2;break t;case 2:r.mode=17;break;case 3:t.msg="invalid block type",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;l<32;){if(0===o)break t;o--,u+=i[s++]<>>16^65535)){t.msg="invalid stored block lengths",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===e)break t;case 15:r.mode=16;case 16:if(c=r.length){if(o>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){t.msg="invalid code lengths set",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;l>>=_,l-=_,0===r.have){t.msg="invalid bit length repeat",r.mode=30;break}k=r.lens[r.have-1],c=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;l>>=_)),u>>>=3,l-=3}else{for(z=_+7;l>>=_)),u>>>=7,l-=7}if(r.have+c>r.nlen+r.ndist){t.msg="invalid bit length repeat",r.mode=30;break}for(;c--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){t.msg="invalid code -- missing end-of-block",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){t.msg="invalid literal/lengths set",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){t.msg="invalid distances set",r.mode=30;break}if(r.mode=20,6===e)break t;case 20:r.mode=21;case 21:if(6<=o&&258<=h){t.next_out=a,t.avail_out=h,t.next_in=s,t.avail_in=o,r.hold=u,r.bits=l,R(t,d),a=t.next_out,n=t.output,h=t.avail_out,s=t.next_in,i=t.input,o=t.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){t.msg="invalid literal/length code",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){t.msg="invalid distance code",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){t.msg="invalid distance too far back",r.mode=30;break}r.mode=25;case 25:if(0===h)break t;if(c=d-h,r.offset>c){if((c=r.offset-c)>r.whave&&r.sane){t.msg="invalid distance too far back",r.mode=30;break}p=c>r.wnext?(c-=r.wnext,r.wsize-c):r.wnext-c,c>r.length&&(c=r.length),m=r.window}else m=n,p=a-r.offset,c=r.length;for(hc?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=e[r+a[v]]}if(k>>7)]}function U(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function P(t,e,r){t.bi_valid>c-r?(t.bi_buf|=e<>c-t.bi_valid,t.bi_valid+=r-c):(t.bi_buf|=e<>>=1,r<<=1,0<--e;);return r>>>1}function Z(t,e,r){var i,n,s=new Array(g+1),a=0;for(i=1;i<=g;i++)s[i]=a=a+r[i-1]<<1;for(n=0;n<=e;n++){var o=t[2*n+1];0!==o&&(t[2*n]=j(s[o]++,o))}}function W(t){var e;for(e=0;e>1;1<=r;r--)G(t,s,r);for(n=h;r=t.heap[1],t.heap[1]=t.heap[t.heap_len--],G(t,s,1),i=t.heap[1],t.heap[--t.heap_max]=r,t.heap[--t.heap_max]=i,s[2*n]=s[2*r]+s[2*i],t.depth[n]=(t.depth[r]>=t.depth[i]?t.depth[r]:t.depth[i])+1,s[2*r+1]=s[2*i+1]=n,t.heap[1]=n++,G(t,s,1),2<=t.heap_len;);t.heap[--t.heap_max]=t.heap[1],function(t,e){var r,i,n,s,a,o,h=e.dyn_tree,u=e.max_code,l=e.stat_desc.static_tree,f=e.stat_desc.has_stree,d=e.stat_desc.extra_bits,c=e.stat_desc.extra_base,p=e.stat_desc.max_length,m=0;for(s=0;s<=g;s++)t.bl_count[s]=0;for(h[2*t.heap[t.heap_max]+1]=0,r=t.heap_max+1;r<_;r++)p<(s=h[2*h[2*(i=t.heap[r])+1]+1]+1)&&(s=p,m++),h[2*i+1]=s,u>=7;i>>=1)if(1&r&&0!==t.dyn_ltree[2*e])return o;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return h;for(e=32;e>>3,(s=t.static_len+3+7>>>3)<=n&&(n=s)):n=s=r+5,r+4<=n&&-1!==e?J(t,e,r,i):4===t.strategy||s===n?(P(t,2+(i?1:0),3),K(t,z,C)):(P(t,4+(i?1:0),3),function(t,e,r,i){var n;for(P(t,e-257,5),P(t,r-1,5),P(t,i-4,4),n=0;n>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&r,t.last_lit++,0===e?t.dyn_ltree[2*r]++:(t.matches++,e--,t.dyn_ltree[2*(A[r]+u+1)]++,t.dyn_dtree[2*N(e)]++),t.last_lit===t.lit_bufsize-1},r._tr_align=function(t){P(t,2,3),L(t,m,z),function(t){16===t.bi_valid?(U(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):8<=t.bi_valid&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}(t)}},{"../utils/common":41}],53:[function(t,e,r){"use strict";e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(t,e,r){"use strict";e.exports="function"==typeof setImmediate?setImmediate:function(){var t=[].slice.apply(arguments);t.splice(1,0,0),setTimeout.apply(null,t)}},{}]},{},[10])(10)}); \ No newline at end of file diff --git a/docs/apidocs/script.js b/docs/apidocs/script.js index b1847c3a1c6..298ebf5f418 100644 --- a/docs/apidocs/script.js +++ b/docs/apidocs/script.js @@ -102,9 +102,6 @@ function loadScripts(doc, tag) { if (!tagSearchIndex) { createElem(doc, tag, 'tag-search-index.js'); } - $(window).resize(function() { - $('.navPadding').css('padding-top', $('.fixedNav').css("height")); - }); } function createElem(doc, tag, path) { diff --git a/docs/apidocs/serialized-form.html b/docs/apidocs/serialized-form.html index d572a2e2f37..b5559adbaf8 100644 --- a/docs/apidocs/serialized-form.html +++ b/docs/apidocs/serialized-form.html @@ -2,10 +2,10 @@ - -Serialized Form (weblogic-kubernetes-operator 2.6.0 API) + +Serialized Form (weblogic-kubernetes-operator 3.0.0 API) - + @@ -25,9 +25,9 @@ -
    + - - +
    +

    Serialized Form

    @@ -187,5 +182,7 @@
    field

    Copyright © 2017–2020. All rights reserved.

    +
    +
    diff --git a/docs/apidocs/stylesheet.css b/docs/apidocs/stylesheet.css index 9681235b9e5..e12be4e31db 100644 --- a/docs/apidocs/stylesheet.css +++ b/docs/apidocs/stylesheet.css @@ -40,13 +40,6 @@ a[href]:hover, a[href]:focus { a[name] { color:#353833; } -a[name]:before, a[name]:target, a[id]:before, a[id]:target { - content:""; - display:inline-block; - position:relative; - padding-top:129px; - margin-top:-129px; -} pre { font-family:'DejaVu Sans Mono', monospace; font-size:14px; @@ -121,13 +114,6 @@ button { .legalCopy { margin-left:.5em; } -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} .tab { background-color:#0066FF; color:#ffffff; @@ -138,22 +124,21 @@ button { /* * Styles for navigation bar. */ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.navPadding { - padding-top: 107px; -} -.fixedNav { - position:fixed; - width:100%; - z-index:999; - background-color:#ffffff; +@media screen { + .flexBox { + position:fixed; + display:flex; + flex-direction:column; + height: 100%; + width: 100%; + } + .flexHeader { + flex: 0 0 auto; + } + .flexContent { + flex: 1 1 auto; + overflow-y: auto; + } } .topNav { background-color:#4D7A97; @@ -243,32 +228,22 @@ ul.subNavList li { left:-9999px; overflow:hidden; } +/* + * Hide navigation links and search box in print layout + */ +@media print { + ul.navList, div.subNav { + display:none; + } +} /* * Styles for page header and footer. */ -.header, .footer { +.header { clear:both; margin:0 20px; padding:5px 0 0 0; } -.indexNav { - position:relative; - font-size:12px; - background-color:#dee3e9; -} -.indexNav ul { - margin-top:0; - padding:5px; -} -.indexNav ul li { - display:inline; - list-style-type:none; - padding-right:10px; - text-transform:uppercase; -} -.indexNav h1 { - font-size:13px; -} .title { color:#2c4557; margin:10px 0; @@ -280,9 +255,6 @@ ul.subNavList li { margin:0 0 15px 0; padding:0; } -.footer ul { - margin:20px 0 5px 0; -} .header ul li, .footer ul li { list-style:none; font-size:13px; @@ -310,28 +282,11 @@ body.class-declaration .summary .inheritedList h2 { * Styles for page layout containers. */ .contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer, -.allClassesContainer, .allPackagesContainer { +.allClassesContainer, .allPackagesContainer, .systemPropertiesContainer { clear:both; padding:10px 20px; position:relative; } -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} .contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { font-size:12px; font-weight:bold; @@ -388,19 +343,21 @@ table tr td dl, table tr td dl dt, table tr td dl dd { * Styles for tables. */ .overviewSummary table, .memberSummary table, .typeSummary table, .useSummary table, .constantsSummary table, .deprecatedSummary table, -.requiresSummary table, .packagesSummary table, .providesSummary table, .usesSummary table { +.requiresSummary table, .packagesSummary table, .providesSummary table, .usesSummary table, .systemPropertiesSummary table { width:100%; border-spacing:0; border-left:1px solid #EEE; border-right:1px solid #EEE; border-bottom:1px solid #EEE; } -.overviewSummary table, .memberSummary table, .requiresSummary table, .packagesSummary table, .providesSummary table, .usesSummary table { +.overviewSummary table, .memberSummary table, .requiresSummary table, .packagesSummary table, +.providesSummary table, .usesSummary table, .systemPropertiesSummary table { padding:0px; } .overviewSummary caption, .memberSummary caption, .typeSummary caption, .useSummary caption, .constantsSummary caption, .deprecatedSummary caption, -.requiresSummary caption, .packagesSummary caption, .providesSummary caption, .usesSummary caption { +.requiresSummary caption, .packagesSummary caption, .providesSummary caption, +.usesSummary caption, .systemPropertiesSummary caption { position:relative; text-align:left; background-repeat:no-repeat; @@ -439,7 +396,7 @@ table tr td dl, table tr td dl dt, table tr td dl dd { .overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, .useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span, .requiresSummary caption span, .packagesSummary caption span, .providesSummary caption span, -.usesSummary caption span { +.usesSummary caption span, .systemPropertiesSummary caption span { white-space:nowrap; padding-top:5px; padding-left:12px; @@ -483,13 +440,14 @@ table tr td dl, table tr td dl dt, table tr td dl dd { } .overviewSummary td, .memberSummary td, .typeSummary td, .useSummary td, .constantsSummary td, .deprecatedSummary td, -.requiresSummary td, .packagesSummary td, .providesSummary td, .usesSummary td { +.requiresSummary td, .packagesSummary td, .providesSummary td, +.usesSummary td, .systemPropertiesSummary td { text-align:left; padding:0px 0px 12px 10px; } th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .useSummary th, .constantsSummary th, .packagesSummary th, td.colFirst, td.colSecond, td.colLast, .useSummary td, -.constantsSummary td { +.constantsSummary td, .systemPropertiesSummary th { vertical-align:top; padding-right:0px; padding-top:8px; @@ -558,9 +516,6 @@ th.colDeprecatedItemName a:link, th.colDeprecatedItemName a:visited, margin:0; padding:10px 0; } -.docSummary { - padding:0; -} div.block { font-size:14px; font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; @@ -604,7 +559,7 @@ h1.hidden { } .block { display:block; - margin:3px 10px 2px 0px; + margin:0 10px 5px 0; color:#474747; } .deprecatedLabel, .descfrmTypeLabel, .implementationLabel, .memberNameLabel, .memberNameLink, @@ -631,61 +586,6 @@ div.block div.deprecationComment, div.block div.block span.emphasizedPhrase, div.block div.block span.interfaceName { font-style:normal; } -/* - * Styles for IFRAME. - */ -.mainContainer { - margin:0 auto; - padding:0; - height:100%; - width:100%; - position:fixed; - top:0; - left:0; -} -.leftContainer { - height:100%; - position:fixed; - width:320px; -} -.leftTop { - position:relative; - float:left; - width:315px; - top:0; - left:0; - height:30%; - border-right:6px solid #ccc; - border-bottom:6px solid #ccc; -} -.leftBottom { - position:relative; - float:left; - width:315px; - bottom:0; - left:0; - height:70%; - border-right:6px solid #ccc; - border-top:1px solid #000; -} -.rightContainer { - position:absolute; - left:320px; - top:0; - bottom:0; - height:100%; - right:0; - border-left:1px solid #000; -} -.rightIframe { - margin:0; - padding:0; - height:100%; - right:30px; - width:100%; - overflow:visible; - margin-bottom:30px; -} /* * Styles specific to HTML5 elements. */ @@ -743,7 +643,7 @@ ul.ui-autocomplete li { background-size:12px; border:0 none; width:16px; - height:17px; + height:16px; position:relative; left:-4px; top:-4px; @@ -760,8 +660,8 @@ ul.ui-autocomplete li { font-style:italic; font-size:12px; } -.searchTagResult:before, .searchTagResult:target { - color:red; +.searchTagResult:target { + background-color:yellow; } .moduleGraph span { display:none; @@ -772,9 +672,6 @@ ul.ui-autocomplete li { margin: -100px 0 0 100px; z-index: 1; } -.methodSignature { - white-space:normal; -} .inheritedList { margin: 10px 0 10px 0; } @@ -792,6 +689,34 @@ section.description { background-color:#ffffff; border:none; } +.verticalSeparator { + padding: 0 5px; +} +/* + * Indicator icon for external links. + */ +main a[href*="://"]::after { + content:""; + display:inline-block; + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); + background-size:100% 100%; + width:7px; + height:7px; + margin-left:2px; + margin-bottom:4px; +} +main a[href*="://"]:hover::after, +main a[href*="://"]:focus::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); +} /* * Styles for user-provided tables. diff --git a/docs/apidocs/system-properties.html b/docs/apidocs/system-properties.html new file mode 100644 index 00000000000..d8c1fc2aa2d --- /dev/null +++ b/docs/apidocs/system-properties.html @@ -0,0 +1,108 @@ + + + + + +System Properties (weblogic-kubernetes-operator 3.0.0 API) + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    System Properties

    +
    +
    +
    + + + + + + + + +
    System Properties Summary 
    PropertyReferenced In
    +
    +
    +
    + + + diff --git a/docs/apidocs/type-search-index.js b/docs/apidocs/type-search-index.js index 2e1fc0ea985..1f073e89fde 100644 --- a/docs/apidocs/type-search-index.js +++ b/docs/apidocs/type-search-index.js @@ -1 +1 @@ -typeSearchIndex = [{"p":"oracle.kubernetes.operator.steps","l":"AbstractListStep"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"AdminServer"},{"p":"oracle.kubernetes.weblogic.domain","l":"AdminServerConfigurator"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"AdminServerSpec"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"AdminServerSpecCommonImpl"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"AdminService"},{"l":"All Classes","url":"allclasses-index.html"},{"p":"oracle.kubernetes.operator.helpers","l":"AnnotationHelper"},{"p":"oracle.kubernetes.operator.work","l":"AsyncFiber"},{"p":"oracle.kubernetes.operator.calls","l":"AsyncRequestStep"},{"p":"oracle.kubernetes.operator.helpers","l":"AsyncRequestStepFactory"},{"p":"oracle.kubernetes.operator.rest","l":"AuthenticationFilter"},{"p":"oracle.kubernetes.operator.helpers","l":"AuthenticationProxy"},{"p":"oracle.kubernetes.operator.authentication","l":"Authenticator"},{"p":"oracle.kubernetes.operator.helpers","l":"AuthorizationProxy"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"BaseConfiguration"},{"p":"oracle.kubernetes.operator.rest","l":"BaseDebugLoggingFilter"},{"p":"oracle.kubernetes.operator.rest.model","l":"BaseModel"},{"p":"oracle.kubernetes.operator.helpers","l":"BasePodStepContext"},{"p":"oracle.kubernetes.operator.rest.resource","l":"BaseResource"},{"p":"oracle.kubernetes.operator.steps","l":"BeforeAdminServiceStep"},{"p":"oracle.kubernetes.operator.helpers","l":"CallBuilder"},{"p":"oracle.kubernetes.operator.helpers","l":"CallBuilderFactory"},{"p":"oracle.kubernetes.operator","l":"TuningParameters.CallBuilderTuning"},{"p":"oracle.kubernetes.operator.calls","l":"CallFactory"},{"p":"oracle.kubernetes.operator.builders","l":"CallParams"},{"p":"oracle.kubernetes.operator.calls","l":"CallResponse"},{"p":"oracle.kubernetes.operator.calls","l":"CallWrapper"},{"p":"oracle.kubernetes.operator.calls","l":"CancellableCall"},{"p":"oracle.kubernetes.operator.calls.unprocessable","l":"Cause"},{"p":"oracle.kubernetes.operator.utils","l":"Certificates"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Channel"},{"p":"oracle.kubernetes.operator.helpers","l":"ClientFactory"},{"p":"oracle.kubernetes.operator.helpers","l":"ClientPool"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Cluster"},{"p":"oracle.kubernetes.operator.helpers","l":"ClusterConfig"},{"p":"oracle.kubernetes.weblogic.domain","l":"ClusterConfigurator"},{"p":"oracle.kubernetes.operator.helpers","l":"ClusteredServerConfig"},{"p":"oracle.kubernetes.operator.rest.model","l":"ClusterModel"},{"p":"oracle.kubernetes.operator.rest.resource","l":"ClusterResource"},{"p":"oracle.kubernetes.operator.steps","l":"ClusterServicesStep"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ClusterSpec"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ClusterSpecCommonImpl"},{"p":"oracle.kubernetes.operator.rest.resource","l":"ClustersResource"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ClusterStatus"},{"p":"oracle.kubernetes.operator.rest.model","l":"CollectionModel"},{"p":"oracle.kubernetes.operator.work","l":"Fiber.CompletionCallback"},{"p":"oracle.kubernetes.operator.work","l":"Component"},{"p":"oracle.kubernetes.operator.work","l":"ComponentEx"},{"p":"oracle.kubernetes.operator.work","l":"ComponentRegistry"},{"p":"oracle.kubernetes.operator.steps","l":"ConfigMapAfterStep"},{"p":"oracle.kubernetes.operator.helpers","l":"ConfigMapConsumer"},{"p":"oracle.kubernetes.operator.helpers","l":"ConfigMapHelper"},{"p":"oracle.kubernetes.operator","l":"ConfigMapWatcher"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Configuration"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ConfigurationConstants"},{"p":"oracle.kubernetes.weblogic.domain","l":"ConfigurationNotSupportedException"},{"p":"oracle.kubernetes.operator.helpers","l":"ConflictRetry"},{"p":"oracle.kubernetes.operator.work","l":"Container"},{"p":"oracle.kubernetes.operator.work","l":"ContainerResolver"},{"p":"oracle.kubernetes.operator.helpers","l":"CrdHelper"},{"p":"oracle.kubernetes.operator.steps","l":"DefaultResponseStep"},{"p":"oracle.kubernetes.operator.steps","l":"DeleteDomainStep"},{"p":"oracle.kubernetes.operator.steps","l":"DeleteServiceListStep"},{"p":"oracle.kubernetes.json","l":"Description"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Domain"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"DomainCommonConfigurator"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"DomainCondition"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"DomainConditionType"},{"p":"oracle.kubernetes.operator.helpers","l":"DomainConfig"},{"p":"oracle.kubernetes.weblogic.domain","l":"DomainConfigurator"},{"p":"oracle.kubernetes.weblogic.domain","l":"DomainConfiguratorFactory"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"DomainList"},{"p":"oracle.kubernetes.operator.rest.model","l":"DomainModel"},{"p":"oracle.kubernetes.operator","l":"DomainPresence"},{"p":"oracle.kubernetes.operator.helpers","l":"DomainPresenceInfo"},{"p":"oracle.kubernetes.operator.steps","l":"DomainPresenceStep"},{"p":"oracle.kubernetes.operator","l":"DomainProcessor"},{"p":"oracle.kubernetes.operator","l":"DomainProcessorDelegate"},{"p":"oracle.kubernetes.operator","l":"DomainProcessorImpl"},{"p":"oracle.kubernetes.operator.rest.resource","l":"DomainResource"},{"p":"oracle.kubernetes.operator","l":"DomainSourceType"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"DomainSpec"},{"p":"oracle.kubernetes.operator.rest.resource","l":"DomainsResource"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"DomainStatus"},{"p":"oracle.kubernetes.operator.helpers","l":"DomainStatusPatch"},{"p":"oracle.kubernetes.operator","l":"DomainStatusUpdater"},{"p":"oracle.kubernetes.operator.helpers","l":"ConfigMapHelper.DomainTopology"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"DomainValidationFailure"},{"p":"oracle.kubernetes.operator.helpers","l":"DomainValidationSteps"},{"p":"oracle.kubernetes.operator","l":"DomainWatcher"},{"p":"oracle.kubernetes.weblogic.domain","l":"EffectiveConfigurationFactory"},{"p":"oracle.kubernetes.operator.work","l":"Engine"},{"p":"oracle.kubernetes.json","l":"EnumClass"},{"p":"oracle.kubernetes.operator.calls.unprocessable","l":"ErrorBody"},{"p":"oracle.kubernetes.operator.rest","l":"ErrorFilter"},{"p":"oracle.kubernetes.operator.rest.model","l":"ErrorModel"},{"p":"oracle.kubernetes.operator","l":"EventWatcher"},{"p":"oracle.kubernetes.operator.rest","l":"ExceptionMapper"},{"p":"oracle.kubernetes.operator.work","l":"Fiber.ExitCallback"},{"p":"oracle.kubernetes.operator.calls","l":"FailureStatusSource"},{"p":"oracle.kubernetes.operator.calls","l":"FailureStatusSourceException"},{"p":"oracle.kubernetes.operator.work","l":"Fiber"},{"p":"oracle.kubernetes.operator.work","l":"FiberGate"},{"p":"oracle.kubernetes.operator.work","l":"FiberGateFactory"},{"p":"oracle.kubernetes.operator.rest","l":"FilterPriorities"},{"p":"oracle.kubernetes.operator.helpers","l":"HealthCheckHelper"},{"p":"oracle.kubernetes.operator.authentication","l":"Helpers"},{"p":"oracle.kubernetes.operator.http","l":"HttpAsyncRequestStep"},{"p":"oracle.kubernetes.operator.http","l":"HttpResponseStep"},{"p":"oracle.kubernetes.operator","l":"ImagePullPolicy"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"IntrospectorJobEnvVars"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Istio"},{"p":"oracle.kubernetes.operator.rest.model","l":"ItemModel"},{"p":"oracle.kubernetes.operator.helpers","l":"JobHelper"},{"p":"oracle.kubernetes.operator.helpers","l":"JobStepContext"},{"p":"oracle.kubernetes.operator","l":"JobWatcher"},{"p":"oracle.kubernetes.json.mojo","l":"JsonSchemaMojo"},{"p":"oracle.kubernetes.operator.work","l":"NextAction.Kind"},{"p":"oracle.kubernetes.operator","l":"KubernetesConstants"},{"p":"oracle.kubernetes.operator.utils","l":"KubernetesExec"},{"p":"oracle.kubernetes.operator.utils","l":"KubernetesExecFactory"},{"p":"oracle.kubernetes.operator.utils","l":"KubernetesExecFactoryImpl"},{"p":"oracle.kubernetes.operator.utils","l":"KubernetesExecFactoryImpl.KubernetesExecImpl"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"KubernetesResourceLookup"},{"p":"oracle.kubernetes.json","l":"KubernetesSchemaReference"},{"p":"oracle.kubernetes.operator.helpers","l":"KubernetesUtils"},{"p":"oracle.kubernetes.operator.helpers","l":"KubernetesVersion"},{"p":"oracle.kubernetes.operator","l":"LabelConstants"},{"p":"oracle.kubernetes.operator.helpers","l":"LastKnownStatus"},{"p":"oracle.kubernetes.operator.helpers","l":"LegalNames"},{"p":"oracle.kubernetes.operator.rest.model","l":"LinkContainerModel"},{"p":"oracle.kubernetes.operator.rest.model","l":"LinkModel"},{"p":"oracle.kubernetes.operator.logging","l":"LoggingFacade"},{"p":"oracle.kubernetes.operator.logging","l":"LoggingFactory"},{"p":"oracle.kubernetes.operator.logging","l":"LoggingFilter"},{"p":"oracle.kubernetes.operator.logging","l":"LoggingFormatter"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"MacroSubstitutor"},{"p":"oracle.kubernetes.json.mojo","l":"Main"},{"p":"oracle.kubernetes.operator","l":"Main"},{"p":"oracle.kubernetes.json.mojo","l":"MainImpl"},{"p":"oracle.kubernetes.operator","l":"TuningParameters.MainTuning"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ManagedServer"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ManagedServerSpecCommonImpl"},{"p":"oracle.kubernetes.operator.steps","l":"ManagedServersUpStep"},{"p":"oracle.kubernetes.operator.steps","l":"ManagedServerUpAfterStep"},{"p":"oracle.kubernetes.operator.steps","l":"ManagedServerUpIteratorStep"},{"p":"oracle.kubernetes.operator.logging","l":"MessageKeys"},{"p":"oracle.kubernetes.operator.work","l":"Step.MultiThrowable"},{"p":"oracle.kubernetes.operator","l":"NamespaceStatus"},{"p":"oracle.kubernetes.operator","l":"NamespaceWatcher"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"NetworkAccessPoint"},{"p":"oracle.kubernetes.weblogic.domain","l":"NetworkAccessPointConfigurator"},{"p":"oracle.kubernetes.operator.work","l":"NextAction"},{"p":"oracle.kubernetes.operator.helpers","l":"NonClusteredServerConfig"},{"p":"oracle.kubernetes.operator.logging","l":"OncePerMessageLoggingFilter"},{"p":"oracle.kubernetes.operator.helpers","l":"AuthorizationProxy.Operation"},{"p":"oracle.kubernetes.operator","l":"OperatorLiveness"},{"p":"oracle.kubernetes.operator","l":"OperatorReady"},{"p":"oracle.kubernetes.operator.helpers","l":"OperatorServiceType"},{"p":"oracle.kubernetes.utils","l":"OperatorUtils"},{"p":"oracle.kubernetes.operator.calls","l":"OtherUnrecoverableErrorBuilder"},{"p":"oracle.kubernetes.operator.work","l":"Packet"},{"p":"oracle.kubernetes.operator","l":"Pair"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"PatchableComponent"},{"p":"oracle.kubernetes.operator.utils","l":"PatchUtils"},{"p":"oracle.kubernetes.json","l":"Pattern"},{"p":"oracle.kubernetes.operator","l":"PodAwaiterStepFactory"},{"p":"oracle.kubernetes.operator.helpers","l":"PodHelper"},{"p":"oracle.kubernetes.operator.helpers","l":"PodStepContext"},{"p":"oracle.kubernetes.operator","l":"TuningParameters.PodTuning"},{"p":"oracle.kubernetes.operator","l":"PodWatcher"},{"p":"oracle.kubernetes.operator.helpers","l":"Pool"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ProbeTuning"},{"p":"oracle.kubernetes.operator","l":"ProcessingConstants"},{"p":"oracle.kubernetes.json","l":"Range"},{"p":"oracle.kubernetes.operator.steps","l":"ReadHealthStep"},{"p":"oracle.kubernetes.operator.rest","l":"RequestDebugLoggingFilter"},{"p":"oracle.kubernetes.operator.calls","l":"RequestParams"},{"p":"oracle.kubernetes.operator.helpers","l":"AuthorizationProxy.Resource"},{"p":"oracle.kubernetes.operator.helpers","l":"ResourceVersion"},{"p":"oracle.kubernetes.operator.rest","l":"ResponseDebugLoggingFilter"},{"p":"oracle.kubernetes.operator.helpers","l":"ResponseStep"},{"p":"oracle.kubernetes.operator.rest.backend","l":"RestBackend"},{"p":"oracle.kubernetes.operator.rest","l":"RestBackendImpl"},{"p":"oracle.kubernetes.operator.rest","l":"RestConfig"},{"p":"oracle.kubernetes.operator.rest","l":"RestConfigImpl"},{"p":"oracle.kubernetes.operator.rest","l":"RestServer"},{"p":"oracle.kubernetes.operator.calls","l":"RetryStrategy"},{"p":"oracle.kubernetes.operator.calls","l":"RetryStrategyListener"},{"p":"oracle.kubernetes.operator.helpers","l":"RollingHelper"},{"p":"oracle.kubernetes.operator.rest.model","l":"ScaleClusterParamsModel"},{"p":"oracle.kubernetes.operator.rest.resource","l":"ScaleClusterResource"},{"p":"oracle.kubernetes.operator.rest","l":"Scan"},{"p":"oracle.kubernetes.operator.rest","l":"ScanCache"},{"p":"oracle.kubernetes.json","l":"SchemaGenerator"},{"p":"oracle.kubernetes.operator.helpers","l":"AuthorizationProxy.Scope"},{"p":"oracle.kubernetes.operator.helpers","l":"SecretHelper"},{"p":"oracle.kubernetes.operator.helpers","l":"SecretType"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Server"},{"p":"oracle.kubernetes.operator.helpers","l":"ServerConfig"},{"p":"oracle.kubernetes.weblogic.domain","l":"ServerConfigurator"},{"p":"oracle.kubernetes.operator.steps","l":"ServerDownIteratorStep"},{"p":"oracle.kubernetes.operator.steps","l":"ServerDownStep"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ServerEnvVars"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ServerHealth"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ServerService"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ServerSpec"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ServerSpecBase"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ServerSpecCommonImpl"},{"p":"oracle.kubernetes.operator","l":"ServerStartPolicy"},{"p":"oracle.kubernetes.operator","l":"ServerStartState"},{"p":"oracle.kubernetes.operator.helpers","l":"DomainPresenceInfo.ServerStartupInfo"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ServerStatus"},{"p":"oracle.kubernetes.operator","l":"ServerStatusReader"},{"p":"oracle.kubernetes.weblogic.domain","l":"ServiceConfigurator"},{"p":"oracle.kubernetes.operator.helpers","l":"ServiceHelper"},{"p":"oracle.kubernetes.operator","l":"ServiceWatcher"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Shutdown"},{"p":"oracle.kubernetes.operator","l":"ShutdownType"},{"p":"oracle.kubernetes.operator.helpers","l":"ConfigMapHelper.SitConfigMapContext"},{"p":"oracle.kubernetes.operator.work","l":"Step"},{"p":"oracle.kubernetes.operator.work","l":"Step.StepAndPacket"},{"p":"oracle.kubernetes.operator.helpers","l":"StepContextBase"},{"p":"oracle.kubernetes.operator.helpers","l":"StepContextConstants"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"SubsystemHealth"},{"p":"oracle.kubernetes.operator","l":"SwaggerBuildHelper"},{"p":"oracle.kubernetes.operator.rest.resource","l":"SwaggerResource"},{"p":"oracle.kubernetes.operator.calls","l":"SynchronousCallDispatcher"},{"p":"oracle.kubernetes.operator.calls","l":"SynchronousCallFactory"},{"p":"oracle.kubernetes.utils","l":"SystemClock"},{"p":"oracle.kubernetes.operator.work","l":"ThreadFactorySingleton"},{"p":"oracle.kubernetes.operator.work","l":"ThreadLocalContainerResolver"},{"p":"oracle.kubernetes.operator","l":"TuningParameters"},{"p":"oracle.kubernetes.operator","l":"TuningParametersImpl"},{"p":"oracle.kubernetes.operator.calls.unprocessable","l":"UnprocessableEntityBuilder"},{"p":"oracle.kubernetes.operator.calls","l":"UnrecoverableErrorBuilder"},{"p":"oracle.kubernetes.operator","l":"VersionConstants"},{"p":"oracle.kubernetes.operator.helpers","l":"VersionHelper"},{"p":"oracle.kubernetes.operator.rest.model","l":"VersionModel"},{"p":"oracle.kubernetes.operator.rest.resource","l":"VersionResource"},{"p":"oracle.kubernetes.operator.rest.resource","l":"VersionsResource"},{"p":"oracle.kubernetes.operator.rest.backend","l":"VersionUtils"},{"p":"oracle.kubernetes.operator.builders","l":"WatchBuilder"},{"p":"oracle.kubernetes.operator.steps","l":"WatchDomainIntrospectorJobReadyStep"},{"p":"oracle.kubernetes.operator.builders","l":"WatchBuilder.WatchFactory"},{"p":"oracle.kubernetes.operator.builders","l":"WatchI"},{"p":"oracle.kubernetes.operator.builders","l":"WatchImpl"},{"p":"oracle.kubernetes.operator.watcher","l":"WatchListener"},{"p":"oracle.kubernetes.operator.steps","l":"WatchPodReadyAdminStep"},{"p":"oracle.kubernetes.operator","l":"TuningParameters.WatchTuning"},{"p":"oracle.kubernetes.weblogic.domain.api","l":"WeblogicApi"},{"p":"oracle.kubernetes.operator","l":"WebLogicConstants"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"WlsClusterConfig"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"WlsDomain"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"WlsDomainConfig"},{"p":"oracle.kubernetes.operator.utils","l":"WlsDomainConfigSupport"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"WlsDynamicServerConfig"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"WlsDynamicServersConfig"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"WlsMachineConfig"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"WlsServerConfig"},{"p":"oracle.kubernetes.json","l":"YamlDocGenerator"}] \ No newline at end of file +typeSearchIndex = [{"p":"oracle.kubernetes.operator.steps","l":"AbstractListStep"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"AdminServer"},{"p":"oracle.kubernetes.weblogic.domain","l":"AdminServerConfigurator"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"AdminServerSpec"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"AdminServerSpecCommonImpl"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"AdminService"},{"l":"All Classes","url":"allclasses-index.html"},{"p":"oracle.kubernetes.operator.helpers","l":"AnnotationHelper"},{"p":"oracle.kubernetes.operator.work","l":"AsyncFiber"},{"p":"oracle.kubernetes.operator.calls","l":"AsyncRequestStep"},{"p":"oracle.kubernetes.operator.helpers","l":"AsyncRequestStepFactory"},{"p":"oracle.kubernetes.operator.rest","l":"AuthenticationFilter"},{"p":"oracle.kubernetes.operator.helpers","l":"AuthenticationProxy"},{"p":"oracle.kubernetes.operator.authentication","l":"Authenticator"},{"p":"oracle.kubernetes.operator.helpers","l":"AuthorizationProxy"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"BaseConfiguration"},{"p":"oracle.kubernetes.operator.rest","l":"BaseDebugLoggingFilter"},{"p":"oracle.kubernetes.operator.rest.model","l":"BaseModel"},{"p":"oracle.kubernetes.operator.helpers","l":"BasePodStepContext"},{"p":"oracle.kubernetes.operator.rest.resource","l":"BaseResource"},{"p":"oracle.kubernetes.operator.steps","l":"BeforeAdminServiceStep"},{"p":"oracle.kubernetes.operator.helpers","l":"CallBuilder"},{"p":"oracle.kubernetes.operator.helpers","l":"CallBuilderFactory"},{"p":"oracle.kubernetes.operator","l":"TuningParameters.CallBuilderTuning"},{"p":"oracle.kubernetes.operator.calls","l":"CallFactory"},{"p":"oracle.kubernetes.operator.builders","l":"CallParams"},{"p":"oracle.kubernetes.operator.calls","l":"CallResponse"},{"p":"oracle.kubernetes.operator.calls","l":"CallWrapper"},{"p":"oracle.kubernetes.operator.calls","l":"CancellableCall"},{"p":"oracle.kubernetes.operator.calls.unprocessable","l":"Cause"},{"p":"oracle.kubernetes.operator.utils","l":"Certificates"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Channel"},{"p":"oracle.kubernetes.operator.helpers","l":"ClientFactory"},{"p":"oracle.kubernetes.operator.helpers","l":"ClientPool"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Cluster"},{"p":"oracle.kubernetes.operator.helpers","l":"ClusterConfig"},{"p":"oracle.kubernetes.weblogic.domain","l":"ClusterConfigurator"},{"p":"oracle.kubernetes.operator.helpers","l":"ClusteredServerConfig"},{"p":"oracle.kubernetes.operator.rest.model","l":"ClusterModel"},{"p":"oracle.kubernetes.operator.rest.resource","l":"ClusterResource"},{"p":"oracle.kubernetes.operator.steps","l":"ClusterServicesStep"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ClusterSpec"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ClusterSpecCommonImpl"},{"p":"oracle.kubernetes.operator.rest.resource","l":"ClustersResource"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ClusterStatus"},{"p":"oracle.kubernetes.operator.rest.model","l":"CollectionModel"},{"p":"oracle.kubernetes.operator.work","l":"Fiber.CompletionCallback"},{"p":"oracle.kubernetes.operator.work","l":"Component"},{"p":"oracle.kubernetes.operator.work","l":"ComponentEx"},{"p":"oracle.kubernetes.operator.work","l":"ComponentRegistry"},{"p":"oracle.kubernetes.operator.steps","l":"ConfigMapAfterStep"},{"p":"oracle.kubernetes.operator.helpers","l":"ConfigMapConsumer"},{"p":"oracle.kubernetes.operator.helpers","l":"ConfigMapHelper"},{"p":"oracle.kubernetes.operator","l":"ConfigMapWatcher"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Configuration"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ConfigurationConstants"},{"p":"oracle.kubernetes.weblogic.domain","l":"ConfigurationNotSupportedException"},{"p":"oracle.kubernetes.operator.helpers","l":"ConflictRetry"},{"p":"oracle.kubernetes.operator.work","l":"Container"},{"p":"oracle.kubernetes.operator.work","l":"ContainerResolver"},{"p":"oracle.kubernetes.operator.helpers","l":"CrdHelper"},{"p":"oracle.kubernetes.operator.steps","l":"DefaultResponseStep"},{"p":"oracle.kubernetes.operator.steps","l":"DeleteDomainStep"},{"p":"oracle.kubernetes.operator.steps","l":"DeleteServiceListStep"},{"p":"oracle.kubernetes.json","l":"Description"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Domain"},{"p":"oracle.kubernetes.operator.rest.model","l":"DomainAction"},{"p":"oracle.kubernetes.operator.rest.model","l":"DomainActionType"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"DomainCommonConfigurator"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"DomainCondition"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"DomainConditionType"},{"p":"oracle.kubernetes.operator.helpers","l":"DomainConfig"},{"p":"oracle.kubernetes.weblogic.domain","l":"DomainConfigurator"},{"p":"oracle.kubernetes.weblogic.domain","l":"DomainConfiguratorFactory"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"DomainList"},{"p":"oracle.kubernetes.operator.rest.model","l":"DomainModel"},{"p":"oracle.kubernetes.operator","l":"DomainPresence"},{"p":"oracle.kubernetes.operator.helpers","l":"DomainPresenceInfo"},{"p":"oracle.kubernetes.operator.steps","l":"DomainPresenceStep"},{"p":"oracle.kubernetes.operator","l":"DomainProcessor"},{"p":"oracle.kubernetes.operator","l":"DomainProcessorDelegate"},{"p":"oracle.kubernetes.operator","l":"DomainProcessorImpl"},{"p":"oracle.kubernetes.operator.rest.resource","l":"DomainResource"},{"p":"oracle.kubernetes.operator","l":"DomainSourceType"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"DomainSpec"},{"p":"oracle.kubernetes.operator.rest.resource","l":"DomainsResource"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"DomainStatus"},{"p":"oracle.kubernetes.operator.helpers","l":"DomainStatusPatch"},{"p":"oracle.kubernetes.operator","l":"DomainStatusUpdater"},{"p":"oracle.kubernetes.operator.helpers","l":"DomainTopology"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"DomainValidationFailure"},{"p":"oracle.kubernetes.operator.helpers","l":"DomainValidationSteps"},{"p":"oracle.kubernetes.operator","l":"DomainWatcher"},{"p":"oracle.kubernetes.weblogic.domain","l":"EffectiveConfigurationFactory"},{"p":"oracle.kubernetes.operator.work","l":"Engine"},{"p":"oracle.kubernetes.json","l":"EnumClass"},{"p":"oracle.kubernetes.operator.calls.unprocessable","l":"ErrorBody"},{"p":"oracle.kubernetes.operator.rest","l":"ErrorFilter"},{"p":"oracle.kubernetes.operator.rest.model","l":"ErrorModel"},{"p":"oracle.kubernetes.operator","l":"EventWatcher"},{"p":"oracle.kubernetes.operator.rest","l":"ExceptionMapper"},{"p":"oracle.kubernetes.operator.work","l":"Fiber.ExitCallback"},{"p":"oracle.kubernetes.operator.calls","l":"FailureStatusSource"},{"p":"oracle.kubernetes.operator.calls","l":"FailureStatusSourceException"},{"p":"oracle.kubernetes.operator.work","l":"Fiber"},{"p":"oracle.kubernetes.operator.work","l":"FiberGate"},{"p":"oracle.kubernetes.operator.work","l":"FiberGateFactory"},{"p":"oracle.kubernetes.operator.rest","l":"FilterPriorities"},{"p":"oracle.kubernetes.operator.helpers","l":"HealthCheckHelper"},{"p":"oracle.kubernetes.operator.authentication","l":"Helpers"},{"p":"oracle.kubernetes.operator.http","l":"HttpAsyncRequestStep"},{"p":"oracle.kubernetes.operator.http","l":"HttpResponseStep"},{"p":"oracle.kubernetes.operator","l":"ImagePullPolicy"},{"p":"oracle.kubernetes.operator.helpers","l":"ConfigMapHelper.IntrospectorConfigMapContext"},{"p":"oracle.kubernetes.operator","l":"IntrospectorConfigMapKeys"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"IntrospectorJobEnvVars"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Istio"},{"p":"oracle.kubernetes.operator.rest.model","l":"ItemModel"},{"p":"oracle.kubernetes.operator.helpers","l":"JobHelper"},{"p":"oracle.kubernetes.operator.helpers","l":"JobStepContext"},{"p":"oracle.kubernetes.operator","l":"JobWatcher"},{"p":"oracle.kubernetes.json.mojo","l":"JsonSchemaMojo"},{"p":"oracle.kubernetes.operator.work","l":"NextAction.Kind"},{"p":"oracle.kubernetes.operator","l":"KubernetesConstants"},{"p":"oracle.kubernetes.operator.utils","l":"KubernetesExec"},{"p":"oracle.kubernetes.operator.utils","l":"KubernetesExecFactory"},{"p":"oracle.kubernetes.operator.utils","l":"KubernetesExecFactoryImpl"},{"p":"oracle.kubernetes.operator.utils","l":"KubernetesExecFactoryImpl.KubernetesExecImpl"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"KubernetesResourceLookup"},{"p":"oracle.kubernetes.json","l":"KubernetesSchemaReference"},{"p":"oracle.kubernetes.operator.helpers","l":"KubernetesUtils"},{"p":"oracle.kubernetes.operator.helpers","l":"KubernetesVersion"},{"p":"oracle.kubernetes.operator","l":"LabelConstants"},{"p":"oracle.kubernetes.operator.helpers","l":"LastKnownStatus"},{"p":"oracle.kubernetes.operator.helpers","l":"LegalNames"},{"p":"oracle.kubernetes.operator.rest.model","l":"LinkContainerModel"},{"p":"oracle.kubernetes.operator.rest.model","l":"LinkModel"},{"p":"oracle.kubernetes.operator.logging","l":"LoggingContext"},{"p":"oracle.kubernetes.operator.logging","l":"LoggingFacade"},{"p":"oracle.kubernetes.operator.logging","l":"LoggingFactory"},{"p":"oracle.kubernetes.operator.logging","l":"LoggingFilter"},{"p":"oracle.kubernetes.operator.logging","l":"LoggingFormatter"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"MacroSubstitutor"},{"p":"oracle.kubernetes.json.mojo","l":"Main"},{"p":"oracle.kubernetes.operator","l":"Main"},{"p":"oracle.kubernetes.json.mojo","l":"MainImpl"},{"p":"oracle.kubernetes.operator","l":"TuningParameters.MainTuning"},{"p":"oracle.kubernetes.operator","l":"MakeRightDomainOperation"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ManagedServer"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ManagedServerSpecCommonImpl"},{"p":"oracle.kubernetes.operator.steps","l":"ManagedServersUpStep"},{"p":"oracle.kubernetes.operator.steps","l":"ManagedServerUpAfterStep"},{"p":"oracle.kubernetes.operator.steps","l":"ManagedServerUpIteratorStep"},{"p":"oracle.kubernetes.operator.logging","l":"MessageKeys"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Model"},{"p":"oracle.kubernetes.operator","l":"ModelInImageDomainType"},{"p":"oracle.kubernetes.operator.work","l":"Step.MultiThrowable"},{"p":"oracle.kubernetes.operator","l":"NamespaceStatus"},{"p":"oracle.kubernetes.operator","l":"NamespaceWatcher"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"NetworkAccessPoint"},{"p":"oracle.kubernetes.weblogic.domain","l":"NetworkAccessPointConfigurator"},{"p":"oracle.kubernetes.operator.work","l":"NextAction"},{"p":"oracle.kubernetes.operator.helpers","l":"NonClusteredServerConfig"},{"p":"oracle.kubernetes.operator.logging","l":"OncePerMessageLoggingFilter"},{"p":"oracle.kubernetes.operator.helpers","l":"AuthorizationProxy.Operation"},{"p":"oracle.kubernetes.operator","l":"OperatorLiveness"},{"p":"oracle.kubernetes.operator","l":"OperatorReady"},{"p":"oracle.kubernetes.operator.helpers","l":"OperatorServiceType"},{"p":"oracle.kubernetes.utils","l":"OperatorUtils"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Opss"},{"p":"oracle.kubernetes.operator","l":"OverrideDistributionStrategy"},{"p":"oracle.kubernetes.operator.work","l":"Packet"},{"p":"oracle.kubernetes.operator","l":"Pair"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"PatchableComponent"},{"p":"oracle.kubernetes.operator.utils","l":"PatchUtils"},{"p":"oracle.kubernetes.json","l":"Pattern"},{"p":"oracle.kubernetes.operator","l":"PodAwaiterStepFactory"},{"p":"oracle.kubernetes.operator.helpers","l":"PodHelper"},{"p":"oracle.kubernetes.operator.helpers","l":"PodStepContext"},{"p":"oracle.kubernetes.operator","l":"TuningParameters.PodTuning"},{"p":"oracle.kubernetes.operator","l":"PodWatcher"},{"p":"oracle.kubernetes.operator.helpers","l":"Pool"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ProbeTuning"},{"p":"oracle.kubernetes.operator","l":"ProcessingConstants"},{"p":"oracle.kubernetes.json","l":"Range"},{"p":"oracle.kubernetes.operator.steps","l":"ReadHealthStep"},{"p":"oracle.kubernetes.operator.rest","l":"RequestDebugLoggingFilter"},{"p":"oracle.kubernetes.operator.calls","l":"RequestParams"},{"p":"oracle.kubernetes.operator.helpers","l":"AuthorizationProxy.Resource"},{"p":"oracle.kubernetes.operator.helpers","l":"ResourceVersion"},{"p":"oracle.kubernetes.operator.rest","l":"ResponseDebugLoggingFilter"},{"p":"oracle.kubernetes.operator.helpers","l":"ResponseStep"},{"p":"oracle.kubernetes.operator.rest.backend","l":"RestBackend"},{"p":"oracle.kubernetes.operator.rest","l":"RestBackendImpl"},{"p":"oracle.kubernetes.operator.rest","l":"RestConfig"},{"p":"oracle.kubernetes.operator.rest","l":"RestConfigImpl"},{"p":"oracle.kubernetes.operator.rest","l":"RestServer"},{"p":"oracle.kubernetes.operator.calls","l":"RetryStrategy"},{"p":"oracle.kubernetes.operator.calls","l":"RetryStrategyListener"},{"p":"oracle.kubernetes.operator.helpers","l":"RollingHelper"},{"p":"oracle.kubernetes.operator.rest.model","l":"ScaleClusterParamsModel"},{"p":"oracle.kubernetes.operator.rest.resource","l":"ScaleClusterResource"},{"p":"oracle.kubernetes.operator.rest","l":"Scan"},{"p":"oracle.kubernetes.operator.rest","l":"ScanCache"},{"p":"oracle.kubernetes.json","l":"SchemaGenerator"},{"p":"oracle.kubernetes.operator.helpers","l":"AuthorizationProxy.Scope"},{"p":"oracle.kubernetes.operator.helpers","l":"SecretHelper"},{"p":"oracle.kubernetes.operator.helpers","l":"SecretType"},{"p":"oracle.kubernetes.operator.helpers","l":"SemanticVersion"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Server"},{"p":"oracle.kubernetes.operator.helpers","l":"ServerConfig"},{"p":"oracle.kubernetes.weblogic.domain","l":"ServerConfigurator"},{"p":"oracle.kubernetes.operator.steps","l":"ServerDownIteratorStep"},{"p":"oracle.kubernetes.operator.steps","l":"ServerDownStep"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ServerEnvVars"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ServerHealth"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ServerService"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ServerSpec"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ServerSpecBase"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ServerSpecCommonImpl"},{"p":"oracle.kubernetes.operator","l":"ServerStartPolicy"},{"p":"oracle.kubernetes.operator","l":"ServerStartState"},{"p":"oracle.kubernetes.operator.helpers","l":"DomainPresenceInfo.ServerStartupInfo"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"ServerStatus"},{"p":"oracle.kubernetes.operator","l":"ServerStatusReader"},{"p":"oracle.kubernetes.weblogic.domain","l":"ServiceConfigurator"},{"p":"oracle.kubernetes.operator.helpers","l":"ServiceHelper"},{"p":"oracle.kubernetes.operator","l":"ServiceWatcher"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"Shutdown"},{"p":"oracle.kubernetes.operator","l":"ShutdownType"},{"p":"oracle.kubernetes.operator.work","l":"Step"},{"p":"oracle.kubernetes.operator.work","l":"Step.StepAndPacket"},{"p":"oracle.kubernetes.operator.helpers","l":"StepContextBase"},{"p":"oracle.kubernetes.operator.helpers","l":"StepContextConstants"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"SubsystemHealth"},{"p":"oracle.kubernetes.operator","l":"SwaggerBuildHelper"},{"p":"oracle.kubernetes.operator.rest.resource","l":"SwaggerResource"},{"p":"oracle.kubernetes.operator.calls","l":"SynchronousCallDispatcher"},{"p":"oracle.kubernetes.operator.calls","l":"SynchronousCallFactory"},{"p":"oracle.kubernetes.utils","l":"SystemClock"},{"p":"oracle.kubernetes.operator.work","l":"ThreadFactorySingleton"},{"p":"oracle.kubernetes.operator.work","l":"ThreadLocalContainerResolver"},{"p":"oracle.kubernetes.operator","l":"TuningParameters"},{"p":"oracle.kubernetes.operator","l":"TuningParametersImpl"},{"p":"oracle.kubernetes.operator.calls","l":"UnrecoverableErrorBuilder"},{"p":"oracle.kubernetes.operator.calls.unprocessable","l":"UnrecoverableErrorBuilderImpl"},{"p":"oracle.kubernetes.operator.rest.model","l":"VersionModel"},{"p":"oracle.kubernetes.operator.rest.resource","l":"VersionResource"},{"p":"oracle.kubernetes.operator.rest.resource","l":"VersionsResource"},{"p":"oracle.kubernetes.operator.rest.backend","l":"VersionUtils"},{"p":"oracle.kubernetes.operator.builders","l":"WatchBuilder"},{"p":"oracle.kubernetes.operator.steps","l":"WatchDomainIntrospectorJobReadyStep"},{"p":"oracle.kubernetes.operator.builders","l":"WatchBuilder.WatchFactory"},{"p":"oracle.kubernetes.operator.builders","l":"WatchI"},{"p":"oracle.kubernetes.operator.builders","l":"WatchImpl"},{"p":"oracle.kubernetes.operator.watcher","l":"WatchListener"},{"p":"oracle.kubernetes.operator.steps","l":"WatchPodReadyAdminStep"},{"p":"oracle.kubernetes.operator","l":"TuningParameters.WatchTuning"},{"p":"oracle.kubernetes.weblogic.domain.api","l":"WeblogicApi"},{"p":"oracle.kubernetes.operator","l":"WebLogicConstants"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"WlsClusterConfig"},{"p":"oracle.kubernetes.weblogic.domain.model","l":"WlsDomain"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"WlsDomainConfig"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"WlsDynamicServerConfig"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"WlsDynamicServersConfig"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"WlsMachineConfig"},{"p":"oracle.kubernetes.operator.wlsconfig","l":"WlsServerConfig"},{"p":"oracle.kubernetes.json","l":"YamlDocGenerator"}] \ No newline at end of file diff --git a/docs/apidocs/type-search-index.zip b/docs/apidocs/type-search-index.zip index 460b419c9a9e01934194638644d45d4a816313b6..2f27b43e5d67ec34f1f299795c876f9deaaa3ce7 100644 GIT binary patch delta 2349 zcmV+|3DWk$67UiYP)h>@6aWYa2mtqS@sSNFf7^1~HW2-lj-Ok7K;LXxY1~MT#&nYD zbov01kc1cnSP-=AcKYwdg_J;wmt8O~9*fdBTmp;5*~RkDe{YJLUvH!$DW{8U`{`=Se+MZvH(_s}NEX&7}C~u0t43QoS_r@?E4K*bW9vjnQR@ ze4>9>bkd)OOz$v!Fy1NEJA_CXNW)U;e+r(#)La5^gwgYk?xmvP;*RtArCC9D72{cqlLlb;TB)(ml`vDdeGl5+Pz%;gT~G(h$?#2j5B=yR9yHRYnE& z8tCI7TCudylWJw$1e%4?Cn}8Ae@x&=+7|_Dj@Uq0!|Nbe&QOvKQ@nNy7(luWGA<=x zU?4UbO;&+I+w~+%&S`4*Yw$b=g3f8Vg&B^5Q_Epv)sCbuNE%BZg;}$)xYb)M@`)Zy ziUNx=Ezfl8YD0?Ky_u5~upaLMzY(1tG3iyuePD_Yf6QTrLKC48 zdrlwCqtr=N6jEuLt=>{vKo#lr@N$+KF9Etp%f*B?)}fQ6GtR~aKA!mwnXNK-einN5 zJ>8Rv>qhWE-MUR-LIJ&ZGZT-mBR-&f@Vz{zLie;x6`PvsF<10vM+H(3y-hKx&mh6` zdl9=OcpAS${eZehLnksee|ucdEEA76;MHf67;P1Tu>&$lF|AOi2gSPh41a;{+AYx5 zkWm4XV|{bb;2*?ZqStqe0T>}VSeM{{#Bo2+#+ZXiY@!L~NIy@7P{b`<;!v~W!-Nh7 zJiuJ(+UyWe<=W?m9=){+20e}r`lZN7RHEleo@F7;1I`NoUkPWKe=jEz#w!)QDlbHd zTW`n_K?}hez1r_>0`c0e{vne0K>Mu3!6+ZtZod*$?#kTriX$tfq`H$Cwi4`cGm4ZB zkBr`{SCg?!&r`3tjR@X=>rq#E-s+8MOokU0v})h>%Ps*I112a?(!TpVF__{n*j6#AjCLBWf5i<%hmVwSeOw-C`U1}ide0g@*1QlCv@RNy`8VqPrcHrNN^0ao zP7ZWialVx%k&7uNwlnO-gV0KrX8SZh4HJ0aSwUk~AIm5D9$RV+`F@wXm3aM1Mki{N ztTb~T71SOy%_C1C^!*A3KvLL4Ud;*E=w4CFjRaOisN$AfilKU}JuXduIhm#MGuc#aK8 zl}xIg*_3oOUbpGS>J6-z2m5s&IWTq&or+ru@NxM0wlDOF9gf;(ZJ*t@@s+s^5k??o z*dD844*dC8SRHCnne;rSg52Wxf;*rY;W66A{RT?ae_jb2n{^)O42g%#72VGtgwwxu zwE|dm4fKkA*2Sjcnmr$tJh`+PY=H~g1xYD5_;-PbRJR*79;vp^ahuw7e=FJO*gx(p^!F{TAYypWzoyq=Oe_XRyDk!L$(?LE_ z0;}G%f6Z^;^-
    Il_mgPhW1W2^adfqGOk=Za<`;Cd_}J%&Tavy| zM3S^6EOuXTg<03aggM_2N7^w=4Rav7w@zgsyl*SB+Y@2+4iVjPWN2cOS9G`GkeDz; zSS?{7h!ESgJG#Bf#EKn7+v+Q~UQ18rBY{sme-Uv&Hy+uT;_GJ6?LH{k)pf48Zq~5k zSrfrK7bgQWrV*=6)*#_IWP3<_@h)ymt}H=yC%AOZ)~u<>E)@E%zJh*`28lTY4A8ia zyenYjT_*+pfCFmvj@f7i!S=? ze;5kv3bK$TF|isJ^?cdsH#_7|wK^F*l2pd@Z6q{RRLAa*9v#;)l9(Z|XBg8lYizrM zFP-k)K~lXx`9Qt6)VqawhI@Gu*vz$`Wk&O@Cz*FB;W_-CJc}ZHT`HO*zK!@oVBZj# zO@b=5w9%R<4L%jShT5$Dhjb7v0@A9Of9NR!j0&>a5TdN?i)ewUU20zAeocaH85b+a2FamNl{RrU@dtl-uK7?aFr(X7kB-)*bc} zIUJ~RuTmiuQCG!yCX9dy#a;3)(xZ|>R;6tTxo2eo&m>2Prc>~+K9IOUTylwif92r$ zsLWcg@0J*S$*D%Sk$94|G|v;$wLOr@$0MP+K{)!qNY3wN8k7|N`X5kB2MCC}O-|AX000z3002-+0Rj{N6aWYa2mtqS4DnEiyG>5g T2mk;SM3VvuItCUA00000SQK;@ delta 2302 zcmV@6aWYa2mlp@){zYpbF1$iJeQaWxL9XIbD*Zpy|(Hnaezv;vp~iR6dqcOJOf^{>z+`vZQ7=DrK$_ z&eQtRuS{h0eYV&6&`nR9x~CleJ#DKHQWMRj_-wCZ7!FdsHSqE%(vNI|1EwH!=_8-% z-xVFzr)#2j7(Rk_N_E5#DS$LAmEKdKe_3i5;UnW3_beS*S}bcN-%)aq7VMI1P`L+0 zk&69;l4M8~??_3{c4p)YTUmp@r<-cGl)D`hJN()jk_%B*_H*!Z80cDNMnT|VG=0}- z3E+>c6xiXJ>AAUt;PAcY9owvr72_X3)@&oQKGi7i~XiZfpnB@s7NX2WW%XpLBnU2D3nZT zSsLhxtilOjX?B)?D$TaWtnJ({fyi$F6!^@(z$jtT8afBU?k|kwafl5pJfyTObP*Ow_Oi8+Gs(@Uyg-a}I#DK=NZX^RmJiyeXvGL8=oUu<2 zYxLUW4#Deap|3?o;!3P`#xtu)Ut}TSfu}iyuY|L#ZtM}pD-~^}e`lh^+F#%b1*c>V zz1VI|D*vP1hYKj9y)0xQc94VM;_gCJxotR4Yf~(glIl)op*>lPo6s(__&{&I_yM)U z_&)WD+oYo_bZ6+I;##~j9a3xgttF@1wHYSpvV4RhD9P?VPYmW0E{gQx;(GtJimers z3UaBzuGkgt@R<^>fA{k}P2ceOd2iSMv*X2xpmoup;NPf|lr}|RdEk%_IoZ*5#rax7 zNfqmF4xLoTxI>1wml3-I; z6w$2x&4e@LGf|UQE~R{{kTv%iUF*s--BJ}-;hd>n?FvjF_zD+svB*J}WJ7t7#}9Xy!PaGHg|UvSASp$=zb-JKmg?Hwe-qW_Ic`%^Pp%~!JVxrToG&Rt z4`F+ApYSm7Bt`TAZd((+Knz|(ET|PC*gcL-3C+IPUj_x)FYe=#LG?^g?Sc;SnG#%k zpe=p_cc%&?Jv=}EYLMuR#4nS-K;fodg`%m1jWiZjw>a<G+5TU&j%PxdhO}NGZDMsff3^%>Mjd5etHca*A~3G{}%6Bo7@nNp%5?yz6Mj zd_@7ZIwl&vpo3>3<6v`0N|8eho$Z#KgSO!P>qRx1fK=3_L$xhUnnm;JLhQ-g5ugaQ zAOo2b@YOi4S9ei9nI*@jo}dB(G!kK@tWVgF)D5DF9d?#7wL^a ze>KCsJc!UruAgPX%wtV5twmmQ)FE{eh5wdHG)MgO=9$0@=1(RGYCW{knkYSb1aci} zD(s&!J~H!2t72rJ1hFcCmA{WNSzE+;w^ONU^U{tabbivorcF;K`$}hE;{msIh`2ef z?(9Uuv_FH2ech$gHHv98nLoE8Ll?E(e@#1AUL)o_P7pD1+TO%!Qy#&0=c7)tyO#&D z+tIom5SS%(Gn<+zB&qQezT_ya~V87{<2r# zK-}FD$T>OH!Gj1j$x_1e#7y8`sqW*E*m~jmJk6_rZ6P$%$AH$8zpqnzSdPM#f1eYM z*c`)zdcrYGDk2<5X#H@71~bYxR1Z5Eba%4zTAYnu0XpGls1{pi6`h$3+oZ(?h5?CY z_Cx$je-{1_4Mf`C!MREg8d5V~Ea_Tib^+_RKZ7Q0E?SG0F!>ce=~@;KG@~Q^T|+V;2j6>p;2pSo9VJ$fqaZm;Lyv^Un9501E0XRZ zOitoJK9ScU`Ge&AUZ!4)Dc zVQyr3R8em|NM&qo0PKBzQyaO~=ltzYp=we~xQmSq1n#)@*)4{U8J;0PL2jnD?%qv_ z?qgenEcHlg6W_`6-Jg=w@2$4G4LAwo{v$Zu($Ud*`JJPeRzJWUJ1uiyFFo!(sORrUWFrV+@e1c1fh&IK7y6ngFNp#A>f@4INfzu(_QR|5MK&?y%o7g%Eg!YtV10udz< z9*qbkSb^+yw$KIffk_BZ!~zfoAO69J_IpgxHHayZlFT3}hh}Kd>mw|YobU&RutF21 zLOI;q<5KpxX}Ra~=^nKe2vfzC`FM3q&S-5dq4vIh(Ic-Z)i%tMt2|>D3Ivn z`rNb!LJQ-=1dty|#it+;kw}0HIg{j$f<;mRSS2u8VpG>YA0fuGt_8cMV4nFLb2VMs zmS{VG5ss+ZuC`GW;t+XpQBO-afPnZ|L68$J(K02n#K06YJkCXew|t5TlZZ1qPvkAN zN-{|k*4aW26XH*b9U@8s9cgI=5K=yepog>|Bq%NKZ6zYuHiEEZw*%AGWkOhPBZFM% z4k&-M?RN9J4{mObFT|KbEkUjK43(7E4U_;Ar zJLP0sKPhys*UD~WPN=fhXqdxl%1R4jrN#QnS#@SWX;ZzZFs1fko`;m|KqE``-+kLmSw+Ln7DA|tysVyAxwY?gs`X5fyp5Bo zZodc~0r&5<;LRhSGldCDyfhV|&jaXnOqn6_EKu#GQS?3)UK&t`Cg;f-y^bio=9KvJ zQuDUmFrpNN_PN%1q47M2F%ucNA@a^gmt0*7kib;2#ar+ND4BFiBFqpsc^;;zz2{Uf zZTa0rsJYwOvcQQ2AO;XXpsgAEK1kao0b?SSnAb}4ZJ|T0kyG=S+J3^bVMk*%5vdpO zDNz={LZKU1^Rgl1xVmoD_GQ=D@&G%AId#Vd~Xa)_Yb;Bn_Ydoo3z=J zlg?JYU+3`yi$p`Dbu3`Y6}*MJXne^7&=!!uP-fZ*4sl^}kZR7M2U!YX^q+W!W0EM) zG~=u}1{@0^8Vv&DB|VKH#&KmNLtw!bGo0LNa#5Ii=iDSy#dNvEfUS?e5BEfSnEJaMdaK60R;4 zcq;C4PPHu!m#L)}_-ud+^`dPEvd-=e(Lw*mAAih;l||ie5mp+Bq_b74x^;-e+2x!_ ze#bL>!N+65#uqRHT9O7e_xQ;6f!cy)$v_NZrTkVi_7PJO*a4hLCWpwoJ^OfebLQDA@Cb93k2`Q=&i_r|jcr1{V72d~#DvptMS7%kKLbEaTy zM^H-<_Uz(U;}>yxlit}ny^fPq&YvjPP9`VkErvjpkEO2T)_#6~>ulZV-7wJW6q+9* zFCjfV>K(=7B%oL-;@<)m{^S=f%jQ1eQYCrE!vq8*HKeIw3^HPx@h9N7!psnPh30zk zxUwf_elLMs?RK=`M2ewP)PG2BY%Rhv=bM*noBahG(TsYMpMwgyiOk9N2Sg6IY@?U{)z zMR=psFV~-Xual>o;MCWi7yqkV)%70*(~x34rubwP+0D%}s&Iuxp(X3T zgMJz+i>DNIHTXtEAeuqp~wUC7iPdz6V4it*EIJiAJJvdDv^A(t9|^>wt_az0G7r7{o~_u{68KHHt~NQ*GrB6 zx#`01Jp)J`?rY}&86)4`xIbP|G%+tX2e8W6dp)xP-}@ZEUCd*N*zf%A*=4+m=uda8 z5dS$#cVRTk0G6%)_7BVB|HFg+X8gaF>&3=@&Te8WO)~&jOkXjOKRT3VPE;REpEQ25 zOd$WbxiHAQ7r&Oh_qQryZ&3EHaka<)^k(A~;AP{#{!w}ScX)Jsu)+UzTrU;>lXtjY z$O>@L>Av}Yb3xc+V7 zC>^iJfR`6auXJ=#p)YO3{)B;eW&96_^!W_LeEA4)8U7!=IV$1*n}fk-{%_?9V|I~-S5!}!C`HGOA6UvK2`|7na{(wf&<-4zM7cKYa{;q5#@pOUV|VH>A?>nR}dDIHArGC?0KQh!jfIjhT|rmKx2o#dcRT zoVFczKTjxXhW`PCj|c!u@c;ODP@ezm4~{nTe`~p36#l<8#|=(_DR%(CVJP$YeXhJ? zcX!om+fS7}1&YWJ{Gq{W3cljPQk!DsPcCxg9|KbYLP~rrhiITdK1P7Jp`2h)u}6<< z)Lu9Y>qL!E(slE@5SA_*rTY4cPq77>mLMV0*iO-5^Q%v1mnT16oV|6EE1YTSAeE#Y3l70| zH0<4+y}$Z!_UY}}PyhJ&)AiNOhnn8FPc~oBCC`$){m1R~+2z|j)r3>`DegH^nKI_( z`dPYJF3KuJSx}af!;r?Ze6CLM3l1>M+4ao)?Dr66J14X z_QS{u+z+FhFhvtO)iX*sBcrUm`p()D81@bZLl#jas5$=ZV z*~ts^nLkaX8K_Y*0|ruF3w{TAn}*L>Y_?Yt*GiG3i)@&y-p<5XXr)&yY>rgXAW5+v zD|4oYdHelbi4X+gLHg`XCodWD{M;9tX~cd#_k(`D0vp;=H)ky7Y<*{5Q~VBqD>bv( z2=clkZ#TBcz4S`}+POURuclDpu-gUZ?oM#dE>3PgoS)vFo!p%M^68hW+q%G7{eZxt zpjsrmAYNCG@~@DsRaxarY-x$=2f&h=j#^)k;^s`=`WCGs8f3dJK=qT^kYN>i>Si&P zv{DP+?b=GniY?%gqqF&q~DK{Gr#>r(6ageH%I05-~ImnX8wOI*Nd9}Ig8CSUMS2T1J8wfu761u zeo-g=d(r3F(mAs0!2YOsQm;++7g68s9yCujcN z|N9`m!D2?LD{@X?HcvH^#^{Now&A>PrkQM;@n?Yae4m790|3- z|214M75~2$?0=<+p>GZD+u*wQeIn<}xSHX=9Zaq|1GIGhXHY)>w|{iJ+5f+m>qX&z zyh*0PyuW#8tNb$9Ys>=odZyzYu;hKKUt#X;?6}|3`W5Exm$Wpkx-@c)FCpc2vE*QX zImvka;VQ&`M6iM7@A+zk|Bre3x5@Xv4iAg?KR7-dZ1VrLTrUd$J=9Hh{4k$JLDO%9 z_E4K@xv8aIZii9z3zf|&=1;5WIkt{8qEb5YzFnsZ-%DRmb-__vt!kAH=xtRucevv! z3RrSlNIUu4C8q|mE{si^=q7uYy+P?T^J!2v|CVHf;+0Jm4eC@j;w`9CetEpAfv=5` zFZo&+|06}Hd}Q!n8vhRt_K!;I|AV9B{rye+U&rC1DZkwui0a=~bZ0Ec z3+{ZRRV4sD=zlPq=N=*uf(yBe1cY2DU2v)m0NoQxjfN*cr^ugZWe_G6rqs^Y)#(FR z&{P{_gyJ!GRcL31udF^oBTQ&quvacu5kyre*O8ncj2JxRyB{mFt}|gICl2XXJ4ILk zpHUC>QQ?t}c=^YJ^f7~n+hXNP*X;8gp>D47HC7W{7l)zlXQi@vUQ_q9&IwYcVn0Y5 z%GbV4+@Y@NyuBCNTh(LIMxWDZu6bzey@he`u#s)_Pz6aA%WOqCy^h~PjN93HR&m{e z0Sn~Y>JG7?k>FEP#;{Y1--}pSB+ML?FBaz)M6qmPeYe&dUdL{kv=e)YQ><=6*T#t| zbc}E9)X4P)d@cfnD;SMl6NMf$Dvv?Ma18;{S)4$3b7ZAy?|&@8<4&FMg=wu+d@;VI z&kR@Z<+zA%>Ekd4C^s?{irp$YyK8idMX)g1U()dr<9!#QfpOebN$*=%Y#R6+w5pPh}`n0o^%5=^3p z3Fr*OyT=H=1F?7ju1lUN2B!zMry&ajy4 zc60*4S(inW+INQ0i0e}KFt1}jBk&8Bmz-Tjlz!Azb8cp$u-nU6C4M0RY6p4$ixK+2J+!maPEa2~kkK5e304-VB0zkEusO?z zjEHa6hK<0CisRc5)Mkw{L$NFu0e?h9K=7-k=9W(dp$7G`+s{F_yoqV&3moKy8+)}9 z*e`fl9{05OdmnC2PS3o!xgyW`cARckipMp0Y+)|$YYyLB9{4K6CLp_@_qGtw$*A1? z0$Yt)h>6E$mg|x=f-ITM7tEK#zKSqS6spbSYLwK@ijk4F-I6SGRlB)Y{8M{HWk7T& z%ktw*BdO3GAncVI@rGWdp@i7e=n576s>rc6JEzIGx>A%*v16&ndC${@gl(4+9I&wr zLQI3!2&$m57&9)2RNoG6H21z&Sd3+5JX}&x0T$zAM^ZD}nyAO3PR3WkE2Y9JlIcLN zU}#C)sPR;UUYYimx->!pvoYi#;8kJ%#9j>@A6ec^_*#SjJEb~HT%9vIPY#KzxI9pp z0#kB<>p!LM#O#(+FRLjJEE(-jr8-dJsrdim{}K_V32uS<&Xc$wW^$p2Jll$88ZBZc(P|^UW=(jiGXFZB^ynF}E#--&rME}C z2Dd&^2@8&W2ijo7QNr*eMR%D77hb zv!;x>d$GE9+cB8v^$8els9j*uv}O1_W6`wX%v}AP!7B=5Y=?Am^^x)NKvYPA7G|i8 z^JVm;DilQ6Eu5~I%cKfp(MBoi9U#ukG>V!48gWYbLuwwj@_0xk!*6h z#8dEEd2KQf-TNCt=}LXZRgdt!fctXK=gfyt$vr*;F(dG>_rS$HVdL%tQIjsWuc_>r z-Nq>9*U*f2AP?7ASG@G=k*Yd z7J)c&gY^D)2CJ_qFte)ym20cP$)m#^^jg3eKEKDxpCIr5{}Xrr-S7U`>;CJ1 zzDnS5ry(SF+s+!~w2dezWt5$19m@$w!*IZr+%>-p4LuA`NKEyBUrjL6rjS~l9HOrY z=6RX4LH0+%)oc+|)!|gJ`0D8Y1e_-k;fZ?CFhUqb^HI#FY&Y?8L8MwTFvv}%K5hc0 z6{EAJOuBotx*e>*WpQfeQQWrFd5Xyd8Y?~0d>Y?h9MNN zROza2M@Ka<+uO4uQ=Ti)>vY}`Ar&GDP4T@6iT2!M6o6EOVbflY!Cg&+A)-KFjmSEC zGjt2Ab@XkD=elJz0TNHwNW_^fY>Ag>_d1>PQMy1)Bw`VzX@f|>l+QrgHK==-XB(Cl zk&E|;S%R1fz`-1a0;JAz$Rc)ZR-m7A8tC7hcr&8z2o`|uxSEtyqUEU7F73`tqvlcz zwQK68;@cd#{Eh>VsO{tV`)h>M(xh<}F zS#~w~LYmiZs2ZQCZfUu*oW#Ro{aT;O8^DJNky`JR+}oY8+Y)UX&bQGhVy56Og3o#+ zV(p43G{G#OV66`UQ^sKx=M5EC*%guK&N1_&B~-JfX*Tdgb?cf89zM+NXe8b+lGVtK zA=AAksXhue0)J$blD#FlF(um4g)#?9yazrLsUXPwBlU~SX|1!S-eaHUMpFgTikMkb zb8%VSBEV@-l8m#WEm>Z_Oe+@(GI%H#tVlB+Er3zXXI7 z`(=HnK}Q=1XHe-{ealYyHyjofm!wMuUQ)^yNq5_0i5SngcbhlcRBn2ga_yWkdK+^ z24PYG4*pLaz?pgtX4`8GvRAi#*0HUGj}q^A4WAA99mA+r=pDqI1$MrHn_Yia`mgU{ zzLO8~Ny%E+jud<@gY}|$`g*jE8La_pH7}BUqU|SjyG0y(MT*c^+5eHSU!6rSP;t$9 zR3~I?DKDq8B-?tJ0P`#}9+8QDJXF}``}CVP+HT!wmYy`5#vzW*5m1at`tBen9Ipi9nwcyrvZeE;|8=xFo)=Q^(M z@BL55`45Smo*OfDN7w@5RFaIID`kzr-0^Bu`MuK8>rnM0*_xLI3&F*U&)#vrPUM`R zD@`63sAb1hG@<8yajkLxX7y|RUh&kq7QJ(mGoMClK_y;#t95J)sYHE8?BoNtYITL#^G_jDt{z5?bhwt$FrL=4|%_x++3bt{;WHA z`R>X?-s#olyL0{jcjuR9@t>Rc@9l?tkLxxfXIs|?%-7c~4EVK>Z)fs`OY|5d%RVENydPV&Qt7@EM!56OD_(%;q&W}bn_K}6| z=lrnN(~x$4hRdscnlA$8@jn$>~P^{L1@Xmoy7vW*Dc5LWmCY)hrofMWT> zt52lr@`qQSM9r0b*d<*jM@h8^$4f}YA46|Muyj~P%^UZR&HopT|Fo(1=6L$ZZOt?G==Qu_&EBUqUb8~I3&9%8U U*YjNe9RL9T|HAdqLjd{!0K@b?6#xJL literal 0 HcmV?d00001 diff --git a/docs/domains/Domain.json b/docs/domains/Domain.json index 07c1724ba4c..ee8e7481d65 100644 --- a/docs/domains/Domain.json +++ b/docs/domains/Domain.json @@ -1,14 +1,12 @@ { "$schema": "http://json-schema.org/draft-04/schema#", - "description": "Domain represents a WebLogic domain and how it will be realized in the Kubernetes cluster.", "type": "object", "definitions": { "AdminServer": { - "description": "AdminServer represents the operator configuration for the Administration Server.", "type": "object", "properties": { "serverStartState": { - "description": "The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING.", + "description": "The WebLogic runtime state in which the server is to be started. Use ADMIN if the server should start in the admin state. Defaults to RUNNING.", "type": "string", "enum": [ "RUNNING", @@ -16,15 +14,15 @@ ] }, "serverService": { - "description": "Customization affecting ClusterIP Kubernetes services for WebLogic Server instances.", + "description": "Customization affecting the generation of Kubernetes Services for WebLogic Server instances.", "$ref": "#/definitions/ServerService" }, "serverPod": { - "description": "Configuration affecting server pods.", + "description": "Customization affecting the generation of Pods for WebLogic Server instances.", "$ref": "#/definitions/ServerPod" }, "serverStartPolicy": { - "description": "The strategy for deciding whether to start a server. Legal values are ALWAYS, NEVER, or IF_NEEDED.", + "description": "The strategy for deciding whether to start a WebLogic Server instance. Legal values are ALWAYS, NEVER, or IF_NEEDED. Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.", "type": "string", "enum": [ "ALWAYS", @@ -33,11 +31,11 @@ ] }, "adminService": { - "description": "Configures which of the Administration Server\u0027s WebLogic admin channels should be exposed outside the Kubernetes cluster via a node port service.", + "description": "Customization affecting the generation of the Kubernetes Service for the Administration Server. These settings can also specify the creation of a second NodePort Service to expose specific channels or network access points outside the Kubernetes cluster.", "$ref": "#/definitions/AdminService" }, "restartVersion": { - "description": "If present, every time this value is updated the operator will restart the required servers.", + "description": "Changes to this field cause the operator to restart WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.", "type": "string" } } @@ -46,28 +44,27 @@ "type": "object", "properties": { "channels": { - "description": "Specifies which of the Administration Server\u0027s WebLogic channels should be exposed outside the Kubernetes cluster via a node port service, along with the node port for each channel. If not specified, the Administration Server\u0027s node port service will not be created.", + "description": "Specifies which of the Administration Server\u0027s WebLogic channels should be exposed outside the Kubernetes cluster via a NodePort Service, along with the port for each channel. If not specified, the Administration Server\u0027s NodePort Service will not be created.", "type": "array", "items": { "$ref": "#/definitions/Channel" } }, "annotations": { - "description": "Annotations to associate with the external channel service.", + "description": "Annotations to associate with the Administration Server\u0027s Service(s).", "$ref": "#/definitions/Map" }, "labels": { - "description": "Labels to associate with the external channel service.", + "description": "Labels to associate with the Administration Server\u0027s Service(s).", "$ref": "#/definitions/Map" } } }, "Channel": { - "description": "Describes a single channel used by the Administration Server.", "type": "object", "properties": { "channelName": { - "description": "Name of channel.\n\u0027default\u0027 refers to the Administration Server\u0027s default channel (configured via the ServerMBean\u0027s ListenPort) \n\u0027default-secure\u0027 refers to the Administration Server\u0027s default secure channel (configured via the ServerMBean\u0027s SSLMBean\u0027s ListenPort) \n\u0027default-admin\u0027 refers to the Administration Server\u0027s default administrative channel (configured via the DomainMBean\u0027s AdministrationPort) \nOtherwise, the name is the name of one of the Administration Server\u0027s network access points (configured via the ServerMBean\u0027s NetworkAccessMBeans).", + "description": "Name of the channel. The \"default\" value refers to the Administration Server\u0027s default channel, which is configured using the ServerMBean\u0027s ListenPort. The \"default-secure\" value refers to the Administration Server\u0027s default secure channel, which is configured using the ServerMBean\u0027s SSLMBean\u0027s ListenPort. The \"default-admin\" value refers to the Administration Server\u0027s default administrative channel, which is configured using the DomainMBean\u0027s AdministrationPort. Otherwise, provide the name of one of the Administration Server\u0027s network access points, which is configured using the ServerMBean\u0027s NetworkAccessMBeans. The \"default\", \"default-secure\", and \"default-admin\" channels may not be specified here when using Istio.", "type": "string" }, "nodePort": { @@ -80,11 +77,10 @@ ] }, "Cluster": { - "description": "An element representing a cluster in the domain configuration.", "type": "object", "properties": { "serverStartState": { - "description": "The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING.", + "description": "The WebLogic runtime state in which the server is to be started. Use ADMIN if the server should start in the admin state. Defaults to RUNNING.", "type": "string", "enum": [ "RUNNING", @@ -92,7 +88,7 @@ ] }, "serverService": { - "description": "Customization affecting ClusterIP Kubernetes services for WebLogic Server instances.", + "description": "Customization affecting the generation of Kubernetes Services for WebLogic Server instances.", "$ref": "#/definitions/ServerService" }, "maxUnavailable": { @@ -101,32 +97,41 @@ "minimum": 1 }, "replicas": { - "description": "The number of cluster members to run.", + "description": "The number of cluster member Managed Server instances to start for this WebLogic cluster. The operator will sort cluster member Managed Server names from the WebLogic domain configuration by normalizing any numbers in the Managed Server name and then sorting alphabetically. This is done so that server names such as \"managed-server10\" come after \"managed-server9\". The operator will then start Managed Server instances from the sorted list, up to the `replicas` count, unless specific Managed Servers are specified as starting in their entry under the `managedServers` field. In that case, the specified Managed Server instances will be started and then additional cluster members will be started, up to the `replicas` count, by finding further cluster members in the sorted list that are not already started. If cluster members are started because of their related entries under `managedServers`, then this cluster may have more cluster members running than its `replicas` count. Defaults to 0.", "type": "number", "minimum": 0 }, "clusterName": { - "description": "The name of this cluster. Required", + "description": "The name of the cluster. This value must match the name of a WebLogic cluster already defined in the WebLogic domain configuration. Required.", "type": "string" }, + "allowReplicasBelowMinDynClusterSize": { + "description": "Specifies whether the number of running cluster members is allowed to drop below the minimum dynamic cluster size configured in the WebLogic domain configuration. Otherwise, the operator will ensure that the number of running cluster members is not less than the minimum dynamic cluster setting. This setting applies to dynamic clusters only. Defaults to true.", + "type": "boolean" + }, "serverPod": { - "description": "Configuration affecting server pods.", + "description": "Customization affecting the generation of Pods for WebLogic Server instances.", "$ref": "#/definitions/ServerPod" }, "clusterService": { - "description": "Customization affecting ClusterIP Kubernetes services for the WebLogic cluster.", + "description": "Customization affecting Kubernetes Service generated for this WebLogic cluster.", "$ref": "#/definitions/KubernetesResource" }, "serverStartPolicy": { - "description": "The strategy for deciding whether to start a server. Legal values are NEVER, or IF_NEEDED.", + "description": "The strategy for deciding whether to start a WebLogic Server instance. Legal values are NEVER, or IF_NEEDED. Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.", "type": "string", "enum": [ "NEVER", "IF_NEEDED" ] }, + "maxConcurrentStartup": { + "description": "The maximum number of Managed Servers instances that the operator will start in parallel for this cluster in response to a change in the `replicas` count. If more Managed Server instances must be started, the operator will wait until a Managed Server Pod is in the `Ready` state before starting the next Managed Server instance. A value of 0 means all Managed Server instances will start in parallel. Defaults to 0.", + "type": "number", + "minimum": 0 + }, "restartVersion": { - "description": "If present, every time this value is updated the operator will restart the required servers.", + "description": "Changes to this field cause the operator to restart WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.", "type": "string" } }, @@ -143,26 +148,26 @@ "minimum": 0 }, "maximumReplicas": { - "description": "The maximum number of cluster members. Required.", + "description": "The maximum number of cluster members.", "type": "number", "minimum": 0 }, "replicas": { - "description": "The number of intended cluster members. Required.", + "description": "The number of currently running cluster members.", "type": "number", "minimum": 0 }, "clusterName": { - "description": "WebLogic cluster name. Required.", + "description": "WebLogic cluster name.", "type": "string" }, "readyReplicas": { - "description": "The number of ready cluster members. Required.", + "description": "The number of ready cluster members.", "type": "number", "minimum": 0 }, "replicasGoal": { - "description": "The requested number of cluster members from the domain spec. Cluster members will be started by the operator if this value is larger than zero.", + "description": "The requested number of cluster members. Cluster members will be started by the operator if this value is larger than zero.", "type": "number", "minimum": 0 } @@ -171,9 +176,40 @@ "Configuration": { "type": "object", "properties": { + "overrideDistributionStrategy": { + "description": "Determines how updated configuration overrides are distributed to already running WebLogic Server instances following introspection when the `domainHomeSourceType` is PersistentVolume or Image. Configuration overrides are generated during introspection from Secrets, the `overrideConfigMap` field, and WebLogic domain topology. Legal values are DYNAMIC, which means that the operator will distribute updated configuration overrides dynamically to running servers, and ON_RESTART, which means that servers will use updated configuration overrides only after the server\u0027s next restart. The selection of ON_RESTART will not cause servers to restart when there are updated configuration overrides available. See also `domains.spec.introspectVersion`. Defaults to DYNAMIC.", + "type": "string", + "enum": [ + "DYNAMIC", + "ON_RESTART" + ] + }, + "opss": { + "description": "Settings for OPSS security.", + "$ref": "#/definitions/Opss" + }, + "model": { + "description": "Model in image model files and properties.", + "$ref": "#/definitions/Model" + }, + "secrets": { + "description": "A list of names of the Secrets for WebLogic configuration overrides or model. If this field is specified, then the value of `spec.configOverrideSecrets` is ignored.", + "type": "array", + "items": { + "type": "string" + } + }, "istio": { "description": "The Istio service mesh integration settings.", "$ref": "#/definitions/Istio" + }, + "overridesConfigMap": { + "description": "The name of the ConfigMap for WebLogic configuration overrides. If this field is specified, then the value of `spec.configOverrides` is ignored.", + "type": "string" + }, + "introspectorJobActiveDeadlineSeconds": { + "description": "The introspector job timeout value in seconds. If this field is specified, then the operator\u0027s ConfigMap `data.introspectorJobActiveDeadlineSeconds` value is ignored. Defaults to 120 seconds.", + "type": "number" } } }, @@ -189,7 +225,7 @@ "type": "string" }, "type": { - "description": "The type of the condition. Valid types are Progressing, Available, and Failed. Required.", + "description": "The type of the condition. Valid types are Progressing, Available, and Failed.", "type": "string", "enum": [ "Progressing", @@ -210,17 +246,85 @@ "$ref": "#/definitions/DateTime" }, "status": { - "description": "Status is the status of the condition. Can be True, False, Unknown. Required.", + "description": "The status of the condition. Can be True, False, Unknown.", "type": "string" } } }, "DomainSpec": { - "description": "DomainSpec is a description of a domain.", + "description": "The specification of the operation of the WebLogic domain. Required.", "type": "object", "properties": { + "configuration": { + "description": "Models and overrides affecting the WebLogic domain configuration.", + "$ref": "#/definitions/Configuration" + }, + "configOverrideSecrets": { + "deprecated": "true", + "description": "Deprecated. Use `configuration.secrets` instead. Ignored if `configuration.secrets` is specified. A list of names of the Secrets for optional WebLogic configuration overrides.", + "type": "array", + "items": { + "type": "string" + } + }, + "imagePullSecrets": { + "description": "A list of image pull Secrets for the WebLogic container image.", + "type": "array", + "items": { + "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.LocalObjectReference" + } + }, + "domainUID": { + "pattern": "^[a-z0-9-.]{1,253}$", + "description": "Domain unique identifier. It is recommended that this value be unique to assist in future work to identify related domains in active-passive scenarios across data centers; however, it is only required that this value be unique within the namespace, similarly to the names of Kubernetes resources. This value is distinct and need not match the domain name from the WebLogic domain configuration. Defaults to the value of `metadata.name`.", + "type": "string" + }, + "serverService": { + "description": "Customization affecting the generation of Kubernetes Services for WebLogic Server instances.", + "$ref": "#/definitions/ServerService" + }, + "domainHome": { + "description": "The directory containing the WebLogic domain configuration inside the container. Defaults to /shared/domains/domains/\u003cdomainUID\u003e if `domainHomeSourceType` is PersistentVolume. Defaults to /u01/oracle/user_projects/domains/ if `domainHomeSourceType` is Image. Defaults to /u01/domains/\u003cdomainUID\u003e if `domainHomeSourceType` is FromModel.", + "type": "string" + }, + "domainHomeSourceType": { + "description": "Domain home file system source type: Legal values: Image, PersistentVolume, FromModel. Image indicates that the domain home file system is present in the container image specified by the `image` field. PersistentVolume indicates that the domain home file system is located on a persistent volume. FromModel indicates that the domain home file system will be created and managed by the operator based on a WDT domain model. If this field is specified, it overrides the value of `domainHomeInImage`. If both fields are unspecified, then `domainHomeSourceType` defaults to Image.", + "type": "string", + "enum": [ + "Image", + "PersistentVolume", + "FromModel" + ] + }, + "httpAccessLogInLogHome": { + "description": "Specifies whether the server HTTP access log files will be written to the same directory specified in `logHome`. Otherwise, server HTTP access log files will be written to the directory configured in the WebLogic domain configuration. Defaults to true.", + "type": "boolean" + }, + "webLogicCredentialsSecret": { + "description": "Reference to a Kubernetes Secret that contains the user name and password needed to boot a WebLogic Server under the `username` and `password` fields.", + "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.SecretReference" + }, + "adminServer": { + "description": "Lifecycle options for the Administration Server, including Java options, environment variables, additional Pod content, and which channels or network access points should be exposed using a NodePort Service.", + "$ref": "#/definitions/AdminServer" + }, + "logHome": { + "description": "The directory in a server\u0027s container in which to store the domain, Node Manager, server logs, server *.out, and optionally HTTP access log files if `httpAccessLogInLogHome` is true. Ignored if `logHomeEnabled` is false.", + "type": "string" + }, + "includeServerOutInPodLog": { + "description": "Specifies whether the server .out file will be included in the Pod\u0027s log. Defaults to true.", + "type": "boolean" + }, + "clusters": { + "description": "Lifecycle options for all of the Managed Server members of a WebLogic cluster, including Java options, environment variables, additional Pod content, and the ability to explicitly start, stop, or restart cluster members. The `clusterName` field of each entry must match a cluster that already exists in the WebLogic domain configuration.", + "type": "array", + "items": { + "$ref": "#/definitions/Cluster" + } + }, "serverStartState": { - "description": "The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING.", + "description": "The WebLogic runtime state in which the server is to be started. Use ADMIN if the server should start in the admin state. Defaults to RUNNING.", "type": "string", "enum": [ "RUNNING", @@ -228,11 +332,11 @@ ] }, "image": { - "description": "The WebLogic Docker image; required when domainHomeInImage is true; otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4.", + "description": "The WebLogic container image; required when `domainHomeSourceType` is Image or FromModel; otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4.", "type": "string" }, "imagePullPolicy": { - "description": "The image pull policy for the WebLogic Docker image. Legal values are Always, Never and IfNotPresent. Defaults to Always if image ends in :latest, IfNotPresent otherwise.", + "description": "The image pull policy for the WebLogic container image. Legal values are Always, Never, and IfNotPresent. Defaults to Always if image ends in :latest; IfNotPresent, otherwise.", "type": "string", "enum": [ "Always", @@ -240,40 +344,23 @@ "IfNotPresent" ] }, - "configuration": { - "description": "Properties affecting the WebLogic domain configuration.", - "$ref": "#/definitions/Configuration" + "maxClusterConcurrentStartup": { + "description": "The maximum number of cluster member Managed Server instances that the operator will start in parallel for a given cluster, if `maxConcurrentStartup` is not specified for a specific cluster under the `clusters` field. A value of 0 means there is no configured limit. Defaults to 0.", + "type": "number", + "minimum": 0 }, "replicas": { - "description": "The number of managed servers to run in any cluster that does not specify a replica count.", + "description": "The default number of cluster member Managed Server instances to start for each WebLogic cluster in the domain configuration, unless `replicas` is specified for that cluster under the `clusters` field. For each cluster, the operator will sort cluster member Managed Server names from the WebLogic domain configuration by normalizing any numbers in the Managed Server name and then sorting alphabetically. This is done so that server names such as \"managed-server10\" come after \"managed-server9\". The operator will then start Managed Servers from the sorted list, up to the `replicas` count, unless specific Managed Servers are specified as starting in their entry under the `managedServers` field. In that case, the specified Managed Servers will be started and then additional cluster members will be started, up to the `replicas` count, by finding further cluster members in the sorted list that are not already started. If cluster members are started because of their entries under `managedServers`, then a cluster may have more cluster members running than its `replicas` count. Defaults to 0.", "type": "number", "minimum": 0 }, - "configOverrideSecrets": { - "description": "A list of names of the secrets for optional WebLogic configuration overrides.", - "type": "array", - "items": { - "type": "string" - } - }, - "imagePullSecrets": { - "description": "A list of image pull secrets for the WebLogic Docker image.", - "type": "array", - "items": { - "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.LocalObjectReference" - } - }, "domainHomeInImage": { - "description": "True indicates that the domain home file system is contained in the Docker image specified by the image field. False indicates that the domain home file system is located on a persistent volume.", + "deprecated": "true", + "description": "Deprecated. Use `domainHomeSourceType` instead. Ignored if `domainHomeSourceType` is specified. True indicates that the domain home file system is present in the container image specified by the image field. False indicates that the domain home file system is located on a persistent volume. Defaults to unset.", "type": "boolean" }, - "domainUID": { - "pattern": "^[a-z0-9-.]{1,253}$", - "description": "Domain unique identifier. Must be unique across the Kubernetes cluster. Not required. Defaults to the value of metadata.name.", - "type": "string" - }, "serverStartPolicy": { - "description": "The strategy for deciding whether to start a server. Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED.", + "description": "The strategy for deciding whether to start a WebLogic Server instance. Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED. Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.", "type": "string", "enum": [ "NEVER", @@ -282,67 +369,45 @@ ] }, "restartVersion": { - "description": "If present, every time this value is updated the operator will restart the required servers.", + "description": "Changes to this field cause the operator to restart WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.", "type": "string" }, - "dataHome": { - "description": "An optional, in-pod location for data storage of default and custom file stores. If dataHome is not specified or its value is either not set or empty (e.g. dataHome: \"\") then the data storage directories are determined from the WebLogic domain home configuration.", + "introspectVersion": { + "description": "Changes to this field cause the operator to repeat its introspection of the WebLogic domain configuration. Repeating introspection is required for the operator to recognize changes to the domain configuration, such as adding a new WebLogic cluster or Managed Server instance, to regenerate configuration overrides, or to regenerate the WebLogic domain home when the `domainHomeSourceType` is FromModel. Introspection occurs automatically, without requiring change to this field, when servers are first started or restarted after a full domain shut down. For the FromModel `domainHomeSourceType`, introspection also occurs when a running server must be restarted because of changes to any of the fields listed here: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#properties-that-cause-servers-to-be-restarted. See also `domains.spec.configuration.overridesConfigurationStrategy`.", "type": "string" }, - "configOverrides": { - "description": "The name of the config map for optional WebLogic configuration overrides.", + "dataHome": { + "description": "An optional directory in a server\u0027s container for data storage of default and custom file stores. If `dataHome` is not specified or its value is either not set or empty, then the data storage directories are determined from the WebLogic domain configuration.", "type": "string" }, - "serverService": { - "description": "Customization affecting ClusterIP Kubernetes services for WebLogic Server instances.", - "$ref": "#/definitions/ServerService" - }, - "domainHome": { - "description": "The folder for the WebLogic Domain. Not required. Defaults to /shared/domains/domains/domainUID if domainHomeInImage is false. Defaults to /u01/oracle/user_projects/domains/ if domainHomeInImage is true.", + "configOverrides": { + "deprecated": "true", + "description": "Deprecated. Use `configuration.overridesConfigMap` instead. Ignored if `configuration.overridesConfigMap` is specified. The name of the ConfigMap for optional WebLogic configuration overrides.", "type": "string" }, "logHomeEnabled": { - "description": "Specified whether the log home folder is enabled. Not required. Defaults to true if domainHomeInImage is false. Defaults to false if domainHomeInImage is true. ", + "description": "Specifies whether the log home folder is enabled. Defaults to true if `domainHomeSourceType` is PersistentVolume; false, otherwise.", "type": "boolean" }, - "webLogicCredentialsSecret": { - "description": "The name of a pre-created Kubernetes secret, in the domain\u0027s namespace, that holds the username and password needed to boot WebLogic Server under the \u0027username\u0027 and \u0027password\u0027 fields.", - "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.SecretReference" - }, - "adminServer": { - "description": "Configuration for the Administration Server.", - "$ref": "#/definitions/AdminServer" + "allowReplicasBelowMinDynClusterSize": { + "description": "Whether to allow the number of running cluster member Managed Server instances to drop below the minimum dynamic cluster size configured in the WebLogic domain configuration, if this is not specified for a specific cluster under the `clusters` field. Defaults to true.", + "type": "boolean" }, "serverPod": { - "description": "Configuration affecting server pods.", + "description": "Customization affecting the generation of Pods for WebLogic Server instances.", "$ref": "#/definitions/ServerPod" }, - "logHome": { - "description": "The in-pod name of the directory in which to store the domain, Node Manager, server logs, and server *.out files.", - "type": "string" - }, - "includeServerOutInPodLog": { - "description": "If true (the default), then the server .out file will be included in the pod\u0027s stdout.", - "type": "boolean" - }, "managedServers": { - "description": "Configuration for individual Managed Servers.", + "description": "Lifecycle options for individual Managed Servers, including Java options, environment variables, additional Pod content, and the ability to explicitly start, stop, or restart a named server instance. The `serverName` field of each entry must match a Managed Server that already exists in the WebLogic domain configuration or that matches a dynamic cluster member based on the server template.", "type": "array", "items": { "$ref": "#/definitions/ManagedServer" } - }, - "clusters": { - "description": "Configuration for the clusters.", - "type": "array", - "items": { - "$ref": "#/definitions/Cluster" - } } } }, "DomainStatus": { - "description": "DomainStatus represents information about the status of a domain. Status may trail the actual state of a system.", + "description": "The current status of the operation of the WebLogic domain. Updated automatically by the operator.", "type": "object", "properties": { "reason": { @@ -357,7 +422,7 @@ } }, "replicas": { - "description": "The number of running Managed Servers in the WebLogic cluster if there is only one cluster in the domain and where the cluster does not explicitly configure its replicas in a cluster specification.", + "description": "The number of running cluster member Managed Servers in the WebLogic cluster if there is exactly one cluster defined in the domain configuration and where the `replicas` field is set at the `spec` level rather than for the specific cluster under `clusters`. This field is provided to support use of Kubernetes scaling for this limited use case.", "type": "number", "minimum": 0 }, @@ -366,7 +431,7 @@ "$ref": "#/definitions/DateTime" }, "conditions": { - "description": "Current service state of domain.", + "description": "Current service state of the domain.", "type": "array", "items": { "$ref": "#/definitions/DomainCondition" @@ -389,11 +454,11 @@ "type": "object", "properties": { "readinessPort": { - "description": "The WebLogic readiness port for Istio. Defaults to 8888. Not required.", + "description": "The operator will create a WebLogic network access point with this port that will then be exposed from the container running the WebLogic Server instance. The readiness probe will use this network access point to verify that the server instance is ready for application traffic. Defaults to 8888.", "type": "number" }, "enabled": { - "description": "True, if this domain is deployed under an Istio service mesh. Defaults to true when the \u0027istio\u0027 element is included. Not required.", + "description": "True, if this domain is deployed under an Istio service mesh. Defaults to true when the `istio` field is specified.", "type": "boolean" } } @@ -402,21 +467,20 @@ "type": "object", "properties": { "annotations": { - "description": "The annotations to be attached to generated resources.", + "description": "The annotations to be added to generated resources.", "$ref": "#/definitions/Map" }, "labels": { - "description": "The labels to be attached to generated resources. The label names must not start with \u0027weblogic.\u0027.", + "description": "The labels to be added to generated resources. The label names must not start with \"weblogic.\".", "$ref": "#/definitions/Map" } } }, "ManagedServer": { - "description": "ManagedServer represents the operator configuration for a single Managed Server.", "type": "object", "properties": { "serverStartState": { - "description": "The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING.", + "description": "The WebLogic runtime state in which the server is to be started. Use ADMIN if the server should start in the admin state. Defaults to RUNNING.", "type": "string", "enum": [ "RUNNING", @@ -424,19 +488,19 @@ ] }, "serverService": { - "description": "Customization affecting ClusterIP Kubernetes services for WebLogic Server instances.", + "description": "Customization affecting the generation of Kubernetes Services for WebLogic Server instances.", "$ref": "#/definitions/ServerService" }, "serverName": { - "description": "The name of the Managed Server. Required.", + "description": "The name of the Managed Server. This name must match the name of a Managed Server instance or of a dynamic cluster member name from a server template already defined in the WebLogic domain configuration. Required.", "type": "string" }, "serverPod": { - "description": "Configuration affecting server pods.", + "description": "Customization affecting the generation of Pods for WebLogic Server instances.", "$ref": "#/definitions/ServerPod" }, "serverStartPolicy": { - "description": "The strategy for deciding whether to start a server. Legal values are ALWAYS, NEVER, or IF_NEEDED.", + "description": "The strategy for deciding whether to start a WebLogic Server instance. Legal values are ALWAYS, NEVER, or IF_NEEDED. Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.", "type": "string", "enum": [ "ALWAYS", @@ -445,7 +509,7 @@ ] }, "restartVersion": { - "description": "If present, every time this value is updated the operator will restart the required servers.", + "description": "Changes to this field cause the operator to restart WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.", "type": "string" } }, @@ -459,6 +523,41 @@ }, "type": "object" }, + "Model": { + "type": "object", + "properties": { + "runtimeEncryptionSecret": { + "description": "Runtime encryption secret. Required when `domainHomeSourceType` is set to FromModel.", + "type": "string" + }, + "domainType": { + "description": "WebLogic Deploy Tooling domain type. Legal values: WLS, RestrictedJRF, JRF. Defaults to WLS.", + "type": "string", + "enum": [ + "WLS", + "RestrictedJRF", + "JRF" + ] + }, + "configMap": { + "description": "Name of a ConfigMap containing the WebLogic Deploy Tooling model.", + "type": "string" + } + } + }, + "Opss": { + "type": "object", + "properties": { + "walletFileSecret": { + "description": "Name of a Secret containing the OPSS key wallet file, which must be in a field named `walletFile`. Use this to allow a JRF domain to reuse its entries in the RCU database. This allows you to specify a wallet file that was obtained from the domain home after the domain was booted for the first time.", + "type": "string" + }, + "walletPasswordSecret": { + "description": "Name of a Secret containing the OPSS key passphrase, which must be in a field named `walletPassword`. Used to encrypt and decrypt the wallet that is used for accessing the domain\u0027s entries in its RCU database.", + "type": "string" + } + } + }, "ProbeTuning": { "type": "object", "properties": { @@ -480,7 +579,7 @@ "type": "object", "properties": { "overallHealth": { - "description": "Server health of this WebLogic Server. If the value is \"Not available\", the operator has failed to read the health. If the value is \"Not available (possibly overloaded)\", the operator has failed to read the health of the server possibly due to the server is in overloaded state.", + "description": "Server health of this WebLogic Server instance. If the value is \"Not available\", the operator has failed to read the health. If the value is \"Not available (possibly overloaded)\", the operator has failed to read the health of the server possibly due to the server is in the overloaded state.", "type": "string" }, "activationTime": { @@ -497,120 +596,119 @@ } }, "ServerPod": { - "description": "ServerPod describes the configuration for a Kubernetes pod for a server.", "type": "object", "properties": { "nodeName": { - "description": "NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits resource requirements.", + "description": "NodeName is a request to schedule this Pod onto a specific Node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits the resource requirements. See `kubectl explain pods.spec.nodeName`.", "type": "string" }, "livenessProbe": { - "description": "Settings for the liveness probe associated with a server.", + "description": "Settings for the liveness probe associated with a WebLogic Server instance.", "$ref": "#/definitions/ProbeTuning" }, "readinessGates": { - "description": "If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to \"True\" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md", + "description": "If specified, all readiness gates will be evaluated for Pod readiness. A Pod is ready when all its containers are ready AND all conditions specified in the readiness gates have a status equal to \"True\". More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md.", "type": "array", "items": { "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.PodReadinessGate" } }, "serviceAccountName": { - "description": "Name of the ServiceAccount to be used to run this pod. If it is not set, default ServiceAccount will be used. The ServiceAccount has to exist at the time the pod is created.", + "description": "Name of the ServiceAccount to be used to run this Pod. If it is not set, default ServiceAccount will be used. The ServiceAccount has to exist at the time the Pod is created. See `kubectl explain pods.spec.serviceAccountName`.", "type": "string" }, "podSecurityContext": { - "description": "Pod-level security attributes.", + "description": "Pod-level security attributes. See `kubectl explain pods.spec.securityContext`.", "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.PodSecurityContext" }, "priorityClassName": { - "description": "If specified, indicates the pod\u0027s priority. \"system-node-critical\" and \"system-cluster-critical\" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default.", + "description": "If specified, indicates the Pod\u0027s priority. \"system-node-critical\" and \"system-cluster-critical\" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be the default or zero, if there is no default. See `kubectl explain pods.spec.priorityClassName`.", "type": "string" }, "volumes": { - "description": "Additional volumes to be created in the server pod.", + "description": "Additional volumes to be created in the server Pod. See `kubectl explain pods.spec.volumes`.", "type": "array", "items": { "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.Volume" } }, "resources": { - "description": "Memory and CPU minimum requirements and limits for the server.", + "description": "Memory and CPU minimum requirements and limits for the WebLogic Server instance. See `kubectl explain pods.spec.containers.resources`.", "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.ResourceRequirements" }, "annotations": { - "description": "The annotations to be attached to generated resources.", + "description": "The annotations to be added to generated resources.", "$ref": "#/definitions/Map" }, "env": { - "description": "A list of environment variables to add to a server.", + "description": "A list of environment variables to set in the container running a WebLogic Server instance. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-resource/#jvm-memory-and-java-option-environment-variables. See `kubectl explain pods.spec.containers.env`.", "type": "array", "items": { "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.EnvVar" } }, "restartPolicy": { - "description": "Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy", + "description": "Restart policy for all containers within the Pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy. See `kubectl explain pods.spec.restartPolicy`.", "type": "string" }, "nodeSelector": { - "description": "Selector which must match a node\u0027s labels for the pod to be scheduled on that node.", + "description": "Selector which must match a Node\u0027s labels for the Pod to be scheduled on that Node. See `kubectl explain pods.spec.nodeSelector`.", "$ref": "#/definitions/Map" }, "volumeMounts": { - "description": "Additional volume mounts for the server pod.", + "description": "Additional volume mounts for the container running a WebLogic Server instance. See `kubectl explain pods.spec.containers.volumeMounts`.", "type": "array", "items": { "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.VolumeMount" } }, "labels": { - "description": "The labels to be attached to generated resources. The label names must not start with \u0027weblogic.\u0027.", + "description": "The labels to be added to generated resources. The label names must not start with \"weblogic.\".", "$ref": "#/definitions/Map" }, "runtimeClassName": { - "description": "RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md This is an alpha feature and may change in the future.", + "description": "RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this Pod. If no RuntimeClass resource matches the named class, the Pod will not be run. If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md This is an alpha feature and may change in the future. See `kubectl explain pods.spec.runtimeClassName`.", "type": "string" }, "tolerations": { - "description": "If specified, the pod\u0027s tolerations.", + "description": "If specified, the Pod\u0027s tolerations. See `kubectl explain pods.spec.tolerations`.", "type": "array", "items": { "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.Toleration" } }, "readinessProbe": { - "description": "Settings for the readiness probe associated with a server.", + "description": "Settings for the readiness probe associated with a WebLogic Server instance.", "$ref": "#/definitions/ProbeTuning" }, "containers": { - "description": "Additional containers to be included in the server pod.", + "description": "Additional containers to be included in the server Pod. See `kubectl explain pods.spec.containers`.", "type": "array", "items": { "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.Container" } }, "containerSecurityContext": { - "description": "Container-level security attributes. Will override any matching pod-level attributes.", + "description": "Container-level security attributes. Will override any matching Pod-level attributes. See `kubectl explain pods.spec.containers.securityContext`.", "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.SecurityContext" }, "schedulerName": { - "description": "If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler.", + "description": "If specified, the Pod will be dispatched by the specified scheduler. If not specified, the Pod will be dispatched by the default scheduler. See `kubectl explain pods.spec.schedulerName`.", "type": "string" }, "initContainers": { - "description": "Initialization containers to be included in the server pod.", + "description": "Initialization containers to be included in the server Pod. See `kubectl explain pods.spec.initContainers`.", "type": "array", "items": { "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.Container" } }, "shutdown": { - "description": "Configures how the operator should shutdown the server instance.", + "description": "Configures how the operator should shut down the server instance.", "$ref": "#/definitions/Shutdown" }, "affinity": { - "description": "If specified, the pod\u0027s scheduling constraints", + "description": "If specified, the Pod\u0027s scheduling constraints. See `kubectl explain pods.spec.affinity`", "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.Affinity" } } @@ -619,15 +717,15 @@ "type": "object", "properties": { "precreateService": { - "description": "If true, operator will create server services even for server instances without running pods.", + "description": "If true, the operator will create Services even for Managed Server instances without running Pods.", "type": "boolean" }, "annotations": { - "description": "The annotations to be attached to generated resources.", + "description": "The annotations to be added to generated resources.", "$ref": "#/definitions/Map" }, "labels": { - "description": "The labels to be attached to generated resources. The label names must not start with \u0027weblogic.\u0027.", + "description": "The labels to be added to generated resources. The label names must not start with \"weblogic.\".", "$ref": "#/definitions/Map" } } @@ -636,41 +734,40 @@ "type": "object", "properties": { "nodeName": { - "description": "Name of node that is hosting the Pod containing this WebLogic Server.", + "description": "Name of Node that is hosting the Pod containing this WebLogic Server instance.", "type": "string" }, "desiredState": { - "description": "Desired state of this WebLogic Server. Values are RUNNING, ADMIN, or SHUTDOWN.", + "description": "Desired state of this WebLogic Server instance. Values are RUNNING, ADMIN, or SHUTDOWN.", "type": "string" }, "clusterName": { - "description": "WebLogic cluster name, if the server is part of a cluster.", + "description": "WebLogic cluster name, if the server is a member of a cluster.", "type": "string" }, "serverName": { - "description": "WebLogic Server name. Required.", + "description": "WebLogic Server instance name.", "type": "string" }, "health": { - "description": "Current status and health of a specific WebLogic Server.", + "description": "Current status and health of a specific WebLogic Server instance.", "$ref": "#/definitions/ServerHealth" }, "state": { - "description": "Current state of this WebLogic Server. Required.", + "description": "Current state of this WebLogic Server instance.", "type": "string" } } }, "Shutdown": { - "description": "Shutdown describes the configuration for shutting down a server instance.", "type": "object", "properties": { "ignoreSessions": { - "description": "For graceful shutdown only, indicates to ignore pending HTTP sessions during in-flight work handling. Not required. Defaults to false.", + "description": "For graceful shutdown only, indicates to ignore pending HTTP sessions during in-flight work handling. Defaults to false.", "type": "boolean" }, "shutdownType": { - "description": "Tells the operator how to shutdown server instances. Not required. Defaults to graceful shutdown.", + "description": "Specifies how the operator will shut down server instances. Defaults to graceful shutdown.", "type": "string", "enum": [ "Graceful", @@ -678,7 +775,7 @@ ] }, "timeoutSeconds": { - "description": "For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting down the server. Not required. Defaults to 30 seconds.", + "description": "For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting down the server. Defaults to 30 seconds.", "type": "number" } } @@ -694,11 +791,11 @@ } }, "health": { - "description": "Server health of this WebLogic Server. Required.", + "description": "Server health of this WebLogic Server instance.", "type": "string" }, "subsystemName": { - "description": "Name of subsystem providing symptom information. Required.", + "description": "Name of subsystem providing symptom information.", "type": "string" } } @@ -706,23 +803,23 @@ }, "properties": { "metadata": { - "description": "The domain meta-data. Must include the name and namespace.", + "description": "The resource metadata. Must include the `name` and `namespace`. Required.", "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" }, "apiVersion": { - "description": "The API version for the Domain.", + "description": "The API version defines the versioned schema of this Domain. Required.", "type": "string" }, "kind": { - "description": "The type of resource. Must be \u0027Domain\u0027.", + "description": "The type of the REST resource. Must be \"Domain\". Required.", "type": "string" }, "spec": { - "description": "The specification of the domain. Required.", + "description": "The specification of the operation of the WebLogic domain. Required.", "$ref": "#/definitions/DomainSpec" }, "status": { - "description": "The current status of the domain. Updated by the operator.", + "description": "The current status of the operation of the WebLogic domain. Updated automatically by the operator.", "$ref": "#/definitions/DomainStatus" } }, diff --git a/docs/domains/Domain.md b/docs/domains/Domain.md index afb07f2111f..47b17e392c0 100644 --- a/docs/domains/Domain.md +++ b/docs/domains/Domain.md @@ -1,155 +1,158 @@ ### Domain -Domain represents a WebLogic domain and how it will be realized in the Kubernetes cluster. - | Name | Type | Description | | --- | --- | --- | -| `apiVersion` | string | The API version for the Domain. | -| `kind` | string | The type of resource. Must be 'Domain'. | -| `metadata` | [Object Meta](k8s1.13.5.md#object-meta) | The domain meta-data. Must include the name and namespace. | -| `spec` | [Domain Spec](#domain-spec) | The specification of the domain. Required. | -| `status` | [Domain Status](#domain-status) | The current status of the domain. Updated by the operator. | +| `apiVersion` | string | The API version defines the versioned schema of this Domain. Required. | +| `kind` | string | The type of the REST resource. Must be "Domain". Required. | +| `metadata` | [Object Meta](k8s1.13.5.md#object-meta) | The resource metadata. Must include the `name` and `namespace`. Required. | +| `spec` | [Domain Spec](#domain-spec) | The specification of the operation of the WebLogic domain. Required. | +| `status` | [Domain Status](#domain-status) | The current status of the operation of the WebLogic domain. Updated automatically by the operator. | ### Domain Spec -DomainSpec is a description of a domain. - -| Name | Type | Description | -| --- | --- | --- | -| `adminServer` | [Admin Server](#admin-server) | Configuration for the Administration Server. | -| `clusters` | array of [Cluster](#cluster) | Configuration for the clusters. | -| `configOverrides` | string | The name of the config map for optional WebLogic configuration overrides. | -| `configOverrideSecrets` | array of string | A list of names of the secrets for optional WebLogic configuration overrides. | -| `configuration` | [Configuration](#configuration) | Properties affecting the WebLogic domain configuration. | -| `dataHome` | string | An optional, in-pod location for data storage of default and custom file stores. If dataHome is not specified or its value is either not set or empty (e.g. dataHome: "") then the data storage directories are determined from the WebLogic domain home configuration. | -| `domainHome` | string | The folder for the WebLogic Domain. Not required. Defaults to /shared/domains/domains/domainUID if domainHomeInImage is false. Defaults to /u01/oracle/user_projects/domains/ if domainHomeInImage is true. | -| `domainHomeInImage` | Boolean | True indicates that the domain home file system is contained in the Docker image specified by the image field. False indicates that the domain home file system is located on a persistent volume. | -| `domainUID` | string | Domain unique identifier. Must be unique across the Kubernetes cluster. Not required. Defaults to the value of metadata.name. | -| `image` | string | The WebLogic Docker image; required when domainHomeInImage is true; otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4. | -| `imagePullPolicy` | string | The image pull policy for the WebLogic Docker image. Legal values are Always, Never and IfNotPresent. Defaults to Always if image ends in :latest, IfNotPresent otherwise. | -| `imagePullSecrets` | array of [Local Object Reference](k8s1.13.5.md#local-object-reference) | A list of image pull secrets for the WebLogic Docker image. | -| `includeServerOutInPodLog` | Boolean | If true (the default), then the server .out file will be included in the pod's stdout. | -| `logHome` | string | The in-pod name of the directory in which to store the domain, Node Manager, server logs, and server *.out files. | -| `logHomeEnabled` | Boolean | Specified whether the log home folder is enabled. Not required. Defaults to true if domainHomeInImage is false. Defaults to false if domainHomeInImage is true. | -| `managedServers` | array of [Managed Server](#managed-server) | Configuration for individual Managed Servers. | -| `replicas` | number | The number of managed servers to run in any cluster that does not specify a replica count. | -| `restartVersion` | string | If present, every time this value is updated the operator will restart the required servers. | -| `serverPod` | [Server Pod](#server-pod) | Configuration affecting server pods. | -| `serverService` | [Server Service](#server-service) | Customization affecting ClusterIP Kubernetes services for WebLogic Server instances. | -| `serverStartPolicy` | string | The strategy for deciding whether to start a server. Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED. | -| `serverStartState` | string | The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING. | -| `webLogicCredentialsSecret` | [Secret Reference](k8s1.13.5.md#secret-reference) | The name of a pre-created Kubernetes secret, in the domain's namespace, that holds the username and password needed to boot WebLogic Server under the 'username' and 'password' fields. | +The specification of the operation of the WebLogic domain. Required. + +| Name | Type | Description | +| --- | --- | --- | +| `adminServer` | [Admin Server](#admin-server) | Lifecycle options for the Administration Server, including Java options, environment variables, additional Pod content, and which channels or network access points should be exposed using a NodePort Service. | +| `allowReplicasBelowMinDynClusterSize` | Boolean | Whether to allow the number of running cluster member Managed Server instances to drop below the minimum dynamic cluster size configured in the WebLogic domain configuration, if this is not specified for a specific cluster under the `clusters` field. Defaults to true. | +| `clusters` | array of [Cluster](#cluster) | Lifecycle options for all of the Managed Server members of a WebLogic cluster, including Java options, environment variables, additional Pod content, and the ability to explicitly start, stop, or restart cluster members. The `clusterName` field of each entry must match a cluster that already exists in the WebLogic domain configuration. | +| `configOverrides` | string | Deprecated. Use `configuration.overridesConfigMap` instead. Ignored if `configuration.overridesConfigMap` is specified. The name of the ConfigMap for optional WebLogic configuration overrides. | +| `configOverrideSecrets` | array of string | Deprecated. Use `configuration.secrets` instead. Ignored if `configuration.secrets` is specified. A list of names of the Secrets for optional WebLogic configuration overrides. | +| `configuration` | [Configuration](#configuration) | Models and overrides affecting the WebLogic domain configuration. | +| `dataHome` | string | An optional directory in a server's container for data storage of default and custom file stores. If `dataHome` is not specified or its value is either not set or empty, then the data storage directories are determined from the WebLogic domain configuration. | +| `domainHome` | string | The directory containing the WebLogic domain configuration inside the container. Defaults to /shared/domains/domains/ if `domainHomeSourceType` is PersistentVolume. Defaults to /u01/oracle/user_projects/domains/ if `domainHomeSourceType` is Image. Defaults to /u01/domains/ if `domainHomeSourceType` is FromModel. | +| `domainHomeInImage` | Boolean | Deprecated. Use `domainHomeSourceType` instead. Ignored if `domainHomeSourceType` is specified. True indicates that the domain home file system is present in the container image specified by the image field. False indicates that the domain home file system is located on a persistent volume. Defaults to unset. | +| `domainHomeSourceType` | string | Domain home file system source type: Legal values: Image, PersistentVolume, FromModel. Image indicates that the domain home file system is present in the container image specified by the `image` field. PersistentVolume indicates that the domain home file system is located on a persistent volume. FromModel indicates that the domain home file system will be created and managed by the operator based on a WDT domain model. If this field is specified, it overrides the value of `domainHomeInImage`. If both fields are unspecified, then `domainHomeSourceType` defaults to Image. | +| `domainUID` | string | Domain unique identifier. It is recommended that this value be unique to assist in future work to identify related domains in active-passive scenarios across data centers; however, it is only required that this value be unique within the namespace, similarly to the names of Kubernetes resources. This value is distinct and need not match the domain name from the WebLogic domain configuration. Defaults to the value of `metadata.name`. | +| `httpAccessLogInLogHome` | Boolean | Specifies whether the server HTTP access log files will be written to the same directory specified in `logHome`. Otherwise, server HTTP access log files will be written to the directory configured in the WebLogic domain configuration. Defaults to true. | +| `image` | string | The WebLogic container image; required when `domainHomeSourceType` is Image or FromModel; otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4. | +| `imagePullPolicy` | string | The image pull policy for the WebLogic container image. Legal values are Always, Never, and IfNotPresent. Defaults to Always if image ends in :latest; IfNotPresent, otherwise. | +| `imagePullSecrets` | array of [Local Object Reference](k8s1.13.5.md#local-object-reference) | A list of image pull Secrets for the WebLogic container image. | +| `includeServerOutInPodLog` | Boolean | Specifies whether the server .out file will be included in the Pod's log. Defaults to true. | +| `introspectVersion` | string | Changes to this field cause the operator to repeat its introspection of the WebLogic domain configuration. Repeating introspection is required for the operator to recognize changes to the domain configuration, such as adding a new WebLogic cluster or Managed Server instance, to regenerate configuration overrides, or to regenerate the WebLogic domain home when the `domainHomeSourceType` is FromModel. Introspection occurs automatically, without requiring change to this field, when servers are first started or restarted after a full domain shut down. For the FromModel `domainHomeSourceType`, introspection also occurs when a running server must be restarted because of changes to any of the fields listed here: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#properties-that-cause-servers-to-be-restarted. See also `domains.spec.configuration.overridesConfigurationStrategy`. | +| `logHome` | string | The directory in a server's container in which to store the domain, Node Manager, server logs, server *.out, and optionally HTTP access log files if `httpAccessLogInLogHome` is true. Ignored if `logHomeEnabled` is false. | +| `logHomeEnabled` | Boolean | Specifies whether the log home folder is enabled. Defaults to true if `domainHomeSourceType` is PersistentVolume; false, otherwise. | +| `managedServers` | array of [Managed Server](#managed-server) | Lifecycle options for individual Managed Servers, including Java options, environment variables, additional Pod content, and the ability to explicitly start, stop, or restart a named server instance. The `serverName` field of each entry must match a Managed Server that already exists in the WebLogic domain configuration or that matches a dynamic cluster member based on the server template. | +| `maxClusterConcurrentStartup` | number | The maximum number of cluster member Managed Server instances that the operator will start in parallel for a given cluster, if `maxConcurrentStartup` is not specified for a specific cluster under the `clusters` field. A value of 0 means there is no configured limit. Defaults to 0. | +| `replicas` | number | The default number of cluster member Managed Server instances to start for each WebLogic cluster in the domain configuration, unless `replicas` is specified for that cluster under the `clusters` field. For each cluster, the operator will sort cluster member Managed Server names from the WebLogic domain configuration by normalizing any numbers in the Managed Server name and then sorting alphabetically. This is done so that server names such as "managed-server10" come after "managed-server9". The operator will then start Managed Servers from the sorted list, up to the `replicas` count, unless specific Managed Servers are specified as starting in their entry under the `managedServers` field. In that case, the specified Managed Servers will be started and then additional cluster members will be started, up to the `replicas` count, by finding further cluster members in the sorted list that are not already started. If cluster members are started because of their entries under `managedServers`, then a cluster may have more cluster members running than its `replicas` count. Defaults to 0. | +| `restartVersion` | string | Changes to this field cause the operator to restart WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers. | +| `serverPod` | [Server Pod](#server-pod) | Customization affecting the generation of Pods for WebLogic Server instances. | +| `serverService` | [Server Service](#server-service) | Customization affecting the generation of Kubernetes Services for WebLogic Server instances. | +| `serverStartPolicy` | string | The strategy for deciding whether to start a WebLogic Server instance. Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED. Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers. | +| `serverStartState` | string | The WebLogic runtime state in which the server is to be started. Use ADMIN if the server should start in the admin state. Defaults to RUNNING. | +| `webLogicCredentialsSecret` | [Secret Reference](k8s1.13.5.md#secret-reference) | Reference to a Kubernetes Secret that contains the user name and password needed to boot a WebLogic Server under the `username` and `password` fields. | ### Domain Status -DomainStatus represents information about the status of a domain. Status may trail the actual state of a system. +The current status of the operation of the WebLogic domain. Updated automatically by the operator. | Name | Type | Description | | --- | --- | --- | | `clusters` | array of [Cluster Status](#cluster-status) | Status of WebLogic clusters in this domain. | -| `conditions` | array of [Domain Condition](#domain-condition) | Current service state of domain. | +| `conditions` | array of [Domain Condition](#domain-condition) | Current service state of the domain. | | `message` | string | A human readable message indicating details about why the domain is in this condition. | | `reason` | string | A brief CamelCase message indicating details about why the domain is in this state. | -| `replicas` | number | The number of running Managed Servers in the WebLogic cluster if there is only one cluster in the domain and where the cluster does not explicitly configure its replicas in a cluster specification. | +| `replicas` | number | The number of running cluster member Managed Servers in the WebLogic cluster if there is exactly one cluster defined in the domain configuration and where the `replicas` field is set at the `spec` level rather than for the specific cluster under `clusters`. This field is provided to support use of Kubernetes scaling for this limited use case. | | `servers` | array of [Server Status](#server-status) | Status of WebLogic Servers in this domain. | | `startTime` | DateTime | RFC 3339 date and time at which the operator started the domain. This will be when the operator begins processing and will precede when the various servers or clusters are available. | ### Admin Server -AdminServer represents the operator configuration for the Administration Server. - | Name | Type | Description | | --- | --- | --- | -| `adminService` | [Admin Service](#admin-service) | Configures which of the Administration Server's WebLogic admin channels should be exposed outside the Kubernetes cluster via a node port service. | -| `restartVersion` | string | If present, every time this value is updated the operator will restart the required servers. | -| `serverPod` | [Server Pod](#server-pod) | Configuration affecting server pods. | -| `serverService` | [Server Service](#server-service) | Customization affecting ClusterIP Kubernetes services for WebLogic Server instances. | -| `serverStartPolicy` | string | The strategy for deciding whether to start a server. Legal values are ALWAYS, NEVER, or IF_NEEDED. | -| `serverStartState` | string | The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING. | +| `adminService` | [Admin Service](#admin-service) | Customization affecting the generation of the Kubernetes Service for the Administration Server. These settings can also specify the creation of a second NodePort Service to expose specific channels or network access points outside the Kubernetes cluster. | +| `restartVersion` | string | Changes to this field cause the operator to restart WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers. | +| `serverPod` | [Server Pod](#server-pod) | Customization affecting the generation of Pods for WebLogic Server instances. | +| `serverService` | [Server Service](#server-service) | Customization affecting the generation of Kubernetes Services for WebLogic Server instances. | +| `serverStartPolicy` | string | The strategy for deciding whether to start a WebLogic Server instance. Legal values are ALWAYS, NEVER, or IF_NEEDED. Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers. | +| `serverStartState` | string | The WebLogic runtime state in which the server is to be started. Use ADMIN if the server should start in the admin state. Defaults to RUNNING. | ### Cluster -An element representing a cluster in the domain configuration. - | Name | Type | Description | | --- | --- | --- | -| `clusterName` | string | The name of this cluster. Required | -| `clusterService` | [Kubernetes Resource](#kubernetes-resource) | Customization affecting ClusterIP Kubernetes services for the WebLogic cluster. | +| `allowReplicasBelowMinDynClusterSize` | Boolean | Specifies whether the number of running cluster members is allowed to drop below the minimum dynamic cluster size configured in the WebLogic domain configuration. Otherwise, the operator will ensure that the number of running cluster members is not less than the minimum dynamic cluster setting. This setting applies to dynamic clusters only. Defaults to true. | +| `clusterName` | string | The name of the cluster. This value must match the name of a WebLogic cluster already defined in the WebLogic domain configuration. Required. | +| `clusterService` | [Kubernetes Resource](#kubernetes-resource) | Customization affecting Kubernetes Service generated for this WebLogic cluster. | +| `maxConcurrentStartup` | number | The maximum number of Managed Servers instances that the operator will start in parallel for this cluster in response to a change in the `replicas` count. If more Managed Server instances must be started, the operator will wait until a Managed Server Pod is in the `Ready` state before starting the next Managed Server instance. A value of 0 means all Managed Server instances will start in parallel. Defaults to 0. | | `maxUnavailable` | number | The maximum number of cluster members that can be temporarily unavailable. Defaults to 1. | -| `replicas` | number | The number of cluster members to run. | -| `restartVersion` | string | If present, every time this value is updated the operator will restart the required servers. | -| `serverPod` | [Server Pod](#server-pod) | Configuration affecting server pods. | -| `serverService` | [Server Service](#server-service) | Customization affecting ClusterIP Kubernetes services for WebLogic Server instances. | -| `serverStartPolicy` | string | The strategy for deciding whether to start a server. Legal values are NEVER, or IF_NEEDED. | -| `serverStartState` | string | The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING. | +| `replicas` | number | The number of cluster member Managed Server instances to start for this WebLogic cluster. The operator will sort cluster member Managed Server names from the WebLogic domain configuration by normalizing any numbers in the Managed Server name and then sorting alphabetically. This is done so that server names such as "managed-server10" come after "managed-server9". The operator will then start Managed Server instances from the sorted list, up to the `replicas` count, unless specific Managed Servers are specified as starting in their entry under the `managedServers` field. In that case, the specified Managed Server instances will be started and then additional cluster members will be started, up to the `replicas` count, by finding further cluster members in the sorted list that are not already started. If cluster members are started because of their related entries under `managedServers`, then this cluster may have more cluster members running than its `replicas` count. Defaults to 0. | +| `restartVersion` | string | Changes to this field cause the operator to restart WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers. | +| `serverPod` | [Server Pod](#server-pod) | Customization affecting the generation of Pods for WebLogic Server instances. | +| `serverService` | [Server Service](#server-service) | Customization affecting the generation of Kubernetes Services for WebLogic Server instances. | +| `serverStartPolicy` | string | The strategy for deciding whether to start a WebLogic Server instance. Legal values are NEVER, or IF_NEEDED. Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers. | +| `serverStartState` | string | The WebLogic runtime state in which the server is to be started. Use ADMIN if the server should start in the admin state. Defaults to RUNNING. | ### Configuration | Name | Type | Description | | --- | --- | --- | +| `introspectorJobActiveDeadlineSeconds` | number | The introspector job timeout value in seconds. If this field is specified, then the operator's ConfigMap `data.introspectorJobActiveDeadlineSeconds` value is ignored. Defaults to 120 seconds. | | `istio` | [Istio](#istio) | The Istio service mesh integration settings. | +| `model` | [Model](#model) | Model in image model files and properties. | +| `opss` | [Opss](#opss) | Settings for OPSS security. | +| `overrideDistributionStrategy` | string | Determines how updated configuration overrides are distributed to already running WebLogic Server instances following introspection when the `domainHomeSourceType` is PersistentVolume or Image. Configuration overrides are generated during introspection from Secrets, the `overrideConfigMap` field, and WebLogic domain topology. Legal values are DYNAMIC, which means that the operator will distribute updated configuration overrides dynamically to running servers, and ON_RESTART, which means that servers will use updated configuration overrides only after the server's next restart. The selection of ON_RESTART will not cause servers to restart when there are updated configuration overrides available. See also `domains.spec.introspectVersion`. Defaults to DYNAMIC. | +| `overridesConfigMap` | string | The name of the ConfigMap for WebLogic configuration overrides. If this field is specified, then the value of `spec.configOverrides` is ignored. | +| `secrets` | array of string | A list of names of the Secrets for WebLogic configuration overrides or model. If this field is specified, then the value of `spec.configOverrideSecrets` is ignored. | ### Managed Server -ManagedServer represents the operator configuration for a single Managed Server. - | Name | Type | Description | | --- | --- | --- | -| `restartVersion` | string | If present, every time this value is updated the operator will restart the required servers. | -| `serverName` | string | The name of the Managed Server. Required. | -| `serverPod` | [Server Pod](#server-pod) | Configuration affecting server pods. | -| `serverService` | [Server Service](#server-service) | Customization affecting ClusterIP Kubernetes services for WebLogic Server instances. | -| `serverStartPolicy` | string | The strategy for deciding whether to start a server. Legal values are ALWAYS, NEVER, or IF_NEEDED. | -| `serverStartState` | string | The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING. | +| `restartVersion` | string | Changes to this field cause the operator to restart WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers. | +| `serverName` | string | The name of the Managed Server. This name must match the name of a Managed Server instance or of a dynamic cluster member name from a server template already defined in the WebLogic domain configuration. Required. | +| `serverPod` | [Server Pod](#server-pod) | Customization affecting the generation of Pods for WebLogic Server instances. | +| `serverService` | [Server Service](#server-service) | Customization affecting the generation of Kubernetes Services for WebLogic Server instances. | +| `serverStartPolicy` | string | The strategy for deciding whether to start a WebLogic Server instance. Legal values are ALWAYS, NEVER, or IF_NEEDED. Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers. | +| `serverStartState` | string | The WebLogic runtime state in which the server is to be started. Use ADMIN if the server should start in the admin state. Defaults to RUNNING. | ### Server Pod -ServerPod describes the configuration for a Kubernetes pod for a server. - -| Name | Type | Description | -| --- | --- | --- | -| `affinity` | [Affinity](k8s1.13.5.md#affinity) | If specified, the pod's scheduling constraints | -| `annotations` | Map | The annotations to be attached to generated resources. | -| `containers` | array of [Container](k8s1.13.5.md#container) | Additional containers to be included in the server pod. | -| `containerSecurityContext` | [Security Context](k8s1.13.5.md#security-context) | Container-level security attributes. Will override any matching pod-level attributes. | -| `env` | array of [Env Var](k8s1.13.5.md#env-var) | A list of environment variables to add to a server. | -| `initContainers` | array of [Container](k8s1.13.5.md#container) | Initialization containers to be included in the server pod. | -| `labels` | Map | The labels to be attached to generated resources. The label names must not start with 'weblogic.'. | -| `livenessProbe` | [Probe Tuning](#probe-tuning) | Settings for the liveness probe associated with a server. | -| `nodeName` | string | NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits resource requirements. | -| `nodeSelector` | Map | Selector which must match a node's labels for the pod to be scheduled on that node. | -| `podSecurityContext` | [Pod Security Context](k8s1.13.5.md#pod-security-context) | Pod-level security attributes. | -| `priorityClassName` | string | If specified, indicates the pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default. | -| `readinessGates` | array of [Pod Readiness Gate](k8s1.13.5.md#pod-readiness-gate) | If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md | -| `readinessProbe` | [Probe Tuning](#probe-tuning) | Settings for the readiness probe associated with a server. | -| `resources` | [Resource Requirements](k8s1.13.5.md#resource-requirements) | Memory and CPU minimum requirements and limits for the server. | -| `restartPolicy` | string | Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy | -| `runtimeClassName` | string | RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md This is an alpha feature and may change in the future. | -| `schedulerName` | string | If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler. | -| `serviceAccountName` | string | Name of the ServiceAccount to be used to run this pod. If it is not set, default ServiceAccount will be used. The ServiceAccount has to exist at the time the pod is created. | -| `shutdown` | [Shutdown](#shutdown) | Configures how the operator should shutdown the server instance. | -| `tolerations` | array of [Toleration](k8s1.13.5.md#toleration) | If specified, the pod's tolerations. | -| `volumeMounts` | array of [Volume Mount](k8s1.13.5.md#volume-mount) | Additional volume mounts for the server pod. | -| `volumes` | array of [Volume](k8s1.13.5.md#volume) | Additional volumes to be created in the server pod. | +| Name | Type | Description | +| --- | --- | --- | +| `affinity` | [Affinity](k8s1.13.5.md#affinity) | If specified, the Pod's scheduling constraints. See `kubectl explain pods.spec.affinity` | +| `annotations` | Map | The annotations to be added to generated resources. | +| `containers` | array of [Container](k8s1.13.5.md#container) | Additional containers to be included in the server Pod. See `kubectl explain pods.spec.containers`. | +| `containerSecurityContext` | [Security Context](k8s1.13.5.md#security-context) | Container-level security attributes. Will override any matching Pod-level attributes. See `kubectl explain pods.spec.containers.securityContext`. | +| `env` | array of [Env Var](k8s1.13.5.md#env-var) | A list of environment variables to set in the container running a WebLogic Server instance. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-resource/#jvm-memory-and-java-option-environment-variables. See `kubectl explain pods.spec.containers.env`. | +| `initContainers` | array of [Container](k8s1.13.5.md#container) | Initialization containers to be included in the server Pod. See `kubectl explain pods.spec.initContainers`. | +| `labels` | Map | The labels to be added to generated resources. The label names must not start with "weblogic.". | +| `livenessProbe` | [Probe Tuning](#probe-tuning) | Settings for the liveness probe associated with a WebLogic Server instance. | +| `nodeName` | string | NodeName is a request to schedule this Pod onto a specific Node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits the resource requirements. See `kubectl explain pods.spec.nodeName`. | +| `nodeSelector` | Map | Selector which must match a Node's labels for the Pod to be scheduled on that Node. See `kubectl explain pods.spec.nodeSelector`. | +| `podSecurityContext` | [Pod Security Context](k8s1.13.5.md#pod-security-context) | Pod-level security attributes. See `kubectl explain pods.spec.securityContext`. | +| `priorityClassName` | string | If specified, indicates the Pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be the default or zero, if there is no default. See `kubectl explain pods.spec.priorityClassName`. | +| `readinessGates` | array of [Pod Readiness Gate](k8s1.13.5.md#pod-readiness-gate) | If specified, all readiness gates will be evaluated for Pod readiness. A Pod is ready when all its containers are ready AND all conditions specified in the readiness gates have a status equal to "True". More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md. | +| `readinessProbe` | [Probe Tuning](#probe-tuning) | Settings for the readiness probe associated with a WebLogic Server instance. | +| `resources` | [Resource Requirements](k8s1.13.5.md#resource-requirements) | Memory and CPU minimum requirements and limits for the WebLogic Server instance. See `kubectl explain pods.spec.containers.resources`. | +| `restartPolicy` | string | Restart policy for all containers within the Pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy. See `kubectl explain pods.spec.restartPolicy`. | +| `runtimeClassName` | string | RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this Pod. If no RuntimeClass resource matches the named class, the Pod will not be run. If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md This is an alpha feature and may change in the future. See `kubectl explain pods.spec.runtimeClassName`. | +| `schedulerName` | string | If specified, the Pod will be dispatched by the specified scheduler. If not specified, the Pod will be dispatched by the default scheduler. See `kubectl explain pods.spec.schedulerName`. | +| `serviceAccountName` | string | Name of the ServiceAccount to be used to run this Pod. If it is not set, default ServiceAccount will be used. The ServiceAccount has to exist at the time the Pod is created. See `kubectl explain pods.spec.serviceAccountName`. | +| `shutdown` | [Shutdown](#shutdown) | Configures how the operator should shut down the server instance. | +| `tolerations` | array of [Toleration](k8s1.13.5.md#toleration) | If specified, the Pod's tolerations. See `kubectl explain pods.spec.tolerations`. | +| `volumeMounts` | array of [Volume Mount](k8s1.13.5.md#volume-mount) | Additional volume mounts for the container running a WebLogic Server instance. See `kubectl explain pods.spec.containers.volumeMounts`. | +| `volumes` | array of [Volume](k8s1.13.5.md#volume) | Additional volumes to be created in the server Pod. See `kubectl explain pods.spec.volumes`. | ### Server Service | Name | Type | Description | | --- | --- | --- | -| `annotations` | Map | The annotations to be attached to generated resources. | -| `labels` | Map | The labels to be attached to generated resources. The label names must not start with 'weblogic.'. | -| `precreateService` | Boolean | If true, operator will create server services even for server instances without running pods. | +| `annotations` | Map | The annotations to be added to generated resources. | +| `labels` | Map | The labels to be added to generated resources. The label names must not start with "weblogic.". | +| `precreateService` | Boolean | If true, the operator will create Services even for Managed Server instances without running Pods. | ### Cluster Status | Name | Type | Description | | --- | --- | --- | -| `clusterName` | string | WebLogic cluster name. Required. | -| `maximumReplicas` | number | The maximum number of cluster members. Required. | +| `clusterName` | string | WebLogic cluster name. | +| `maximumReplicas` | number | The maximum number of cluster members. | | `minimumReplicas` | number | The minimum number of cluster members. | -| `readyReplicas` | number | The number of ready cluster members. Required. | -| `replicas` | number | The number of intended cluster members. Required. | -| `replicasGoal` | number | The requested number of cluster members from the domain spec. Cluster members will be started by the operator if this value is larger than zero. | +| `readyReplicas` | number | The number of ready cluster members. | +| `replicas` | number | The number of currently running cluster members. | +| `replicasGoal` | number | The requested number of cluster members. Cluster members will be started by the operator if this value is larger than zero. | ### Domain Condition @@ -159,41 +162,56 @@ ServerPod describes the configuration for a Kubernetes pod for a server. | `lastTransitionTime` | DateTime | Last time the condition transitioned from one status to another. | | `message` | string | Human-readable message indicating details about last transition. | | `reason` | string | Unique, one-word, CamelCase reason for the condition's last transition. | -| `status` | string | Status is the status of the condition. Can be True, False, Unknown. Required. | -| `type` | string | The type of the condition. Valid types are Progressing, Available, and Failed. Required. | +| `status` | string | The status of the condition. Can be True, False, Unknown. | +| `type` | string | The type of the condition. Valid types are Progressing, Available, and Failed. | ### Server Status | Name | Type | Description | | --- | --- | --- | -| `clusterName` | string | WebLogic cluster name, if the server is part of a cluster. | -| `desiredState` | string | Desired state of this WebLogic Server. Values are RUNNING, ADMIN, or SHUTDOWN. | -| `health` | [Server Health](#server-health) | Current status and health of a specific WebLogic Server. | -| `nodeName` | string | Name of node that is hosting the Pod containing this WebLogic Server. | -| `serverName` | string | WebLogic Server name. Required. | -| `state` | string | Current state of this WebLogic Server. Required. | +| `clusterName` | string | WebLogic cluster name, if the server is a member of a cluster. | +| `desiredState` | string | Desired state of this WebLogic Server instance. Values are RUNNING, ADMIN, or SHUTDOWN. | +| `health` | [Server Health](#server-health) | Current status and health of a specific WebLogic Server instance. | +| `nodeName` | string | Name of Node that is hosting the Pod containing this WebLogic Server instance. | +| `serverName` | string | WebLogic Server instance name. | +| `state` | string | Current state of this WebLogic Server instance. | ### Admin Service | Name | Type | Description | | --- | --- | --- | -| `annotations` | Map | Annotations to associate with the external channel service. | -| `channels` | array of [Channel](#channel) | Specifies which of the Administration Server's WebLogic channels should be exposed outside the Kubernetes cluster via a node port service, along with the node port for each channel. If not specified, the Administration Server's node port service will not be created. | -| `labels` | Map | Labels to associate with the external channel service. | +| `annotations` | Map | Annotations to associate with the Administration Server's Service(s). | +| `channels` | array of [Channel](#channel) | Specifies which of the Administration Server's WebLogic channels should be exposed outside the Kubernetes cluster via a NodePort Service, along with the port for each channel. If not specified, the Administration Server's NodePort Service will not be created. | +| `labels` | Map | Labels to associate with the Administration Server's Service(s). | ### Kubernetes Resource | Name | Type | Description | | --- | --- | --- | -| `annotations` | Map | The annotations to be attached to generated resources. | -| `labels` | Map | The labels to be attached to generated resources. The label names must not start with 'weblogic.'. | +| `annotations` | Map | The annotations to be added to generated resources. | +| `labels` | Map | The labels to be added to generated resources. The label names must not start with "weblogic.". | ### Istio | Name | Type | Description | | --- | --- | --- | -| `enabled` | Boolean | True, if this domain is deployed under an Istio service mesh. Defaults to true when the 'istio' element is included. Not required. | -| `readinessPort` | number | The WebLogic readiness port for Istio. Defaults to 8888. Not required. | +| `enabled` | Boolean | True, if this domain is deployed under an Istio service mesh. Defaults to true when the `istio` field is specified. | +| `readinessPort` | number | The operator will create a WebLogic network access point with this port that will then be exposed from the container running the WebLogic Server instance. The readiness probe will use this network access point to verify that the server instance is ready for application traffic. Defaults to 8888. | + +### Model + +| Name | Type | Description | +| --- | --- | --- | +| `configMap` | string | Name of a ConfigMap containing the WebLogic Deploy Tooling model. | +| `domainType` | string | WebLogic Deploy Tooling domain type. Legal values: WLS, RestrictedJRF, JRF. Defaults to WLS. | +| `runtimeEncryptionSecret` | string | Runtime encryption secret. Required when `domainHomeSourceType` is set to FromModel. | + +### Opss + +| Name | Type | Description | +| --- | --- | --- | +| `walletFileSecret` | string | Name of a Secret containing the OPSS key wallet file, which must be in a field named `walletFile`. Use this to allow a JRF domain to reuse its entries in the RCU database. This allows you to specify a wallet file that was obtained from the domain home after the domain was booted for the first time. | +| `walletPasswordSecret` | string | Name of a Secret containing the OPSS key passphrase, which must be in a field named `walletPassword`. Used to encrypt and decrypt the wallet that is used for accessing the domain's entries in its RCU database. | ### Probe Tuning @@ -205,35 +223,31 @@ ServerPod describes the configuration for a Kubernetes pod for a server. ### Shutdown -Shutdown describes the configuration for shutting down a server instance. - | Name | Type | Description | | --- | --- | --- | -| `ignoreSessions` | Boolean | For graceful shutdown only, indicates to ignore pending HTTP sessions during in-flight work handling. Not required. Defaults to false. | -| `shutdownType` | string | Tells the operator how to shutdown server instances. Not required. Defaults to graceful shutdown. | -| `timeoutSeconds` | number | For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting down the server. Not required. Defaults to 30 seconds. | +| `ignoreSessions` | Boolean | For graceful shutdown only, indicates to ignore pending HTTP sessions during in-flight work handling. Defaults to false. | +| `shutdownType` | string | Specifies how the operator will shut down server instances. Defaults to graceful shutdown. | +| `timeoutSeconds` | number | For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting down the server. Defaults to 30 seconds. | ### Server Health | Name | Type | Description | | --- | --- | --- | | `activationTime` | DateTime | RFC 3339 date and time at which the server started. | -| `overallHealth` | string | Server health of this WebLogic Server. If the value is "Not available", the operator has failed to read the health. If the value is "Not available (possibly overloaded)", the operator has failed to read the health of the server possibly due to the server is in overloaded state. | +| `overallHealth` | string | Server health of this WebLogic Server instance. If the value is "Not available", the operator has failed to read the health. If the value is "Not available (possibly overloaded)", the operator has failed to read the health of the server possibly due to the server is in the overloaded state. | | `subsystems` | array of [Subsystem Health](#subsystem-health) | Status of unhealthy subsystems, if any. | ### Channel -Describes a single channel used by the Administration Server. - | Name | Type | Description | | --- | --- | --- | -| `channelName` | string | Name of channel.
    'default' refers to the Administration Server's default channel (configured via the ServerMBean's ListenPort)
    'default-secure' refers to the Administration Server's default secure channel (configured via the ServerMBean's SSLMBean's ListenPort)
    'default-admin' refers to the Administration Server's default administrative channel (configured via the DomainMBean's AdministrationPort)
    Otherwise, the name is the name of one of the Administration Server's network access points (configured via the ServerMBean's NetworkAccessMBeans). | +| `channelName` | string | Name of the channel. The "default" value refers to the Administration Server's default channel, which is configured using the ServerMBean's ListenPort. The "default-secure" value refers to the Administration Server's default secure channel, which is configured using the ServerMBean's SSLMBean's ListenPort. The "default-admin" value refers to the Administration Server's default administrative channel, which is configured using the DomainMBean's AdministrationPort. Otherwise, provide the name of one of the Administration Server's network access points, which is configured using the ServerMBean's NetworkAccessMBeans. The "default", "default-secure", and "default-admin" channels may not be specified here when using Istio. | | `nodePort` | number | Specifies the port number used to access the WebLogic channel outside of the Kubernetes cluster. If not specified, defaults to the port defined by the WebLogic channel. | ### Subsystem Health | Name | Type | Description | | --- | --- | --- | -| `health` | string | Server health of this WebLogic Server. Required. | -| `subsystemName` | string | Name of subsystem providing symptom information. Required. | +| `health` | string | Server health of this WebLogic Server instance. | +| `subsystemName` | string | Name of subsystem providing symptom information. | | `symptoms` | array of string | Symptoms provided by the reporting subsystem. | \ No newline at end of file diff --git a/docs/domains/index.html b/docs/domains/index.html index a3ba2407dd7..2c53bb5d48c 100644 --- a/docs/domains/index.html +++ b/docs/domains/index.html @@ -841,23 +841,23 @@ ], "properties": { "metadata": { - "description": "The domain meta-data. Must include the name and namespace.", + "description": "The resource metadata. Must include the `name` and `namespace`. Required.", "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" }, "apiVersion": { - "description": "The API version for the Domain.", + "description": "The API version defines the versioned schema of this Domain. Required.", "type": "string" }, "kind": { - "description": "The type of resource. Must be \u0027Domain\u0027.", + "description": "The type of the REST resource. Must be \"Domain\". Required.", "type": "string" }, "spec": { - "description": "The specification of the domain. Required.", + "description": "The specification of the operation of the WebLogic domain. Required.", "$ref": "#/definitions/DomainSpec" }, "status": { - "description": "The current status of the domain. Updated by the operator.", + "description": "The current status of the operation of the WebLogic domain. Updated automatically by the operator.", "$ref": "#/definitions/DomainStatus" } } @@ -924,11 +924,10 @@ "properties": {} }, "AdminServer": { - "description": "AdminServer represents the operator configuration for the Administration Server.", "type": "object", "properties": { "serverStartState": { - "description": "The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING.", + "description": "The WebLogic runtime state in which the server is to be started. Use ADMIN if the server should start in the admin state. Defaults to RUNNING.", "type": "string", "enum": [ "RUNNING", @@ -936,15 +935,15 @@ ] }, "serverService": { - "description": "Customization affecting ClusterIP Kubernetes services for WebLogic Server instances.", + "description": "Customization affecting the generation of Kubernetes Services for WebLogic Server instances.", "$ref": "#/definitions/ServerService" }, "serverPod": { - "description": "Configuration affecting server pods.", + "description": "Customization affecting the generation of Pods for WebLogic Server instances.", "$ref": "#/definitions/ServerPod" }, "serverStartPolicy": { - "description": "The strategy for deciding whether to start a server. Legal values are ALWAYS, NEVER, or IF_NEEDED.", + "description": "The strategy for deciding whether to start a WebLogic Server instance. Legal values are ALWAYS, NEVER, or IF_NEEDED. Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.", "type": "string", "enum": [ "ALWAYS", @@ -953,11 +952,11 @@ ] }, "adminService": { - "description": "Configures which of the Administration Server\u0027s WebLogic admin channels should be exposed outside the Kubernetes cluster via a node port service.", + "description": "Customization affecting the generation of the Kubernetes Service for the Administration Server. These settings can also specify the creation of a second NodePort Service to expose specific channels or network access points outside the Kubernetes cluster.", "$ref": "#/definitions/AdminService" }, "restartVersion": { - "description": "If present, every time this value is updated the operator will restart the required servers.", + "description": "Changes to this field cause the operator to restart WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.", "type": "string" } } @@ -966,28 +965,27 @@ "type": "object", "properties": { "channels": { - "description": "Specifies which of the Administration Server\u0027s WebLogic channels should be exposed outside the Kubernetes cluster via a node port service, along with the node port for each channel. If not specified, the Administration Server\u0027s node port service will not be created.", + "description": "Specifies which of the Administration Server\u0027s WebLogic channels should be exposed outside the Kubernetes cluster via a NodePort Service, along with the port for each channel. If not specified, the Administration Server\u0027s NodePort Service will not be created.", "type": "array", "items": { "$ref": "#/definitions/Channel" } }, "annotations": { - "description": "Annotations to associate with the external channel service.", + "description": "Annotations to associate with the Administration Server\u0027s Service(s).", "$ref": "#/definitions/Map" }, "labels": { - "description": "Labels to associate with the external channel service.", + "description": "Labels to associate with the Administration Server\u0027s Service(s).", "$ref": "#/definitions/Map" } } }, "Channel": { - "description": "Describes a single channel used by the Administration Server.", "type": "object", "properties": { "channelName": { - "description": "Name of channel.\n\u0027default\u0027 refers to the Administration Server\u0027s default channel (configured via the ServerMBean\u0027s ListenPort) \n\u0027default-secure\u0027 refers to the Administration Server\u0027s default secure channel (configured via the ServerMBean\u0027s SSLMBean\u0027s ListenPort) \n\u0027default-admin\u0027 refers to the Administration Server\u0027s default administrative channel (configured via the DomainMBean\u0027s AdministrationPort) \nOtherwise, the name is the name of one of the Administration Server\u0027s network access points (configured via the ServerMBean\u0027s NetworkAccessMBeans).", + "description": "Name of the channel. The \"default\" value refers to the Administration Server\u0027s default channel, which is configured using the ServerMBean\u0027s ListenPort. The \"default-secure\" value refers to the Administration Server\u0027s default secure channel, which is configured using the ServerMBean\u0027s SSLMBean\u0027s ListenPort. The \"default-admin\" value refers to the Administration Server\u0027s default administrative channel, which is configured using the DomainMBean\u0027s AdministrationPort. Otherwise, provide the name of one of the Administration Server\u0027s network access points, which is configured using the ServerMBean\u0027s NetworkAccessMBeans. The \"default\", \"default-secure\", and \"default-admin\" channels may not be specified here when using Istio.", "type": "string" }, "nodePort": { @@ -1000,11 +998,10 @@ ] }, "Cluster": { - "description": "An element representing a cluster in the domain configuration.", "type": "object", "properties": { "serverStartState": { - "description": "The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING.", + "description": "The WebLogic runtime state in which the server is to be started. Use ADMIN if the server should start in the admin state. Defaults to RUNNING.", "type": "string", "enum": [ "RUNNING", @@ -1012,7 +1009,7 @@ ] }, "serverService": { - "description": "Customization affecting ClusterIP Kubernetes services for WebLogic Server instances.", + "description": "Customization affecting the generation of Kubernetes Services for WebLogic Server instances.", "$ref": "#/definitions/ServerService" }, "maxUnavailable": { @@ -1021,32 +1018,41 @@ "minimum": 1.0 }, "replicas": { - "description": "The number of cluster members to run.", + "description": "The number of cluster member Managed Server instances to start for this WebLogic cluster. The operator will sort cluster member Managed Server names from the WebLogic domain configuration by normalizing any numbers in the Managed Server name and then sorting alphabetically. This is done so that server names such as \"managed-server10\" come after \"managed-server9\". The operator will then start Managed Server instances from the sorted list, up to the `replicas` count, unless specific Managed Servers are specified as starting in their entry under the `managedServers` field. In that case, the specified Managed Server instances will be started and then additional cluster members will be started, up to the `replicas` count, by finding further cluster members in the sorted list that are not already started. If cluster members are started because of their related entries under `managedServers`, then this cluster may have more cluster members running than its `replicas` count. Defaults to 0.", "type": "number", "minimum": 0.0 }, "clusterName": { - "description": "The name of this cluster. Required", + "description": "The name of the cluster. This value must match the name of a WebLogic cluster already defined in the WebLogic domain configuration. Required.", "type": "string" }, + "allowReplicasBelowMinDynClusterSize": { + "description": "Specifies whether the number of running cluster members is allowed to drop below the minimum dynamic cluster size configured in the WebLogic domain configuration. Otherwise, the operator will ensure that the number of running cluster members is not less than the minimum dynamic cluster setting. This setting applies to dynamic clusters only. Defaults to true.", + "type": "boolean" + }, "serverPod": { - "description": "Configuration affecting server pods.", + "description": "Customization affecting the generation of Pods for WebLogic Server instances.", "$ref": "#/definitions/ServerPod" }, "clusterService": { - "description": "Customization affecting ClusterIP Kubernetes services for the WebLogic cluster.", + "description": "Customization affecting Kubernetes Service generated for this WebLogic cluster.", "$ref": "#/definitions/KubernetesResource" }, "serverStartPolicy": { - "description": "The strategy for deciding whether to start a server. Legal values are NEVER, or IF_NEEDED.", + "description": "The strategy for deciding whether to start a WebLogic Server instance. Legal values are NEVER, or IF_NEEDED. Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.", "type": "string", "enum": [ "NEVER", "IF_NEEDED" ] }, + "maxConcurrentStartup": { + "description": "The maximum number of Managed Servers instances that the operator will start in parallel for this cluster in response to a change in the `replicas` count. If more Managed Server instances must be started, the operator will wait until a Managed Server Pod is in the `Ready` state before starting the next Managed Server instance. A value of 0 means all Managed Server instances will start in parallel. Defaults to 0.", + "type": "number", + "minimum": 0.0 + }, "restartVersion": { - "description": "If present, every time this value is updated the operator will restart the required servers.", + "description": "Changes to this field cause the operator to restart WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.", "type": "string" } }, @@ -1063,26 +1069,26 @@ "minimum": 0.0 }, "maximumReplicas": { - "description": "The maximum number of cluster members. Required.", + "description": "The maximum number of cluster members.", "type": "number", "minimum": 0.0 }, "replicas": { - "description": "The number of intended cluster members. Required.", + "description": "The number of currently running cluster members.", "type": "number", "minimum": 0.0 }, "clusterName": { - "description": "WebLogic cluster name. Required.", + "description": "WebLogic cluster name.", "type": "string" }, "readyReplicas": { - "description": "The number of ready cluster members. Required.", + "description": "The number of ready cluster members.", "type": "number", "minimum": 0.0 }, "replicasGoal": { - "description": "The requested number of cluster members from the domain spec. Cluster members will be started by the operator if this value is larger than zero.", + "description": "The requested number of cluster members. Cluster members will be started by the operator if this value is larger than zero.", "type": "number", "minimum": 0.0 } @@ -1091,9 +1097,40 @@ "Configuration": { "type": "object", "properties": { + "overrideDistributionStrategy": { + "description": "Determines how updated configuration overrides are distributed to already running WebLogic Server instances following introspection when the `domainHomeSourceType` is PersistentVolume or Image. Configuration overrides are generated during introspection from Secrets, the `overrideConfigMap` field, and WebLogic domain topology. Legal values are DYNAMIC, which means that the operator will distribute updated configuration overrides dynamically to running servers, and ON_RESTART, which means that servers will use updated configuration overrides only after the server\u0027s next restart. The selection of ON_RESTART will not cause servers to restart when there are updated configuration overrides available. See also `domains.spec.introspectVersion`. Defaults to DYNAMIC.", + "type": "string", + "enum": [ + "DYNAMIC", + "ON_RESTART" + ] + }, + "opss": { + "description": "Settings for OPSS security.", + "$ref": "#/definitions/Opss" + }, + "model": { + "description": "Model in image model files and properties.", + "$ref": "#/definitions/Model" + }, + "secrets": { + "description": "A list of names of the Secrets for WebLogic configuration overrides or model. If this field is specified, then the value of `spec.configOverrideSecrets` is ignored.", + "type": "array", + "items": { + "type": "string" + } + }, "istio": { "description": "The Istio service mesh integration settings.", "$ref": "#/definitions/Istio" + }, + "overridesConfigMap": { + "description": "The name of the ConfigMap for WebLogic configuration overrides. If this field is specified, then the value of `spec.configOverrides` is ignored.", + "type": "string" + }, + "introspectorJobActiveDeadlineSeconds": { + "description": "The introspector job timeout value in seconds. If this field is specified, then the operator\u0027s ConfigMap `data.introspectorJobActiveDeadlineSeconds` value is ignored. Defaults to 120 seconds.", + "type": "number" } } }, @@ -1109,7 +1146,7 @@ "type": "string" }, "type": { - "description": "The type of the condition. Valid types are Progressing, Available, and Failed. Required.", + "description": "The type of the condition. Valid types are Progressing, Available, and Failed.", "type": "string", "enum": [ "Progressing", @@ -1130,17 +1167,85 @@ "$ref": "#/definitions/DateTime" }, "status": { - "description": "Status is the status of the condition. Can be True, False, Unknown. Required.", + "description": "The status of the condition. Can be True, False, Unknown.", "type": "string" } } }, "DomainSpec": { - "description": "DomainSpec is a description of a domain.", + "description": "The specification of the operation of the WebLogic domain. Required.", "type": "object", "properties": { + "configuration": { + "description": "Models and overrides affecting the WebLogic domain configuration.", + "$ref": "#/definitions/Configuration" + }, + "configOverrideSecrets": { + "deprecated": "true", + "description": "Deprecated. Use `configuration.secrets` instead. Ignored if `configuration.secrets` is specified. A list of names of the Secrets for optional WebLogic configuration overrides.", + "type": "array", + "items": { + "type": "string" + } + }, + "imagePullSecrets": { + "description": "A list of image pull Secrets for the WebLogic container image.", + "type": "array", + "items": { + "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.LocalObjectReference" + } + }, + "domainUID": { + "pattern": "^[a-z0-9-.]{1,253}$", + "description": "Domain unique identifier. It is recommended that this value be unique to assist in future work to identify related domains in active-passive scenarios across data centers; however, it is only required that this value be unique within the namespace, similarly to the names of Kubernetes resources. This value is distinct and need not match the domain name from the WebLogic domain configuration. Defaults to the value of `metadata.name`.", + "type": "string" + }, + "serverService": { + "description": "Customization affecting the generation of Kubernetes Services for WebLogic Server instances.", + "$ref": "#/definitions/ServerService" + }, + "domainHome": { + "description": "The directory containing the WebLogic domain configuration inside the container. Defaults to /shared/domains/domains/\u003cdomainUID\u003e if `domainHomeSourceType` is PersistentVolume. Defaults to /u01/oracle/user_projects/domains/ if `domainHomeSourceType` is Image. Defaults to /u01/domains/\u003cdomainUID\u003e if `domainHomeSourceType` is FromModel.", + "type": "string" + }, + "domainHomeSourceType": { + "description": "Domain home file system source type: Legal values: Image, PersistentVolume, FromModel. Image indicates that the domain home file system is present in the container image specified by the `image` field. PersistentVolume indicates that the domain home file system is located on a persistent volume. FromModel indicates that the domain home file system will be created and managed by the operator based on a WDT domain model. If this field is specified, it overrides the value of `domainHomeInImage`. If both fields are unspecified, then `domainHomeSourceType` defaults to Image.", + "type": "string", + "enum": [ + "Image", + "PersistentVolume", + "FromModel" + ] + }, + "httpAccessLogInLogHome": { + "description": "Specifies whether the server HTTP access log files will be written to the same directory specified in `logHome`. Otherwise, server HTTP access log files will be written to the directory configured in the WebLogic domain configuration. Defaults to true.", + "type": "boolean" + }, + "webLogicCredentialsSecret": { + "description": "Reference to a Kubernetes Secret that contains the user name and password needed to boot a WebLogic Server under the `username` and `password` fields.", + "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.SecretReference" + }, + "adminServer": { + "description": "Lifecycle options for the Administration Server, including Java options, environment variables, additional Pod content, and which channels or network access points should be exposed using a NodePort Service.", + "$ref": "#/definitions/AdminServer" + }, + "logHome": { + "description": "The directory in a server\u0027s container in which to store the domain, Node Manager, server logs, server *.out, and optionally HTTP access log files if `httpAccessLogInLogHome` is true. Ignored if `logHomeEnabled` is false.", + "type": "string" + }, + "includeServerOutInPodLog": { + "description": "Specifies whether the server .out file will be included in the Pod\u0027s log. Defaults to true.", + "type": "boolean" + }, + "clusters": { + "description": "Lifecycle options for all of the Managed Server members of a WebLogic cluster, including Java options, environment variables, additional Pod content, and the ability to explicitly start, stop, or restart cluster members. The `clusterName` field of each entry must match a cluster that already exists in the WebLogic domain configuration.", + "type": "array", + "items": { + "$ref": "#/definitions/Cluster" + } + }, "serverStartState": { - "description": "The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING.", + "description": "The WebLogic runtime state in which the server is to be started. Use ADMIN if the server should start in the admin state. Defaults to RUNNING.", "type": "string", "enum": [ "RUNNING", @@ -1148,11 +1253,11 @@ ] }, "image": { - "description": "The WebLogic Docker image; required when domainHomeInImage is true; otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4.", + "description": "The WebLogic container image; required when `domainHomeSourceType` is Image or FromModel; otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4.", "type": "string" }, "imagePullPolicy": { - "description": "The image pull policy for the WebLogic Docker image. Legal values are Always, Never and IfNotPresent. Defaults to Always if image ends in :latest, IfNotPresent otherwise.", + "description": "The image pull policy for the WebLogic container image. Legal values are Always, Never, and IfNotPresent. Defaults to Always if image ends in :latest; IfNotPresent, otherwise.", "type": "string", "enum": [ "Always", @@ -1160,40 +1265,23 @@ "IfNotPresent" ] }, - "configuration": { - "description": "Properties affecting the WebLogic domain configuration.", - "$ref": "#/definitions/Configuration" + "maxClusterConcurrentStartup": { + "description": "The maximum number of cluster member Managed Server instances that the operator will start in parallel for a given cluster, if `maxConcurrentStartup` is not specified for a specific cluster under the `clusters` field. A value of 0 means there is no configured limit. Defaults to 0.", + "type": "number", + "minimum": 0.0 }, "replicas": { - "description": "The number of managed servers to run in any cluster that does not specify a replica count.", + "description": "The default number of cluster member Managed Server instances to start for each WebLogic cluster in the domain configuration, unless `replicas` is specified for that cluster under the `clusters` field. For each cluster, the operator will sort cluster member Managed Server names from the WebLogic domain configuration by normalizing any numbers in the Managed Server name and then sorting alphabetically. This is done so that server names such as \"managed-server10\" come after \"managed-server9\". The operator will then start Managed Servers from the sorted list, up to the `replicas` count, unless specific Managed Servers are specified as starting in their entry under the `managedServers` field. In that case, the specified Managed Servers will be started and then additional cluster members will be started, up to the `replicas` count, by finding further cluster members in the sorted list that are not already started. If cluster members are started because of their entries under `managedServers`, then a cluster may have more cluster members running than its `replicas` count. Defaults to 0.", "type": "number", "minimum": 0.0 }, - "configOverrideSecrets": { - "description": "A list of names of the secrets for optional WebLogic configuration overrides.", - "type": "array", - "items": { - "type": "string" - } - }, - "imagePullSecrets": { - "description": "A list of image pull secrets for the WebLogic Docker image.", - "type": "array", - "items": { - "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.LocalObjectReference" - } - }, "domainHomeInImage": { - "description": "True indicates that the domain home file system is contained in the Docker image specified by the image field. False indicates that the domain home file system is located on a persistent volume.", + "deprecated": "true", + "description": "Deprecated. Use `domainHomeSourceType` instead. Ignored if `domainHomeSourceType` is specified. True indicates that the domain home file system is present in the container image specified by the image field. False indicates that the domain home file system is located on a persistent volume. Defaults to unset.", "type": "boolean" }, - "domainUID": { - "pattern": "^[a-z0-9-.]{1,253}$", - "description": "Domain unique identifier. Must be unique across the Kubernetes cluster. Not required. Defaults to the value of metadata.name.", - "type": "string" - }, "serverStartPolicy": { - "description": "The strategy for deciding whether to start a server. Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED.", + "description": "The strategy for deciding whether to start a WebLogic Server instance. Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED. Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.", "type": "string", "enum": [ "NEVER", @@ -1202,67 +1290,45 @@ ] }, "restartVersion": { - "description": "If present, every time this value is updated the operator will restart the required servers.", + "description": "Changes to this field cause the operator to restart WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.", "type": "string" }, - "dataHome": { - "description": "An optional, in-pod location for data storage of default and custom file stores. If dataHome is not specified or its value is either not set or empty (e.g. dataHome: \"\") then the data storage directories are determined from the WebLogic domain home configuration.", + "introspectVersion": { + "description": "Changes to this field cause the operator to repeat its introspection of the WebLogic domain configuration. Repeating introspection is required for the operator to recognize changes to the domain configuration, such as adding a new WebLogic cluster or Managed Server instance, to regenerate configuration overrides, or to regenerate the WebLogic domain home when the `domainHomeSourceType` is FromModel. Introspection occurs automatically, without requiring change to this field, when servers are first started or restarted after a full domain shut down. For the FromModel `domainHomeSourceType`, introspection also occurs when a running server must be restarted because of changes to any of the fields listed here: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#properties-that-cause-servers-to-be-restarted. See also `domains.spec.configuration.overridesConfigurationStrategy`.", "type": "string" }, - "configOverrides": { - "description": "The name of the config map for optional WebLogic configuration overrides.", + "dataHome": { + "description": "An optional directory in a server\u0027s container for data storage of default and custom file stores. If `dataHome` is not specified or its value is either not set or empty, then the data storage directories are determined from the WebLogic domain configuration.", "type": "string" }, - "serverService": { - "description": "Customization affecting ClusterIP Kubernetes services for WebLogic Server instances.", - "$ref": "#/definitions/ServerService" - }, - "domainHome": { - "description": "The folder for the WebLogic Domain. Not required. Defaults to /shared/domains/domains/domainUID if domainHomeInImage is false. Defaults to /u01/oracle/user_projects/domains/ if domainHomeInImage is true.", + "configOverrides": { + "deprecated": "true", + "description": "Deprecated. Use `configuration.overridesConfigMap` instead. Ignored if `configuration.overridesConfigMap` is specified. The name of the ConfigMap for optional WebLogic configuration overrides.", "type": "string" }, "logHomeEnabled": { - "description": "Specified whether the log home folder is enabled. Not required. Defaults to true if domainHomeInImage is false. Defaults to false if domainHomeInImage is true. ", + "description": "Specifies whether the log home folder is enabled. Defaults to true if `domainHomeSourceType` is PersistentVolume; false, otherwise.", "type": "boolean" }, - "webLogicCredentialsSecret": { - "description": "The name of a pre-created Kubernetes secret, in the domain\u0027s namespace, that holds the username and password needed to boot WebLogic Server under the \u0027username\u0027 and \u0027password\u0027 fields.", - "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.SecretReference" - }, - "adminServer": { - "description": "Configuration for the Administration Server.", - "$ref": "#/definitions/AdminServer" + "allowReplicasBelowMinDynClusterSize": { + "description": "Whether to allow the number of running cluster member Managed Server instances to drop below the minimum dynamic cluster size configured in the WebLogic domain configuration, if this is not specified for a specific cluster under the `clusters` field. Defaults to true.", + "type": "boolean" }, "serverPod": { - "description": "Configuration affecting server pods.", + "description": "Customization affecting the generation of Pods for WebLogic Server instances.", "$ref": "#/definitions/ServerPod" }, - "logHome": { - "description": "The in-pod name of the directory in which to store the domain, Node Manager, server logs, and server *.out files.", - "type": "string" - }, - "includeServerOutInPodLog": { - "description": "If true (the default), then the server .out file will be included in the pod\u0027s stdout.", - "type": "boolean" - }, "managedServers": { - "description": "Configuration for individual Managed Servers.", + "description": "Lifecycle options for individual Managed Servers, including Java options, environment variables, additional Pod content, and the ability to explicitly start, stop, or restart a named server instance. The `serverName` field of each entry must match a Managed Server that already exists in the WebLogic domain configuration or that matches a dynamic cluster member based on the server template.", "type": "array", "items": { "$ref": "#/definitions/ManagedServer" } - }, - "clusters": { - "description": "Configuration for the clusters.", - "type": "array", - "items": { - "$ref": "#/definitions/Cluster" - } } } }, "DomainStatus": { - "description": "DomainStatus represents information about the status of a domain. Status may trail the actual state of a system.", + "description": "The current status of the operation of the WebLogic domain. Updated automatically by the operator.", "type": "object", "properties": { "reason": { @@ -1277,7 +1343,7 @@ } }, "replicas": { - "description": "The number of running Managed Servers in the WebLogic cluster if there is only one cluster in the domain and where the cluster does not explicitly configure its replicas in a cluster specification.", + "description": "The number of running cluster member Managed Servers in the WebLogic cluster if there is exactly one cluster defined in the domain configuration and where the `replicas` field is set at the `spec` level rather than for the specific cluster under `clusters`. This field is provided to support use of Kubernetes scaling for this limited use case.", "type": "number", "minimum": 0.0 }, @@ -1286,7 +1352,7 @@ "$ref": "#/definitions/DateTime" }, "conditions": { - "description": "Current service state of domain.", + "description": "Current service state of the domain.", "type": "array", "items": { "$ref": "#/definitions/DomainCondition" @@ -1309,11 +1375,11 @@ "type": "object", "properties": { "readinessPort": { - "description": "The WebLogic readiness port for Istio. Defaults to 8888. Not required.", + "description": "The operator will create a WebLogic network access point with this port that will then be exposed from the container running the WebLogic Server instance. The readiness probe will use this network access point to verify that the server instance is ready for application traffic. Defaults to 8888.", "type": "number" }, "enabled": { - "description": "True, if this domain is deployed under an Istio service mesh. Defaults to true when the \u0027istio\u0027 element is included. Not required.", + "description": "True, if this domain is deployed under an Istio service mesh. Defaults to true when the `istio` field is specified.", "type": "boolean" } } @@ -1322,21 +1388,20 @@ "type": "object", "properties": { "annotations": { - "description": "The annotations to be attached to generated resources.", + "description": "The annotations to be added to generated resources.", "$ref": "#/definitions/Map" }, "labels": { - "description": "The labels to be attached to generated resources. The label names must not start with \u0027weblogic.\u0027.", + "description": "The labels to be added to generated resources. The label names must not start with \"weblogic.\".", "$ref": "#/definitions/Map" } } }, "ManagedServer": { - "description": "ManagedServer represents the operator configuration for a single Managed Server.", "type": "object", "properties": { "serverStartState": { - "description": "The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING.", + "description": "The WebLogic runtime state in which the server is to be started. Use ADMIN if the server should start in the admin state. Defaults to RUNNING.", "type": "string", "enum": [ "RUNNING", @@ -1344,19 +1409,19 @@ ] }, "serverService": { - "description": "Customization affecting ClusterIP Kubernetes services for WebLogic Server instances.", + "description": "Customization affecting the generation of Kubernetes Services for WebLogic Server instances.", "$ref": "#/definitions/ServerService" }, "serverName": { - "description": "The name of the Managed Server. Required.", + "description": "The name of the Managed Server. This name must match the name of a Managed Server instance or of a dynamic cluster member name from a server template already defined in the WebLogic domain configuration. Required.", "type": "string" }, "serverPod": { - "description": "Configuration affecting server pods.", + "description": "Customization affecting the generation of Pods for WebLogic Server instances.", "$ref": "#/definitions/ServerPod" }, "serverStartPolicy": { - "description": "The strategy for deciding whether to start a server. Legal values are ALWAYS, NEVER, or IF_NEEDED.", + "description": "The strategy for deciding whether to start a WebLogic Server instance. Legal values are ALWAYS, NEVER, or IF_NEEDED. Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.", "type": "string", "enum": [ "ALWAYS", @@ -1365,7 +1430,7 @@ ] }, "restartVersion": { - "description": "If present, every time this value is updated the operator will restart the required servers.", + "description": "Changes to this field cause the operator to restart WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.", "type": "string" } }, @@ -1379,6 +1444,41 @@ }, "type": "object" }, + "Model": { + "type": "object", + "properties": { + "runtimeEncryptionSecret": { + "description": "Runtime encryption secret. Required when `domainHomeSourceType` is set to FromModel.", + "type": "string" + }, + "domainType": { + "description": "WebLogic Deploy Tooling domain type. Legal values: WLS, RestrictedJRF, JRF. Defaults to WLS.", + "type": "string", + "enum": [ + "WLS", + "RestrictedJRF", + "JRF" + ] + }, + "configMap": { + "description": "Name of a ConfigMap containing the WebLogic Deploy Tooling model.", + "type": "string" + } + } + }, + "Opss": { + "type": "object", + "properties": { + "walletFileSecret": { + "description": "Name of a Secret containing the OPSS key wallet file, which must be in a field named `walletFile`. Use this to allow a JRF domain to reuse its entries in the RCU database. This allows you to specify a wallet file that was obtained from the domain home after the domain was booted for the first time.", + "type": "string" + }, + "walletPasswordSecret": { + "description": "Name of a Secret containing the OPSS key passphrase, which must be in a field named `walletPassword`. Used to encrypt and decrypt the wallet that is used for accessing the domain\u0027s entries in its RCU database.", + "type": "string" + } + } + }, "ProbeTuning": { "type": "object", "properties": { @@ -1400,7 +1500,7 @@ "type": "object", "properties": { "overallHealth": { - "description": "Server health of this WebLogic Server. If the value is \"Not available\", the operator has failed to read the health. If the value is \"Not available (possibly overloaded)\", the operator has failed to read the health of the server possibly due to the server is in overloaded state.", + "description": "Server health of this WebLogic Server instance. If the value is \"Not available\", the operator has failed to read the health. If the value is \"Not available (possibly overloaded)\", the operator has failed to read the health of the server possibly due to the server is in the overloaded state.", "type": "string" }, "activationTime": { @@ -1417,120 +1517,119 @@ } }, "ServerPod": { - "description": "ServerPod describes the configuration for a Kubernetes pod for a server.", "type": "object", "properties": { "nodeName": { - "description": "NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits resource requirements.", + "description": "NodeName is a request to schedule this Pod onto a specific Node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits the resource requirements. See `kubectl explain pods.spec.nodeName`.", "type": "string" }, "livenessProbe": { - "description": "Settings for the liveness probe associated with a server.", + "description": "Settings for the liveness probe associated with a WebLogic Server instance.", "$ref": "#/definitions/ProbeTuning" }, "readinessGates": { - "description": "If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to \"True\" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md", + "description": "If specified, all readiness gates will be evaluated for Pod readiness. A Pod is ready when all its containers are ready AND all conditions specified in the readiness gates have a status equal to \"True\". More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md.", "type": "array", "items": { "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.PodReadinessGate" } }, "serviceAccountName": { - "description": "Name of the ServiceAccount to be used to run this pod. If it is not set, default ServiceAccount will be used. The ServiceAccount has to exist at the time the pod is created.", + "description": "Name of the ServiceAccount to be used to run this Pod. If it is not set, default ServiceAccount will be used. The ServiceAccount has to exist at the time the Pod is created. See `kubectl explain pods.spec.serviceAccountName`.", "type": "string" }, "podSecurityContext": { - "description": "Pod-level security attributes.", + "description": "Pod-level security attributes. See `kubectl explain pods.spec.securityContext`.", "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.PodSecurityContext" }, "priorityClassName": { - "description": "If specified, indicates the pod\u0027s priority. \"system-node-critical\" and \"system-cluster-critical\" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default.", + "description": "If specified, indicates the Pod\u0027s priority. \"system-node-critical\" and \"system-cluster-critical\" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be the default or zero, if there is no default. See `kubectl explain pods.spec.priorityClassName`.", "type": "string" }, "volumes": { - "description": "Additional volumes to be created in the server pod.", + "description": "Additional volumes to be created in the server Pod. See `kubectl explain pods.spec.volumes`.", "type": "array", "items": { "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.Volume" } }, "resources": { - "description": "Memory and CPU minimum requirements and limits for the server.", + "description": "Memory and CPU minimum requirements and limits for the WebLogic Server instance. See `kubectl explain pods.spec.containers.resources`.", "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.ResourceRequirements" }, "annotations": { - "description": "The annotations to be attached to generated resources.", + "description": "The annotations to be added to generated resources.", "$ref": "#/definitions/Map" }, "env": { - "description": "A list of environment variables to add to a server.", + "description": "A list of environment variables to set in the container running a WebLogic Server instance. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-resource/#jvm-memory-and-java-option-environment-variables. See `kubectl explain pods.spec.containers.env`.", "type": "array", "items": { "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.EnvVar" } }, "restartPolicy": { - "description": "Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy", + "description": "Restart policy for all containers within the Pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy. See `kubectl explain pods.spec.restartPolicy`.", "type": "string" }, "nodeSelector": { - "description": "Selector which must match a node\u0027s labels for the pod to be scheduled on that node.", + "description": "Selector which must match a Node\u0027s labels for the Pod to be scheduled on that Node. See `kubectl explain pods.spec.nodeSelector`.", "$ref": "#/definitions/Map" }, "volumeMounts": { - "description": "Additional volume mounts for the server pod.", + "description": "Additional volume mounts for the container running a WebLogic Server instance. See `kubectl explain pods.spec.containers.volumeMounts`.", "type": "array", "items": { "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.VolumeMount" } }, "labels": { - "description": "The labels to be attached to generated resources. The label names must not start with \u0027weblogic.\u0027.", + "description": "The labels to be added to generated resources. The label names must not start with \"weblogic.\".", "$ref": "#/definitions/Map" }, "runtimeClassName": { - "description": "RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md This is an alpha feature and may change in the future.", + "description": "RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this Pod. If no RuntimeClass resource matches the named class, the Pod will not be run. If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md This is an alpha feature and may change in the future. See `kubectl explain pods.spec.runtimeClassName`.", "type": "string" }, "tolerations": { - "description": "If specified, the pod\u0027s tolerations.", + "description": "If specified, the Pod\u0027s tolerations. See `kubectl explain pods.spec.tolerations`.", "type": "array", "items": { "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.Toleration" } }, "readinessProbe": { - "description": "Settings for the readiness probe associated with a server.", + "description": "Settings for the readiness probe associated with a WebLogic Server instance.", "$ref": "#/definitions/ProbeTuning" }, "containers": { - "description": "Additional containers to be included in the server pod.", + "description": "Additional containers to be included in the server Pod. See `kubectl explain pods.spec.containers`.", "type": "array", "items": { "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.Container" } }, "containerSecurityContext": { - "description": "Container-level security attributes. Will override any matching pod-level attributes.", + "description": "Container-level security attributes. Will override any matching Pod-level attributes. See `kubectl explain pods.spec.containers.securityContext`.", "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.SecurityContext" }, "schedulerName": { - "description": "If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler.", + "description": "If specified, the Pod will be dispatched by the specified scheduler. If not specified, the Pod will be dispatched by the default scheduler. See `kubectl explain pods.spec.schedulerName`.", "type": "string" }, "initContainers": { - "description": "Initialization containers to be included in the server pod.", + "description": "Initialization containers to be included in the server Pod. See `kubectl explain pods.spec.initContainers`.", "type": "array", "items": { "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.Container" } }, "shutdown": { - "description": "Configures how the operator should shutdown the server instance.", + "description": "Configures how the operator should shut down the server instance.", "$ref": "#/definitions/Shutdown" }, "affinity": { - "description": "If specified, the pod\u0027s scheduling constraints", + "description": "If specified, the Pod\u0027s scheduling constraints. See `kubectl explain pods.spec.affinity`", "$ref": "https://github.com/garethr/kubernetes-json-schema/blob/master/v1.13.5/_definitions.json#/definitions/io.k8s.api.core.v1.Affinity" } } @@ -1539,15 +1638,15 @@ "type": "object", "properties": { "precreateService": { - "description": "If true, operator will create server services even for server instances without running pods.", + "description": "If true, the operator will create Services even for Managed Server instances without running Pods.", "type": "boolean" }, "annotations": { - "description": "The annotations to be attached to generated resources.", + "description": "The annotations to be added to generated resources.", "$ref": "#/definitions/Map" }, "labels": { - "description": "The labels to be attached to generated resources. The label names must not start with \u0027weblogic.\u0027.", + "description": "The labels to be added to generated resources. The label names must not start with \"weblogic.\".", "$ref": "#/definitions/Map" } } @@ -1556,41 +1655,40 @@ "type": "object", "properties": { "nodeName": { - "description": "Name of node that is hosting the Pod containing this WebLogic Server.", + "description": "Name of Node that is hosting the Pod containing this WebLogic Server instance.", "type": "string" }, "desiredState": { - "description": "Desired state of this WebLogic Server. Values are RUNNING, ADMIN, or SHUTDOWN.", + "description": "Desired state of this WebLogic Server instance. Values are RUNNING, ADMIN, or SHUTDOWN.", "type": "string" }, "clusterName": { - "description": "WebLogic cluster name, if the server is part of a cluster.", + "description": "WebLogic cluster name, if the server is a member of a cluster.", "type": "string" }, "serverName": { - "description": "WebLogic Server name. Required.", + "description": "WebLogic Server instance name.", "type": "string" }, "health": { - "description": "Current status and health of a specific WebLogic Server.", + "description": "Current status and health of a specific WebLogic Server instance.", "$ref": "#/definitions/ServerHealth" }, "state": { - "description": "Current state of this WebLogic Server. Required.", + "description": "Current state of this WebLogic Server instance.", "type": "string" } } }, "Shutdown": { - "description": "Shutdown describes the configuration for shutting down a server instance.", "type": "object", "properties": { "ignoreSessions": { - "description": "For graceful shutdown only, indicates to ignore pending HTTP sessions during in-flight work handling. Not required. Defaults to false.", + "description": "For graceful shutdown only, indicates to ignore pending HTTP sessions during in-flight work handling. Defaults to false.", "type": "boolean" }, "shutdownType": { - "description": "Tells the operator how to shutdown server instances. Not required. Defaults to graceful shutdown.", + "description": "Specifies how the operator will shut down server instances. Defaults to graceful shutdown.", "type": "string", "enum": [ "Graceful", @@ -1598,7 +1696,7 @@ ] }, "timeoutSeconds": { - "description": "For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting down the server. Not required. Defaults to 30 seconds.", + "description": "For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting down the server. Defaults to 30 seconds.", "type": "number" } } @@ -1614,11 +1712,11 @@ } }, "health": { - "description": "Server health of this WebLogic Server. Required.", + "description": "Server health of this WebLogic Server instance.", "type": "string" }, "subsystemName": { - "description": "Name of subsystem providing symptom information. Required.", + "description": "Name of subsystem providing symptom information.", "type": "string" } } diff --git a/docs/v2.4.0/apidocs/allclasses.html b/docs/v2.4.0/apidocs/allclasses.html index 882b1f46aa1..2ef909617d7 100644 --- a/docs/v2.4.0/apidocs/allclasses.html +++ b/docs/v2.4.0/apidocs/allclasses.html @@ -14,8 +14,7 @@ - - + diff --git a/docs/v2.4.0/apidocs/jquery/external/jquery/jquery.js b/docs/v2.4.0/apidocs/jquery/external/jquery/jquery.js index 9b5206bcc60..5b16efa11d4 100644 --- a/docs/v2.4.0/apidocs/jquery/external/jquery/jquery.js +++ b/docs/v2.4.0/apidocs/jquery/external/jquery/jquery.js @@ -1,5 +1,5 @@ /*! - * jQuery JavaScript Library v3.3.1 + * jQuery JavaScript Library v3.4.1 * https://jquery.com/ * * Includes Sizzle.js @@ -9,7 +9,7 @@ * Released under the MIT license * https://jquery.org/license * - * Date: 2018-01-20T17:24Z + * Date: 2019-05-01T21:04Z */ ( function( global, factory ) { @@ -91,20 +91,33 @@ var isWindow = function isWindow( obj ) { var preservedScriptAttributes = { type: true, src: true, + nonce: true, noModule: true }; - function DOMEval( code, doc, node ) { + function DOMEval( code, node, doc ) { doc = doc || document; - var i, + var i, val, script = doc.createElement( "script" ); script.text = code; if ( node ) { for ( i in preservedScriptAttributes ) { - if ( node[ i ] ) { - script[ i ] = node[ i ]; + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); } } } @@ -129,7 +142,7 @@ function toType( obj ) { var - version = "3.3.1", + version = "3.4.1", // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -258,25 +271,28 @@ jQuery.extend = jQuery.fn.extend = function() { // Extend the base object for ( name in options ) { - src = target[ name ]; copy = options[ name ]; + // Prevent Object.prototype pollution // Prevent never-ending loop - if ( target === copy ) { + if ( name === "__proto__" || target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject( copy ) || ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; - if ( copyIsArray ) { - copyIsArray = false; - clone = src && Array.isArray( src ) ? src : []; - + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; + clone = src; } + copyIsArray = false; // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); @@ -329,9 +345,6 @@ jQuery.extend( { }, isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 var name; for ( name in obj ) { @@ -341,8 +354,8 @@ jQuery.extend( { }, // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); + globalEval: function( code, options ) { + DOMEval( code, { nonce: options && options.nonce } ); }, each: function( obj, callback ) { @@ -498,14 +511,14 @@ function isArrayLike( obj ) { } var Sizzle = /*! - * Sizzle CSS Selector Engine v2.3.3 + * Sizzle CSS Selector Engine v2.3.4 * https://sizzlejs.com/ * - * Copyright jQuery Foundation and other contributors + * Copyright JS Foundation and other contributors * Released under the MIT license - * http://jquery.org/license + * https://js.foundation/ * - * Date: 2016-08-08 + * Date: 2019-04-08 */ (function( window ) { @@ -539,6 +552,7 @@ var i, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), + nonnativeSelectorCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; @@ -600,8 +614,7 @@ var i, rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + rdescend = new RegExp( whitespace + "|>" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), @@ -622,6 +635,7 @@ var i, whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, + rhtml = /HTML$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, @@ -676,9 +690,9 @@ var i, setDocument(); }, - disabledAncestor = addCombinator( + inDisabledFieldset = addCombinator( function( elem ) { - return elem.disabled === true && ("form" in elem || "label" in elem); + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; }, { dir: "parentNode", next: "legend" } ); @@ -791,18 +805,22 @@ function Sizzle( selector, context, results, seed ) { // Take advantage of querySelectorAll if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; + !nonnativeSelectorCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) && - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 + // Support: IE 8 only // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { + (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && rdescend.test( selector ) ) { // Capture the context ID, setting it first if necessary if ( (nid = context.getAttribute( "id" )) ) { @@ -824,17 +842,16 @@ function Sizzle( selector, context, results, seed ) { context; } - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); } } } @@ -998,7 +1015,7 @@ function createDisabledPseudo( disabled ) { // Where there is no isDisabled, check manually /* jshint -W018 */ elem.isDisabled !== !disabled && - disabledAncestor( elem ) === disabled; + inDisabledFieldset( elem ) === disabled; } return elem.disabled === disabled; @@ -1055,10 +1072,13 @@ support = Sizzle.support = {}; * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; + var namespace = elem.namespaceURI, + docElem = (elem.ownerDocument || elem).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); }; /** @@ -1480,11 +1500,8 @@ Sizzle.matchesSelector = function( elem, expr ) { setDocument( elem ); } - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && + !nonnativeSelectorCache[ expr + " " ] && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { @@ -1498,7 +1515,9 @@ Sizzle.matchesSelector = function( elem, expr ) { elem.document && elem.document.nodeType !== 11 ) { return ret; } - } catch (e) {} + } catch (e) { + nonnativeSelectorCache( expr, true ); + } } return Sizzle( expr, document, null, [ elem ] ).length > 0; @@ -1957,7 +1976,7 @@ Expr = Sizzle.selectors = { "contains": markFunction(function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; }; }), @@ -2096,7 +2115,11 @@ Expr = Sizzle.selectors = { }), "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } @@ -3146,18 +3169,18 @@ jQuery.each( { return siblings( elem.firstChild ); }, contents: function( elem ) { - if ( nodeName( elem, "iframe" ) ) { - return elem.contentDocument; - } + if ( typeof elem.contentDocument !== "undefined" ) { + return elem.contentDocument; + } - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } - return jQuery.merge( [], elem.childNodes ); + return jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { @@ -4466,6 +4489,26 @@ var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } var isHiddenWithinTree = function( elem, el ) { // isHiddenWithinTree might be called from jQuery#filter function; @@ -4480,7 +4523,7 @@ var isHiddenWithinTree = function( elem, el ) { // Support: Firefox <=43 - 45 // Disconnected elements can have computed display: none, so first confirm that elem is // in the document. - jQuery.contains( elem.ownerDocument, elem ) && + isAttached( elem ) && jQuery.css( elem, "display" ) === "none"; }; @@ -4522,7 +4565,8 @@ function adjustCSS( elem, prop, valueParts, tween ) { unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && rcssNum.exec( jQuery.css( elem, prop ) ); if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { @@ -4669,7 +4713,7 @@ jQuery.fn.extend( { } ); var rcheckableType = ( /^(?:checkbox|radio)$/i ); -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); @@ -4741,7 +4785,7 @@ function setGlobalEval( elems, refElements ) { var rhtml = /<|&#?\w+;/; function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, + var elem, tmp, tag, wrap, attached, j, fragment = context.createDocumentFragment(), nodes = [], i = 0, @@ -4805,13 +4849,13 @@ function buildFragment( elems, context, scripts, selection, ignored ) { continue; } - contains = jQuery.contains( elem.ownerDocument, elem ); + attached = isAttached( elem ); // Append to fragment tmp = getAll( fragment.appendChild( elem ), "script" ); // Preserve script evaluation history - if ( contains ) { + if ( attached ) { setGlobalEval( tmp ); } @@ -4854,8 +4898,6 @@ function buildFragment( elems, context, scripts, selection, ignored ) { div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; } )(); -var documentElement = document.documentElement; - var @@ -4871,8 +4913,19 @@ function returnFalse() { return false; } +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + // Support: IE <=9 only -// See #13393 for more info +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 function safeActiveElement() { try { return document.activeElement; @@ -5172,9 +5225,10 @@ jQuery.event = { while ( ( handleObj = matched.handlers[ j++ ] ) && !event.isImmediatePropagationStopped() ) { - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; @@ -5298,39 +5352,51 @@ jQuery.event = { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, - focus: { + click: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); } + + // Return false to allow normal processing in the caller + return false; }, - delegateType: "focusout" - }, - click: { + trigger: function( data ) { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { - this.click(); - return false; + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); } + + // Return non-false to allow normal event-path propagation + return true; }, - // For cross-browser consistency, don't fire native .click() on links + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack _default: function( event ) { - return nodeName( event.target, "a" ); + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); } }, @@ -5347,6 +5413,93 @@ jQuery.event = { } }; +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + jQuery.removeEvent = function( elem, type, handle ) { // This "if" is needed for plain objects @@ -5459,6 +5612,7 @@ jQuery.each( { shiftKey: true, view: true, "char": true, + code: true, charCode: true, key: true, keyCode: true, @@ -5505,6 +5659,33 @@ jQuery.each( { } }, jQuery.event.addProp ); +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + // Create mouseenter/leave events using mouseover/out and event-time checks // so that event delegation works in jQuery. // Do the same for pointerenter/pointerleave and pointerover/pointerout @@ -5755,11 +5936,13 @@ function domManip( collection, args, callback, ignored ) { if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + } ); } } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node ); + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); } } } @@ -5781,7 +5964,7 @@ function remove( elem, selector, keepData ) { } if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + if ( keepData && isAttached( node ) ) { setGlobalEval( getAll( node, "script" ) ); } node.parentNode.removeChild( node ); @@ -5799,7 +5982,7 @@ jQuery.extend( { clone: function( elem, dataAndEvents, deepDataAndEvents ) { var i, l, srcElements, destElements, clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); + inPage = isAttached( elem ); // Fix IE cloning issues if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && @@ -6095,8 +6278,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); // Support: IE 9 only // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) div.style.position = "absolute"; - scrollboxSizeVal = div.offsetWidth === 36 || "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; documentElement.removeChild( container ); @@ -6167,7 +6352,7 @@ function curCSS( elem, name, computed ) { if ( computed ) { ret = computed.getPropertyValue( name ) || computed[ name ]; - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + if ( ret === "" && !isAttached( elem ) ) { ret = jQuery.style( elem, name ); } @@ -6223,30 +6408,13 @@ function addGetHookIf( conditionFn, hookFn ) { } -var +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }, - - cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style; - -// Return a css property mapped to a potentially vendor prefixed property +// Return a vendor-prefixed property or undefined function vendorPropName( name ) { - // Shortcut for names that are not vendor prefixed - if ( name in emptyStyle ) { - return name; - } - // Check for vendor prefixed names var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), i = cssPrefixes.length; @@ -6259,16 +6427,33 @@ function vendorPropName( name ) { } } -// Return a property mapped along what jQuery.cssProps suggests or to -// a vendor prefixed property. +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property function finalPropName( name ) { - var ret = jQuery.cssProps[ name ]; - if ( !ret ) { - ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; } - return ret; + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; } + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + function setPositiveNumber( elem, value, subtract ) { // Any relative (+/-) values have already been @@ -6340,7 +6525,10 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed delta - extra - 0.5 - ) ); + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; } return delta; @@ -6350,9 +6538,16 @@ function getWidthOrHeight( elem, dimension, extra ) { // Start with computed style var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + val = curCSS( elem, dimension, styles ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox; + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); // Support: Firefox <=54 // Return a confounding non-pixel value or feign ignorance, as appropriate. @@ -6363,22 +6558,29 @@ function getWidthOrHeight( elem, dimension, extra ) { val = "auto"; } - // Check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = valueIsBorderBox && - ( support.boxSizingReliable() || val === elem.style[ dimension ] ); // Fall back to offsetWidth/offsetHeight when value is "auto" // This happens for inline elements with no explicit setting (gh-3571) // Support: Android <=4.1 - 4.3 only // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - if ( val === "auto" || - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) { + // Support: IE 9-11 only + // Also use offsetWidth/offsetHeight for when box sizing is unreliable + // We use getClientRects() to check for hidden/disconnected. + // In those cases, the computed value can be trusted to be border-box + if ( ( !support.boxSizingReliable() && isBorderBox || + val === "auto" || + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + elem.getClientRects().length ) { - val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ]; + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - // offsetWidth/offsetHeight provide border-box values - valueIsBorderBox = true; + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } } // Normalize "" and auto @@ -6424,6 +6626,13 @@ jQuery.extend( { "flexGrow": true, "flexShrink": true, "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, "lineHeight": true, "opacity": true, "order": true, @@ -6479,7 +6688,9 @@ jQuery.extend( { } // If a number was passed in, add the unit (except for certain CSS properties) - if ( type === "number" ) { + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); } @@ -6579,18 +6790,29 @@ jQuery.each( [ "height", "width" ], function( i, dimension ) { set: function( elem, value, extra ) { var matches, styles = getStyles( elem ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra && boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ); + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; // Account for unreliable border-box dimensions by comparing offset* to computed and // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && support.scrollboxSize() === styles.position ) { + if ( isBorderBox && scrollboxSizeBuggy ) { subtract -= Math.ceil( elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - parseFloat( styles[ dimension ] ) - @@ -6758,9 +6980,9 @@ Tween.propHooks = { // Use .style if available and use plain properties where available. if ( jQuery.fx.step[ tween.prop ] ) { jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && - ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || - jQuery.cssHooks[ tween.prop ] ) ) { + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); } else { tween.elem[ tween.prop ] = tween.now; @@ -8467,6 +8689,10 @@ jQuery.param = function( a, traditional ) { encodeURIComponent( value == null ? "" : value ); }; + if ( a == null ) { + return ""; + } + // If an array was passed in, assume that it is an array of form elements. if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { @@ -8969,12 +9195,14 @@ jQuery.extend( { if ( !responseHeaders ) { responseHeaders = {}; while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); } } - match = responseHeaders[ key.toLowerCase() ]; + match = responseHeaders[ key.toLowerCase() + " " ]; } - return match == null ? null : match; + return match == null ? null : match.join( ", " ); }, // Raw string @@ -9363,7 +9591,7 @@ jQuery.each( [ "get", "post" ], function( i, method ) { } ); -jQuery._evalUrl = function( url ) { +jQuery._evalUrl = function( url, options ) { return jQuery.ajax( { url: url, @@ -9373,7 +9601,16 @@ jQuery._evalUrl = function( url ) { cache: true, async: false, global: false, - "throws": true + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options ); + } } ); }; @@ -9656,24 +9893,21 @@ jQuery.ajaxPrefilter( "script", function( s ) { // Bind script tag hack transport jQuery.ajaxTransport( "script", function( s ) { - // This transport only deals with cross domain requests - if ( s.crossDomain ) { + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { var script, callback; return { send: function( _, complete ) { - script = jQuery( " - + diff --git a/docs/v2.4.0/apidocs/oracle/kubernetes/operator/class-use/Workarounds.html b/docs/v2.4.0/apidocs/oracle/kubernetes/operator/class-use/Workarounds.html index 0f5c110ee01..26a6f047ccc 100644 --- a/docs/v2.4.0/apidocs/oracle/kubernetes/operator/class-use/Workarounds.html +++ b/docs/v2.4.0/apidocs/oracle/kubernetes/operator/class-use/Workarounds.html @@ -14,8 +14,7 @@ - - + diff --git a/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/DomainValidationStep.html b/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/DomainValidationStep.html index ee2251fca3c..d48002e7e02 100644 --- a/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/DomainValidationStep.html +++ b/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/DomainValidationStep.html @@ -14,8 +14,7 @@ - - + diff --git a/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/SecretHelper.SecretType.html b/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/SecretHelper.SecretType.html index 3e02b9fe900..307cd11c540 100644 --- a/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/SecretHelper.SecretType.html +++ b/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/SecretHelper.SecretType.html @@ -14,8 +14,7 @@ - - + diff --git a/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainValidationStep.html b/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainValidationStep.html index 769bc2efa97..631cf457fab 100644 --- a/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainValidationStep.html +++ b/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/class-use/DomainValidationStep.html @@ -14,8 +14,7 @@ - - + diff --git a/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/class-use/SecretHelper.SecretType.html b/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/class-use/SecretHelper.SecretType.html index e65b81ea047..81cace84b06 100644 --- a/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/class-use/SecretHelper.SecretType.html +++ b/docs/v2.4.0/apidocs/oracle/kubernetes/operator/helpers/class-use/SecretHelper.SecretType.html @@ -14,8 +14,7 @@ - - + diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index 99560e3da91..850f869da1f 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -7,7 +7,7 @@ oracle.kubernetes operator-parent - 2.6.0 + 3.0.0 operator-integration-tests @@ -92,39 +92,48 @@ org.glassfish.jersey.core jersey-client + test org.glassfish.jersey.media jersey-media-json-processing + test org.glassfish.jersey.inject jersey-hk2 + test com.fasterxml.jackson.core jackson-core + test com.fasterxml.jackson.core jackson-annotations + test com.fasterxml.jackson.core jackson-databind + test com.fasterxml.jackson.dataformat jackson-dataformat-yaml + test com.fasterxml.jackson.datatype jackson-datatype-joda + test org.yaml snakeyaml + test io.kubernetes @@ -134,14 +143,17 @@ javax.jms javax.jms-api + test javax.xml.bind jaxb-api + test net.sourceforge.htmlunit htmlunit + test diff --git a/integration-tests/src/test/java/oracle/kubernetes/operator/ItJrfPvWlst.java b/integration-tests/src/test/java/oracle/kubernetes/operator/ItJrfPvWlst.java index bfa5ff5c13a..5a47ba9c21c 100644 --- a/integration-tests/src/test/java/oracle/kubernetes/operator/ItJrfPvWlst.java +++ b/integration-tests/src/test/java/oracle/kubernetes/operator/ItJrfPvWlst.java @@ -49,11 +49,11 @@ public static void staticPrepare() { namespaceList = new StringBuffer(); testClassName = new Object() { }.getClass().getEnclosingClass().getSimpleName(); - - LoggerHelper.getLocal().log(Level.INFO, "setting up properties, directories for: {0}", + + LoggerHelper.getLocal().log(Level.INFO, "setting up properties, directories for: {0}", testClassName); assertDoesNotThrow(() -> initialize(APP_PROPS_FILE, testClassName), - "Failed: initial setup"); + "Failed: initial setup"); } /** @@ -65,38 +65,38 @@ public void prepare() { LoggerHelper.getLocal().log(Level.INFO, "Creating result/pv root directories"); assertDoesNotThrow(() -> createResultAndPvDirs(testClassName), "Failed: createResultAndPvDirs"); - + LoggerHelper.getLocal().log(Level.INFO, "Copying sample dir to the result dir"); assertDoesNotThrow(() -> TestUtils.execOrAbortProcess( - "cp -rf " - + BaseTest.getProjectRoot() - + "/kubernetes/samples/scripts " - + getResultDir(), - true), - "Failed: Copy sample dir to the result dir"); - + "cp -rf " + + BaseTest.getProjectRoot() + + "/kubernetes/samples/scripts " + + getResultDir(), + true), + "Failed: Copy sample dir to the result dir"); + //start DB and create RCU dbrcuNamespace = "dbrcu" + String.valueOf(getNewSuffixCount()); dbPort = 30011 + getNewSuffixCount(); dbUrl = "oracle-db." + dbrcuNamespace + ".svc.cluster.local:1521/devpdb.k8s"; - assertDoesNotThrow(() -> DbUtils.setupRcuDatabase(getResultDir(), dbPort, dbUrl, + assertDoesNotThrow(() -> DbUtils.setupRcuDatabase(getResultDir(), dbPort, dbUrl, rcuSchemaPrefix, dbrcuNamespace)); - + // create operator if (operator == null) { Map operatorMap = createOperatorMap(getNewSuffixCount(), true, testClassName); - operator = assertDoesNotThrow(() -> TestUtils.createOperator(operatorMap, + operator = assertDoesNotThrow(() -> TestUtils.createOperator(operatorMap, Operator.RestCertType.SELF_SIGNED)); assertNotNull(operator); LoggerHelper.getLocal().log(Level.INFO, "Operator is created for {0}", testClassName); - + domainNS = ((ArrayList) operatorMap.get("domainNamespaces")).get(0); namespaceList.append((String)operatorMap.get("namespace")); namespaceList.append(" ").append(domainNS); } } - + /** * This method will run once after every test method is finished. It delete both RCU and DB pods. */ @@ -108,7 +108,7 @@ public void unPrepare() { assertDoesNotThrow(() -> DbUtils.deleteDbPod(getResultDir()), "Failed: stop DB"); } - + /** * Releases k8s cluster lease, archives result, pv directories. */ @@ -116,7 +116,7 @@ public void unPrepare() { public static void staticUnPrepare() { assertDoesNotThrow(() -> tearDown(new Object() { }.getClass().getEnclosingClass().getSimpleName(), namespaceList.toString()), - "tearDown failed"); + "tearDown failed"); } /** @@ -130,7 +130,7 @@ public void testJrfDomainOnPvUsingWlst() { LoggerHelper.getLocal().log(Level.INFO, "+++++++++++++++++++++++++++++++++---------------------------------+"); LoggerHelper.getLocal().log(Level.INFO, "BEGIN " + testMethodName); - + boolean testCompletedSuccessfully = false; try { @@ -142,25 +142,25 @@ public void testJrfDomainOnPvUsingWlst() { domainMap.put("managedServerNameBase", "infraserver"); domainMap.put("domainHomeSourceType", "PersistentVolume"); domainMap.put("rcuSchemaPrefix", "jrfdomain"); - LoggerHelper.getLocal().log(Level.INFO, "DEBUG " + testClassName + "domain: dbUrl: " + LoggerHelper.getLocal().log(Level.INFO, "DEBUG " + testClassName + "domain: dbUrl: " + dbUrl); domainMap.put("rcuDatabaseURL", dbUrl); domainUid = (String) domainMap.get("domainUID"); LoggerHelper.getLocal().log(Level.INFO, "Creating and verifying the domain creation with domainUid: " + domainUid); - jrfdomain = assertDoesNotThrow(() -> new JrfDomain(domainMap), + jrfdomain = assertDoesNotThrow(() -> new JrfDomain(domainMap), "Failed: JRF domain creation"); - LoggerHelper.getLocal().log(Level.INFO, "JRF domain is created for {0}", + LoggerHelper.getLocal().log(Level.INFO, "JRF domain is created for {0}", testClassName); - assertDoesNotThrow(() -> jrfdomain.verifyDomainCreated(), + assertDoesNotThrow(() -> jrfdomain.verifyDomainCreated(), "Failed: domain verification"); - LoggerHelper.getLocal().log(Level.INFO, "JRF domain verification succeeded for {0}", + LoggerHelper.getLocal().log(Level.INFO, "JRF domain verification succeeded for {0}", testClassName); - + // basic test cases assertDoesNotThrow(() -> testBasicUseCases(jrfdomain, false)); - LoggerHelper.getLocal().log(Level.INFO, "JRF domain BasicUseCases succeeded for {0}", + LoggerHelper.getLocal().log(Level.INFO, "JRF domain BasicUseCases succeeded for {0}", testClassName); testCompletedSuccessfully = true; @@ -173,4 +173,4 @@ public void testJrfDomainOnPvUsingWlst() { LoggerHelper.getLocal().log(Level.INFO, "SUCCESS - " + testMethodName); } } -} \ No newline at end of file +} diff --git a/integration-tests/src/test/java/oracle/kubernetes/operator/ItMiiConfigUpdateCm.java b/integration-tests/src/test/java/oracle/kubernetes/operator/ItMiiConfigUpdateCm.java new file mode 100644 index 00000000000..27a2a5441f2 --- /dev/null +++ b/integration-tests/src/test/java/oracle/kubernetes/operator/ItMiiConfigUpdateCm.java @@ -0,0 +1,366 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.kubernetes.operator; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Map; +import java.util.logging.Level; + +import oracle.kubernetes.operator.utils.Domain; +import oracle.kubernetes.operator.utils.ExecResult; +import oracle.kubernetes.operator.utils.LoggerHelper; +import oracle.kubernetes.operator.utils.Operator; +import oracle.kubernetes.operator.utils.Operator.RestCertType; +import oracle.kubernetes.operator.utils.TestUtils; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +/** + * Wdt Config Update with Model File(s) to existing MII domain + * + *

    This test is used for domain config update by re-creating + * config map using model in image. + */ +public class ItMiiConfigUpdateCm extends MiiConfigUpdateBaseTest { + private static Operator operator; + private static String domainNS; + private static String testClassName; + private static StringBuffer namespaceList; + + /** + * This method does the initialization of the integration test + * properties defined in OperatorIT.properties and setting + * the resultRoot, pvRoot and projectRoot attributes. + * + * @throws Exception if initializing the application properties + * and creates directories for results fails. + */ + @BeforeAll + public static void staticPrepare() throws Exception { + namespaceList = new StringBuffer(); + testClassName = new Object() { + }.getClass().getEnclosingClass().getSimpleName(); + // initialize test properties and create the directories + initialize(APP_PROPS_FILE, testClassName); + } + + /** + * This method creates the result/pv root directories for the test. + * Creates the operator if its not running. + * + * @throws Exception if Operator creation fails + */ + @BeforeEach + public void prepare() throws Exception { + createResultAndPvDirs(testClassName); + + // create operator + if (operator == null) { + Map operatorMap = createOperatorMap(getNewSuffixCount(), + true, testClassName); + operator = TestUtils.createOperator(operatorMap, RestCertType.SELF_SIGNED); + assertNotNull(operator); + domainNS = ((ArrayList) operatorMap.get("domainNamespaces")).get(0); + namespaceList.append((String)operatorMap.get("namespace")); + namespaceList.append(" ").append(domainNS); + } + } + + /** + * Releases k8s cluster lease, archives result, pv directories. + * + * @throws Exception when errors while running statedump.sh or cleanup.sh + * scripts or while renewing the lease for shared cluster run + */ + @AfterAll + public static void staticUnPrepare() throws Exception { + tearDown(new Object() { + }.getClass().getEnclosingClass().getSimpleName(), namespaceList.toString()); + + LoggerHelper.getLocal().info("SUCCESS"); + } + + /** + * Create a domain without a JDBC DS using model in image and having config map + * in the domain.yaml before deploying the domain. After the domain resources + * is created, re-create the config map with model files that define a JDBC DataSource + * and patch to change domain-level restart version to reload the model files, + * generate new config and initiate a rolling restart. + */ + @Test + public void testMiiConfigUpdateNonJdbcCm() { + Assumptions.assumeTrue(QUICKTEST); + String testMethodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + boolean testCompletedSuccessfully = false; + Domain domain = null; + + try { + logTestBegin(testMethodName); + LoggerHelper.getLocal().log(Level.INFO, + "Creating Domain & waiting for the script to complete execution"); + + // create domain w/o JDBC DS using the image created by MII + boolean createDS = false; + domain = createDomainUsingMii(createDS, domainNS, testClassName); + assertNotNull(domain, "Failed to create a domain"); + + // copy model files that contains JDBC DS to a dir, re-create cm to update config, + // patch domain to change domain-level restart version and verify domain restarted successfully + final String destDir = getResultDir() + "/samples/model-in-image-update"; + final String[] modelFiles = {"model.jdbc.yaml", "model.jdbc.properties"}; + createCmAndPatchDomain(domain, destDir, modelFiles); + + // get JDBC DS prop values via WLST on server pod + String jdbcResourceData = getJdbcResources(destDir, domain); + + // verify that JDBC DS is created by checking DS name, JNDI name and read timeout + LoggerHelper.getLocal().log(Level.INFO, "Verify that JDBC DS is created"); + final String[] jdbcResourcesToVerify = + {"datasource.name.1=" + dsName, + "datasource.jndiname.1=array(java.lang.String,['" + jndiName + "'])", + "datasource.readTimeout.1=" + readTimeout_2}; + for (String prop : jdbcResourcesToVerify) { + assertTrue(jdbcResourceData.contains(prop), prop + " is not found"); + LoggerHelper.getLocal().log(Level.INFO, prop + " exists"); + } + + testCompletedSuccessfully = true; + } catch (Exception ex) { + fail("FAILED - " + testMethodName); + } finally { + if (domain != null && (JENKINS || testCompletedSuccessfully)) { + try { + TestUtils.deleteWeblogicDomainResources(domain.getDomainUid()); + } catch (Exception ex) { + LoggerHelper.getLocal().log(Level.INFO, "Failed to delete domain\n " + ex.getMessage()); + } + } + } + + LoggerHelper.getLocal().log(Level.INFO, "SUCCESS - " + testMethodName); + } + + /** + * Create a domain with a JDBC DS using model in image and having config map + * in the domain.yaml before deploying the domain. After the domain resources + * is created, re-create the config map with a model file that define a JDBC DataSource + * and patch to change domain-level restart version to reload the model file, + * generate new config and initiate a rolling restart. + */ + @Test + public void testMiiConfigUpdateJdbcCm() { + Assumptions.assumeTrue(QUICKTEST); + String testMethodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + boolean testCompletedSuccessfully = false; + // The value for property oracle.net.CONNECT_TIMEOUT set in model.jdbc.yaml + // for a client to establish an Oracle Net connection to the database instance. + final String connTimeout = "5200"; + Domain domain = null; + + try { + logTestBegin(testMethodName); + LoggerHelper.getLocal().log(Level.INFO, + "Creating Domain & waiting for the script to complete execution"); + + // create domain w JDBC DS using the image created by MII + boolean createDS = true; + domain = createDomainUsingMii(createDS, domainNS, testClassName); + assertNotNull(domain, "Failed to create a domain"); + + // get JDBC DS prop values via WLST on server pod + final String destDir = getResultDir() + "/samples/model-in-image-update"; + String jdbcResourceData = getJdbcResources(destDir, domain); + + // verify that JDBC DS is created by checking DS name, JNDI name and read timeout + LoggerHelper.getLocal().log(Level.INFO, "Verify that JDBC DS is created"); + final String[] jdbcResourcesToVerify1 = + {"datasource.name.1=" + dsName, + "datasource.jndiname.1=array(java.lang.String,['" + jndiName + "'])", + "datasource.readTimeout.1=" + readTimeout_1}; + for (String prop : jdbcResourcesToVerify1) { + assertTrue(jdbcResourceData.contains(prop), prop + " is not found"); + LoggerHelper.getLocal().log(Level.INFO, prop + " exists"); + } + + // copy model files that contains JDBC DS to a dir, re-create cm to update config, + // patch domain to change domain-level restart version and verify domain restarted successfully + final String[] modelFiles = {"model.jdbc.yaml", "model.jdbc.properties"}; + createCmAndPatchDomain(domain, destDir, modelFiles); + + // get JDBC DS props via WLST on server pod + jdbcResourceData = getJdbcResources(destDir, domain); + + // verify that JDBC DS is updated by checking JDBC DS name, + // connection timeout and read timeout via WLST on server pod + LoggerHelper.getLocal().log(Level.INFO, "Verify that JDBC DS is created"); + final String[] jdbcResourcesToVerify2 = + {"datasource.name.1=" + dsName, + "datasource.readTimeout.1=" + readTimeout_2, + "datasource.connectionTimeout.1=" + connTimeout}; + for (String prop : jdbcResourcesToVerify2) { + assertTrue(jdbcResourceData.contains(prop), prop + " is not found"); + LoggerHelper.getLocal().log(Level.INFO, prop + " exists"); + } + + testCompletedSuccessfully = true; + } catch (Exception ex) { + fail("FAILED - " + testMethodName); + } finally { + if (domain != null && (JENKINS || testCompletedSuccessfully)) { + try { + TestUtils.deleteWeblogicDomainResources(domain.getDomainUid()); + } catch (Exception ex) { + LoggerHelper.getLocal().log(Level.INFO, "Failed to delete domain\n " + ex.getMessage()); + } + } + } + + LoggerHelper.getLocal().log(Level.INFO, "SUCCESS - " + testMethodName); + } + + /** + * Create a domain using model in image and having config map in the domain.yaml + * The model file has predeployed application and a JDBC DataSource. After the domain + * resources is created, re-create the config map with a model file that removes the JDBC + * and application through the ! notation and patch the domain to change domain + * restartVersion to reload the model, generate new config and initiate a rolling restart. + * Verify the JDBC DataSource and application no longer exists in the WebLogic domain. + * + * @throws Exception when test fails + */ + @Test + public void testMiiConfigAppDelete() throws Exception { + Assumptions.assumeTrue(FULLTEST); + String testMethodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + boolean testCompletedSuccessfully = false; + Domain domain = null; + + try { + logTestBegin(testMethodName); + + // create Domain with JDBC DataSource and application using the image created by MII + LoggerHelper.getLocal().log(Level.INFO, + "Creating Domain & waiting for the script to complete execution"); + boolean createDS = true; + domain = createDomainUsingMii(createDS, domainNS, testClassName); + assertNotNull(domain, "Failed to create a domain"); + + // verify that JDBC DS is created by checking JDBC DS name and read timeout + // verify the test result by checking override config file on server pod + // verify that application is accessible from inside the managed server pod + String jdbcDsStr = getJndiName(domain); + assertTrue(verifyApp().contains("Hello"), "Application is not found"); + + // delete config and application using new model file + wdtConfigDeleteOverride(domain); + + // patch to change domain-level restart version and verify domain restarted successfully + modifyDomainYamlWithRestartVersion(domain); + + // verify the test result by getting JDBC DS via WLST on server pod + String destDir = getResultDir() + "/samples/model-in-image-override"; + String jdbcResources = getJdbcResources(destDir, domain); + assertFalse(jdbcResources.contains(dsName), dsName + " is found"); + + // verify the app access returns 404 + assertFalse(verifyApp().contains("Hello"), "Application is found"); + + testCompletedSuccessfully = true; + } catch (Exception ex) { + fail("FAILED - " + testMethodName); + } finally { + if (domain != null && (JENKINS || testCompletedSuccessfully)) { + try { + TestUtils.deleteWeblogicDomainResources(domain.getDomainUid()); + } catch (Exception ex) { + LoggerHelper.getLocal().log(Level.INFO, "Failed to delete domain.\n " + ex.getMessage()); + } + } + } + + LoggerHelper.getLocal().log(Level.INFO, "SUCCESS - " + testMethodName); + } + + private void wdtConfigDeleteOverride(Domain domain) throws Exception { + final String appName = "myear"; + LoggerHelper.getLocal().log(Level.INFO, "Creating configMap"); + String origDir = BaseTest.getProjectRoot() + + "/integration-tests/src/test/resources/model-in-image"; + final String origModelFile = origDir + "/model.jdbc.yaml"; + final String origPropFile = origDir + "/model.jdbc.properties"; + final String destDir = getResultDir() + "/samples/model-in-image-override";; + final String destModelFile = destDir + "/model.jdbc_2.yaml"; + final String destPropFile = destDir + "/model.jdbc_2.properties"; + Files.createDirectories(Paths.get(destDir)); + + Path path = Paths.get(origModelFile); + Charset charset = StandardCharsets.UTF_8; + String content = new String(Files.readAllBytes(path), charset); + // prefix the JDBC DataSource and application name with ! + content = content.replaceAll(dsName, "!" + dsName); + content = content.replaceAll(appName, "!" + appName); + Files.write(Paths.get(destModelFile), content.getBytes(charset)); + TestUtils.copyFile(origPropFile, destPropFile); + + // Re-create config map after deploying domain crd + final String domainUid = domain.getDomainUid(); + final String cmName = domainUid + configMapSuffix; + final String label = "weblogic.domainUID=" + domainUid; + + try { + TestUtils.createConfigMap(cmName, destDir, domainNS, label); + } catch (Exception ex) { + ex.printStackTrace(); + fail("Failed to create cm.\n", ex.getCause()); + } + } + + private String verifyApp() throws Exception { + String appStr = ""; + // get managed server pod name + StringBuffer cmdStrBuff = new StringBuffer(); + cmdStrBuff + .append("kubectl get pod -n ") + .append(domainNS) + .append(" -o=jsonpath='{.items[1].metadata.name}' | grep managed-server1"); + String msPodName = TestUtils.execOrAbortProcess(cmdStrBuff.toString()).stdout(); + + // access the application deployed in managed-server1 + cmdStrBuff = new StringBuffer(); + cmdStrBuff + .append("kubectl -n ") + .append(domainNS) + .append(" exec -it ") + .append(msPodName) + .append(" -- bash -c ") + .append("'curl http://" + msPodName + ":8001/sample_war/") + .append("'"); + + try { + ExecResult exec = TestUtils.execOrAbortProcess(cmdStrBuff.toString(), true); + appStr = exec.stdout(); + } catch (Exception ex) { + LoggerHelper.getLocal().log(Level.INFO, "Varify app failed:\n " + ex.getMessage()); + ex.printStackTrace(); + } + + return appStr; + } +} diff --git a/integration-tests/src/test/java/oracle/kubernetes/operator/ItMiiConfigUpdateImage.java b/integration-tests/src/test/java/oracle/kubernetes/operator/ItMiiConfigUpdateImage.java new file mode 100644 index 00000000000..1c04bdac062 --- /dev/null +++ b/integration-tests/src/test/java/oracle/kubernetes/operator/ItMiiConfigUpdateImage.java @@ -0,0 +1,235 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.kubernetes.operator; + +import java.util.ArrayList; +import java.util.Map; +import java.util.logging.Level; + +import oracle.kubernetes.operator.utils.Domain; +import oracle.kubernetes.operator.utils.LoggerHelper; +import oracle.kubernetes.operator.utils.Operator; +import oracle.kubernetes.operator.utils.Operator.RestCertType; +import oracle.kubernetes.operator.utils.TestUtils; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +/** + * Wdt Config Update with Model File(s) to existing MII domain + * + *

    This test is used for domain config update by updating + * the image tag using model in image. + */ +public class ItMiiConfigUpdateImage extends MiiConfigUpdateBaseTest { + private static Operator operator; + private static String domainNS; + private static String testClassName; + private static StringBuffer namespaceList; + + /** + * This method does the initialization of the integration test + * properties defined in OperatorIT.properties and setting + * the resultRoot, pvRoot and projectRoot attributes. + * + * @throws Exception if initializing the application properties + * and creates directories for results fails. + */ + @BeforeAll + public static void staticPrepare() throws Exception { + namespaceList = new StringBuffer(); + testClassName = new Object() { + }.getClass().getEnclosingClass().getSimpleName(); + // initialize test properties and create the directories + initialize(APP_PROPS_FILE, testClassName); + } + + /** + * This method creates the result/pv root directories for the test. + * Creates the operator if its not running. + * + * @throws Exception if Operator creation fails + */ + @BeforeEach + public void prepare() throws Exception { + createResultAndPvDirs(testClassName); + + // create operator + if (operator == null) { + Map operatorMap = createOperatorMap(getNewSuffixCount(), + true, testClassName); + operator = TestUtils.createOperator(operatorMap, RestCertType.SELF_SIGNED); + assertNotNull(operator); + domainNS = ((ArrayList) operatorMap.get("domainNamespaces")).get(0); + namespaceList.append((String)operatorMap.get("namespace")); + namespaceList.append(" ").append(domainNS); + } + } + + /** + * Releases k8s cluster lease, archives result, pv directories. + * + * @throws Exception when errors while running statedump.sh or cleanup.sh + * scripts or while renewing the lease for shared cluster run + */ + @AfterAll + public static void staticUnPrepare() throws Exception { + tearDown(new Object() { + }.getClass().getEnclosingClass().getSimpleName(), namespaceList.toString()); + + LoggerHelper.getLocal().info("SUCCESS"); + } + + /** + * Create a domain without a JDBC DS using model in image and having config map + * in the domain.yaml before deploying the domain. After the domain resources + * is created, create a new image with diff tag name and model files that + * define a JDBC DataSource and patch the domain to change image tag to reload + * the model file, generate new config and initiate a rolling restart. + */ + @Test + public void testMiiConfigUpdateNonJdbcImage() { + Assumptions.assumeTrue(QUICKTEST); + String testMethodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + boolean testCompletedSuccessfully = false; + Domain domain = null; + + try { + logTestBegin(testMethodName); + LoggerHelper.getLocal().log(Level.INFO, + "Creating Domain & waiting for the script to complete execution"); + + // create domain w/o JDBC DS using the image created by MII + boolean createDS = false; + domain = createDomainUsingMii(createDS, domainNS, testClassName); + assertNotNull(domain, "Failed to create a domain"); + + // create image with a new tag to update config and verify image created successfully + // patch domain to change image tag and verify domain restarted successfully + Map domainMap = domain.getDomainMap(); + final String imageName = (String) domainMap.get("image") + "_nonjdbc"; + final String wdtModelFile = "model.jdbc.yaml"; + final String wdtModelPropFile = "model.jdbc.properties"; + createImageAndPatchDomain(domain, imageName, wdtModelFile, wdtModelPropFile); + + // get JDBC DS prop values via WLST on server pod + final String destDir = getResultDir() + "/samples/model-in-image-update"; + String jdbcResourceData = getJdbcResources(destDir, domain); + + // verify that JDBC DS is created by checking DS name, JNDI name and read timeout + LoggerHelper.getLocal().log(Level.INFO, "Verify that JDBC DS is created"); + final String[] jdbcResourcesToVerify = + {"datasource.name.1=" + dsName, + "datasource.jndiname.1=array(java.lang.String,['" + jndiName + "'])", + "datasource.readTimeout.1=" + readTimeout_2}; + for (String prop : jdbcResourcesToVerify) { + assertTrue(jdbcResourceData.contains(prop), prop + " is not found"); + LoggerHelper.getLocal().log(Level.INFO, prop + " exists"); + } + + testCompletedSuccessfully = true; + } catch (Exception ex) { + fail("FAILED - " + testMethodName); + } finally { + if (domain != null && (JENKINS || testCompletedSuccessfully)) { + try { + TestUtils.deleteWeblogicDomainResources(domain.getDomainUid()); + } catch (Exception ex) { + LoggerHelper.getLocal().log(Level.INFO, "Failed to delete domain\n " + ex.getMessage()); + } + } + } + + LoggerHelper.getLocal().log(Level.INFO, "SUCCESS - " + testMethodName); + } + + /** + * Create a domain with a JDBC DS using model in image and having config map + * in the domain.yaml before deploying the domain. After the domain resources + * is created, create a new image with diff tag name and model files that + * define a JDBC DataSource and patch to change image tage to reload + * the model file, generate new config and initiate a rolling restart. + */ + @Test + public void testMiiConfigUpdateJdbcImage() { + Assumptions.assumeTrue(QUICKTEST); + String testMethodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + boolean testCompletedSuccessfully = false; + // The value for property oracle.net.CONNECT_TIMEOUT set in model.jdbc.yaml + // for a client to establish an Oracle Net connection to the database instance. + final String connTimeout = "5200"; + Domain domain = null; + + try { + logTestBegin(testMethodName); + LoggerHelper.getLocal().log(Level.INFO, + "Creating Domain & waiting for the script to complete execution"); + + // create domain w JDBC DS using the image created by MII + boolean createDS = true; + domain = createDomainUsingMii(createDS, domainNS, testClassName); + assertNotNull(domain, "Failed to create a domain"); + + // get JDBC DS prop values via WLST on server pod + final String destDir = getResultDir() + "/samples/model-in-image-update"; + String jdbcResourceData = getJdbcResources(destDir, domain); + + // verify that JDBC DS is created by checking DS name, JNDI name and read timeout + LoggerHelper.getLocal().log(Level.INFO, "Verify that JDBC DS is created"); + String[] jdbcResourcesToVerify1 = + {"datasource.name.1=" + dsName, + "datasource.jndiname.1=array(java.lang.String,['" + jndiName + "'])", + "datasource.readTimeout.1=" + readTimeout_1}; + for (String prop : jdbcResourcesToVerify1) { + assertTrue(jdbcResourceData.contains(prop), prop + " is not found"); + LoggerHelper.getLocal().log(Level.INFO, prop + " exists"); + } + + // create image with a new tag to update config and verify image created successfully + // patch domain to change image tag and verify domain restarted successfully + Map domainMap = domain.getDomainMap(); + final String imageName = (String) domainMap.get("image") + "_jdbc"; + final String wdtModelFile = "model.jdbc.yaml"; + final String wdtModelPropFile = "model.jdbc.properties"; + createImageAndPatchDomain(domain, imageName, wdtModelFile, wdtModelPropFile); + + // get JDBC DS prop values via WLST on server pod + jdbcResourceData = getJdbcResources(destDir, domain); + + // verify that JDBC DS is updated by checking JDBC DS name, + // connection timeout and read timeout via WLST on server pod + LoggerHelper.getLocal().log(Level.INFO, "Verify that JDBC DS is created"); + String[] jdbcResourcesToVerify2 = + {"datasource.name.1=" + dsName, + "datasource.readTimeout.1=" + readTimeout_2, + "datasource.connectionTimeout.1=" + connTimeout}; + for (String prop : jdbcResourcesToVerify2) { + assertTrue(jdbcResourceData.contains(prop), prop + " is not found"); + LoggerHelper.getLocal().log(Level.INFO, prop + " exists"); + } + + testCompletedSuccessfully = true; + } catch (Exception ex) { + fail("FAILED - " + testMethodName); + } finally { + if (domain != null && (JENKINS || testCompletedSuccessfully)) { + try { + TestUtils.deleteWeblogicDomainResources(domain.getDomainUid()); + } catch (Exception ex) { + LoggerHelper.getLocal().log(Level.INFO, "Failed to delete domain\n " + ex.getMessage()); + } + } + } + + LoggerHelper.getLocal().log(Level.INFO, "SUCCESS - " + testMethodName); + } +} diff --git a/integration-tests/src/test/java/oracle/kubernetes/operator/ItModelInImage.java b/integration-tests/src/test/java/oracle/kubernetes/operator/ItModelInImage.java new file mode 100644 index 00000000000..eb40edb0407 --- /dev/null +++ b/integration-tests/src/test/java/oracle/kubernetes/operator/ItModelInImage.java @@ -0,0 +1,243 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.kubernetes.operator; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Level; + +import oracle.kubernetes.operator.utils.Domain; +import oracle.kubernetes.operator.utils.DomainCrd; +import oracle.kubernetes.operator.utils.ExecResult; +import oracle.kubernetes.operator.utils.LoggerHelper; +import oracle.kubernetes.operator.utils.Operator; +import oracle.kubernetes.operator.utils.Operator.RestCertType; +import oracle.kubernetes.operator.utils.Secret; +import oracle.kubernetes.operator.utils.TestUtils; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +/** + * Simple JUnit test file used for testing Model in Image. + * + *

    This test is used for creating domain using model in image. + */ + +public class ItModelInImage extends MiiBaseTest { + private static Operator operator; + private static String domainNS; + private static String testClassName; + private static StringBuffer namespaceList; + + /** + * This method gets called only once before any of the test methods are executed. It does the + * initialization of the integration test properties defined in OperatorIT.properties and setting + * the resultRoot, pvRoot and projectRoot attributes. + * + * @throws Exception exception + */ + @BeforeAll + public static void staticPrepare() throws Exception { + namespaceList = new StringBuffer(); + testClassName = new Object() { + }.getClass().getEnclosingClass().getSimpleName(); + // initialize test properties and create the directories + initialize(APP_PROPS_FILE, testClassName); + } + + /** + * This method gets called before every test. It creates the result/pv root directories + * for the test. Creates the operator and domain if its not running. + * + * @throws Exception exception if result/pv/operator/domain creation fails + */ + @BeforeEach + public void prepare() throws Exception { + + createResultAndPvDirs(testClassName); + + // create operator1 + if (operator == null) { + Map operatorMap = createOperatorMap(getNewSuffixCount(), + true, testClassName); + operator = TestUtils.createOperator(operatorMap, RestCertType.SELF_SIGNED); + Assertions.assertNotNull(operator); + domainNS = ((ArrayList) operatorMap.get("domainNamespaces")).get(0); + namespaceList.append((String)operatorMap.get("namespace")); + namespaceList.append(" ").append(domainNS); + } + } + + /** + * Releases k8s cluster lease, archives result, pv directories. + * + * @throws Exception exception + */ + @AfterAll + public static void staticUnPrepare() throws Exception { + tearDown(new Object() { + }.getClass().getEnclosingClass().getSimpleName(), namespaceList.toString()); + + LoggerHelper.getLocal().info("SUCCESS"); + } + + /** + * Create a domain using model in image with model yaml and model properties + * file in the image. Deploy the domain, verify the running domain has + * the correct configuration as given in the image. + * + * @throws Exception exception + */ + @Test + public void testMiiWithNoConfigMap() throws Exception { + Assumptions.assumeTrue(QUICKTEST); + String testMethodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + logTestBegin(testMethodName); + LoggerHelper.getLocal().log(Level.INFO, + "Creating Domain & waiting for the script to complete execution"); + Domain domain = null; + boolean testCompletedSuccessfully = false; + try { + Map domainMap = + createModelInImageMap(getNewSuffixCount(), testClassName); + domainMap.put("namespace", domainNS); + domainMap.put("wdtModelFile", "./model.wls.yaml"); + domainMap.put("wdtModelPropertiesFile", "./model.properties"); + + domain = TestUtils.createDomain(domainMap); + // domain = new Domain(domainMap, true, false); + domain.verifyDomainCreated(); + testCompletedSuccessfully = true; + } finally { + if (domain != null && (JENKINS || testCompletedSuccessfully)) { + TestUtils.deleteWeblogicDomainResources(domain.getDomainUid()); + } + } + + LoggerHelper.getLocal().log(Level.INFO, "SUCCESS - " + testMethodName); + } + + /** + * Create a domain using model in image and having configmap in the domain.yaml + * before deploying the domain. After deploying the domain crd, create a new + * config map and update the domain crd to new config map and change domain + * restartVersion to reload the model, generate new config and initiate a + * rolling restart. + * @throws Exception exception + */ + @Test + public void testMiiWithConfigMapBothBeforeAndAfterDeployingDomain() throws Exception { + Assumptions.assumeTrue(QUICKTEST); + String testMethodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + logTestBegin(testMethodName); + LoggerHelper.getLocal().log(Level.INFO, + "Creating Domain & waiting for the script to complete execution"); + Domain domain = null; + boolean testCompletedSuccessfully = false; + try { + + domain = createMiiDomainWithConfigMap(testClassName, domainNS, "./model.wls.yaml", + "./model.empty.properties", "./model.properties", "WLS"); + Map domainMap = domain.getDomainMap(); + //ToDo: access MS using port given in the configmap props + + // config map after deploying domain crd + String cmName = domainMap.get("domainUID") + "-mii-config-map2"; + String cmFile = getResultDir() + "/samples/model-in-image/model.cm.properties"; + TestUtils.createConfigMap(cmName, cmFile, domainNS, + " weblogic.domainUID=" + domainMap.get("domainUID")); + + // update domain yaml with new config map, restartVersion and + // apply the domain yaml, verify domain restarted + modifyDomainYamlWithNewConfigMapAndDomainRestartVersion( + cmName, domain); + LoggerHelper.getLocal().log(Level.INFO, "Verifying if the domain is restarted"); + domain.verifyDomainRestarted(); + //ToDo: access MS using port given in the new configmap props + testCompletedSuccessfully = true; + } finally { + if (domain != null && (JENKINS || testCompletedSuccessfully)) { + TestUtils.deleteWeblogicDomainResources(domain.getDomainUid()); + } + } + + LoggerHelper.getLocal().log(Level.INFO, "SUCCESS - " + testMethodName); + } + + /** + * Create a domain using model in image with model yaml and model properties file in the image. + * Change the weblogic credentials and verify the pods can restart with changed password + * + * @throws Exception exception + */ + @Test + public void testCredentialsChange() throws Exception { + Assumptions.assumeTrue(FULLTEST); + String testMethodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + logTestBegin(testMethodName); + Domain domain = null; + boolean testCompletedSuccessfully = false; + try { + Map domainMap + = createModelInImageMap(getNewSuffixCount(), testClassName); + domainMap.put("namespace", domainNS); + domainMap.put("wdtModelFile", "./model.wls.yaml"); + domainMap.put("wdtModelPropertiesFile", "./model.properties"); + domain = TestUtils.createDomain(domainMap); + domain.verifyDomainCreated(); + + // delete and recreate the weblogic-credentials secret + Secret secret = new Secret(domain.getDomainNs(), domain.getDomainUid() + + "-weblogic-credentials", "system", "gumby1234"); + // use a different secret name for runtimeEncryptionSecret with original credentials + secret = new Secret(domain.getDomainNs(), domain.getDomainUid() + + "-model-secret", getUsername(), getPassword()); + + // Modify the original domain yaml to include restartVersion and change runtimeEncryptionSecret + String originalYaml = getUserProjectsDir() + "/weblogic-domains/" + domain.getDomainUid() + + "/domain.yaml"; + DomainCrd crd = new DomainCrd(originalYaml); + Map objectNode = new HashMap(); + objectNode.put("restartVersion", "v1.1"); + crd.addObjectNodeToDomain(objectNode); + crd.changeRuntimeEncryptionSecret(secret.getSecretName()); + String modYaml = crd.getYamlTree(); + LoggerHelper.getLocal().log(Level.INFO, modYaml); + // Write the modified yaml to a new file + Path path = Paths.get(getUserProjectsDir() + "/weblogic-domains/" + domain.getDomainUid(), + "modified.domain.yaml"); + LoggerHelper.getLocal().log(Level.INFO, "Path of the modified domain.yaml :{0}", path.toString()); + Charset charset = StandardCharsets.UTF_8; + Files.write(path, modYaml.getBytes(charset)); + + // Apply the new yaml to update the domain crd + LoggerHelper.getLocal().log(Level.INFO, "kubectl apply -f {0}", path.toString()); + ExecResult exec = TestUtils.execOrAbortProcess("kubectl apply -f " + path.toString()); + LoggerHelper.getLocal().log(Level.INFO, exec.stdout()); + LoggerHelper.getLocal().log(Level.INFO, "Verifying if the domain is restarted"); + domain.verifyAdminServerRestarted(); + domain.verifyManagedServersRestarted(); + domain.verifyDomainCreated(); + testCompletedSuccessfully = true; + } finally { + if (domain != null && (JENKINS || testCompletedSuccessfully)) { + TestUtils.deleteWeblogicDomainResources(domain.getDomainUid()); + } + } + LoggerHelper.getLocal().log(Level.INFO, "SUCCESS - " + testMethodName); + } +} diff --git a/integration-tests/src/test/java/oracle/kubernetes/operator/ItMonitoringExporter.java b/integration-tests/src/test/java/oracle/kubernetes/operator/ItMonitoringExporter.java index d6fb5f5e6a6..98f3293c92c 100644 --- a/integration-tests/src/test/java/oracle/kubernetes/operator/ItMonitoringExporter.java +++ b/integration-tests/src/test/java/oracle/kubernetes/operator/ItMonitoringExporter.java @@ -86,7 +86,7 @@ public class ItMonitoringExporter extends BaseTest { private static String currentDateTime; private static final String monitoringNS = "monitortestns"; private static boolean installPromGrafanaWebHookMySqlCoord = false; - + /** * This method gets called only once before any of the test methods are executed. It does the * initialization of the integration test properties defined in OperatorIT.properties and setting diff --git a/integration-tests/src/test/java/oracle/kubernetes/operator/ItOperatorUpgrade.java b/integration-tests/src/test/java/oracle/kubernetes/operator/ItOperatorUpgrade.java index f48974e78f7..c69a5355ca1 100644 --- a/integration-tests/src/test/java/oracle/kubernetes/operator/ItOperatorUpgrade.java +++ b/integration-tests/src/test/java/oracle/kubernetes/operator/ItOperatorUpgrade.java @@ -140,7 +140,39 @@ public void testOperatorUpgradeFrom2_5_0() throws Exception { managed1CreateTimeStamp = TestUtils.getCreationTimeStamp(DOM_NS,DUID + "-managed-server1"); managed2CreateTimeStamp = TestUtils.getCreationTimeStamp(DOM_NS,DUID + "-managed-server2"); adminCreateTimeStamp = TestUtils.getCreationTimeStamp(DOM_NS,DUID + "-admin-server"); - upgradeOperator(); + uninstallAndInstallNewVersionOperatorAndVerify(); + testCompletedSuccessfully = true; + LoggerHelper.getLocal().log(Level.INFO, "SUCCESS - " + testMethod); + } + + /** + * Test for upgrading Operator from release 2.6.0 to develop branch. + * + * @throws Exception when upgrade fails + */ + @Test + public void testOperatorUpgradeFrom2_6_0() throws Exception { + Assumptions.assumeTrue(QUICKTEST); + testCompletedSuccessfully = false; + String testMethod = new Object() { + }.getClass().getEnclosingMethod().getName(); + logTestBegin(testMethod); + OP_NS = "weblogic-operator260"; + DOM_NS = "weblogic-domain260"; + namespaceList.append(OP_NS); + namespaceList.append(" ").append(DOM_NS); + OP_DEP_NAME = "operator-upgrade260"; + OP_SA = "operator-sa260"; + DUID = "operatordomain260"; + setupOperatorAndDomain("release/2.6.0", "2.6.0"); + + // Save the CreateTimeStamp for the server pod(s) to compare with + // CreateTimeStamp after upgrade to make sure the pod(s) are not re-stated + managed1CreateTimeStamp = TestUtils.getCreationTimeStamp(DOM_NS,DUID + "-managed-server1"); + managed2CreateTimeStamp = TestUtils.getCreationTimeStamp(DOM_NS,DUID + "-managed-server2"); + adminCreateTimeStamp = TestUtils.getCreationTimeStamp(DOM_NS,DUID + "-admin-server"); + uninstallAndInstallNewVersionOperatorAndVerify(); + testCompletedSuccessfully = true; LoggerHelper.getLocal().log(Level.INFO, "SUCCESS - " + testMethod); } @@ -157,6 +189,30 @@ private void upgradeOperator() throws Exception { testClusterScaling(operator, domain, false); } + /** + * Upgrades operator to develop branch by uninstalling old release operator + * and installing latest operator. + * @throws Exception when upgrade fails or basic usecase testing or scaling fails. + */ + private void uninstallAndInstallNewVersionOperatorAndVerify() throws Exception { + operator.destroy(); + Map operatorMap = createOperatorMap(getNewSuffixCount(), true, ""); + operatorMap.put("namespace", OP_NS + "-1"); + operatorMap.put("releaseName", OP_DEP_NAME); + operatorMap.put("serviceAccount", OP_SA); + operatorMap.put("externalRestEnabled", true); + operatorMap.put("javaLoggingLevel", "FINE"); + namespaceList.append(" ").append(OP_NS + "-1"); + List domNs = new ArrayList(); + domNs.add(DOM_NS); + operatorMap.put("domainNamespaces", domNs); + operator = TestUtils.createOperator(operatorMap, Operator.RestCertType.LEGACY); + + checkCrdVersion(); + testClusterScaling(operator, domain, false); + } + + /** * Checks the expected Upgraded Version of CustomResourceDefintion (CRD). * @@ -224,6 +280,7 @@ private void setupOperatorAndDomain(String operatorGitRelease, String operatorRe LoggerHelper.getLocal().log(Level.INFO, "+++++++++++++++Beginning Test Setup+++++++++++++++++++++"); opUpgradeTmpDir = getResultDir() + "/operatorupgrade"; TestUtils.execOrAbortProcess("rm -rf " + Paths.get(opUpgradeTmpDir).toString()); + TestUtils.execOrAbortProcess("kubectl delete crd domains.weblogic.oracle --ignore-not-found"); Files.createDirectories(Paths.get(opUpgradeTmpDir)); Map operatorMap = createOperatorMap(getNewSuffixCount(), true, ""); operatorMap.put("operatorImageName", "oracle/weblogic-kubernetes-operator"); diff --git a/integration-tests/src/test/java/oracle/kubernetes/operator/MiiBaseTest.java b/integration-tests/src/test/java/oracle/kubernetes/operator/MiiBaseTest.java new file mode 100644 index 00000000000..c333377207f --- /dev/null +++ b/integration-tests/src/test/java/oracle/kubernetes/operator/MiiBaseTest.java @@ -0,0 +1,220 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.kubernetes.operator; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Level; + +import oracle.kubernetes.operator.utils.Domain; +import oracle.kubernetes.operator.utils.DomainCrd; +import oracle.kubernetes.operator.utils.ExecResult; +import oracle.kubernetes.operator.utils.LoggerHelper; +import oracle.kubernetes.operator.utils.TestUtils; +import org.junit.jupiter.api.Assertions; + +public class MiiBaseTest extends BaseTest { + /** + * Creates a map with customized domain input attributes using suffixCount and prefix + * to make the namespaces and ports unique for model in image. + * + * @param suffixCount unique numeric value + * @param prefix prefix for the artifact names + * @return map with domain input attributes + */ + public Map createModelInImageMap( + int suffixCount, String prefix) { + Map domainMap = createDomainMap(suffixCount, prefix); + domainMap.put("domainHomeSourceType", "FromModel"); + domainMap.put("domainHomeImageBase", + getWeblogicImageName() + ":" + getWeblogicImageTag()); + domainMap.put("logHomeOnPV", "true"); + //domainMap.put("wdtDomainType", "WLS"); + + // To get unique image name + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date date = new Date(); + String currentDateTime = dateFormat.format(date) + "-" + System.currentTimeMillis(); + + if (prefix != null && !prefix.trim().equals("")) { + domainMap.put("image", prefix.toLowerCase() + "-modelinimage:" + currentDateTime); + } else { + domainMap.put("image", "modelinimage:" + currentDateTime); + } + return domainMap; + } + + /** + * Create domain using model in image. + * @param domainUidPrefix domain UID prefix + * @param domainNS domain namespace + * @param wdtModelFile file should be under test/resouces/model-in-image dir, + * value can be ./model.wls.yaml + * @param wdtModelPropertiesFile file should be under test/resouces/model-in-image dir, + * value can be ./model.empty.properties + * @param cmFile creates configmap from this file or dir + */ + public Domain createMiiDomainWithConfigMap(String domainUidPrefix, + String domainNS, String wdtModelFile, String wdtModelPropertiesFile, + String cmFile, String wdtDomainType) throws Exception { + Map domainMap = + createModelInImageMap(getNewSuffixCount(), domainUidPrefix); + // config map before deploying domain crd + String cmName = domainMap.get("domainUID") + "-mii-config-map"; + + domainMap.put("namespace", domainNS); + domainMap.put("wdtModelFile", wdtModelFile); + domainMap.put("wdtModelPropertiesFile", wdtModelPropertiesFile); + domainMap.put("wdtDomainType", wdtDomainType); + + domainMap.put("miiConfigMap", cmName); + domainMap.put("miiConfigMapFileOrDir", cmFile); + + Domain domain = TestUtils.createDomain(domainMap); + // domain = new Domain(domainMap, true, false); + domain.verifyDomainCreated(); + return domain; + } + + /** + * Modify the domain yaml to add reference to config map and change domain-level restart version. + * @param cmName Config map name + * @param domain the domain + * @throws Exception on failure + */ + public void modifyDomainYamlWithNewConfigMapAndDomainRestartVersion( + String cmName, Domain domain) throws Exception { + String originalYaml = + getUserProjectsDir() + + "/weblogic-domains/" + + domain.getDomainUid() + + "/domain.yaml"; + + // Modify the original domain yaml to include restartVersion in admin server node + DomainCrd crd = new DomainCrd(originalYaml); + Map objectNode = new HashMap<>(); + objectNode.put("restartVersion", "v1.1"); + crd.addObjectNodeToDomain(objectNode); + String modYaml = crd.getYamlTree(); + LoggerHelper.getLocal().log(Level.INFO, modYaml); + + //change config map name to new config map + modYaml.replaceAll((String)domain.getDomainMap().get("miiConfigMap"), cmName); + + // Write the modified yaml to a new file + Path path = Paths.get(getUserProjectsDir() + + "/weblogic-domains/" + + domain.getDomainUid(), "modified.domain.yaml"); + LoggerHelper.getLocal().log(Level.INFO, "Path of the modified domain.yaml :{0}", path.toString()); + Charset charset = StandardCharsets.UTF_8; + Files.write(path, modYaml.getBytes(charset)); + + // Apply the new yaml to update the domain crd + LoggerHelper.getLocal().log(Level.INFO, "kubectl apply -f {0}", path.toString()); + ExecResult exec = TestUtils.execOrAbortProcess("kubectl apply -f " + path.toString()); + LoggerHelper.getLocal().log(Level.INFO, exec.stdout()); + + } + + /** + * Modify the domain yaml to change domain-level restart version and verify the domain restarted. + * @param domain the Domain where to change domain-level restart version + * @param domainNS the domain namespace name + */ + protected void modifyDomainYamlWithRestartVersion(Domain domain) { + final String domainNS = domain.getDomainNs(); + final String domainUid = domain.getDomainUid(); + final String versionNo = getRestartVersion(domainNS, domainUid); + ExecResult result = null; + + StringBuffer patchDomainCmd = new StringBuffer("kubectl -n "); + patchDomainCmd + .append(domainNS) + .append(" patch domain ") + .append(domainUid) + .append(" --type='json' ") + .append(" -p='[{\"op\": \"replace\", \"path\": \"/spec/restartVersion\", \"value\": \"'") + .append(versionNo) + .append("'\" }]'"); + + try { + // patching the domain + LoggerHelper.getLocal().log(Level.INFO, "Command to patch domain: " + patchDomainCmd); + result = TestUtils.execOrAbortProcess(patchDomainCmd.toString()); + LoggerHelper.getLocal().log(Level.INFO, "Domain patch result: " + result.stdout()); + + // verify the domain restarted + domain.verifyAdminServerRestarted(); + domain.verifyManagedServersRestarted(); + } catch (Exception ex) { + ex.printStackTrace(); + StringBuffer errorMsg = new StringBuffer("FAILURE: command: "); + errorMsg + .append(patchDomainCmd) + .append(" failed, returned ") + .append(result.stdout()) + .append("\n") + .append(result.stderr()); + + Assertions.fail(errorMsg.toString(), ex.getCause()); + } + } + + private String getRestartVersion(String domainNS, String domainUid) { + String versionNo = "1"; + StringBuffer getVersionCmd = new StringBuffer("kubectl -n "); + getVersionCmd + .append(domainNS) + .append(" get domain ") + .append(domainUid) + .append("-o=jsonpath='{.spec.restartVersion}'"); + + LoggerHelper.getLocal().log(Level.INFO, "Command to get restartVersion: " + getVersionCmd); + try { + ExecResult result = TestUtils.execOrAbortProcess(getVersionCmd.toString()); + String existinVersion = result.stdout(); + LoggerHelper.getLocal().log(Level.INFO, "Existing restartVersion is: " + existinVersion); + + // check restartVersion number is digit + if (existinVersion.matches("-?(0|[1-9]\\d*)")) { + int number = Integer.parseInt(existinVersion); + // if restartVersion is a digit, increase it by 1 + versionNo = String.valueOf(Integer.parseInt(versionNo) + number); + } else { + // if restartVersion is not a digit, append 1 to it + versionNo = existinVersion + versionNo; + } + } catch (Exception ex) { + if (ex.getMessage().contains("not found")) { + LoggerHelper.getLocal().log(Level.INFO, "Not Version num found. Set the restartVersion the first time"); + } + } + + LoggerHelper.getLocal().log(Level.INFO, "New restartVersion is: " + versionNo); + + return versionNo; + } + + enum WdtDomainType { + WLS("WLS"), JRF("JRF"), RestrictedJRF("RestrictedJRF"); + + private String type; + + WdtDomainType(String type) { + this.type = type; + } + + public String geWdtDomainType() { + return type; + } + } +} \ No newline at end of file diff --git a/integration-tests/src/test/java/oracle/kubernetes/operator/MiiConfigUpdateBaseTest.java b/integration-tests/src/test/java/oracle/kubernetes/operator/MiiConfigUpdateBaseTest.java new file mode 100644 index 00000000000..63c1da35f4a --- /dev/null +++ b/integration-tests/src/test/java/oracle/kubernetes/operator/MiiConfigUpdateBaseTest.java @@ -0,0 +1,660 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.kubernetes.operator; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Map; +import java.util.logging.Level; + +import oracle.kubernetes.operator.utils.Domain; +import oracle.kubernetes.operator.utils.ExecCommand; +import oracle.kubernetes.operator.utils.ExecResult; +import oracle.kubernetes.operator.utils.LoggerHelper; +import oracle.kubernetes.operator.utils.Secret; +import oracle.kubernetes.operator.utils.TestUtils; + +import static org.junit.jupiter.api.Assertions.fail; + +/** + * Base class which contains common methods to test config update + * using model in image. ItMiiConfigUpdate tests can extend this class. + */ +public class MiiConfigUpdateBaseTest extends MiiBaseTest { + protected static final String configMapSuffix = "-mii-config-map"; + protected static final String dsName = "MyDataSource"; + protected static final String jndiName = "jdbc/generic1"; + // values for property oracle.jdbc.ReadTimeout set in model files + // It defines Read timeout while reading from the socket. + protected static final String readTimeout_1 = "30001"; + protected static final String readTimeout_2 = "30002"; + + /** + * Create domain using model in image. + * @param createDS a boolean value to determine whether or not + * to config a JDBC DS when creating domain + * @param domainNS domain namespace name + * @param testClassName test class name that calls this method + */ + protected Domain createDomainUsingMii(boolean createDS, String domainNS, String testClassName) { + final String cmFile = "model.empty.properties"; + String wdtModelFile = "model.wls.yaml"; + String wdtModelPropFile = "model.properties"; + Domain domain = null; + + if (createDS) { + wdtModelFile = "model.jdbc.image.yaml"; + wdtModelPropFile = "model.jdbc.image.properties"; + } + + StringBuffer paramBuff = new StringBuffer("Creating a Domain with: "); + paramBuff + .append("testClassName=") + .append(testClassName) + .append(", domainNS=") + .append(domainNS) + .append(", wdtModelFile=") + .append(wdtModelFile) + .append(", wdtModelPropFile=") + .append(wdtModelPropFile) + .append(", cmFile=") + .append(cmFile) + .append(", WdtDomainType=") + .append(WdtDomainType.WLS.geWdtDomainType()); + + LoggerHelper.getLocal().log(Level.INFO, "Params used to create domain: " + paramBuff); + + try { + domain = createMiiDomainWithConfigMap( + testClassName, + domainNS, + wdtModelFile, + wdtModelPropFile, + cmFile, + WdtDomainType.WLS.geWdtDomainType()); + } catch (Exception ex) { + LoggerHelper.getLocal().log(Level.INFO, "FAILURE: command: " + + paramBuff + + " failed \n" + + ex.getMessage()); + + ex.printStackTrace(); + } + + return domain; + } + + /** + * Re-create cm to update config and patch domain to change domain-level restart version. + * @param domain the Domain object where to patch domain and update domain config values + * @param destDir destination directory name to copy model files to + * @param modelFiles names of model files to copy + */ + protected void createCmAndPatchDomain(Domain domain, String destDir, String[] modelFiles) { + // copy model files that contains JDBC DS to a dir. to re-create cm + copyTestModelFiles(destDir, modelFiles); + + // re-create cm to update config and verify cm is created successfully + wdtConfigUpdateCm(destDir, domain); + + // patch domain to change domain-level restart version and verify domain restarted successfully + modifyDomainYamlWithRestartVersion(domain); + } + + /** + * Create image to update config and patch domain to change domain-level restart version. + * @param domain the Domain object where to patch domain and update domain config values + * @param destDir destination directory name to copy model files to + * @param modelFiles names of model files to copy + */ + protected void createImageAndPatchDomain(Domain domain, + String imageName, + String wdtModelFile, + String wdtModelPropFile) { + Map domainMap = domain.getDomainMap(); + wdtConfigUpdateImage(domainMap, imageName, wdtModelFile, wdtModelPropFile); + + // push the image to docker repository + if (BaseTest.SHARED_CLUSTER) { + try { + TestUtils.loginAndPushImageToOcir(imageName); + } catch (Exception ex) { + ex.printStackTrace(); + fail("Failed to push image <" + imageName + "> to Docker repo"); + } + } + + // patch to change image tag and verify domain restarted successfully + modifyDomainYamlWithImageTag(domain, imageName); + } + + /** + * Create secret to update config and patch domain to change domain-level restart version. + * @param domain the Domain object where to patch domain and update domain config values + * @param destDir destination directory name to copy model files to + * @param modelFiles names of model files to copy + */ + protected Secret createSecretImageAndPatchDomain(Domain domain, + String jdbcUrl, + String mysqldbport, + String wdtModelFile, + String wdtModelPropFile) { + // create a secret with jdbc url, username and password + final String domainNS = domain.getDomainNs(); + Secret secret = createSecrets(domainNS, jdbcUrl); + + // patch domain to adding the secret name and verify domain restarted successfully + modifyDomainYamlWithSecretName(domain, secret.getSecretName()); + + // replace secret name token with real secret name + Map domainMap = domain.getDomainMap(); + final String resultsDir = (String) domainMap.get("resultDir"); + final String destDir = resultsDir + "/samples/model-in-image"; + copyAndUpdateModelFileWSecret(destDir, wdtModelFile, secret.getSecretName()); + + final String imageName = (String) domainMap.get("image") + "_secret"; + createImageAndPatchDomain(domain, imageName, wdtModelFile, wdtModelPropFile); + + return secret; + } + + /** + * Copy model files from source dir. to test dir. + * @param destDir destination directory name to copy model files to + * @param modelFiles names of model files to copy + */ + protected void copyTestModelFiles(String destDir, String[] modelFiles) { + LoggerHelper.getLocal().log(Level.INFO, "Creating configMap"); + final String origDir = BaseTest.getProjectRoot() + + "/integration-tests/src/test/resources/model-in-image"; + + try { + Files.deleteIfExists(Paths.get(destDir)); + Files.createDirectories(Paths.get(destDir)); + + for (String modelFile : modelFiles) { + TestUtils.copyFile(origDir + "/" + modelFile, destDir + "/" + modelFile); + LoggerHelper.getLocal().log(Level.INFO, "Copied <" + origDir + + "/" + modelFile + "> to <" + destDir + "/" + modelFile + ">"); + } + } catch (Exception ex) { + ex.printStackTrace(); + fail("Failed to copy model files", ex.getCause()); + } + } + + /** + * Copy model files from source dir. to test dir. and replace JDBC URL token with real value. + * @param destDir destination directory name to copy model files to + * @param modelFiles names of model files to copy + * @param secretName secret name to create + */ + protected void copyAndUpdateModelFileWSecret(String destDir, String modelFile, String secretName) { + LoggerHelper.getLocal().log(Level.INFO, "Copy and modify test modelFile"); + final String origDir = BaseTest.getProjectRoot() + + "/integration-tests/src/test/resources/model-in-image"; + + try { + Files.deleteIfExists(Paths.get(destDir + "/" + modelFile)); + + // copy MySQL yaml file + final Path src = Paths.get(origDir + "/" + modelFile); + final Path dst = Paths.get(destDir + "/" + modelFile); + LoggerHelper.getLocal().log(Level.INFO, "Copying " + src.toString() + " to " + dst.toString()); + Charset charset = StandardCharsets.UTF_8; + String content = new String(Files.readAllBytes(src), charset); + Files.write(dst, content.getBytes(charset)); + content = new String(Files.readAllBytes(dst), charset); + LoggerHelper.getLocal().log(Level.INFO, "Replace secret name token with " + secretName); + content = content.replaceAll("SECRET_NAME", secretName); + Files.write(dst, content.getBytes(charset)); + } catch (Exception ex) { + ex.printStackTrace(); + fail("Failed to copy and modify test modelFile", ex.getCause()); + } + } + + /** + * Update an existing cm. + * @param fileOrDirPath a directory path where to get model files + * @param domain the Domain object where to update domain config values + */ + protected void wdtConfigUpdateCm(String fileOrDirPath, Domain domain) { + LoggerHelper.getLocal().log(Level.INFO, "Creating configMap..."); + // get domain UID and domain namespace name + final String domainUid = domain.getDomainUid(); + final String domainNS = domain.getDomainNs(); + final String cmName = domainUid + configMapSuffix; + final String label = "weblogic.domainUID=" + domainUid; + + try { + // Re-create config map after deploying domain crd + TestUtils.createConfigMap(cmName, fileOrDirPath, domainNS, label); + } catch (Exception ex) { + ex.printStackTrace(); + fail("Failed to create cm.\n", ex.getCause()); + } + } + + /** + * Create a new or update an existing image using model in image. + * @param domainMap a Java Map object stores key and value pairs used to create the Domain + * @param imageName image name to be created or updated + * @param modelFile a model to describe a WebLogic Server domain configuration. + * @param modelPropFile a file to specify values of variable tokens declared in model file(s) at runtime + */ + protected void wdtConfigUpdateImage(Map domainMap, String imageName, + String modelFile, String modelPropFile) { + // get domain base image, domain UID and domain name + final String domainBaseImageName = (String) domainMap.get("domainHomeImageBase"); + final String domainUid = (String) domainMap.get("domainUID"); + final String domainName = (String) domainMap.get("domainName"); + ExecResult result = null; + + // Get the map of any additional environment vars, or null + Map additionalEnvMap = (Map) domainMap.get("additionalEnvMap"); + final String resultsDir = (String) domainMap.get("resultDir"); + StringBuffer createDomainImageScriptCmd = new StringBuffer("export WDT_VERSION="); + + createDomainImageScriptCmd.append(BaseTest.WDT_VERSION).append(" && ") + .append(getUserProjectsDir()) + .append("/weblogic-domains/") + .append(domainName) + .append("/miiWorkDir/") + .append("imagetool/bin/imagetool.sh update") + .append(" --tag ") + .append(imageName) + .append(" --fromImage ") + .append(domainBaseImageName) + .append(" --wdtModel ") + .append(resultsDir) + .append("/samples/model-in-image/") + .append(modelFile) + .append(" --wdtVariables ") + .append(resultsDir) + .append("/samples/model-in-image/") + .append(modelPropFile) + .append(" --wdtArchive ") + .append(getUserProjectsDir()) + .append("/weblogic-domains/") + .append(domainName) + .append("/miiWorkDir/models/archive.zip") + .append(" --wdtModelOnly ") + .append(" --wdtDomainType ") + .append(WdtDomainType.WLS.geWdtDomainType()); + + try { + // create a new or update an existing image + LoggerHelper.getLocal().log(Level.INFO, "Command to create domain image: " + + createDomainImageScriptCmd); + result = ExecCommand.exec(createDomainImageScriptCmd.toString(), true, additionalEnvMap); + } catch (Exception ex) { + ex.printStackTrace(); + StringBuffer errorMsg = new StringBuffer("FAILURE: command: "); + errorMsg + .append(createDomainImageScriptCmd) + .append(" failed, returned ") + .append(result.stdout()) + .append("\n") + .append(result.stderr()); + + fail(errorMsg.toString(), ex.getCause()); + } + } + + /** + * Patch the domain to add reference to image and verify the domain restarted. + * @param domain the Domain where to update the image + * @param imageName image name to be updated in the Domain + */ + protected void modifyDomainYamlWithImageTag(Domain domain, String imageName) { + // get domain namespace name and domain UID + final String domainNS = domain.getDomainNs(); + final String domainUid = domain.getDomainUid(); + ExecResult result = null; + + StringBuffer patchDomainCmd = new StringBuffer("kubectl -n "); + patchDomainCmd + .append(domainNS) + .append(" patch domain ") + .append(domainUid) + .append(" --type='json' ") + .append(" -p='[{\"op\": \"replace\", \"path\": \"/spec/image\", \"value\": \"'") + .append(imageName) + .append("'\" }]'"); + + try { + // patch the domain + LoggerHelper.getLocal().log(Level.INFO, "Command to patch domain: " + patchDomainCmd); + result = TestUtils.execOrAbortProcess(patchDomainCmd.toString()); + LoggerHelper.getLocal().log(Level.INFO, "Domain patch result: " + result.stdout()); + + // verify the domain restarted + domain.verifyAdminServerRestarted(); + domain.verifyManagedServersRestarted(); + } catch (Exception ex) { + ex.printStackTrace(); + StringBuffer errorMsg = new StringBuffer("FAILURE: command: "); + errorMsg + .append(patchDomainCmd) + .append(" failed, returned ") + .append(result.stdout()) + .append("\n") + .append(result.stderr()); + + fail(errorMsg.toString(), ex.getCause()); + } + } + + /** + * Modify the domain yaml to change image name and verify the domain restarted. + * @param domain the Domain where to change the image name + * @param imageName image name to be updated in the Domain + */ + protected void modifyDomainYamlWithSecretName(Domain domain, String secretName) { + // get domain namespace name + Map domainMap = domain.getDomainMap(); + final String domainNS = domainMap.get("namespace").toString(); + ExecResult result = null; + + StringBuffer getExistSecretsCmd = new StringBuffer("kubectl -n "); + getExistSecretsCmd + .append(domainNS) + .append(" get domain ") + .append(domain.getDomainUid()) + .append(" -o jsonpath='{.spec.configuration.secrets}' | sed 's/[][]//g'"); + LoggerHelper.getLocal().log(Level.INFO, "Command to get existing secrets: " + getExistSecretsCmd); + + try { + // get existing secret names in domain + result = TestUtils.execOrAbortProcess(getExistSecretsCmd.toString()); + LoggerHelper.getLocal().log(Level.INFO, "Existing secrets are: " + result.stdout()); + } catch (Exception ex) { + ex.printStackTrace(); + StringBuffer errorMsg = new StringBuffer("FAILURE: command: "); + errorMsg + .append(getExistSecretsCmd) + .append(" failed, returned ") + .append(result.stdout()) + .append("\n") + .append(result.stderr()); + } + + String allSecrets = secretName; + if (!result.stdout().isEmpty()) { + // append new secret name to existing secret names in domain + allSecrets += "," + result.stdout().trim(); + } + + StringBuffer patchDomainCmd = new StringBuffer("kubectl -n "); + patchDomainCmd + .append(domainNS) + .append(" patch domain ") + .append(domain.getDomainUid()) + .append(" --type='json' ") + .append(" -p='[{\"op\": \"replace\", \"path\": \"/spec/configuration/secrets\", \"value\": [\"") + .append(allSecrets) + .append("\"] }]'"); + LoggerHelper.getLocal().log(Level.INFO, "Command to patch domain: " + patchDomainCmd); + + try { + // patch the domain + LoggerHelper.getLocal().log(Level.INFO, "Adding [" + allSecrets + "] to domain dynamically"); + result = TestUtils.execOrAbortProcess(patchDomainCmd.toString()); + LoggerHelper.getLocal().log(Level.INFO, "Domain patch result: " + result.stdout()); + } catch (Exception ex) { + ex.printStackTrace(); + StringBuffer errorMsg = new StringBuffer("FAILURE: command: "); + errorMsg + .append(patchDomainCmd) + .append(" failed, returned ") + .append(result.stdout()) + .append("\n") + .append(result.stderr()); + + fail(errorMsg.toString(), ex.getCause()); + } + } + + /** + * Create a MySQL pod. + * @param domain the Domain where to change the image name + * @param mysqldbport MySQL DB port number + */ + protected void createMySql(Domain domain, String destDir, String mysqldbport) { + Map domainMap = domain.getDomainMap(); + final String domainNS = domainMap.get("namespace").toString(); + final String domainUid = domain.getDomainUid(); + final String mysqlYamlFile = "mysql-dbservices.ymlt"; + final String origDir = BaseTest.getProjectRoot() + + "/integration-tests/src/test/resources/mysql"; + String createMysqlCmd = null; + ExecResult result = null; + + try { + Files.deleteIfExists(Paths.get(destDir)); + Files.createDirectories(Paths.get(destDir)); + + // copy mysql yaml file + final Path src = Paths.get(origDir + "/" + mysqlYamlFile); + final Path dst = Paths.get(destDir + "/" + mysqlYamlFile); + LoggerHelper.getLocal().log(Level.INFO, "Copying " + src.toString() + " to " + dst.toString()); + Charset charset = StandardCharsets.UTF_8; + String content = new String(Files.readAllBytes(src), charset); + Files.write(dst, content.getBytes(charset)); + content = new String(Files.readAllBytes(dst), charset); + content = content.replaceAll("@NAMESPACE@", domainNS); + content = content.replaceAll("@DOMAIN_UID@", domainUid); + content = content.replaceAll("@MYSQLPORT@", mysqldbport); + Files.write(dst, content.getBytes(charset)); + + createMysqlCmd = "kubectl create -f " + destDir + "/" + mysqlYamlFile; + LoggerHelper.getLocal().log(Level.INFO, "Command to create mysql: " + createMysqlCmd); + result = TestUtils.execOrAbortProcess(createMysqlCmd); + } catch (Exception ex) { + ex.printStackTrace(); + StringBuffer errorMsg = new StringBuffer("FAILURE: command: "); + errorMsg + .append(createMysqlCmd) + .append(" failed, returned ") + .append(result.stdout()) + .append("\n") + .append(result.stderr()); + + fail(errorMsg.toString(), ex.getCause()); + } + } + + /** + * Create a secret that contains the username, password and JDBC URL to MySQL. + * @param domainNS domain namespace name + * @param jdbcUrl JDBC URL to connect to MySQL + */ + protected Secret createSecrets(String domainNS, String jdbcUrl) { + Secret secret = null; + try { + final String secretName = "mii-config-update-secret"; + final String username = "root"; + final String password = "root123"; + LoggerHelper.getLocal().log(Level.INFO, "jdbcUrl: " + jdbcUrl); + + // create a secret with JDBC URL, username and password + secret = new Secret(domainNS, secretName, jdbcUrl, username, password); + } catch (Exception ex) { + ex.printStackTrace(); + fail("Failed to create Secret"); + } + + return secret; + } + + /** + * Retrieve JNDI name from server pod. + * @param domain the Domain object where to get domain config values + */ + protected String getJndiName(Domain domain) { + // get domain name and domain namespace name + Map domainMap = domain.getDomainMap(); + final String domainName = (String) domainMap.get("domainName"); + final String domainNS = domain.getDomainNs(); + ExecResult result = null; + String jdbcDsStr = ""; + + // check JDBC DS update + StringBuffer cmdStrBuff = new StringBuffer("kubectl -n "); + cmdStrBuff + .append(domainNS) + .append(" exec -it ") + .append(domain.getDomainUid()) + .append("-") + .append(domain.getAdminServerName()) + .append(" -- bash -c 'cd /u01/oracle/user_projects/domains/") + .append(domainName) + .append("/config/jdbc/") + .append(" && grep -R ") + .append(jndiName) + .append("'"); + + try { + LoggerHelper.getLocal().log(Level.INFO, "Command to exec: " + cmdStrBuff); + result = TestUtils.execOrAbortProcess(cmdStrBuff.toString()); + LoggerHelper.getLocal().log(Level.INFO, "JDBC DS info from server pod: " + result.stdout()); + jdbcDsStr = result.stdout(); + } catch (Exception ex) { + StringBuffer errorMsg = new StringBuffer("FAILURE: command: "); + errorMsg + .append(cmdStrBuff) + .append(" failed, returned ") + .append(result.stdout()) + .append("\n") + .append(result.stderr()); + + LoggerHelper.getLocal().log(Level.INFO, errorMsg + "\n" + ex.getMessage()); + ex.printStackTrace(); + } + + return jdbcDsStr; + } + + /** + * Retrieve JDBC DS prop values from server pod via WLST. + * @param destDir destination directory name to test python file to + * @param domain the Domain object where to get domain config values + */ + protected String getJdbcResources(String destDir, Domain domain) { + // get domain name and domain namespace name + Map domainMap = domain.getDomainMap(); + String domainName = (String) domainMap.get("domainName"); + final String domainNS = domain.getDomainNs(); + ExecResult result = null; + String jdbcDsStr = ""; + + try { + // copy verification file to test dir. + final String origDir = BaseTest.getProjectRoot() + + "/integration-tests/src/test/resources/model-in-image/scripts"; + final String pyFileName = "verify-jdbc-resource.py"; + Files.createDirectories(Paths.get(destDir)); + TestUtils.copyFile(origDir + "/" + pyFileName, destDir + "/" + pyFileName); + + // replace var in verification file + String tempDir = getResultDir() + "/configupdatetemp-" + domainNS; + Files.createDirectories(Paths.get(tempDir)); + String content = + new String(Files.readAllBytes(Paths.get(destDir + "/" + pyFileName)), StandardCharsets.UTF_8); + content = content.replaceAll("DOMAINNAME", domainName); + Files.write( + Paths.get(tempDir, pyFileName), + content.getBytes(StandardCharsets.UTF_8)); + + // get server pod name + final String adminPodName = + domain.getDomainUid() + "-" + domain.getAdminServerName(); + + // copy verification file to the pod + StringBuffer cmdStrBuff = new StringBuffer("kubectl -n "); + cmdStrBuff + .append(domainNS) + .append(" exec -it ") + .append(adminPodName) + .append(" -- bash -c 'mkdir -p ") + .append(BaseTest.getAppLocationInPod()) + .append("'"); + LoggerHelper.getLocal().log(Level.INFO, "Command to exec: " + cmdStrBuff); + TestUtils.execOrAbortProcess(cmdStrBuff.toString(), true); + + TestUtils.copyFileViaCat( + Paths.get(tempDir, pyFileName).toString(), + BaseTest.getAppLocationInPod() + "/" + pyFileName, + adminPodName, + domainNS); + + cmdStrBuff = new StringBuffer("kubectl -n "); + cmdStrBuff + .append(domainNS) + .append(" exec -it ") + .append(adminPodName) + .append(" -- bash -c 'wlst.sh ") + .append(BaseTest.getAppLocationInPod()) + .append("/") + .append(pyFileName) + .append("'"); + LoggerHelper.getLocal().log(Level.INFO, "Command to exec: " + cmdStrBuff); + result = TestUtils.execOrAbortProcess(cmdStrBuff.toString(), true); + jdbcDsStr = result.stdout(); + //clean up + LoggerHelper.getLocal().log(Level.INFO, "Deleting: " + destDir + "/" + pyFileName); + Files.deleteIfExists(Paths.get(destDir + "/" + pyFileName)); + } catch (Exception ex) { + LoggerHelper.getLocal().log(Level.INFO, "Failed to get DS prop values.\n" + ex.getMessage()); + ex.printStackTrace(); + } + + return jdbcDsStr; + } + + /** + * Build a webapp to deploy to the cluster. It's used to established + * a connection to MySQL DB + * @param domain the Domain object where to get domain config values + * @param scriptName secret name containing the username, password + * and JDBC URL to connect to MySQL + */ + protected void buildApp(Domain domain, String scriptName) { + Map domainMap = domain.getDomainMap(); + String resultsDir = (String) domainMap.get("resultDir"); + ExecResult result = null; + + StringBuffer buildAppCmd = new StringBuffer("export WDT_VERSION="); + buildAppCmd.append(BaseTest.WDT_VERSION) + .append(" && ") + .append(resultsDir) + .append("/samples/model-in-image/") + .append(scriptName) + .append(" ") + .append(getUserProjectsDir()) + .append(" ") + .append(domain.getDomainUid()) + .append(" ") + .append(getProjectRoot()) + .append("/integration-tests/src/test/resources/model-in-image"); + LoggerHelper.getLocal().log(Level.INFO, "Command to build app: " + buildAppCmd); + try { + result = TestUtils.execOrAbortProcess(buildAppCmd.toString()); + } catch (Exception ex) { + ex.printStackTrace(); + StringBuffer errorMsg = new StringBuffer("FAILURE: command: "); + errorMsg + .append(buildAppCmd) + .append(" failed, returned ") + .append(result.stdout()) + .append("\n") + .append(result.stderr()); + fail(errorMsg.toString()); + } + } +} diff --git a/integration-tests/src/test/java/oracle/kubernetes/operator/utils/DbUtils.java b/integration-tests/src/test/java/oracle/kubernetes/operator/utils/DbUtils.java index 908d9420a40..0693ff913dd 100644 --- a/integration-tests/src/test/java/oracle/kubernetes/operator/utils/DbUtils.java +++ b/integration-tests/src/test/java/oracle/kubernetes/operator/utils/DbUtils.java @@ -49,27 +49,27 @@ public static OracleDB createOracleDB(String dbPropsFile) throws Exception { return oracledb; } - + /** * Start Oracle DB pod and service in the specified namespace. - * + * * @param scriptsDir directory of scripts * @param dbPort NodePort of DB * @param dbNamespace namespace where DB instance is going to start * @throws Exception if any error occurs when creating Oracle DB pod and service */ - public static void startOracleDB(String scriptsDir, String dbPort, - String dbNamespace) throws Exception { + public static void startOracleDB(String scriptsDir, String dbPort, + String dbNamespace) throws Exception { String cmd1 = "sh " + scriptsDir + "/scripts/create-oracle-db-service/start-db-service.sh" + " -i " + BaseTest.getOracledbImageName() + ":" + BaseTest.getOracledbImageTag() + " -p " + dbPort + " -n " + dbNamespace; - + TestUtils.execOrAbortProcess(cmd1, true); - String cmd2 = "kubectl get pod -n " - + dbNamespace + String cmd2 = "kubectl get pod -n " + + dbNamespace + " -o jsonpath=\"{.items[0].metadata.name}\""; logger.info("DEBUG: command to get DB pod: " + cmd2); ExecResult result = TestUtils.execOrAbortProcess(cmd2, true); @@ -82,35 +82,35 @@ public static void startOracleDB(String scriptsDir, String dbPort, String cmd3 = "kubectl logs " + podName + " -n " + dbNamespace; TestUtils.checkCmdInLoop(cmd3, "The database is ready for use", podName); } - + /** * Stop Oracle DB service. - * + * * @param scriptsDir directory of scripts - * @param dbNamespace namespace where DB instance was + * @param dbNamespace namespace where DB instance was * @throws Exception if any error occurs when stopping Oracle DB service */ public static void stopOracleDB(String scriptsDir, String dbNamespace) throws Exception { - String cmd = "sh " + String cmd = "sh " + scriptsDir + "/scripts/create-oracle-db-service/stop-db-service.sh" + " -n " + dbNamespace; - + TestUtils.execOrAbortProcess(cmd, true); } - + /** * Create Oracle rcu pod and load database schema in the specified namespace. - * + * * @param scriptsDir directory of scripts * @param rcuSchemaPrefix prefix of RCU schema * @param namespace namespace where RCU schema is going to be created * @throws Exception if any error occurs when creating RCU schema */ - public static void createRcuSchema(String scriptsDir, String rcuSchemaPrefix, - String dbUrl, String namespace) throws Exception { + public static void createRcuSchema(String scriptsDir, String rcuSchemaPrefix, + String dbUrl, String namespace) throws Exception { String cmd; - cmd = "sh " + cmd = "sh " + scriptsDir + "/scripts/create-rcu-schema/create-rcu-schema.sh -s " + rcuSchemaPrefix @@ -118,21 +118,21 @@ public static void createRcuSchema(String scriptsDir, String rcuSchemaPrefix, + dbUrl + " -p " + DEFAULT_ImagePullSecret - + " -i " + + " -i " + BaseTest.getfmwImageName() + ":" + BaseTest.getfmwImageTag() + " -u " + DEFAULT_ImagePullPolicy - + " -n " + + " -n " + namespace + " -o " + scriptsDir + "/scripts/create-rcu-schema/rcuoutput"; - - TestUtils.execOrAbortProcess(cmd, true); + + TestUtils.execOrAbortProcess(cmd, true); } - + /** * Create Docker Registry Secret in the specified namespace. - * + * * @param namespace namespace where the docker registry secret is going to create * @throws Exception when the kubectl create secret command fails */ @@ -145,60 +145,60 @@ public static void createDockerRegistrySecret(String namespace) throws Exception if (ocrserver == null) { ocrserver = "container-registry.oracle.com"; } - + TestUtils.createDockerRegistrySecret( - secret, - ocrserver, - System.getenv("OCR_USERNAME"), - System.getenv("OCR_PASSWORD"), - System.getenv("OCR_USERNAME"), - namespace); + secret, + ocrserver, + System.getenv("OCR_USERNAME"), + System.getenv("OCR_PASSWORD"), + System.getenv("OCR_USERNAME"), + namespace); } /** * Drop Oracle rcu schema. - * + * * @param scriptsDir directory of scripts * @param rcuSchemaPrefix prefix of RCU schema - * @param namespace namespace where RCU schema was + * @param namespace namespace where RCU schema was * @throws Exception if any error occurs when dropping rcu schema */ - public static void dropRcuSchema(String scriptsDir, String rcuSchemaPrefix, - String namespace) throws Exception { - String cmd = "sh " + public static void dropRcuSchema(String scriptsDir, String rcuSchemaPrefix, + String namespace) throws Exception { + String cmd = "sh " + scriptsDir + "/scripts/create-rcu-schema/drop-rcu-schema.sh " + " -s " + rcuSchemaPrefix + " -n " + namespace; TestUtils.execOrAbortProcess(cmd, true); } - + /** * Delete RCU pod. - * + * * @param scriptsDir directory of scripts * @throws Exception - if any error occurs when deleting RCU pod */ public static void deleteRcuPod(String scriptsDir) throws Exception { - String cmd = "kubectl delete -f " + String cmd = "kubectl delete -f " + scriptsDir + "/scripts/create-rcu-schema/rcuoutput/rcu.yaml --ignore-not-found"; TestUtils.execOrAbortProcess(cmd, true); } - + /** * Delete DB pod. - * + * * @param scriptsDir directory of scripts * @throws Exception if any error occurs when deleting DB pod */ public static void deleteDbPod(String scriptsDir) throws Exception { - String cmd = "kubectl delete -f " + String cmd = "kubectl delete -f " + scriptsDir + "/scripts/create-oracle-db-service/common/oracle.db.yaml --ignore-not-found"; TestUtils.execOrAbortProcess(cmd, true); } - + /** * Delete a namespace. * @@ -218,7 +218,7 @@ public static void deleteNamespace(String namespace) throws Exception { /** * Create a namespace. - * + * * @param namespace namespace to create * @throws Exception if any error occurs */ @@ -232,10 +232,10 @@ public static void createNamespace(String namespace) throws Exception { TestUtils.execOrAbortProcess(cmd2, true); } } - + /** * Start DB instance, create Oracle rcu pod and load database schema in the specified namespace. - * + * * @param scriptsDir directory of scripts * @param dbPort NodePort of DB * @param dbUrl URL of DB @@ -243,32 +243,32 @@ public static void createNamespace(String namespace) throws Exception { * @param namespace namespace where DB and RCU schema are going to start * @throws Exception if any error occurs when setting up RCU database */ - public static void setupRcuDatabase(String scriptsDir, int dbPort, String dbUrl, - String rcuSchemaPrefix, String namespace) throws Exception { - + public static void setupRcuDatabase(String scriptsDir, int dbPort, String dbUrl, + String rcuSchemaPrefix, String namespace) throws Exception { + createNamespace(namespace); createDockerRegistrySecret(namespace); String cmd1 = "mkdir -p " + scriptsDir + "/scripts/create-rcu-schema/rcuoutput"; TestUtils.execOrAbortProcess(cmd1); - String cmd2 = "cp " + String cmd2 = "cp " + scriptsDir + "/scripts/create-rcu-schema/common/rcu.yaml " + scriptsDir + "/scripts/create-rcu-schema/rcuoutput/"; TestUtils.execOrAbortProcess(cmd2); createDBandRCUschema(scriptsDir, dbPort, dbUrl, rcuSchemaPrefix, namespace); - LoggerHelper.getLocal().log(Level.INFO,"RCU schema is going to create for:" - + " namespace: " + namespace - + " dbUrl:" + dbUrl + LoggerHelper.getLocal().log(Level.INFO,"RCU schema is going to create for:" + + " namespace: " + namespace + + " dbUrl:" + dbUrl + " dbPort: " + dbPort - + " rcuSchemaPrefix: " + rcuSchemaPrefix); - + + " rcuSchemaPrefix: " + rcuSchemaPrefix); + } - - private static void createDBandRCUschema(String scriptsDir, int dbPort, String dbUrl, - String rcuSchemaPrefix, String namespace) throws Exception { + + private static void createDBandRCUschema(String scriptsDir, int dbPort, String dbUrl, + String rcuSchemaPrefix, String namespace) throws Exception { count++; if (count < 2) { deleteRcuPod(scriptsDir); @@ -276,9 +276,9 @@ private static void createDBandRCUschema(String scriptsDir, int dbPort, String d try { startOracleDB(scriptsDir, String.valueOf(dbPort), namespace); createRcuSchema(scriptsDir,rcuSchemaPrefix, dbUrl, namespace); - LoggerHelper.getLocal().log(Level.INFO,"RCU schema is created for:" - + " namespace: " + namespace - + " dbUrl:" + dbUrl + LoggerHelper.getLocal().log(Level.INFO,"RCU schema is created for:" + + " namespace: " + namespace + + " dbUrl:" + dbUrl + " dbPort: " + dbPort + " rcuSchemaPrefix: " + rcuSchemaPrefix); LoggerHelper.getLocal().log(Level.INFO,"DEBUG in DBUtils count: " + count); @@ -286,7 +286,7 @@ private static void createDBandRCUschema(String scriptsDir, int dbPort, String d createDBandRCUschema(scriptsDir, dbPort, dbUrl, rcuSchemaPrefix, namespace); } } - + } -} \ No newline at end of file +} diff --git a/integration-tests/src/test/java/oracle/kubernetes/operator/utils/K8sTestUtils.java b/integration-tests/src/test/java/oracle/kubernetes/operator/utils/K8sTestUtils.java index cb84919acf0..2d2f9378f16 100644 --- a/integration-tests/src/test/java/oracle/kubernetes/operator/utils/K8sTestUtils.java +++ b/integration-tests/src/test/java/oracle/kubernetes/operator/utils/K8sTestUtils.java @@ -16,9 +16,9 @@ import io.kubernetes.client.openapi.apis.BatchV1Api; import io.kubernetes.client.openapi.apis.CoreV1Api; import io.kubernetes.client.openapi.apis.CustomObjectsApi; -import io.kubernetes.client.openapi.apis.ExtensionsV1beta1Api; +import io.kubernetes.client.openapi.apis.NetworkingV1beta1Api; import io.kubernetes.client.openapi.apis.RbacAuthorizationV1Api; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1IngressList; +import io.kubernetes.client.openapi.models.NetworkingV1beta1IngressList; import io.kubernetes.client.openapi.models.V1APIGroup; import io.kubernetes.client.openapi.models.V1APIGroupList; import io.kubernetes.client.openapi.models.V1ClusterRoleBindingList; @@ -60,7 +60,7 @@ public class K8sTestUtils { private CoreV1Api coreV1Api = new CoreV1Api(); private BatchV1Api batchV1Api = new BatchV1Api(); private AppsV1Api appsV1Api = new AppsV1Api(); - private ExtensionsV1beta1Api extensionsV1beta1Api = new ExtensionsV1beta1Api(); + private NetworkingV1beta1Api networkingV1beta1Api = new NetworkingV1beta1Api(); private RbacAuthorizationV1Api rbacAuthorizationV1Api = new RbacAuthorizationV1Api(); private ApiextensionsV1beta1Api apiextensionsV1beta1Api = new ApiextensionsV1beta1Api(); private ApiextensionsV1Api apiextensionsV1Api = new ApiextensionsV1Api(); @@ -271,8 +271,8 @@ public void verifyPvcs(String labelSelectors, int expected) throws Exception { public void verifyIngresses( String domainNs, String domainUid, String labelSelectors, int expectedLabeled) throws Exception { - ExtensionsV1beta1IngressList labeledIngressList = - extensionsV1beta1Api.listIngressForAllNamespaces( + NetworkingV1beta1IngressList labeledIngressList = + networkingV1beta1Api.listIngressForAllNamespaces( Boolean.FALSE, null, null, @@ -287,8 +287,8 @@ public void verifyIngresses( labeledIngressList.getItems().size(), expectedLabeled, "Number of labeled ingress"); labeledIngressList.getItems().stream() .forEach(li -> li.getMetadata().getNamespace().equals(domainNs)); - ExtensionsV1beta1IngressList traefikIngressList = - extensionsV1beta1Api.listIngressForAllNamespaces( + NetworkingV1beta1IngressList traefikIngressList = + networkingV1beta1Api.listIngressForAllNamespaces( Boolean.FALSE, null, String.format("metadata.name=traefik-hostrouting-%s", domainUid), diff --git a/integration-tests/src/test/java/oracle/kubernetes/operator/utils/Operator.java b/integration-tests/src/test/java/oracle/kubernetes/operator/utils/Operator.java index 4d1e5c90205..d919211e5d2 100644 --- a/integration-tests/src/test/java/oracle/kubernetes/operator/utils/Operator.java +++ b/integration-tests/src/test/java/oracle/kubernetes/operator/utils/Operator.java @@ -219,8 +219,8 @@ public void verifyExternalRestService() throws Exception { * @throws Exception exception */ public void destroy() throws Exception { - String cmd = "helm uninstall " + operatorMap.get("releaseName") + " --namespace " + operatorMap.get("namespace"); - + String cmd = "helm uninstall " + operatorMap.get("releaseName") + " --namespace " + operatorMap.get("namespace"); + ExecResult result = ExecCommand.exec(cmd); if (result.exitValue() != 0) { throw new RuntimeException( @@ -299,6 +299,7 @@ public Map getOperatorMap() { /** * Call Helm install. + * * @throws Exception on failure */ public void callHelmInstall() throws Exception { @@ -318,25 +319,25 @@ public void callHelmInstall() throws Exception { cmd.append("cd "); cmd.append(operatorMap.get("operatorGitVersionDir")) .append("/weblogic-kubernetes-operator"); - + cmd.append(" && helm install ") - .append(operatorMap.get("releaseName")) - .append(" kubernetes/charts/weblogic-operator"); + .append(operatorMap.get("releaseName")) + .append(" kubernetes/charts/weblogic-operator"); } else { cmd.append("cd "); cmd.append(BaseTest.getProjectRoot()); cmd.append(" && helm install ") .append(operatorMap.get("releaseName")) .append(" kubernetes/charts/weblogic-operator"); - cmd.append(" --values ") - .append(generatedInputYamlFile) - .append(" --namespace ") - .append(operatorNS) - .append(" --set \"imagePullPolicy=") - .append(imagePullPolicy) - .append("\" "); - cmd.append(" --wait --timeout 3m0s"); } + cmd.append(" --values ") + .append(generatedInputYamlFile) + .append(" --namespace ") + .append(operatorNS) + .append(" --set \"imagePullPolicy=") + .append(imagePullPolicy) + .append("\" "); + cmd.append(" --wait --timeout 3m0s"); LoggerHelper.getLocal().log(Level.INFO, "Running " + cmd); ExecResult result = ExecCommand.exec(cmd.toString()); @@ -349,6 +350,7 @@ public void callHelmInstall() throws Exception { /** * Call Helm upgrade. + * * @param upgradeSet upgrade properties * @throws Exception on failure */ @@ -376,6 +378,7 @@ public void callHelmUpgrade(String upgradeSet) throws Exception { /** * get Helm values. + * * @return values * @throws Exception on failure */ @@ -385,7 +388,7 @@ public String getHelmValues() throws Exception { .append(" && helm get values ") .append(operatorMap.get("releaseName")); - cmd.append(" --namespace " + operatorMap.get("namespace")); + cmd.append(" --namespace " + operatorMap.get("namespace")); LoggerHelper.getLocal().log(Level.INFO, "Running " + cmd); ExecResult result = ExecCommand.exec(cmd.toString()); if (result.exitValue() != 0) { @@ -653,6 +656,7 @@ public static enum RestCertType { /** * writes operator pod describe and logs to a file. + * * @param logLocation - location where the logs to be written */ public void writePodLog(String logLocation) throws Exception { diff --git a/integration-tests/src/test/resources/OperatorIT.properties b/integration-tests/src/test/resources/OperatorIT.properties index d25541038bb..d3ea8dc008f 100644 --- a/integration-tests/src/test/resources/OperatorIT.properties +++ b/integration-tests/src/test/resources/OperatorIT.properties @@ -15,8 +15,8 @@ fmwImageName = container-registry.oracle.com/middleware/fmw-infrastructure oracledbImageTag = 12.2.0.1-slim oracledbImageName = container-registry.oracle.com/database/enterprise OCR_SERVER=container-registry.oracle.com -DOMAIN_API_VERSION = weblogic.oracle/v7 -CRD_VERSION = v7 +DOMAIN_API_VERSION = weblogic.oracle/v8 +CRD_VERSION = v8 WDT_VERSION=1.7.2 PROMETHEUS_CHART_VERSION=11.1.5 GRAFANA_CHART_VERSION=5.0.20 diff --git a/integration-tests/src/test/resources/charts/ingress-per-domain/templates/traefik-ingress.yaml b/integration-tests/src/test/resources/charts/ingress-per-domain/templates/traefik-ingress.yaml index ccf2ced6eff..a18eebe2c81 100644 --- a/integration-tests/src/test/resources/charts/ingress-per-domain/templates/traefik-ingress.yaml +++ b/integration-tests/src/test/resources/charts/ingress-per-domain/templates/traefik-ingress.yaml @@ -3,13 +3,11 @@ {{- if eq .Values.type "TRAEFIK" }} --- -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: {{ .Values.wlsDomain.domainUID }}-traefik namespace: {{ .Release.Namespace }} - labels: - weblogic.resourceVersion: domain-v2 spec: annotations: kubernetes.io/ingress.class: traefik diff --git a/integration-tests/src/test/resources/charts/ingress-per-domain/templates/voyager-ingress.yaml b/integration-tests/src/test/resources/charts/ingress-per-domain/templates/voyager-ingress.yaml index e9b8cb050c5..b5f41325ed7 100644 --- a/integration-tests/src/test/resources/charts/ingress-per-domain/templates/voyager-ingress.yaml +++ b/integration-tests/src/test/resources/charts/ingress-per-domain/templates/voyager-ingress.yaml @@ -8,8 +8,6 @@ kind: Ingress metadata: name: {{ .Values.wlsDomain.domainUID }}-voyager namespace: {{ .Release.Namespace }} - labels: - weblogic.resourceVersion: domain-v2 annotations: ingress.appscode.com/type: 'NodePort' ingress.appscode.com/stats: 'true' @@ -30,8 +28,6 @@ kind: Service metadata: name: {{ .Values.wlsDomain.domainUID }}-voyager-stats namespace: {{ .Release.Namespace }} - labels: - weblogic.resourceVersion: domain-v2 spec: type: NodePort ports: diff --git a/integration-tests/src/test/resources/charts/traefik/host-routing.yaml b/integration-tests/src/test/resources/charts/traefik/host-routing.yaml index f9799296764..156cfbc3129 100644 --- a/integration-tests/src/test/resources/charts/traefik/host-routing.yaml +++ b/integration-tests/src/test/resources/charts/traefik/host-routing.yaml @@ -1,4 +1,4 @@ -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: diff --git a/integration-tests/src/test/resources/exporter/coordinator_test5.yaml b/integration-tests/src/test/resources/exporter/coordinator_test5.yaml index 979a46c20fd..fc382424226 100644 --- a/integration-tests/src/test/resources/exporter/coordinator_test5.yaml +++ b/integration-tests/src/test/resources/exporter/coordinator_test5.yaml @@ -1,7 +1,7 @@ # Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. -apiVersion: extensions/v1beta1 +apiVersion: apps/v1 kind: Deployment metadata: name: coordinator diff --git a/integration-tests/src/test/resources/exporter/domain1.yaml b/integration-tests/src/test/resources/exporter/domain1.yaml index 7d82deacfd3..54fcf878cb3 100644 --- a/integration-tests/src/test/resources/exporter/domain1.yaml +++ b/integration-tests/src/test/resources/exporter/domain1.yaml @@ -10,11 +10,10 @@ metadata: name: domain1 namespace: default labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: domain1 spec: domainHome: /u01/oracle/user-projects/domains/domain1 - domainHomeInImage: true + domainHomeSourceType: Image image: domain1-image:1.0 imagePullPolicy: "Always" imagePullSecrets: diff --git a/integration-tests/src/test/resources/exporter/server.yaml b/integration-tests/src/test/resources/exporter/server.yaml index e3c4e7f601e..6e844396a49 100644 --- a/integration-tests/src/test/resources/exporter/server.yaml +++ b/integration-tests/src/test/resources/exporter/server.yaml @@ -1,7 +1,7 @@ # Copyright (c) 2017, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upload -apiVersion: extensions/v1beta1 +apiVersion: apps/v1 kind: Deployment metadata: name: webhook diff --git a/integration-tests/src/test/resources/imagetool/build_download.sh b/integration-tests/src/test/resources/imagetool/build_download.sh index 83afa0fdc25..a033c06f0b8 100644 --- a/integration-tests/src/test/resources/imagetool/build_download.sh +++ b/integration-tests/src/test/resources/imagetool/build_download.sh @@ -13,7 +13,7 @@ # 2. The latest imagetool version will be installed if no version number # specified # -# If this is run behind a proxy. Environment varibale http_proxy and https_proxy must be set +# If this is run behind a proxy. Environment variable http_proxy and https_proxy must be set # # Exit immediately if a command exits with a non-zero status. @@ -23,11 +23,11 @@ usage() { printf "\n" echo 1>&2 "1. To install imagetool with the version number specified by env.IMAGE_TOOL_VERSION" - echo 1>&2 "Usage: export IMAGE_TOOL_VERSION=1.8.3; $0" + echo 1>&2 "Usage: export IMAGE_TOOL_VERSION=1.9.1; $0" echo 1>&2 "Or on Jenkins, set the version number in IMAGE_TOOL_VERSION field" echo 1>&2 "2. To install imagetool with a specified version number" echo 1>&2 "Usage: $0 -v " - echo 1>&2 "Example: $0 -v 1.8.3" + echo 1>&2 "Example: $0 -v 1.9.1" echo 1>&2 "3. To install latest imagetool version" echo 1>&2 "Usage: $0" printf "\n" diff --git a/integration-tests/src/test/resources/model-in-image/add_os_utils b/integration-tests/src/test/resources/model-in-image/add_os_utils new file mode 100644 index 00000000000..b70db2b62b1 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/add_os_utils @@ -0,0 +1,5 @@ +[final-build-commands] +USER root +RUN yum -y install gzip unzip tar +USER oracle + diff --git a/integration-tests/src/test/resources/model-in-image/build-app.sh b/integration-tests/src/test/resources/model-in-image/build-app.sh new file mode 100755 index 00000000000..c585bbf0045 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/build-app.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Description +# This sample script creates a WebLogic domain home in docker image, and generates the domain resource +# yaml file, which can be used to restart the Kubernetes artifacts of the corresponding domain. +# +# The domain creation inputs can be customized by editing create-domain-inputs.yaml +# +# The following pre-requisites must be handled prior to running this script: +# * The WDT sample requires that JAVA_HOME is set to a java JDK version 1.8 or greater +# * The kubernetes namespace must already be created +# * The kubernetes secrets 'username' and 'password' of the admin account have been created in the namespace +# * The host directory that will be used as the persistent volume must already exist +# and have the appropriate file permissions set. +# * If logHomeOnPV is enabled, the kubernetes persisitent volume must already be created +# * If logHomeOnPV is enabled, the kubernetes persisitent volume claim must already be created +# + +# Initialize +script="${BASH_SOURCE[0]}" +scriptDirr="$( cd "$( dirname "${script}" )" && pwd )" +echo "scriptDirr,,, is ${scriptDirr}" + +outputDir=$1 +domainUID=$2 +scriptDir=$3 +domainOutputDir="${outputDir}/weblogic-domains/${domainUID}" +miiWorkDir="${domainOutputDir}/miiWorkDir" +modelDir="${miiWorkDir}/models" + +echo "scriptDir is ${scriptDir}" +echo "domainOutputDir is ${domainOutputDir}" +echo "miiWorkDir is ${miiWorkDir}" +echo "modelDir is ${modelDir}" + +cp -r ${scriptDir}/ds_app ${miiWorkDir} +cd ${miiWorkDir}/ds_app/wlsdeploy/applications +rm -f ds_app.ear +jar cvfM ds_app.ear * + +cd ../.. +rm -f ${modelDir}/archive.zip +pwd +zip ${modelDir}/archive.zip wlsdeploy/applications/ds_app.ear wlsdeploy/config/amimemappings.properties \ No newline at end of file diff --git a/integration-tests/src/test/resources/model-in-image/cm.jdbc.yaml b/integration-tests/src/test/resources/model-in-image/cm.jdbc.yaml new file mode 100644 index 00000000000..790ecbf0006 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/cm.jdbc.yaml @@ -0,0 +1,52 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +domainInfo: + AdminUserName: '@@FILE:/weblogic-operator/secrets/username@@' + AdminPassword: '@@FILE:/weblogic-operator/secrets/password@@' + ServerStartMode: 'prod' + +topology: + Name: domain1 + AdminServerName: "admin-server" + Cluster: + "cluster-1": + DynamicServers: + ServerTemplate: "cluster-1-template" + ServerNamePrefix: "managed-server" + DynamicClusterSize: 5 + MaxDynamicClusterSize: 5 + CalculatedListenPorts: false + Server: + "admin-server": + ListenPort: 7001 + ServerTemplate: + "cluster-1-template": + Cluster: "cluster-1" + ListenPort : '@@PROP:MANSVR_PORT@@' +resources: + JDBCSystemResource: + MyDataSource: + Target: "cluster-1" + JdbcResource: + JDBCDataSourceParams: + JNDIName: jdbc/generic1 + JDBCDriverParams: + DriverName: oracle.jdbc.OracleDriver + URL: 'jdbc:oracle:thin:@//@@PROP:dbcs1.url@@' + PasswordEncrypted: '@@PROP:dbcs1.password@@' + Properties: + user: + Value: '@@PROP:dbcs1.user@@' + oracle.net.CONNECT_TIMEOUT: + Value: 5199 + oracle.jdbc.ReadTimeout: + Value: '@@PROP:read.timeout@@' + JDBCConnectionPoolParams: + MaxCapacity: 50 +appDeployments: + Application: + myear: + SourcePath: wlsdeploy/applications/sample_app.ear + ModuleType: ear + Target: 'cluster-1' \ No newline at end of file diff --git a/integration-tests/src/test/resources/model-in-image/create-domain-inputs.yaml b/integration-tests/src/test/resources/model-in-image/create-domain-inputs.yaml new file mode 100644 index 00000000000..f3d9c705773 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/create-domain-inputs.yaml @@ -0,0 +1,167 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# The version of this inputs file. Do not modify. +version: create-weblogic-sample-domain-inputs-v1 + +# Port number for admin server +adminPort: 7001 + +# Name of the Admin Server +adminServerName: admin-server + +# Unique ID identifying a domain. +# This ID must not contain an underscope ("_"), and must be lowercase and unique across all domains +# in a Kubernetes cluster. +domainUID: domain1 + +# Determines which WebLogic Servers the operator will start up +# Legal values are "NEVER", "IF_NEEDED", or "ADMIN_ONLY" +serverStartPolicy: IF_NEEDED + +# Cluster name +clusterName: cluster-1 + +# Number of managed servers to generate for the domain +configuredManagedServerCount: 5 + +# Number of managed servers to initially start for the domain +initialManagedServerReplicas: 2 + +# Base string used to generate managed server names +managedServerNameBase: managed-server + +# Port number for each managed server +managedServerPort: 8001 + +# Boolean indicating if production mode is enabled for the domain +productionModeEnabled: true + +# Name of the image for the created model in image. With Model In Image, WDT models, WDT +# archives and WDT install can be included in the image. Additional models and variable +# files can be provided using kubernetes config map. +# If this property is set, the create domain scripts will use the value specified, instead of the +# default value, to tag the generated image and set the `image` in the domain YAML file. +# +# A unique value is required for each domain that is created using the scripts. +# +# If you are running the sample scripts from a machine that is remote to the Kubernetes cluster where +# the domain is going to be running, you need to set this property to the image name that is intended +# to be used in a registry local to that Kubernetes cluster. You also need to push the `image` to +# that registry before starting the domain using the `kubectl create -f` or `kubectl apply -f` command. +# See README.md for more help. +image: model-in-image:v1 + +# Image pull policy +# Legal values are "IfNotPresent", "Always", or "Never" +imagePullPolicy: IfNotPresent + +# Name of the Kubernetes secret to access the Docker Store to pull the WebLogic Server Docker image +# The presence of the secret will be validated when this parameter is enabled. +#imagePullSecretName: + +# Name of the Kubernetes secret for the Admin Server's username and password +# The name must be lowercase. +# If not specified, the value is derived from the domainUID as -weblogic-credentials +weblogicCredentialsSecretName: domain1-weblogic-credentials + +# Whether to include server .out to the pod's stdout. +# The default is true. +includeServerOutInPodLog: true + +# Specifies whether the log home is stored on the persistent volume. +# If set to true, then you must specify the 'logHome', 'persistentVolumeClaimName' +# and 'domainPVMountPath' properties. +# The default is false. +logHomeOnPV: false + +# The in-pod location for domain log, server logs, server out, and node manager log files +# If not specified, the value is derived from the domainUID as /shared/logs/ +# This parameter is required if 'logHomeOnPV' is true. +# Otherwise, it is ignored. +logHome: /shared/logs/domain1 + +# An (optional) in-pod location for data storage of default and custom file stores. +# If not specified or the value is either not set or empty (e.g. dataHome: "") then the +# data storage directories are determined from the WebLogic domain home configuration. +#dataHome: + +# Port for the T3Channel of the NetworkAccessPoint +t3ChannelPort: 30012 + +# Public address for T3Channel of the NetworkAccessPoint. This value should be set to the +# kubernetes server address, which you can get by running "kubectl cluster-info". If this +# value is not set to that address, WLST will not be able to connect from outside the +# kubernetes cluster. +#t3PublicAddress: + +# Boolean to indicate if the channel should be exposed as a service +exposeAdminT3Channel: false + +# NodePort to expose for the admin server +adminNodePort: 30701 + +# Boolean to indicate if the adminNodePort will be exposed +exposeAdminNodePort: false + +# Name of the domain namespace +namespace: default + +# Java Option for WebLogic Server +javaOptions: -Dweblogic.StdoutDebugEnabled=false + +# Name of the persistent volume claim +# If not specified, the value is derived from the domainUID as -weblogic-sample-pvc +# This parameter is required if 'logHomeOnPV' is true. +# Otherwise, it is ignored. +persistentVolumeClaimName: domain1-weblogic-sample-pvc + +# Mount path of the domain persistent volume. +# This parameter is required if 'logHomeOnPV' is true. +# Otherwise, it is ignored. +domainPVMountPath: /shared + +# Base WebLogic binary image used to build the WebLogic domain image +# The operator requires WebLogic Server 12.2.1.3.0 with patch 29135930 applied or 12.2.1.4.0. +# The WebLogic Docker image, `weblogic:12.2.1.3`, has all the necessary patches applied. +# Refer to [WebLogic Docker images](../../../../../site/weblogic-docker-images.md) for details on how +# to obtain or create the image. +# See README.md for more help. +domainHomeImageBase: container-registry.oracle.com/middleware/weblogic:12.2.1.4 + +# Uncomment and edit value(s) below to specify the maximum amount of +# compute resources allowed, and minimum amount of compute resources +# required for each server pod. +# These are optional. +# Please refer to the kubernetes documentation on Managing Compute +# Resources for Containers for details. +# +# serverPodMemoryRequest: "64Mi" +# serverPodCpuRequest: "250m" +# serverPodMemoryLimit: "1Gi" +# serverPodCpuLimit: "1000m" + +# domainHomeSourceType is FromModel for MII +domainHomeSourceType: FromModel + +# The wdt domain type for model in image case. +# Valid values are 'WLS', 'JRF', and 'RestrictedJRF' +wdtDomainType: WLS + +# wdt model file containing WebLogic configuration +wdtModelFile: ./model.wls.yaml + +# wdt properties file to be used for the model +wdtModelPropertiesFile: ./model.empty.properties + +# configMap for MII +#miiConfigMap: domain1-mii-config-map + +# To create configmap with multiple files, create a sub directory at the same directory +# as this inputs file and give path here, example ./advancedusecase/ +#miiConfigMapFileOrDir: ./model.cm.properties + + + + + diff --git a/integration-tests/src/test/resources/model-in-image/create-domain.sh b/integration-tests/src/test/resources/model-in-image/create-domain.sh new file mode 100755 index 00000000000..9880fa99017 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/create-domain.sh @@ -0,0 +1,287 @@ +#!/usr/bin/env bash +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Description +# This sample script creates a WebLogic domain home in docker image, and generates the domain resource +# yaml file, which can be used to restart the Kubernetes artifacts of the corresponding domain. +# +# The domain creation inputs can be customized by editing create-domain-inputs.yaml +# +# The following pre-requisites must be handled prior to running this script: +# * The WDT sample requires that JAVA_HOME is set to a java JDK version 1.8 or greater +# * The Kubernetes namespace must already be created +# * The Kubernetes secrets 'username' and 'password' of the admin account have been created in the namespace +# * The host directory that will be used as the persistent volume must already exist +# and have the appropriate file permissions set. +# * If logHomeOnPV is enabled, the Kubernetes persistent volume must already be created +# * If logHomeOnPV is enabled, the Kubernetes persistent volume claim must already be created +# + +# Initialize +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/../scripts/common/utility.sh +source ${scriptDir}/../scripts/common/validate.sh + +function usage { + echo usage: ${script} -o dir -i file -u username -p password [-k] [-e] [-v] [-h] + echo " -i Parameter inputs file, must be specified." + echo " -o Output directory for the generated properties and YAML files, must be specified." + echo " -u Username used in building the Docker image for WebLogic domain in image." + echo " -p Password used in building the Docker image for WebLogic domain in image." + echo " -e Also create the resources in the generated YAML files, optional." + echo " -v Validate the existence of persistentVolumeClaim, optional." + echo " -k Keep what has been previously from cloned https://github.com/oracle/docker-images.git, optional. " + echo " If not specified, this script will always remove existing project directory and clone again." + echo " -h Help" + exit $1 +} + +# +# Parse the command line options +# +doValidation=false +executeIt=false +downloadTools=true +#downloadTools=false +while getopts "evhki:o:u:p:" opt; do + case $opt in + i) valuesInputFile="${OPTARG}" + ;; + o) outputDir="${OPTARG}" + ;; + v) doValidation=true + ;; + e) executeIt=true + ;; + u) username="${OPTARG}" + ;; + p) password="${OPTARG}" + ;; + k) downloadTools=false; + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z ${valuesInputFile} ]; then + echo "${script}: -i must be specified." + missingRequiredOption="true" +fi + +if [ -z ${username} ]; then + echo "${script}: -u must be specified." + missingRequiredOption="true" +fi + +if [ -z ${password} ]; then + echo "${script}: -p must be specified." + missingRequiredOption="true" +fi + +if [ -z ${outputDir} ]; then + echo "${script}: -o must be specified." + missingRequiredOption="true" +fi + +if [ "${missingRequiredOption}" == "true" ]; then + usage 1 +fi + +# +# Function to initialize and validate the output directory +# for the generated properties and yaml files for this domain. +# +function initOutputDir { + domainOutputDir="${outputDir}/weblogic-domains/${domainUID}" + miiWorkDir="${domainOutputDir}/miiWorkDir" + modelDir="${miiWorkDir}/models" + # Create a directory for this domain's output files and model files + mkdir -p ${modelDir} + + removeFileIfExists ${domainOutputDir}/${valuesInputFile} + removeFileIfExists ${domainOutputDir}/create-domain-inputs.yaml + removeFileIfExists ${domainOutputDir}/domain.properties + removeFileIfExists ${domainOutputDir}/domain.yaml +} + +# try to execute docker to see whether docker is available +function validateDockerAvailable { + if ! [ -x "$(command -v docker)" ]; then + validationError "docker is not installed" + fi +} + +# +# Function to setup the environment to create domain +# +function initialize { + + # Validate the required files exist + validateErrors=false + + validateDockerAvailable + validateKubectlAvailable + + if [ -z "${valuesInputFile}" ]; then + validationError "You must use the -i option to specify the name of the inputs parameter file (a modified copy of kubernetes/samples/scripts/create-weblogic-domain/domain-home-in-image/create-domain-inputs.yaml)." + else + if [ ! -f ${valuesInputFile} ]; then + validationError "Unable to locate the input parameters file ${valuesInputFile}" + fi + fi + + if [ -z "${outputDir}" ]; then + validationError "You must use the -o option to specify the name of an existing directory to store the generated properties and yaml files in." + fi + + domainPropertiesInput="${scriptDir}/properties-template.properties" + if [ ! -f ${domainPropertiesInput} ]; then + validationError "The template file ${domainPropertiesInput} for creating a WebLogic domain was not found" + fi + + dcrInput="${scriptDir}/../scripts/common/domain-template.yaml" + if [ ! -f ${dcrInput} ]; then + validationError "The template file ${dcrInput} for creating the domain resource was not found" + fi + + failIfValidationErrors + + validateCommonInputs + + validateBooleanInputParamsSpecified logHomeOnPV + failIfValidationErrors + + initOutputDir + + if [ "${downloadTools}" = true ] ; then + downloadTool oracle/weblogic-deploy-tooling ${miiWorkDir}/weblogic-deploy-tooling.zip + downloadTool oracle/weblogic-image-tool ${miiWorkDir}/weblogic-image-tool.zip + fi +} + +# +# Function to get the dependency tools +# +function downloadTool { + toolLocation=$1 + downloadTo=$2 + downloadlink=$(curl -sL https://github.com/$1/releases/latest | + grep "/$1/releases/download" | awk '{ split($0,a,/href="/); print a[2]}' | cut -d\" -f 1) + echo "@@ Downloading latest '$toolLocation' to '$downloadTo' from 'https://github.com$downloadlink'." + curl -L https://github.com$downloadlink -o $downloadTo +} + + +# +# Function to build model in image +# +function createDomainHome { + + buildApp + cd ${scriptDir} + cp add_os_utils ${miiWorkDir} + cp ${wdtModelFile} ${modelDir}/model.yaml + #if [ "$?" != "0" ]; then + # fail "Copy of model file ${wdtModelFile} failed." + #fi + cp ${wdtModelPropertiesFile} ${modelDir}/model.properties + #if [ "$?" != "0" ]; then + # fail "Copy of model properties file ${wdtModelPropertiesFile} failed." + #fi + + cd ${miiWorkDir} + echo @@ Info: Setting up imagetool and populating its caches + + mkdir -p cache + unzip -o weblogic-image-tool.zip + + IMGTOOL_BIN=${miiWorkDir}/imagetool/bin/imagetool.sh + + # The image tool uses the WLSIMG_CACHEDIR and WLSIMG_BLDIR env vars: + WLSIMG_CACHEDIR=${WORKDIR}/cache + WLSIMG_BLDDIR=${WORKDIR} + + imagetool/bin/imagetool.sh cache deleteEntry --key wdt_latest + imagetool/bin/imagetool.sh cache addInstaller \ + --type wdt --version latest --path weblogic-deploy-tooling.zip + + echo "Info: Starting model image build for '${image}'" + + + # + # Run the image tool to create the image. It will implicitly use the latest WDT binaries + # in the local image tool cache marked with key 'wdt_latest' (see 'cache' commands above). To + # use a different version of WDT, specify '--wdtVersion'. + # + + set -x + imagetool/bin/imagetool.sh update \ + --tag ${image} \ + --fromImage ${domainHomeImageBase} \ + --wdtModel models/model.yaml \ + --wdtVariables models/model.properties \ + --wdtArchive models/archive.zip \ + --wdtModelOnly \ + --wdtDomainType ${wdtDomainType} \ + --additionalBuildCommands add_os_utils + + if [ "$?" != "0" ]; then + fail "Create model in image failed." + fi + + # clean up the generated domain.properties file + rm ${domainPropertiesOutput} + + echo "" + echo "Create domain ${domainName} successfully." +} + +# +# Creating model archive +# + +function buildApp { + cp -r ${scriptDir}/sample_app ${miiWorkDir} + cd ${miiWorkDir}/sample_app/wlsdeploy/applications + rm -f sample_app.ear + jar cvfM sample_app.ear * + + cd ../.. + rm -f ${modelDir}/archive.zip + pwd + zip ../models/archive.zip wlsdeploy/applications/sample_app.ear wlsdeploy/config/amimemappings.properties + +} + +# +# Function to output to the console a summary of the work completed +# +function printSummary { + + # Get the IP address of the kubernetes cluster (into K8S_IP) + getKubernetesClusterIP + + echo "" + echo "Domain ${domainName} was created and will be started by the WebLogic Kubernetes Operator" + echo "" + if [ "${exposeAdminNodePort}" = true ]; then + echo "Administration console access is available at http://${K8S_IP}:${adminNodePort}/console" + fi + if [ "${exposeAdminT3Channel}" = true ]; then + echo "T3 access is available at t3://${K8S_IP}:${t3ChannelPort}" + fi + echo "The following files were generated:" + echo " ${domainOutputDir}/create-domain-inputs.yaml" + echo " ${dcrOutput}" + echo "" + echo "Completed" +} + +# Perform the sequence of steps to create a domain +createDomain true + diff --git a/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/META-INF/MANIFEST.MF b/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..8a636006c23 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: 1.8.0_201 (Oracle Corporation) + diff --git a/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/META-INF/application.xml b/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/META-INF/application.xml new file mode 100644 index 00000000000..c248f89876a --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/META-INF/application.xml @@ -0,0 +1,13 @@ + + + + JSP 2.0 Expression Language Example + JSP 2.0 Expression Language Example + + + ds_war + ds_war + + + diff --git a/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/META-INF/weblogic-application.xml b/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/META-INF/weblogic-application.xml new file mode 100644 index 00000000000..ab962a287df --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/META-INF/weblogic-application.xml @@ -0,0 +1,5 @@ + + + + diff --git a/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/ds_war/WEB-INF/web.xml b/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/ds_war/WEB-INF/web.xml new file mode 100644 index 00000000000..ff4e8b894ea --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/ds_war/WEB-INF/web.xml @@ -0,0 +1,5 @@ + + + + diff --git a/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/ds_war/WEB-INF/weblogic.xml b/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/ds_war/WEB-INF/weblogic.xml new file mode 100644 index 00000000000..bc3ecd9f593 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/ds_war/WEB-INF/weblogic.xml @@ -0,0 +1,13 @@ + + + + + 15 + 60 + + + 1 + true + + diff --git a/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/ds_war/index.jsp b/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/ds_war/index.jsp new file mode 100644 index 00000000000..9eda75fcc7f --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/applications/ds_war/index.jsp @@ -0,0 +1,44 @@ +<%-- Copyright (c) 2020, Oracle Corporation and/or its affiliates. + Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. --%> +<% + out.println("Hello World, you have reached server: " + System.getProperty("weblogic.Name" )); +%> +<%@page import="java.sql.*, java.io.*, javax.sql.DataSource, javax.naming.*"%> +<%! + String dsName = "jdbc/generic1"; + Connection conn = null; +%> +<% + try { + String driver = ""; + String db = ""; + + if (!dsName.equals("")) { + InitialContext ctx = new InitialContext(); + DataSource dataSource = (DataSource) ctx.lookup (dsName); + conn = dataSource.getConnection(); + DatabaseMetaData dmd = conn.getMetaData(); + db = dmd.getDatabaseProductName() + " " + dmd.getDatabaseProductVersion(); + driver = dmd.getDriverName() + " " + dmd.getDriverVersion(); +%> +Successfully looked up and got a connection to <%=dsName%>
    +Database: <%=db%>
    +Driver version: <%=driver%>
    +<% + } + } catch (Exception e) { + PrintWriter pw = new PrintWriter (out); +%> +There was an exeption getting a connection to or looking up the datasource:<%=dsName%>
    +<% + e.printStackTrace (pw); +%> +<% + } finally { + if (conn != null ) { + try { + conn.close(); + } catch (Exception ex) { } + } + } +%> \ No newline at end of file diff --git a/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/config/amimemappings.properties b/integration-tests/src/test/resources/model-in-image/ds_app/wlsdeploy/config/amimemappings.properties new file mode 100644 index 00000000000..e69de29bb2d diff --git a/integration-tests/src/test/resources/model-in-image/jdbc.20.yaml b/integration-tests/src/test/resources/model-in-image/jdbc.20.yaml new file mode 100644 index 00000000000..c06984adf07 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/jdbc.20.yaml @@ -0,0 +1,52 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +domainInfo: + AdminUserName: '@@FILE:/weblogic-operator/secrets/username@@' + AdminPassword: '@@FILE:/weblogic-operator/secrets/password@@' + ServerStartMode: 'prod' + +topology: + Name: domain1 + AdminServerName: "admin-server" + Cluster: + "cluster-1": + DynamicServers: + ServerTemplate: "cluster-1-template" + ServerNamePrefix: "managed-server" + DynamicClusterSize: 5 + MaxDynamicClusterSize: 5 + CalculatedListenPorts: false + Server: + "admin-server": + ListenPort: 7001 + ServerTemplate: + "cluster-1-template": + Cluster: "cluster-1" + ListenPort : '@@PROP:MANSVR_PORT@@' +resources: + JDBCSystemResource: + MyDataSource: + Target: "cluster-1" + JdbcResource: + JDBCDataSourceParams: + JNDIName: jdbc/generic1 + JDBCDriverParams: + DriverName: oracle.jdbc.OracleDriver + URL: 'jdbc:oracle:thin:@//@@PROP:dbcs1.url@@' + PasswordEncrypted: '@@PROP:dbcs1.password@@' + Properties: + user: + Value: '@@PROP:dbcs1.user@@' + oracle.net.CONNECT_TIMEOUT: + Value: 5203 + oracle.jdbc.ReadTimeout: + Value: '@@PROP:read.timeout@@' + JDBCConnectionPoolParams: + MaxCapacity: 50 +appDeployments: + Application: + myear: + SourcePath: wlsdeploy/applications/sample_app.ear + ModuleType: ear + Target: 'cluster-1' \ No newline at end of file diff --git a/integration-tests/src/test/resources/model-in-image/miisection-toaddin-domain-template.yaml b/integration-tests/src/test/resources/model-in-image/miisection-toaddin-domain-template.yaml new file mode 100644 index 00000000000..2089daecb70 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/miisection-toaddin-domain-template.yaml @@ -0,0 +1,31 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# This file need to appended into kubernetes/samples/scripts/common/domain-template.yaml + + + %MII_PREFIX%configuration: + + %MII_PREFIX% model: + # + # Optional configmap for additional models and variable files + # + %MII_CONFIG_MAP_PREFIX% configMap: %MII_CONFIG_MAP% + + # + # wdt domain type for model in image case + # Valid WDT_DOMAIN_TYPE_VALUES are 'WLS', 'JRF', and 'RestrictedJRF' + # + %MII_PREFIX% domainType: %WDT_DOMAIN_TYPE% + %MII_PREFIX% runtimeEncryptionSecret: %WEBLOGIC_CREDENTIALS_SECRET_NAME% + + #opss: + # + # k8 secret for the opss extract wallet. It contains the key passphrase used to extract the wallet + # + #walletPasswordSecret: %DOMAIN_UID%-opss-key-passphrase-secret + # + # opss wallet file secret containing key ewallet.p12 containing the base64 encoded opss wallet + #walletFileSecret: %DOMAIN_UID%-opss-walletfile-secret + # + # diff --git a/integration-tests/src/test/resources/model-in-image/model.cluster.yaml b/integration-tests/src/test/resources/model-in-image/model.cluster.yaml new file mode 100644 index 00000000000..a312562686d --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/model.cluster.yaml @@ -0,0 +1,21 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# A sparce model file to add a Configured Cluster + +topology: + Cluster: + 'cluster-2': + Server: + 'config-managed-server-1': + Cluster: 'cluster-2' + ListenPort: '@@PROP:MANSVR_PORT@@' + 'config-managed-server-2': + Cluster: 'cluster-2' + ListenPort: '@@PROP:MANSVR_PORT@@' + 'config-managed-server-3': + Cluster: 'cluster-2' + ListenPort: '@@PROP:MANSVR_PORT@@' + 'config-managed-server-4': + Cluster: 'cluster-2' + ListenPort: '@@PROP:MANSVR_PORT@@' diff --git a/integration-tests/src/test/resources/model-in-image/model.cm.properties b/integration-tests/src/test/resources/model-in-image/model.cm.properties new file mode 100644 index 00000000000..ab952018a7c --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/model.cm.properties @@ -0,0 +1,4 @@ +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +MANSVR_PORT=9001 diff --git a/integration-tests/src/test/resources/model-in-image/model.config.wls.yaml b/integration-tests/src/test/resources/model-in-image/model.config.wls.yaml new file mode 100644 index 00000000000..927349d8b9a --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/model.config.wls.yaml @@ -0,0 +1,28 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# Model file to configure a Domain with a Configured Cluster +domainInfo: + AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' + AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' + ServerStartMode: prod +topology: + AdminServerName: 'admin-server' + Name: domain1 + Cluster: + 'cluster-1': + Server: + 'admin-server': + ListenPort: 7001 + 'config-managed-server-1': + Cluster: 'cluster-1' + ListenPort: '@@PROP:MANSVR_PORT@@' + 'config-managed-server-2': + Cluster: 'cluster-1' + ListenPort: '@@PROP:MANSVR_PORT@@' + 'config-managed-server-3': + Cluster: 'cluster-1' + ListenPort: '@@PROP:MANSVR_PORT@@' + 'config-managed-server-4': + Cluster: 'cluster-1' + ListenPort: '@@PROP:MANSVR_PORT@@' diff --git a/integration-tests/src/test/resources/model-in-image/model.empty.properties b/integration-tests/src/test/resources/model-in-image/model.empty.properties new file mode 100644 index 00000000000..e69de29bb2d diff --git a/integration-tests/src/test/resources/model-in-image/model.jdbc.image.properties b/integration-tests/src/test/resources/model-in-image/model.jdbc.image.properties new file mode 100644 index 00000000000..0a25bec25c4 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/model.jdbc.image.properties @@ -0,0 +1,9 @@ +# Copyright 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +MANSVR_PORT=8001 +dbcs1.url=mydburl +dbcs1.password=j2ee +dbcs1.user=j2ee +read.timeout=30001 \ No newline at end of file diff --git a/integration-tests/src/test/resources/model-in-image/model.jdbc.image.yaml b/integration-tests/src/test/resources/model-in-image/model.jdbc.image.yaml new file mode 100644 index 00000000000..acd6dee6d29 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/model.jdbc.image.yaml @@ -0,0 +1,52 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +domainInfo: + AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' + AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' + ServerStartMode: 'prod' + +topology: + Name: domain1 + AdminServerName: "admin-server" + Cluster: + "cluster-1": + DynamicServers: + ServerTemplate: "cluster-1-template" + ServerNamePrefix: "managed-server" + DynamicClusterSize: 5 + MaxDynamicClusterSize: 5 + CalculatedListenPorts: false + Server: + "admin-server": + ListenPort: 7001 + ServerTemplate: + "cluster-1-template": + Cluster: "cluster-1" + ListenPort : '@@PROP:MANSVR_PORT@@' +resources: + JDBCSystemResource: + MyDataSource: + Target: "cluster-1" + JdbcResource: + JDBCDataSourceParams: + JNDIName: jdbc/generic1 + JDBCDriverParams: + DriverName: oracle.jdbc.OracleDriver + URL: 'jdbc:oracle:thin:@//@@PROP:dbcs1.url@@' + PasswordEncrypted: '@@PROP:dbcs1.password@@' + Properties: + user: + Value: '@@PROP:dbcs1.user@@' + oracle.net.CONNECT_TIMEOUT: + Value: 5100 + oracle.jdbc.ReadTimeout: + Value: '@@PROP:read.timeout@@' + JDBCConnectionPoolParams: + MaxCapacity: 50 +appDeployments: + Application: + myear: + SourcePath: wlsdeploy/applications/sample_app.ear + ModuleType: ear + Target: 'cluster-1' diff --git a/integration-tests/src/test/resources/model-in-image/model.jdbc.properties b/integration-tests/src/test/resources/model-in-image/model.jdbc.properties new file mode 100644 index 00000000000..c4a86d9c059 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/model.jdbc.properties @@ -0,0 +1,9 @@ +# Copyright 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +MANSVR_PORT=8001 +dbcs1.url=mydburl +dbcs1.password=j2ee +dbcs1.user=j2ee +read.timeout=30002 \ No newline at end of file diff --git a/integration-tests/src/test/resources/model-in-image/model.jdbc.yaml b/integration-tests/src/test/resources/model-in-image/model.jdbc.yaml new file mode 100644 index 00000000000..8c95dc82f4e --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/model.jdbc.yaml @@ -0,0 +1,52 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +domainInfo: + AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' + AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' + ServerStartMode: 'prod' + +topology: + Name: domain1 + AdminServerName: "admin-server" + Cluster: + "cluster-1": + DynamicServers: + ServerTemplate: "cluster-1-template" + ServerNamePrefix: "managed-server" + DynamicClusterSize: 5 + MaxDynamicClusterSize: 5 + CalculatedListenPorts: false + Server: + "admin-server": + ListenPort: 7001 + ServerTemplate: + "cluster-1-template": + Cluster: "cluster-1" + ListenPort : '@@PROP:MANSVR_PORT@@' +resources: + JDBCSystemResource: + MyDataSource: + Target: "cluster-1" + JdbcResource: + JDBCDataSourceParams: + JNDIName: jdbc/generic1 + JDBCDriverParams: + DriverName: oracle.jdbc.OracleDriver + URL: 'jdbc:oracle:thin:@//@@PROP:dbcs1.url@@' + PasswordEncrypted: '@@PROP:dbcs1.password@@' + Properties: + user: + Value: '@@PROP:dbcs1.user@@' + oracle.net.CONNECT_TIMEOUT: + Value: 5200 + oracle.jdbc.ReadTimeout: + Value: '@@PROP:read.timeout@@' + JDBCConnectionPoolParams: + MaxCapacity: 50 +appDeployments: + Application: + myear: + SourcePath: wlsdeploy/applications/sample_app.ear + ModuleType: ear + Target: 'cluster-1' diff --git a/integration-tests/src/test/resources/model-in-image/model.jms.yaml b/integration-tests/src/test/resources/model-in-image/model.jms.yaml new file mode 100644 index 00000000000..39798f73d1d --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/model.jms.yaml @@ -0,0 +1,56 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +resources: + FileStore: + TestFileStore: + Target: 'admin-server' + TestClusterFileStore: + Target: 'cluster-1' + JMSServer: + TestJmsServer: + ProductionPausedAtStartup: false + ConsumptionPausedAtStartup: false + Target: 'admin-server' + PersistentStore: 'TestFileStore' + InsertionPausedAtStartup: false + TestClusterJmsServer: + ProductionPausedAtStartup: false + ConsumptionPausedAtStartup: false + Target: 'cluster-1' + PersistentStore: 'TestClusterFileStore' + InsertionPausedAtStartup: false + + JMSSystemResource: + TestJmsModule: + Target: 'admin-server' + SubDeployment: + TestSubDeployment: + Target: TestJmsServer + JmsResource: + ConnectionFactory: + testCF: + JNDIName: jms/testCF + DefaultTargetingEnabled: true + Queue: + testQueue: + SubDeploymentName: TestSubDeployment + JNDIName: jms/testQueue + testQueue2: + SubDeploymentName: TestSubDeployment + JNDIName: jms/testQueue2 + TestClusterJmsModule: + Target: 'cluster-1' + SubDeployment: + TestClusterSubDeployment: + Target: TestClusterJmsServer + JmsResource: + UniformDistributedQueue: + testUniformQueue: + SubDeploymentName: TestClusterSubDeployment + JNDIName: jms/testUniformQueue + UniformDistributedTopic: + testUniformTopic: + SubDeploymentName: TestClusterSubDeployment + ForwardingPolicy: Partitioned + JNDIName: jms/testUniformTopic diff --git a/integration-tests/src/test/resources/model-in-image/model.jrf.yaml b/integration-tests/src/test/resources/model-in-image/model.jrf.yaml new file mode 100644 index 00000000000..93788a00144 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/model.jrf.yaml @@ -0,0 +1,36 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +domainInfo: + AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' + AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' + ServerStartMode: 'prod' + RCUDbInfo: + rcu_prefix: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_prefix@@' + rcu_schema_password: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_schema_password@@' + rcu_db_conn_string: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_db_conn_string@@' + +topology: + Name: domain1 + AdminServerName: "admin-server" + Cluster: + "cluster-1": + DynamicServers: + ServerTemplate: "cluster-1-template" + ServerNamePrefix: "managed-server" + DynamicClusterSize: 5 + MaxDynamicClusterSize: 5 + CalculatedListenPorts: false + Server: + "admin-server": + ListenPort: 7001 + ServerTemplate: + "cluster-1-template": + Cluster: "cluster-1" + ListenPort : '@@PROP:MANSVR_PORT@@' +appDeployments: + Application: + myear: + SourcePath: wlsdeploy/applications/sample_app.ear + ModuleType: ear + Target: 'cluster-1' diff --git a/integration-tests/src/test/resources/model-in-image/model.mysql.yaml b/integration-tests/src/test/resources/model-in-image/model.mysql.yaml new file mode 100644 index 00000000000..0ebb1ebdf39 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/model.mysql.yaml @@ -0,0 +1,56 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +domainInfo: + AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' + AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' + ServerStartMode: 'prod' + +topology: + Name: domain1 + AdminServerName: "admin-server" + Cluster: + "cluster-1": + DynamicServers: + ServerTemplate: "cluster-1-template" + ServerNamePrefix: "managed-server" + DynamicClusterSize: 5 + MaxDynamicClusterSize: 5 + CalculatedListenPorts: false + Server: + "admin-server": + ListenPort: 7001 + ServerTemplate: + "cluster-1-template": + Cluster: "cluster-1" + ListenPort : '@@PROP:MANSVR_PORT@@' +resources: + JDBCSystemResource: + MyDataSource: + Target: "cluster-1" + JdbcResource: + JDBCDataSourceParams: + JNDIName: jdbc/generic1 + JDBCDriverParams: + DriverName: com.mysql.jdbc.Driver + URL: '@@FILE:/weblogic-operator/config-overrides-secrets/SECRET_NAME/dburl@@' + PasswordEncrypted: '@@FILE:/weblogic-operator/config-overrides-secrets/SECRET_NAME/password@@' + Properties: + user: + Value: '@@FILE:/weblogic-operator/config-overrides-secrets/SECRET_NAME/username@@' + oracle.net.CONNECT_TIMEOUT: + Value: '5200' + DatasourceType: GENERIC + JDBCConnectionPoolParams: + StatementCacheSize: 10 + InitialCapacity: 2 + MinCapacity: 2 + TestTableName: SQL ISVALID + StatementCacheType: LRU + MaxCapacity: 5 +appDeployments: + Application: + mydsear: + SourcePath: wlsdeploy/applications/ds_app.ear + ModuleType: ear + Target: 'cluster-1' diff --git a/integration-tests/src/test/resources/model-in-image/model.properties b/integration-tests/src/test/resources/model-in-image/model.properties new file mode 100644 index 00000000000..819b026c3c9 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/model.properties @@ -0,0 +1,4 @@ +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +MANSVR_PORT=8001 diff --git a/integration-tests/src/test/resources/model-in-image/model.wldf.yaml b/integration-tests/src/test/resources/model-in-image/model.wldf.yaml new file mode 100644 index 00000000000..224ba5ae7a4 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/model.wldf.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +resources: + WLDFSystemResource: + 'TestWldfModule': + Description: WLDF Module for Situational Config Override + Target: 'admin-server' diff --git a/integration-tests/src/test/resources/model-in-image/model.wls.yaml b/integration-tests/src/test/resources/model-in-image/model.wls.yaml new file mode 100644 index 00000000000..967ff9e5807 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/model.wls.yaml @@ -0,0 +1,32 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +domainInfo: + AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' + AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' + ServerStartMode: 'prod' + +topology: + Name: domain1 + AdminServerName: "admin-server" + Cluster: + "cluster-1": + DynamicServers: + ServerTemplate: "cluster-1-template" + ServerNamePrefix: "managed-server" + DynamicClusterSize: 5 + MaxDynamicClusterSize: 5 + CalculatedListenPorts: false + Server: + "admin-server": + ListenPort: 7001 + ServerTemplate: + "cluster-1-template": + Cluster: "cluster-1" + ListenPort : '@@PROP:MANSVR_PORT@@' +appDeployments: + Application: + myear: + SourcePath: wlsdeploy/applications/sample_app.ear + ModuleType: ear + Target: 'cluster-1' diff --git a/integration-tests/src/test/resources/model-in-image/new.jdbc.10.yaml b/integration-tests/src/test/resources/model-in-image/new.jdbc.10.yaml new file mode 100644 index 00000000000..43dec6d2ccb --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/new.jdbc.10.yaml @@ -0,0 +1,52 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +domainInfo: + AdminUserName: '@@FILE:/weblogic-operator/secrets/username@@' + AdminPassword: '@@FILE:/weblogic-operator/secrets/password@@' + ServerStartMode: 'prod' + +topology: + Name: domain1 + AdminServerName: "admin-server" + Cluster: + "cluster-1": + DynamicServers: + ServerTemplate: "cluster-1-template" + ServerNamePrefix: "managed-server" + DynamicClusterSize: 5 + MaxDynamicClusterSize: 5 + CalculatedListenPorts: false + Server: + "admin-server": + ListenPort: 7001 + ServerTemplate: + "cluster-1-template": + Cluster: "cluster-1" + ListenPort : '@@PROP:MANSVR_PORT@@' +resources: + JDBCSystemResource: + MyDataSource: + Target: "cluster-1" + JdbcResource: + JDBCDataSourceParams: + JNDIName: jdbc/generic1 + JDBCDriverParams: + DriverName: oracle.jdbc.OracleDriver + URL: 'jdbc:oracle:thin:@//@@PROP:dbcs1.url@@' + PasswordEncrypted: '@@PROP:dbcs1.password@@' + Properties: + user: + Value: '@@PROP:dbcs1.user@@' + oracle.net.CONNECT_TIMEOUT: + Value: 5201 + oracle.jdbc.ReadTimeout: + Value: '@@PROP:read.timeout@@' + JDBCConnectionPoolParams: + MaxCapacity: 50 +appDeployments: + Application: + myear: + SourcePath: wlsdeploy/applications/sample_app.ear + ModuleType: ear + Target: 'cluster-1' \ No newline at end of file diff --git a/integration-tests/src/test/resources/model-in-image/now.jdbc.10.yaml b/integration-tests/src/test/resources/model-in-image/now.jdbc.10.yaml new file mode 100644 index 00000000000..d15e7fe579d --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/now.jdbc.10.yaml @@ -0,0 +1,52 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +domainInfo: + AdminUserName: '@@FILE:/weblogic-operator/secrets/username@@' + AdminPassword: '@@FILE:/weblogic-operator/secrets/password@@' + ServerStartMode: 'prod' + +topology: + Name: domain1 + AdminServerName: "admin-server" + Cluster: + "cluster-1": + DynamicServers: + ServerTemplate: "cluster-1-template" + ServerNamePrefix: "managed-server" + DynamicClusterSize: 5 + MaxDynamicClusterSize: 5 + CalculatedListenPorts: false + Server: + "admin-server": + ListenPort: 7001 + ServerTemplate: + "cluster-1-template": + Cluster: "cluster-1" + ListenPort : '@@PROP:MANSVR_PORT@@' +resources: + JDBCSystemResource: + MyDataSource: + Target: "cluster-1" + JdbcResource: + JDBCDataSourceParams: + JNDIName: jdbc/generic1 + JDBCDriverParams: + DriverName: oracle.jdbc.OracleDriver + URL: 'jdbc:oracle:thin:@//@@PROP:dbcs1.url@@' + PasswordEncrypted: '@@PROP:dbcs1.password@@' + Properties: + user: + Value: '@@PROP:dbcs1.user@@' + oracle.net.CONNECT_TIMEOUT: + Value: 5202 + oracle.jdbc.ReadTimeout: + Value: '@@PROP:read.timeout@@' + JDBCConnectionPoolParams: + MaxCapacity: 50 +appDeployments: + Application: + myear: + SourcePath: wlsdeploy/applications/sample_app.ear + ModuleType: ear + Target: 'cluster-1' \ No newline at end of file diff --git a/integration-tests/src/test/resources/model-in-image/properties-template.properties b/integration-tests/src/test/resources/model-in-image/properties-template.properties new file mode 100644 index 00000000000..e6df4a4ea32 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/properties-template.properties @@ -0,0 +1,18 @@ +DOMAIN_NAME=%DOMAIN_NAME% +ADMIN_PORT=%ADMIN_PORT% +ADMIN_NAME=%ADMIN_SERVER_NAME% +ADMIN_HOST=wlsadmin +MANAGED_SERVER_PORT=%MANAGED_SERVER_PORT% +MANAGED_SERVER_NAME_BASE=%MANAGED_SERVER_NAME_BASE% +CONFIGURED_MANAGED_SERVER_COUNT=%CONFIGURED_MANAGED_SERVER_COUNT% +CLUSTER_NAME=%CLUSTER_NAME% +DEBUG_PORT=8453 +DB_PORT=1527 +DEBUG_FLAG=true +DERBY_FLAG=true +PRODUCTION_MODE_ENABLED=%PRODUCTION_MODE_ENABLED% +CLUSTER_TYPE=DYNAMIC +JAVA_OPTIONS=%JAVA_OPTIONS% +T3_CHANNEL_PORT=%T3_CHANNEL_PORT% +T3_PUBLIC_ADDRESS=%T3_PUBLIC_ADDRESS% +IMAGE_TAG=%IMAGE_NAME% diff --git a/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/META-INF/MANIFEST.MF b/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..8a636006c23 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: 1.8.0_201 (Oracle Corporation) + diff --git a/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/META-INF/application.xml b/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/META-INF/application.xml new file mode 100644 index 00000000000..104714a7138 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/META-INF/application.xml @@ -0,0 +1,11 @@ + + + JSP 2.0 Expression Language Example + JSP 2.0 Expression Language Example + + + sample_war + sample_war + + + diff --git a/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/META-INF/weblogic-application.xml b/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/META-INF/weblogic-application.xml new file mode 100644 index 00000000000..a9506565fe8 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/META-INF/weblogic-application.xml @@ -0,0 +1,3 @@ + + + diff --git a/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/sample_war/WEB-INF/web.xml b/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/sample_war/WEB-INF/web.xml new file mode 100644 index 00000000000..c2dcf6163b6 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/sample_war/WEB-INF/web.xml @@ -0,0 +1,3 @@ + + + diff --git a/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/sample_war/WEB-INF/weblogic.xml b/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/sample_war/WEB-INF/weblogic.xml new file mode 100644 index 00000000000..ea44151f8d3 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/sample_war/WEB-INF/weblogic.xml @@ -0,0 +1,12 @@ + + + + + 15 + 60 + + + 1 + true + + diff --git a/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/sample_war/index.jsp b/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/sample_war/index.jsp new file mode 100644 index 00000000000..99aece29126 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/applications/sample_war/index.jsp @@ -0,0 +1,3 @@ +<% + out.println("Hello World, you have reached server " + System.getProperty("weblogic.Name" )); +%> diff --git a/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/config/amimemappings.properties b/integration-tests/src/test/resources/model-in-image/sample_app/wlsdeploy/config/amimemappings.properties new file mode 100644 index 00000000000..e69de29bb2d diff --git a/integration-tests/src/test/resources/model-in-image/scripts/verify-ds-secret.py b/integration-tests/src/test/resources/model-in-image/scripts/verify-ds-secret.py new file mode 100644 index 00000000000..6fc91ae9ee1 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/scripts/verify-ds-secret.py @@ -0,0 +1,22 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +connect('weblogic', 'welcome1', 't3://itmiiconfigupdatesecret-domain-3-admin-server:7001') + +# get all JDBC Properties +dsCounter = 0 +allJDBCResources = cmo.getJDBCSystemResources() +for jdbcResource in allJDBCResources: + dsCounter = dsCounter + 1 + dsname = jdbcResource.getName() + dsResource = jdbcResource.getJDBCResource() + dsJNDIname = dsResource.getJDBCDataSourceParams().getJNDINames()#[0] + jdbcurl = dsResource.getJDBCDriverParams().getUrl() + user = get("/JDBCSystemResources/"+ dsname +"/Resource/" + dsname + "/JDBCDriverParams/" + dsname + "/Properties/" + dsname + "/Properties/user/Value") + + print 'datasource.name.' + str(dsCounter) +'=' + str(dsname) + print 'datasource.jndiname.' + str(dsCounter) + '=' + str(dsJNDIname) + print 'datasource.jdbcurl.' + str(dsCounter) + '=' + jdbcurl + print 'datasource.username.' + str(dsCounter) + '=' + str(user) +disconnect() +exit() \ No newline at end of file diff --git a/integration-tests/src/test/resources/model-in-image/scripts/verify-jdbc-resource.py b/integration-tests/src/test/resources/model-in-image/scripts/verify-jdbc-resource.py new file mode 100644 index 00000000000..a9a1ee58b00 --- /dev/null +++ b/integration-tests/src/test/resources/model-in-image/scripts/verify-jdbc-resource.py @@ -0,0 +1,38 @@ +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +connect('weblogic', 'welcome1', 't3://DOMAINNAME-admin-server:7001') + +# get all JDBC Properties +dsCounter = 0 +allJDBCResources = cmo.getJDBCSystemResources() +for jdbcResource in allJDBCResources: + dsCounter = dsCounter + 1 + dsname = jdbcResource.getName() + dsResource = jdbcResource.getJDBCResource() + dsJNDIname = dsResource.getJDBCDataSourceParams().getJNDINames()#[0] + dsDriver = dsResource.getJDBCDriverParams().getDriverName() + conn = dsResource.getJDBCDriverParams().getUrl() + dsInitialCap = dsResource.getJDBCConnectionPoolParams().getInitialCapacity() + dsMaxCap = dsResource.getJDBCConnectionPoolParams().getMaxCapacity() + dsParams = dsResource.getJDBCDataSourceParams() + dsProps = dsResource.getJDBCDriverParams().getProperties() + dsParams = dsResource.getJDBCConnectionPoolParams() + + user = get("/JDBCSystemResources/"+ dsname +"/Resource/" + dsname + "/JDBCDriverParams/" + dsname + "/Properties/" + dsname + "/Properties/user/Value") + readTimeOut = get("/JDBCSystemResources/"+ dsname +"/Resource/" + dsname + "/JDBCDriverParams/" + dsname + "/Properties/" + dsname + "/Properties/oracle.jdbc.ReadTimeout/Value") + connTimeOut = get("/JDBCSystemResources/"+ dsname +"/Resource/" + dsname + "/JDBCDriverParams/" + dsname + "/Properties/" + dsname + "/Properties/oracle.net.CONNECT_TIMEOUT/Value") + + print 'datasource.name.' + str(dsCounter) +'=' + str(dsname) + print 'datasource.jndiname.' + str(dsCounter) + '=' + str(dsJNDIname) + print 'datasource.driver.class.' + str(dsCounter) + '=' + dsDriver + print 'datasource.url.' + str(dsCounter) + '=' + conn + print 'datasource.initialCapacity.' + str(dsCounter) + '=' + str(dsInitialCap) + print 'datasource.maxCapacity.' + str(dsCounter) + '=' + str(dsMaxCap) + print 'datasource.readTimeout.' + str(dsCounter) + '=' + readTimeOut + print 'datasource.connectionTimeout.' + str(dsCounter) + '=' + connTimeOut + print 'datasource.username.' + str(dsCounter) + '=' + str(user) + print 'datasource.dsProps.' + str(dsCounter) + '=' + str(dsProps) + print 'datasource.dsParams.' + str(dsCounter) + '=' + str(dsParams) +disconnect() +exit() \ No newline at end of file diff --git a/integration-tests/src/test/resources/webhook/webhook-deployment.yaml b/integration-tests/src/test/resources/webhook/webhook-deployment.yaml index 59e2338592f..4cc5b20034f 100755 --- a/integration-tests/src/test/resources/webhook/webhook-deployment.yaml +++ b/integration-tests/src/test/resources/webhook/webhook-deployment.yaml @@ -46,7 +46,7 @@ subjects: namespace: monitortestns --- -apiVersion: extensions/v1beta1 +apiVersion: apps/v1 kind: Deployment metadata: labels: diff --git a/json-schema-maven-plugin/pom.xml b/json-schema-maven-plugin/pom.xml index 3d096e63100..2682af71f34 100644 --- a/json-schema-maven-plugin/pom.xml +++ b/json-schema-maven-plugin/pom.xml @@ -7,7 +7,7 @@ operator-parent oracle.kubernetes - 2.6.0 + 3.0.0 jsonschema-maven-plugin @@ -23,7 +23,7 @@ org.apache.maven maven-plugin-api - 3.6.1 + 3.6.3 org.apache.maven.plugin-tools diff --git a/json-schema/pom.xml b/json-schema/pom.xml index 8cbd978fc9e..e7deda7e976 100644 --- a/json-schema/pom.xml +++ b/json-schema/pom.xml @@ -7,7 +7,7 @@ operator-parent oracle.kubernetes - 2.6.0 + 3.0.0 json-schema diff --git a/json-schema/src/main/java/oracle/kubernetes/json/SchemaGenerator.java b/json-schema/src/main/java/oracle/kubernetes/json/SchemaGenerator.java index e66724fba44..e481a149196 100644 --- a/json-schema/src/main/java/oracle/kubernetes/json/SchemaGenerator.java +++ b/json-schema/src/main/java/oracle/kubernetes/json/SchemaGenerator.java @@ -59,6 +59,9 @@ public class SchemaGenerator { // if true, generate the top-level schema version reference private boolean includeSchemaReference = true; + // suppress descriptions for any contained packages + private Collection suppressDescriptionForPackages = new ArrayList<>(); + /** * Returns a pretty-printed string corresponding to a generated schema. * @@ -149,6 +152,14 @@ public void setIncludeSchemaReference(boolean includeSchemaReference) { this.includeSchemaReference = includeSchemaReference; } + /** + * Suppress descriptions for fields from these packages. + * @param packageName Package name + */ + public void addPackageToSuppressDescriptions(String packageName) { + this.suppressDescriptionForPackages.add(packageName); + } + /** * Generates an object representing a JSON schema for the specified class. * @@ -246,6 +257,9 @@ private boolean isNumeric(Class type) { } private String getDescription(Field field) { + if (suppressDescriptionForPackages.contains(field.getDeclaringClass().getPackageName())) { + return null; + } Description description = field.getAnnotation(Description.class); if (description != null) { return description.value(); @@ -268,6 +282,9 @@ private String getDescription(Field field) { } private String getDescription(Class someClass) { + if (suppressDescriptionForPackages.contains(someClass.getPackageName())) { + return null; + } Description description = someClass.getAnnotation(Description.class); if (description != null) { return description.value(); diff --git a/kindtest.sh b/kindtest.sh index cf27d4bfd21..14f0a192d62 100755 --- a/kindtest.sh +++ b/kindtest.sh @@ -36,7 +36,7 @@ script="${BASH_SOURCE[0]}" scriptDir="$( cd "$( dirname "${script}" )" && pwd )" function usage { - echo "usage: ${script} [-v ] [-n ] [-o ] [-t ] [-h]" + echo "usage: ${script} [-v ] [-n ] [-o ] [-t ] [-c ] [-p true|false] [-x ] [-h]" echo " -v Kubernetes version (optional) " echo " (default: 1.15.11, supported values: 1.18, 1.18.2, 1.17, 1.17.5, 1.16, 1.16.9, 1.15, 1.15.11, 1.14, 1.14.10) " echo " -n Kind cluster name (optional) " @@ -45,6 +45,12 @@ function usage { echo " (default: \${WORKSPACE}/logdir/\${BUILD_TAG}, if \${WORKSPACE} defined, else /scratch/\${USER}/kindtest) " echo " -t Test filter (optional) " echo " (default: **/It*) " + echo " -c CNI implementation (optional) " + echo " (default: kindnet, supported values: kindnet, calico) " + echo " -p Run It classes in parallel" + echo " (default: false) " + echo " -x Number of threads to run the classes in parallel" + echo " (default: 2) " echo " -h Help" exit $1 } @@ -57,8 +63,11 @@ else outdir="${WORKSPACE}/logdir/${BUILD_TAG}" fi test_filter="**/It*" +cni_implementation="kindnet" +parallel_run="false" +threads="2" -while getopts ":h:n:o:t:v:" opt; do +while getopts ":h:n:o:t:v:c:x:p:" opt; do case $opt in v) k8s_version="${OPTARG}" ;; @@ -68,6 +77,12 @@ while getopts ":h:n:o:t:v:" opt; do ;; t) test_filter="${OPTARG}" ;; + c) cni_implementation="${OPTARG}" + ;; + x) threads="${OPTARG}" + ;; + p) parallel_run="${OPTARG}" + ;; h) usage 0 ;; *) usage 1 @@ -87,6 +102,18 @@ fi echo "Using Kubernetes version: ${k8s_version}" +disableDefaultCNI="false" +if [ "${cni_implementation}" = "calico" ]; then + if [ "${k8s_version}" = "1.15" ] || [ "${k8s_version}" = "1.15.11" ] || [ "${k8s_version}" = "1.14" ] || [ "${k8s_version}" = "1.14.10" ]; then + echo "Calico CNI is not supported with Kubernetes versions below 1.16." + exit 1 + fi + disableDefaultCNI="true" +elif [ "${cni_implementation}" != "kindnet" ]; then + echo "Unsupported CNI implementation: ${cni_implementation}" + exit 1 +fi + mkdir -m777 -p "${outdir}" export RESULT_ROOT="${outdir}/wl_k8s_test_results" if [ -d "${RESULT_ROOT}" ]; then @@ -137,6 +164,9 @@ echo 'Create a cluster with the local registry enabled in containerd' cat <&1 | tee "${RESULT_ROOT}/kindtest.log" +echo "Running mvn -Dit.test=${test_filter} -DPARALLEL_CLASSES=${parallel_run} -DNUMBER_OF_THREADS=${threads} -pl new-integration-tests -P integration-tests verify" +time mvn -Dit.test="${test_filter}" -DPARALLEL_CLASSES="${parallel_run}" -DNUMBER_OF_THREADS="${threads}" -pl new-integration-tests -P integration-tests verify 2>&1 | tee "${RESULT_ROOT}/kindtest.log" diff --git a/kubernetes/charts/weblogic-operator/Chart.yaml b/kubernetes/charts/weblogic-operator/Chart.yaml index 27c24664dc8..267a63cf10f 100644 --- a/kubernetes/charts/weblogic-operator/Chart.yaml +++ b/kubernetes/charts/weblogic-operator/Chart.yaml @@ -3,5 +3,5 @@ name: weblogic-operator apiVersion: v1 -version: 2.6.0 +version: 3.0.0 description: Helm chart for configuring the WebLogic operator. diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-domain-admin.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-domain-admin.tpl index d2c022856ce..01de566bf00 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-domain-admin.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-domain-admin.tpl @@ -17,7 +17,6 @@ metadata: name: {{ list .Release.Namespace "weblogic-operator-clusterrole-domain-admin" | join "-" | quote }} {{- end }} labels: - weblogic.resourceVersion: "operator-v2" weblogic.operatorName: {{ .Release.Namespace | quote }} rules: - apiGroups: [""] diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-general.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-general.tpl index db9f969bea5..5e7e506d60b 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-general.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-general.tpl @@ -17,7 +17,6 @@ metadata: name: {{ list .Release.Namespace "weblogic-operator-clusterrole-general" | join "-" | quote }} {{- end }} labels: - weblogic.resourceVersion: "operator-v2" weblogic.operatorName: {{ .Release.Namespace | quote }} rules: {{- if not .dedicated }} diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-namespace.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-namespace.tpl index fe81323c2b6..d94c57d632e 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-namespace.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-namespace.tpl @@ -17,7 +17,6 @@ metadata: name: {{ list .Release.Namespace "weblogic-operator-clusterrole-namespace" | join "-" | quote }} {{- end }} labels: - weblogic.resourceVersion: "operator-v2" weblogic.operatorName: {{ .Release.Namespace | quote }} rules: - apiGroups: [""] diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-nonresource.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-nonresource.tpl index 2e360c4cce7..db79983dc30 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-nonresource.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-nonresource.tpl @@ -8,7 +8,6 @@ apiVersion: "rbac.authorization.k8s.io/v1" metadata: name: {{ list .Release.Namespace "weblogic-operator-clusterrole-nonresource" | join "-" | quote }} labels: - weblogic.resourceVersion: "operator-v2" weblogic.operatorName: {{ .Release.Namespace | quote }} rules: - nonResourceURLs: ["/version/*"] diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-operator-admin.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-operator-admin.tpl index 3b72ddee78a..52cce5ae46c 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-operator-admin.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-operator-admin.tpl @@ -17,7 +17,6 @@ metadata: name: {{ list .Release.Namespace "weblogic-operator-clusterrole-operator-admin" | join "-" | quote }} {{- end }} labels: - weblogic.resourceVersion: "operator-v2" weblogic.operatorName: {{ .Release.Namespace | quote }} rules: - apiGroups: [""] diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-auth-delegator.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-auth-delegator.tpl index 38f39376f2f..8fe94a4a05e 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-auth-delegator.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-auth-delegator.tpl @@ -12,7 +12,6 @@ kind: "ClusterRoleBinding" metadata: labels: weblogic.operatorName: {{ .Release.Namespace | quote}} - weblogic.resourceVersion: "operator-v2" {{- if .dedicated }} name: "weblogic-operator-rolebinding-auth-delegator" namespace: {{ .Release.Namespace | quote }} diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-discovery.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-discovery.tpl index a4cf6772bc6..d6cd47831ab 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-discovery.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-discovery.tpl @@ -12,7 +12,6 @@ kind: "ClusterRoleBinding" metadata: labels: weblogic.operatorName: {{ .Release.Namespace | quote }} - weblogic.resourceVersion: "operator-v2" {{- if .dedicated }} name: "weblogic-operator-rolebinding-discovery" namespace: {{ .Release.Namespace | quote }} diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-general.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-general.tpl index cc17cd8256c..984e05d72f6 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-general.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-general.tpl @@ -12,7 +12,6 @@ kind: "ClusterRoleBinding" metadata: labels: weblogic.operatorName: {{ .Release.Namespace | quote }} - weblogic.resourceVersion: "operator-v2" {{- if .dedicated }} name: "weblogic-operator-rolebinding-general" namespace: {{ .Release.Namespace | quote }} diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-nonresource.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-nonresource.tpl index aa258bade2d..3d06f7021dd 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-nonresource.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-nonresource.tpl @@ -8,7 +8,6 @@ kind: "ClusterRoleBinding" metadata: labels: weblogic.operatorName: {{ .Release.Namespace | quote }} - weblogic.resourceVersion: "operator-v2" name: {{ list .Release.Namespace "weblogic-operator-clusterrolebinding-nonresource" | join "-" | quote }} roleRef: apiGroup: "rbac.authorization.k8s.io" diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-cm.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-cm.tpl index 5958c53f140..a11b0446632 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-cm.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-cm.tpl @@ -22,7 +22,6 @@ kind: "ConfigMap" metadata: labels: weblogic.operatorName: {{ .Release.Namespace | quote }} - weblogic.resourceVersion: "operator-v2" name: "weblogic-operator-cm" namespace: {{ .Release.Namespace | quote }} {{- end }} diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-dep.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-dep.tpl index 07796869b12..f737078f506 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-dep.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-dep.tpl @@ -9,18 +9,15 @@ metadata: name: "weblogic-operator" namespace: {{ .Release.Namespace | quote }} labels: - weblogic.resourceVersion: "operator-v2" weblogic.operatorName: {{ .Release.Namespace | quote }} spec: selector: matchLabels: - weblogic.resourceVersion: "operator-v2" weblogic.operatorName: {{ .Release.Namespace | quote }} replicas: 1 template: metadata: labels: - weblogic.resourceVersion: "operator-v2" weblogic.operatorName: {{ .Release.Namespace | quote }} app: "weblogic-operator" spec: diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-external-svc.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-external-svc.tpl index 9c18d81721f..4f2f53aaedc 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-external-svc.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-external-svc.tpl @@ -10,7 +10,6 @@ metadata: name: "external-weblogic-operator-svc" namespace: {{ .Release.Namespace | quote }} labels: - weblogic.resourceVersion: "operator-v2" weblogic.operatorName: {{ .Release.Namespace | quote }} spec: type: "NodePort" diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-internal-svc.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-internal-svc.tpl index 26dbba48293..54e47504e8a 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-internal-svc.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-internal-svc.tpl @@ -9,7 +9,6 @@ metadata: name: "internal-weblogic-operator-svc" namespace: {{ .Release.Namespace | quote }} labels: - weblogic.resourceVersion: "operator-v2" weblogic.operatorName: {{ .Release.Namespace | quote }} spec: type: "ClusterIP" diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-role.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-role.tpl index 9a901efa35b..2de25bce3eb 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-role.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-role.tpl @@ -9,7 +9,6 @@ metadata: name: "weblogic-operator-role" namespace: {{ .Release.Namespace | quote }} labels: - weblogic.resourceVersion: "operator-v2" weblogic.operatorName: {{ .Release.Namespace | quote }} rules: - apiGroups: [""] diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding-namespace.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding-namespace.tpl index 79eaf6b3ea8..403452b1526 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding-namespace.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding-namespace.tpl @@ -9,7 +9,6 @@ metadata: name: "weblogic-operator-rolebinding-namespace" namespace: {{ .domainNamespace | quote }} labels: - weblogic.resourceVersion: "operator-v2" weblogic.operatorName: {{ .Release.Namespace | quote }} subjects: - kind: "ServiceAccount" diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding.tpl index 6f545b8a638..192b8e048f3 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding.tpl @@ -9,7 +9,6 @@ metadata: name: "weblogic-operator-rolebinding" namespace: {{ .Release.Namespace | quote }} labels: - weblogic.resourceVersion: "operator-v2" weblogic.operatorName: {{ .Release.Namespace | quote }} subjects: - kind: "ServiceAccount" diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-secret.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-secret.tpl index cc6313c76a1..775bdc665e3 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-secret.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-secret.tpl @@ -12,7 +12,6 @@ data: metadata: labels: weblogic.operatorName: {{ .Release.Namespace | quote }} - weblogic.resourceVersion: "operator-v2" name: "weblogic-operator-secrets" namespace: {{ .Release.Namespace | quote }} type: "Opaque" diff --git a/kubernetes/charts/weblogic-operator/values.yaml b/kubernetes/charts/weblogic-operator/values.yaml index 7e959cf1fce..e05666cf1d9 100644 --- a/kubernetes/charts/weblogic-operator/values.yaml +++ b/kubernetes/charts/weblogic-operator/values.yaml @@ -25,12 +25,12 @@ domainNamespaces: - "default" # image specifies the docker image containing the operator code. -image: "oracle/weblogic-kubernetes-operator:2.6.0" +image: "oracle/weblogic-kubernetes-operator:3.0.0" # imagePullPolicy specifies the image pull policy for the operator docker image. imagePullPolicy: "IfNotPresent" -# imagePullSecrets contains an optional list of Kubernetes secrets, in the operator's namepace, +# imagePullSecrets contains an optional list of Kubernetes secrets, in the operator's namespace, # that are needed to access the registry containing the operator Docker image. # The customer is responsible for creating the secret. # If no secrets are required, then omit this property. @@ -48,7 +48,7 @@ imagePullPolicy: "IfNotPresent" # property. # # If set to true, then the customer must provide the SSL certificate and private key for -# the operator's external REST intervace by specifying the 'externalOperatorCert' and +# the operator's external REST interface by specifying the 'externalOperatorCert' and # 'externalOperatorKey' properties. externalRestEnabled: false @@ -58,7 +58,7 @@ externalRestEnabled: false externalRestHttpsPort: 31001 # The name of the secret used to store the certificate and private key to use for the external operator REST https interface. -# The secret has to be created in the same namespace of the welbogic operator. +# The secret has to be created in the same namespace of the WebLogic operator. # This parameter is required if 'externalRestEnabled' is true. Otherwise, it is ignored. # As example, an external rest identity can be created using the following sample script # kubernetes/samples/scripts/rest/generate-external-rest-identity.sh @@ -108,9 +108,9 @@ elasticSearchPort: 9200 # dns1123Fields overrides the default list of field names that the operator # converts to DNS-1123 legal values when replacing variable references in the -# domain resource. The default list can be found inside the class Legalnames +# domain resource. The default list can be found inside the class LegalNames # in the oracle.kubernetes.operator.helpers package. -# Supply a comma seperated list of field names to customize the list of fields +# Supply a comma separated list of field names to customize the list of fields # such as "name, claimName, volumeName", or leave it commented out to use # the default list of field names. # dns1123Fields: "" diff --git a/kubernetes/crd/domain-crd.yaml b/kubernetes/crd/domain-crd.yaml index 93fc7883954..a6000084c02 100644 --- a/kubernetes/crd/domain-crd.yaml +++ b/kubernetes/crd/domain-crd.yaml @@ -16,198 +16,243 @@ spec: preserveUnknownFields: false scope: Namespaced versions: - - name: v7 + - name: v8 schema: openAPIV3Schema: type: object properties: spec: type: object - description: DomainSpec is a description of a domain. + description: The specification of the operation of the WebLogic domain. + Required. properties: - serverStartState: - type: string - description: The state in which the server is to be started. Use ADMIN - if server should start in the admin state. Defaults to RUNNING. - enum: - - RUNNING - - ADMIN - image: - type: string - description: The WebLogic Docker image; required when domainHomeInImage - is true; otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4. - imagePullPolicy: - type: string - description: The image pull policy for the WebLogic Docker image. - Legal values are Always, Never and IfNotPresent. Defaults to Always - if image ends in :latest, IfNotPresent otherwise. - enum: - - Always - - Never - - IfNotPresent configuration: type: object - description: Properties affecting the WebLogic domain configuration. + description: Models and overrides affecting the WebLogic domain configuration. properties: + overrideDistributionStrategy: + type: string + description: Determines how updated configuration overrides are + distributed to already running WebLogic Server instances following + introspection when the `domainHomeSourceType` is PersistentVolume + or Image. Configuration overrides are generated during introspection + from Secrets, the `overrideConfigMap` field, and WebLogic domain + topology. Legal values are DYNAMIC, which means that the operator + will distribute updated configuration overrides dynamically + to running servers, and ON_RESTART, which means that servers + will use updated configuration overrides only after the server's + next restart. The selection of ON_RESTART will not cause servers + to restart when there are updated configuration overrides available. + See also `domains.spec.introspectVersion`. Defaults to DYNAMIC. + enum: + - DYNAMIC + - ON_RESTART + opss: + type: object + description: Settings for OPSS security. + properties: + walletFileSecret: + type: string + description: Name of a Secret containing the OPSS key wallet + file, which must be in a field named `walletFile`. Use this + to allow a JRF domain to reuse its entries in the RCU database. + This allows you to specify a wallet file that was obtained + from the domain home after the domain was booted for the + first time. + walletPasswordSecret: + type: string + description: Name of a Secret containing the OPSS key passphrase, + which must be in a field named `walletPassword`. Used to + encrypt and decrypt the wallet that is used for accessing + the domain's entries in its RCU database. + model: + type: object + description: Model in image model files and properties. + properties: + runtimeEncryptionSecret: + type: string + description: Runtime encryption secret. Required when `domainHomeSourceType` + is set to FromModel. + domainType: + type: string + description: 'WebLogic Deploy Tooling domain type. Legal values: + WLS, RestrictedJRF, JRF. Defaults to WLS.' + enum: + - WLS + - RestrictedJRF + - JRF + configMap: + type: string + description: Name of a ConfigMap containing the WebLogic Deploy + Tooling model. + secrets: + type: array + description: A list of names of the Secrets for WebLogic configuration + overrides or model. If this field is specified, then the value + of `spec.configOverrideSecrets` is ignored. + items: + type: string istio: type: object description: The Istio service mesh integration settings. properties: readinessPort: type: number - description: The WebLogic readiness port for Istio. Defaults - to 8888. Not required. + description: The operator will create a WebLogic network access + point with this port that will then be exposed from the + container running the WebLogic Server instance. The readiness + probe will use this network access point to verify that + the server instance is ready for application traffic. Defaults + to 8888. enabled: type: boolean description: True, if this domain is deployed under an Istio - service mesh. Defaults to true when the 'istio' element - is included. Not required. - replicas: - type: number - description: The number of managed servers to run in any cluster that - does not specify a replica count. - minimum: 0.0 + service mesh. Defaults to true when the `istio` field is + specified. + overridesConfigMap: + type: string + description: The name of the ConfigMap for WebLogic configuration + overrides. If this field is specified, then the value of `spec.configOverrides` + is ignored. + introspectorJobActiveDeadlineSeconds: + type: number + description: The introspector job timeout value in seconds. If + this field is specified, then the operator's ConfigMap `data.introspectorJobActiveDeadlineSeconds` + value is ignored. Defaults to 120 seconds. configOverrideSecrets: type: array - description: A list of names of the secrets for optional WebLogic - configuration overrides. + description: Deprecated. Use `configuration.secrets` instead. Ignored + if `configuration.secrets` is specified. A list of names of the + Secrets for optional WebLogic configuration overrides. items: type: string imagePullSecrets: type: array - description: A list of image pull secrets for the WebLogic Docker + description: A list of image pull Secrets for the WebLogic container image. items: - description: LocalObjectReference contains enough information to - let you locate the referenced object inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string - domainHomeInImage: - type: boolean - description: True indicates that the domain home file system is contained - in the Docker image specified by the image field. False indicates - that the domain home file system is located on a persistent volume. domainUID: type: string - description: Domain unique identifier. Must be unique across the Kubernetes - cluster. Not required. Defaults to the value of metadata.name. + description: Domain unique identifier. It is recommended that this + value be unique to assist in future work to identify related domains + in active-passive scenarios across data centers; however, it is + only required that this value be unique within the namespace, similarly + to the names of Kubernetes resources. This value is distinct and + need not match the domain name from the WebLogic domain configuration. + Defaults to the value of `metadata.name`. pattern: ^[a-z0-9-.]{1,253}$ - serverStartPolicy: - type: string - description: The strategy for deciding whether to start a server. - Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED. - enum: - - NEVER - - IF_NEEDED - - ADMIN_ONLY - restartVersion: - type: string - description: If present, every time this value is updated the operator - will restart the required servers. - dataHome: - type: string - description: 'An optional, in-pod location for data storage of default - and custom file stores. If dataHome is not specified or its value - is either not set or empty (e.g. dataHome: "") then the data storage - directories are determined from the WebLogic domain home configuration.' - configOverrides: - type: string - description: The name of the config map for optional WebLogic configuration - overrides. serverService: type: object - description: Customization affecting ClusterIP Kubernetes services - for WebLogic Server instances. + description: Customization affecting the generation of Kubernetes + Services for WebLogic Server instances. properties: precreateService: type: boolean - description: If true, operator will create server services even - for server instances without running pods. + description: If true, the operator will create Services even for + Managed Server instances without running Pods. annotations: type: object additionalProperties: type: string - description: The annotations to be attached to generated resources. + description: The annotations to be added to generated resources. labels: type: object additionalProperties: type: string - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. + description: The labels to be added to generated resources. The + label names must not start with "weblogic.". domainHome: type: string - description: The folder for the WebLogic Domain. Not required. Defaults - to /shared/domains/domains/domainUID if domainHomeInImage is false. - Defaults to /u01/oracle/user_projects/domains/ if domainHomeInImage - is true. - logHomeEnabled: + description: The directory containing the WebLogic domain configuration + inside the container. Defaults to /shared/domains/domains/ + if `domainHomeSourceType` is PersistentVolume. Defaults to /u01/oracle/user_projects/domains/ + if `domainHomeSourceType` is Image. Defaults to /u01/domains/ + if `domainHomeSourceType` is FromModel. + domainHomeSourceType: + type: string + description: 'Domain home file system source type: Legal values: Image, + PersistentVolume, FromModel. Image indicates that the domain home + file system is present in the container image specified by the `image` + field. PersistentVolume indicates that the domain home file system + is located on a persistent volume. FromModel indicates that the + domain home file system will be created and managed by the operator + based on a WDT domain model. If this field is specified, it overrides + the value of `domainHomeInImage`. If both fields are unspecified, + then `domainHomeSourceType` defaults to Image.' + enum: + - Image + - PersistentVolume + - FromModel + httpAccessLogInLogHome: type: boolean - description: 'Specified whether the log home folder is enabled. Not - required. Defaults to true if domainHomeInImage is false. Defaults - to false if domainHomeInImage is true. ' + description: Specifies whether the server HTTP access log files will + be written to the same directory specified in `logHome`. Otherwise, + server HTTP access log files will be written to the directory configured + in the WebLogic domain configuration. Defaults to true. webLogicCredentialsSecret: type: object - description: The name of a pre-created Kubernetes secret, in the domain's - namespace, that holds the username and password needed to boot WebLogic - Server under the 'username' and 'password' fields. + description: Reference to a Kubernetes Secret that contains the user + name and password needed to boot a WebLogic Server under the `username` + and `password` fields. properties: name: type: string - description: Name is unique within a namespace to reference a - secret resource. namespace: type: string - description: Namespace defines the space within which the secret - name must be unique. adminServer: type: object - description: Configuration for the Administration Server. + description: Lifecycle options for the Administration Server, including + Java options, environment variables, additional Pod content, and + which channels or network access points should be exposed using + a NodePort Service. properties: serverStartState: type: string - description: The state in which the server is to be started. Use - ADMIN if server should start in the admin state. Defaults to - RUNNING. + description: The WebLogic runtime state in which the server is + to be started. Use ADMIN if the server should start in the admin + state. Defaults to RUNNING. enum: - RUNNING - ADMIN serverService: type: object - description: Customization affecting ClusterIP Kubernetes services - for WebLogic Server instances. + description: Customization affecting the generation of Kubernetes + Services for WebLogic Server instances. properties: precreateService: type: boolean - description: If true, operator will create server services - even for server instances without running pods. + description: If true, the operator will create Services even + for Managed Server instances without running Pods. annotations: type: object additionalProperties: type: string - description: The annotations to be attached to generated resources. + description: The annotations to be added to generated resources. labels: type: object additionalProperties: type: string - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. + description: The labels to be added to generated resources. + The label names must not start with "weblogic.". serverPod: type: object - description: Configuration affecting server pods. + description: Customization affecting the generation of Pods for + WebLogic Server instances. properties: nodeName: type: string - description: NodeName is a request to schedule this pod onto - a specific node. If it is non-empty, the scheduler simply + description: NodeName is a request to schedule this Pod onto + a specific Node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits - resource requirements. + the resource requirements. See `kubectl explain pods.spec.nodeName`. livenessProbe: type: object description: Settings for the liveness probe associated with - a server. + a WebLogic Server instance. properties: periodSeconds: type: number @@ -223,458 +268,184 @@ spec: readinessGates: type: array description: 'If specified, all readiness gates will be evaluated - for pod readiness. A pod is ready when all its containers + for Pod readiness. A Pod is ready when all its containers are ready AND all conditions specified in the readiness - gates have status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + gates have a status equal to "True". More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md.' items: - description: PodReadinessGate contains the reference to - a pod condition type: object properties: conditionType: - description: ConditionType refers to a condition in - the pod's condition list with matching type. type: string required: - conditionType serviceAccountName: type: string description: Name of the ServiceAccount to be used to run - this pod. If it is not set, default ServiceAccount will + this Pod. If it is not set, default ServiceAccount will be used. The ServiceAccount has to exist at the time the - pod is created. + Pod is created. See `kubectl explain pods.spec.serviceAccountName`. podSecurityContext: type: object - description: Pod-level security attributes. + description: Pod-level security attributes. See `kubectl explain + pods.spec.securityContext`. properties: runAsUser: type: number - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence - for that container. seLinuxOptions: type: object - description: SELinuxOptions are the labels to be applied - to the container properties: role: type: string - description: Role is a SELinux role label that applies - to the container. level: type: string - description: Level is SELinux level label that applies - to the container. type: type: string - description: Type is a SELinux type label that applies - to the container. user: type: string - description: User is a SELinux user label that applies - to the container. fsGroup: type: number - description: 'A special supplemental group that applies - to all containers in a pod. Some volume types allow - the Kubelet to change the ownership of that volume to - be owned by the pod: 1. The owning GID will be the - FSGroup 2. The setgid bit is set (new files created - in the volume will be owned by FSGroup) 3. The permission - bits are OR''d with rw-rw---- If unset, the Kubelet - will not modify the ownership and permissions of any - volume.' windowsOptions: type: object - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. properties: gmsaCredentialSpec: type: string - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. runAsUserName: type: string - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and - it is only honored by servers that enable the WindowsRunAsUserName - feature flag. gmsaCredentialSpecName: type: string - description: GMSACredentialSpecName is the name of - the GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. supplementalGroups: type: array - description: A list of groups applied to the first process - run in each container, in addition to the container's - primary GID. If unspecified, no groups will be added - to any container. items: type: number runAsGroup: type: number - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in SecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence for that container. runAsNonRoot: type: boolean - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if it - does. If unset or false, no such validation will be - performed. May also be set in SecurityContext. If set - in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. sysctls: type: array - description: Sysctls hold a list of namespaced sysctls - used for the pod. Pods with unsupported sysctls (by - the container runtime) might fail to launch. items: - description: Sysctl defines a kernel parameter to be - set type: object properties: name: - description: Name of a property to set type: string value: - description: Value of a property to set type: string required: - name - value priorityClassName: type: string - description: If specified, indicates the pod's priority. "system-node-critical" + description: If specified, indicates the Pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, - the pod priority will be default or zero if there is no - default. + the pod priority will be the default or zero, if there is + no default. See `kubectl explain pods.spec.priorityClassName`. volumes: type: array description: Additional volumes to be created in the server - pod. + Pod. See `kubectl explain pods.spec.volumes`. items: - description: Volume represents a named volume in a pod that - may be accessed by any container in the pod. type: object properties: quobyte: - description: Represents a Quobyte mount that lasts the - lifetime of a pod. Quobyte volumes do not support - ownership management or SELinux relabeling. type: object properties: volume: - description: Volume is a string that references - an already created Quobyte volume by name. type: string registry: - description: Registry represents a single or multiple - Quobyte Registry services specified as a string - as host:port pair (multiple entries are separated - with commas) which acts as the central registry - for volumes type: string readOnly: - description: ReadOnly here will force the Quobyte - volume to be mounted with read-only permissions. - Defaults to false. type: boolean user: - description: User to map volume access to Defaults - to serivceaccount user type: string tenant: - description: Tenant owning the given Quobyte volume - in the Backend Used with dynamically provisioned - Quobyte volumes, value is set by the plugin type: string group: - description: Group to map volume access to Default - is no group type: string required: - registry - volume azureFile: - description: AzureFile represents an Azure File Service - mount on the host and bind mount to the pod. type: object properties: secretName: - description: the name of secret that contains Azure - Storage Account Name and Key type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean shareName: - description: Share Name type: string required: - secretName - shareName flexVolume: - description: FlexVolume represents a generic volume - resource that is provisioned/attached using an exec - based plugin. type: object properties: driver: - description: Driver is the name of the driver to - use for this volume. type: string options: - description: 'Optional: Extra command options if - any.' additionalProperties: type: string type: object secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' type: boolean fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". The default - filesystem depends on FlexVolume script. type: string required: - driver secret: - description: Adapts a Secret into a volume. The contents - of the target Secret's Data field will be presented - in a volume as files using the keys in the Data field - as the file names. Secret volumes support ownership - management and SELinux relabeling. type: object properties: secretName: - description: 'Name of the secret in the pod''s namespace - to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' type: string defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect - the file mode, like fsGroup, and the result can - be other mode bits set.' type: number optional: - description: Specify whether the Secret or its keys - must be defined type: boolean items: - description: If unspecified, each key-value pair - in the Data field of the referenced Secret will - be projected into the volume as a file whose name - is the key and content is the value. If specified, - the listed keys will be projected into the specified - paths, and unlisted keys will not be present. - If a key is specified which is not present in - the Secret, the volume setup will error unless - it is marked optional. Paths must be relative - and may not contain the '..' path or start with - '..'. type: array items: - description: Maps a string key to a path within - a volume. type: object properties: mode: - description: 'Optional: mode bits to use on - this file, must be a value between 0 and - 0777. If not specified, the volume defaultMode - will be used. This might be in conflict - with other options that affect the file - mode, like fsGroup, and the result can be - other mode bits set.' type: number path: - description: The relative path of the file - to map the key to. May not be an absolute - path. May not contain the path element '..'. - May not start with the string '..'. type: string key: - description: The key to project. type: string required: - key - path projected: - description: Represents a projected volume source type: object properties: sources: - description: list of volume projections type: array items: - description: Projection that may be projected - along with other supported volume types type: object properties: downwardAPI: - description: Represents downward API info - for projecting into a projected volume. - Note that this is identical to a downwardAPI - volume source without the default mode. type: object properties: items: - description: Items is a list of DownwardAPIVolume - file type: array items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field type: object properties: mode: - description: 'Optional: mode bits - to use on this file, must be a - value between 0 and 0777. If not - specified, the volume defaultMode - will be used. This might be in - conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode - bits set.' type: number path: - description: 'Required: Path is the - relative path name of the file - to be created. Must not be absolute - or contain the ''..'' path. Must - be utf-8 encoded. The first item - of the relative path must not - start with ''..''' type: string resourceFieldRef: - description: ResourceFieldSelector - represents container resources - (cpu, memory) and their output - format type: object properties: divisor: - description: 'Quantity is a - fixed-point representation - of a number. It provides convenient - marshaling/unmarshaling in - JSON and YAML, in addition - to String() and AsInt64() - accessors. The serialization - format is: ::= - (Note - that may be empty, - from the "" case in .) - ::= 0 | - 1 | ... | 9 ::= - | - ::= - | . | . - | . ::= - "+" | "-" ::= - | - ::= - | | - ::= Ki | - Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | - "" | k | M | G | T | P | E (Note - that 1024 = 1Ki but 1000 = - 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No - matter which of the three - exponent forms is used, no - quantity may represent a number - greater than 2^63-1 in magnitude, - nor may it have more than - 3 decimal places. Numbers - larger or more precise will - be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) - This may be extended in the - future if we require larger - or smaller quantities. When - a Quantity is parsed from - a string, it will remember - the type of suffix it had, - and will use the same type - again when it is serialized. Before - serializing, Quantity will - be put in "canonical form". - This means that Exponent/suffix - will be adjusted up or down - (with a corresponding increase - or decrease in Mantissa) such - that: a. No precision is - lost b. No fractional digits - will be emitted c. The exponent - (or suffix) is as large as - possible. The sign will be - omitted unless the number - is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER - be internally represented - by a floating point number. - That is the whole point of - this exercise. Non-canonical - values will still parse as - long as they are well formed, - but will be re-emitted in - their canonical form. (So - always use canonical form, - or don''t diff.) This format - is intended to make it difficult - to use these numbers without - writing some sort of special - handling code in the hopes - that that will cause implementors - to also use a fixed point - implementation.' type: object properties: number: @@ -686,368 +457,135 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource - to select' type: string containerName: - description: 'Container name: - required for volumes, optional - for env vars' type: string required: - resource fieldRef: - description: ObjectFieldSelector - selects an APIVersioned field - of an object. type: object properties: apiVersion: - description: Version of the - schema the FieldPath is written - in terms of, defaults to "v1". type: string fieldPath: - description: Path of the field - to select in the specified - API version. type: string required: - fieldPath required: - path configMap: - description: Adapts a ConfigMap into a projected - volume. The contents of the target ConfigMap's - Data field will be presented in a projected - volume as files using the keys in the Data - field as the file names, unless the items - element is populated with specific mappings - of keys to paths. Note that this is identical - to a configmap volume source without the - default mode. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its keys must be defined type: boolean items: - description: If unspecified, each key-value - pair in the Data field of the referenced - ConfigMap will be projected into the - volume as a file whose name is the key - and content is the value. If specified, - the listed keys will be projected into - the specified paths, and unlisted keys - will not be present. If a key is specified - which is not present in the ConfigMap, - the volume setup will error unless it - is marked optional. Paths must be relative - and may not contain the '..' path or - start with '..'. type: array items: - description: Maps a string key to a - path within a volume. type: object properties: mode: - description: 'Optional: mode bits - to use on this file, must be a - value between 0 and 0777. If not - specified, the volume defaultMode - will be used. This might be in - conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode - bits set.' type: number path: - description: The relative path of - the file to map the key to. May - not be an absolute path. May not - contain the path element '..'. - May not start with the string - '..'. type: string key: - description: The key to project. type: string required: - key - path secret: - description: Adapts a secret into a projected - volume. The contents of the target Secret's - Data field will be presented in a projected - volume as files using the keys in the Data - field as the file names. Note that this - is identical to a secret volume source without - the default mode. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - or its key must be defined type: boolean items: - description: If unspecified, each key-value - pair in the Data field of the referenced - Secret will be projected into the volume - as a file whose name is the key and - content is the value. If specified, - the listed keys will be projected into - the specified paths, and unlisted keys - will not be present. If a key is specified - which is not present in the Secret, - the volume setup will error unless it - is marked optional. Paths must be relative - and may not contain the '..' path or - start with '..'. type: array items: - description: Maps a string key to a - path within a volume. type: object properties: mode: - description: 'Optional: mode bits - to use on this file, must be a - value between 0 and 0777. If not - specified, the volume defaultMode - will be used. This might be in - conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode - bits set.' type: number path: - description: The relative path of - the file to map the key to. May - not be an absolute path. May not - contain the path element '..'. - May not start with the string - '..'. type: string key: - description: The key to project. type: string required: - key - path serviceAccountToken: - description: ServiceAccountTokenProjection - represents a projected service account token - volume. This projection can be used to insert - a service account token into the pods runtime - filesystem for use against APIs (Kubernetes - API Server or otherwise). type: object properties: path: - description: Path is the path relative - to the mount point of the file to project - the token into. type: string audience: - description: Audience is the intended - audience of the token. A recipient of - a token must identify itself with an - identifier specified in the audience - of the token, and otherwise should reject - the token. The audience defaults to - the identifier of the apiserver. type: string expirationSeconds: - description: ExpirationSeconds is the - requested duration of validity of the - service account token. As the token - approaches expiration, the kubelet volume - plugin will proactively rotate the service - account token. The kubelet will start - trying to rotate the token if the token - is older than 80 percent of its time - to live or if the token is older than - 24 hours.Defaults to 1 hour and must - be at least 10 minutes. type: number required: - path defaultMode: - description: Mode bits to use on created files by - default. Must be a value between 0 and 0777. Directories - within the path are not affected by this setting. - This might be in conflict with other options that - affect the file mode, like fsGroup, and the result - can be other mode bits set. type: number required: - sources cephfs: - description: Represents a Ceph Filesystem mount that - lasts the lifetime of a pod Cephfs volumes do not - support ownership management or SELinux relabeling. type: object properties: path: - description: 'Optional: Used as the mounted root, - rather than the full Ceph tree, default is /' type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string secretFile: - description: 'Optional: SecretFile is the path to - key ring for User, default is /etc/ceph/user.secret - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: boolean user: - description: 'Optional: User is the rados user name, - default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string monitors: - description: 'Required: Monitors is a collection - of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: array items: type: string required: - monitors scaleIO: - description: ScaleIOVolumeSource represents a persistent - ScaleIO volume type: object properties: system: - description: The name of the storage system as configured - in ScaleIO. type: string protectionDomain: - description: The name of the ScaleIO Protection - Domain for the configured storage. type: string sslEnabled: - description: Flag to enable/disable SSL communication - with Gateway, default false type: boolean storageMode: - description: Indicates whether the storage for a - volume should be ThickProvisioned or ThinProvisioned. - Default is ThinProvisioned. type: string volumeName: - description: The name of a volume already created - in the ScaleIO system that is associated with - this volume source. type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Default is - "xfs". type: string storagePool: - description: The ScaleIO Storage Pool associated - with the protection domain. type: string gateway: - description: The host address of the ScaleIO API - Gateway. type: string required: - gateway - secretRef - system emptyDir: - description: Represents an empty directory for a pod. - Empty directory volumes support ownership management - and SELinux relabeling. type: object properties: sizeLimit: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and - AsInt64() accessors. The serialization format - is: ::= (Note - that may be empty, from the "" case in - .) ::= 0 | 1 | ... - | 9 ::= | - ::= | . - | . | . ::= - "+" | "-" ::= | - ::= | - | ::= Ki | Mi | - Gi | Ti | Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T | - P | E (Note that 1024 = 1Ki but 1000 = 1k; I - didn''t choose the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms is used, - no quantity may represent a number greater than - 2^63-1 in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more precise - will be capped or rounded up. (E.g.: 0.1m will - rounded up to 1m.) This may be extended in the - future if we require larger or smaller quantities. When - a Quantity is parsed from a string, it will remember - the type of suffix it had, and will use the same - type again when it is serialized. Before serializing, - Quantity will be put in "canonical form". This - means that Exponent/suffix will be adjusted up - or down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision is lost b. - No fractional digits will be emitted c. The - exponent (or suffix) is as large as possible. - The sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole - point of this exercise. Non-canonical values - will still parse as long as they are well formed, - but will be re-emitted in their canonical form. - (So always use canonical form, or don''t diff.) This - format is intended to make it difficult to use - these numbers without writing some sort of special - handling code in the hopes that that will cause - implementors to also use a fixed point implementation.' type: object properties: number: @@ -1059,266 +597,93 @@ spec: - DECIMAL_SI - BINARY_SI medium: - description: 'What type of storage medium should - back this directory. The default is "" which means - to use the node''s default medium. Must be an - empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' type: string glusterfs: - description: Represents a Glusterfs mount that lasts - the lifetime of a pod. Glusterfs volumes do not support - ownership management or SELinux relabeling. type: object properties: path: - description: 'Path is the Glusterfs volume path. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string endpoints: - description: 'EndpointsName is the endpoint name - that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string readOnly: - description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. - Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: boolean required: - endpoints - path gcePersistentDisk: - description: Represents a Persistent Disk resource in - Google Compute Engine. A GCE PD must exist before - mounting to a container. The disk must also be in - the same GCE project and zone as the kubelet. A GCE - PD can only be mounted as read/write once or read-only - many times. GCE PDs support ownership management and - SELinux relabeling. type: object properties: partition: - description: 'The partition in the volume that you - want to mount. If omitted, the default is to mount - by volume name. Examples: For volume /dev/sda1, - you specify the partition as "1". Similarly, the - volume partition for /dev/sda is "0" (or you can - leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: number readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More - info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: boolean pdName: - description: 'Unique name of the PD resource in - GCE. Used to identify the disk in GCE. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string required: - pdName photonPersistentDisk: - description: Represents a Photon Controller persistent - disk resource. type: object properties: pdID: - description: ID that identifies Photon Controller - persistent disk type: string fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string required: - pdID azureDisk: - description: AzureDisk represents an Azure Data Disk - mount on the host and bind mount to the pod. type: object properties: diskName: - description: The Name of the data disk in the blob - storage type: string kind: - description: 'Expected values Shared: multiple blob - disks per storage account Dedicated: single blob - disk per storage account Managed: azure managed - data disk (only in managed availability set). - defaults to shared' type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean cachingMode: - description: 'Host Caching mode: None, Read Only, - Read Write.' type: string diskURI: - description: The URI the data disk in the blob storage type: string fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string required: - diskName - diskURI cinder: - description: Represents a cinder volume resource in - Openstack. A Cinder volume must exist before mounting - to a container. The volume must also be in the same - region as the kubelet. Cinder volumes support ownership - management and SELinux relabeling. type: object properties: secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string volumeID: - description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: boolean fsType: - description: 'Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://examples.k8s.io/mysql-cinder-pd/README.md' type: string required: - volumeID downwardAPI: - description: DownwardAPIVolumeSource represents a volume - containing downward API info. Downward API volumes - support ownership management and SELinux relabeling. type: object properties: defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect - the file mode, like fsGroup, and the result can - be other mode bits set.' type: number items: - description: Items is a list of downward API volume - file type: array items: - description: DownwardAPIVolumeFile represents - information to create the file containing the - pod field type: object properties: mode: - description: 'Optional: mode bits to use on - this file, must be a value between 0 and - 0777. If not specified, the volume defaultMode - will be used. This might be in conflict - with other options that affect the file - mode, like fsGroup, and the result can be - other mode bits set.' type: number path: - description: 'Required: Path is the relative - path name of the file to be created. Must - not be absolute or contain the ''..'' path. - Must be utf-8 encoded. The first item of - the relative path must not start with ''..''' type: string resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format type: object properties: divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the - "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | - Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M - | G | T | P | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms - is used, no quantity may represent a - number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may - be extended in the future if we require - larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type again - when it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. - No fractional digits will be emitted c. - The exponent (or suffix) is as large - as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always - use canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing - some sort of special handling code in - the hopes that that will cause implementors - to also use a fixed point implementation.' type: object properties: number: @@ -1330,198 +695,97 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to select' type: string containerName: - description: 'Container name: required - for volumes, optional for env vars' type: string required: - resource fieldRef: - description: ObjectFieldSelector selects an - APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the - FieldPath is written in terms of, defaults - to "v1". type: string fieldPath: - description: Path of the field to select - in the specified API version. type: string required: - fieldPath required: - path awsElasticBlockStore: - description: Represents a Persistent Disk resource in - AWS. An AWS EBS disk must exist before mounting to - a container. The disk must also be in the same AWS - zone as the kubelet. An AWS EBS disk can only be mounted - as read/write once. AWS EBS volumes support ownership - management and SELinux relabeling. type: object properties: partition: - description: 'The partition in the volume that you - want to mount. If omitted, the default is to mount - by volume name. Examples: For volume /dev/sda1, - you specify the partition as "1". Similarly, the - volume partition for /dev/sda is "0" (or you can - leave the property empty).' type: number volumeID: - description: 'Unique ID of the persistent disk resource - in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string readOnly: - description: 'Specify "true" to force and set the - ReadOnly property in VolumeMounts to "true". If - omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: boolean fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string required: - volumeID flocker: - description: Represents a Flocker volume mounted by - the Flocker agent. One and only one of datasetName - and datasetUUID should be set. Flocker volumes do - not support ownership management or SELinux relabeling. type: object properties: datasetName: - description: Name of the dataset stored as metadata - -> name on the dataset for Flocker should be considered - as deprecated type: string datasetUUID: - description: UUID of the dataset. This is unique - identifier of a Flocker dataset type: string iscsi: - description: Represents an ISCSI disk. ISCSI volumes - can only be mounted as read/write once. ISCSI volumes - support ownership management and SELinux relabeling. type: object properties: chapAuthSession: - description: whether support iSCSI Session CHAP - authentication type: boolean iscsiInterface: - description: iSCSI Interface Name that uses an iSCSI - transport. Defaults to 'default' (tcp). type: string lun: - description: iSCSI Target Lun number. type: number chapAuthDiscovery: - description: whether support iSCSI Discovery CHAP - authentication type: boolean iqn: - description: Target iSCSI Qualified Name. type: string portals: - description: iSCSI Target Portal List. The portal - is either an IP or ip_addr:port if the port is - other than default (typically TCP ports 860 and - 3260). type: array items: type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string initiatorName: - description: Custom iSCSI Initiator Name. If initiatorName - is specified with iscsiInterface simultaneously, - new iSCSI interface : - will be created for the connection. type: string readOnly: - description: ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. type: boolean fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' type: string targetPortal: - description: iSCSI Target Portal. The Portal is - either an IP or ip_addr:port if the port is other - than default (typically TCP ports 860 and 3260). type: string required: - iqn - lun - targetPortal rbd: - description: Represents a Rados Block Device mount that - lasts the lifetime of a pod. RBD volumes support ownership - management and SELinux relabeling. type: object properties: image: - description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string pool: - description: 'The rados pool name. Default is rbd. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: boolean fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' type: string keyring: - description: 'Keyring is the path to key ring for - RBDUser. Default is /etc/ceph/keyring. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string user: - description: 'The rados user name. Default is admin. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string monitors: - description: 'A collection of Ceph monitors. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: array items: type: string @@ -1529,317 +793,145 @@ spec: - image - monitors configMap: - description: Adapts a ConfigMap into a volume. The - contents of the target ConfigMap's Data field will - be presented in a volume as files using the keys in - the Data field as the file names, unless the items - element is populated with specific mappings of keys - to paths. ConfigMap volumes support ownership management - and SELinux relabeling. type: object properties: defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect - the file mode, like fsGroup, and the result can - be other mode bits set.' type: number name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap or its - keys must be defined type: boolean items: - description: If unspecified, each key-value pair - in the Data field of the referenced ConfigMap - will be projected into the volume as a file whose - name is the key and content is the value. If specified, - the listed keys will be projected into the specified - paths, and unlisted keys will not be present. - If a key is specified which is not present in - the ConfigMap, the volume setup will error unless - it is marked optional. Paths must be relative - and may not contain the '..' path or start with - '..'. type: array items: - description: Maps a string key to a path within - a volume. type: object properties: mode: - description: 'Optional: mode bits to use on - this file, must be a value between 0 and - 0777. If not specified, the volume defaultMode - will be used. This might be in conflict - with other options that affect the file - mode, like fsGroup, and the result can be - other mode bits set.' type: number path: - description: The relative path of the file - to map the key to. May not be an absolute - path. May not contain the path element '..'. - May not start with the string '..'. type: string key: - description: The key to project. type: string required: - key - path storageos: - description: Represents a StorageOS persistent volume - resource. type: object properties: volumeNamespace: - description: VolumeNamespace specifies the scope - of the volume within StorageOS. If no namespace - is specified then the Pod's namespace will be - used. This allows the Kubernetes name scoping - to be mirrored within StorageOS for tighter integration. - Set VolumeName to any name to override the default - behaviour. Set to "default" if you are not using - namespaces within StorageOS. Namespaces that do - not pre-exist within StorageOS will be created. type: string volumeName: - description: VolumeName is the human-readable name - of the StorageOS volume. Volume names are only - unique within a namespace. type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string csi: - description: Represents a source location of a volume - to mount, managed by an external CSI driver type: object properties: driver: - description: Driver is the name of the CSI driver - that handles this volume. Consult with your admin - for the correct name as registered in the cluster. type: string nodePublishSecretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: Specifies a read-only configuration - for the volume. Defaults to false (read/write). type: boolean fsType: - description: Filesystem type to mount. Ex. "ext4", - "xfs", "ntfs". If not provided, the empty value - is passed to the associated CSI driver which will - determine the default filesystem to apply. type: string volumeAttributes: - description: VolumeAttributes stores driver-specific - properties that are passed to the CSI driver. - Consult your driver's documentation for supported - values. additionalProperties: type: string type: object required: - driver name: - description: 'Volume''s name. Must be a DNS_LABEL and - unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string nfs: - description: Represents an NFS mount that lasts the - lifetime of a pod. NFS volumes do not support ownership - management or SELinux relabeling. type: object properties: path: - description: 'Path that is exported by the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string server: - description: 'Server is the hostname or IP address - of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string readOnly: - description: 'ReadOnly here will force the NFS export - to be mounted with read-only permissions. Defaults - to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: boolean required: - path - server persistentVolumeClaim: - description: PersistentVolumeClaimVolumeSource references - the user's PVC in the same namespace. This volume - finds the bound PV and mounts that volume for the - pod. A PersistentVolumeClaimVolumeSource is, essentially, - a wrapper around another type of volume that is owned - by someone else (the system). type: object properties: claimName: - description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' type: string readOnly: - description: Will force the ReadOnly setting in - VolumeMounts. Default false. type: boolean required: - claimName gitRepo: - description: 'Represents a volume that is populated - with the contents of a git repository. Git repo volumes - do not support ownership management. Git repo volumes - support SELinux relabeling. DEPRECATED: GitRepo is - deprecated. To provision a container with a git repo, - mount an EmptyDir into an InitContainer that clones - the repo using git, then mount the EmptyDir into the - Pod''s container.' type: object properties: repository: - description: Repository URL type: string directory: - description: Target directory name. Must not contain - or start with '..'. If '.' is supplied, the volume - directory will be the git repository. Otherwise, - if specified, the volume will contain the git - repository in the subdirectory with the given - name. type: string revision: - description: Commit hash for the specified revision. type: string required: - repository portworxVolume: - description: PortworxVolumeSource represents a Portworx - volume resource. type: object properties: volumeID: - description: VolumeID uniquely identifies a Portworx - volume type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: FSType represents the filesystem type - to mount Must be a filesystem type supported by - the host operating system. Ex. "ext4", "xfs". - Implicitly inferred to be "ext4" if unspecified. type: string required: - volumeID vsphereVolume: - description: Represents a vSphere volume resource. type: object properties: storagePolicyName: - description: Storage Policy Based Management (SPBM) - profile name. type: string storagePolicyID: - description: Storage Policy Based Management (SPBM) - profile ID associated with the StoragePolicyName. type: string volumePath: - description: Path that identifies vSphere volume - vmdk type: string fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string required: - volumePath fc: - description: Represents a Fibre Channel volume. Fibre - Channel volumes can only be mounted as read/write - once. Fibre Channel volumes support ownership management - and SELinux relabeling. type: object properties: lun: - description: 'Optional: FC target lun number' type: number targetWWNs: - description: 'Optional: FC target worldwide names - (WWNs)' type: array items: type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' type: boolean wwids: - description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' type: array items: type: string fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string hostPath: - description: Represents a host path mapped into a pod. - Host path volumes do not support ownership management - or SELinux relabeling. type: object properties: path: - description: 'Path of the directory on the host. - If the path is a symlink, it will follow the link - to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string type: - description: 'Type for HostPath Volume Defaults - to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string required: - path @@ -1848,134 +940,52 @@ spec: resources: type: object description: Memory and CPU minimum requirements and limits - for the server. + for the WebLogic Server instance. See `kubectl explain pods.spec.containers.resources`. properties: requests: type: object additionalProperties: type: string - description: 'Requests describes the minimum amount of - compute resources required. If Requests is omitted for - a container, it defaults to Limits if that is explicitly - specified, otherwise to an implementation-defined value. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' limits: type: object additionalProperties: type: string - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' annotations: type: object additionalProperties: type: string - description: The annotations to be attached to generated resources. + description: The annotations to be added to generated resources. env: type: array - description: A list of environment variables to add to a server. + description: 'A list of environment variables to set in the + container running a WebLogic Server instance. More info: + https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-resource/#jvm-memory-and-java-option-environment-variables. + See `kubectl explain pods.spec.containers.env`.' items: - description: EnvVar represents an environment variable present - in a Container. type: object properties: name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) are expanded - using the previous defined environment variables in - the container and any service environment variables. - If a variable cannot be resolved, the reference in - the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Defaults to - "".' type: string valueFrom: - description: EnvVarSource represents a source for the - value of an EnvVar. type: object properties: secretKeyRef: - description: SecretKeySelector selects a key of - a Secret. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret or its - key must be defined type: boolean key: - description: The key of the secret to select - from. Must be a valid secret key. type: string required: - key resourceFieldRef: - description: ResourceFieldSelector represents container - resources (cpu, memory) and their output format type: object properties: divisor: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" case - in .) ::= 0 | - 1 | ... | 9 ::= - | ::= - | . | . | . - ::= "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | Ti | - Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | - T | P | E (Note that 1024 = 1Ki but 1000 - = 1k; I didn''t choose the capitalization.) - ::= "e" | - "E" No matter which of the - three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than 3 - decimal places. Numbers larger or more precise - will be capped or rounded up. (E.g.: 0.1m - will rounded up to 1m.) This may be extended - in the future if we require larger or smaller - quantities. When a Quantity is parsed from - a string, it will remember the type of suffix - it had, and will use the same type again when - it is serialized. Before serializing, Quantity - will be put in "canonical form". This means - that Exponent/suffix will be adjusted up or - down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision - is lost b. No fractional digits will be - emitted c. The exponent (or suffix) is as - large as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi will - be serialized as "1536Mi" Note that the quantity - will NEVER be internally represented by a - floating point number. That is the whole point - of this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or don''t - diff.) This format is intended to make it - difficult to use these numbers without writing - some sort of special handling code in the - hopes that that will cause implementors to - also use a fixed point implementation.' type: object properties: number: @@ -1987,43 +997,28 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to select' type: string containerName: - description: 'Container name: required for volumes, - optional for env vars' type: string required: - resource configMapKeyRef: - description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap or - its key must be defined type: boolean key: - description: The key to select. type: string required: - key fieldRef: - description: ObjectFieldSelector selects an APIVersioned - field of an object. type: object properties: apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". type: string fieldPath: - description: Path of the field to select in - the specified API version. type: string required: - fieldPath @@ -2032,51 +1027,34 @@ spec: restartPolicy: type: string description: 'Restart policy for all containers within the - pod. One of Always, OnFailure, Never. Default to Always. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + Pod. One of Always, OnFailure, Never. Default to Always. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy. + See `kubectl explain pods.spec.restartPolicy`.' nodeSelector: type: object additionalProperties: type: string - description: Selector which must match a node's labels for - the pod to be scheduled on that node. + description: Selector which must match a Node's labels for + the Pod to be scheduled on that Node. See `kubectl explain + pods.spec.nodeSelector`. volumeMounts: type: array - description: Additional volume mounts for the server pod. + description: Additional volume mounts for the container running + a WebLogic Server instance. See `kubectl explain pods.spec.containers.volumeMounts`. items: - description: VolumeMount describes a mounting of a Volume - within a container. type: object properties: mountPath: - description: Path within the container at which the - volume should be mounted. Must not contain ':'. type: string mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and the - other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. type: string name: - description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. type: boolean subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's - root). type: string subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves - similarly to SubPath but environment variable references - $(VAR_NAME) are expanded using the container's environment. - Defaults to "" (volume's root). SubPathExpr and SubPath - are mutually exclusive. This field is beta in 1.15. type: string required: - mountPath @@ -2085,63 +1063,40 @@ spec: type: object additionalProperties: type: string - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. + description: The labels to be added to generated resources. + The label names must not start with "weblogic.". runtimeClassName: type: string description: 'RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this - pod. If no RuntimeClass resource matches the named class, - the pod will not be run. If unset or empty, the "legacy" + Pod. If no RuntimeClass resource matches the named class, + the Pod will not be run. If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md - This is an alpha feature and may change in the future.' + This is an alpha feature and may change in the future. See + `kubectl explain pods.spec.runtimeClassName`.' tolerations: type: array - description: If specified, the pod's tolerations. + description: If specified, the Pod's tolerations. See `kubectl + explain pods.spec.tolerations`. items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple using - the matching operator . type: object properties: effect: - description: Effect indicates the taint effect to match. - Empty means match all taint effects. When specified, - allowed values are NoSchedule, PreferNoSchedule and - NoExecute. type: string tolerationSeconds: - description: TolerationSeconds represents the period - of time the toleration (which must be of effect NoExecute, - otherwise this field is ignored) tolerates the taint. - By default, it is not set, which means tolerate the - taint forever (do not evict). Zero and negative values - will be treated as 0 (evict immediately) by the system. type: number value: - description: Value is the taint value the toleration - matches to. If the operator is Exists, the value should - be empty, otherwise just a regular string. type: string key: - description: Key is the taint key that the toleration - applies to. Empty means match all taint keys. If the - key is empty, operator must be Exists; this combination - means to match all values and all keys. type: string operator: - description: Operator represents a key's relationship - to the value. Valid operators are Exists and Equal. - Defaults to Equal. Exists is equivalent to wildcard - for value, so that a pod can tolerate all taints of - a particular category. type: string readinessProbe: type: object description: Settings for the readiness probe associated with - a server. + a WebLogic Server instance. properties: periodSeconds: type: number @@ -2157,73 +1112,37 @@ spec: containers: type: array description: Additional containers to be included in the server - pod. + Pod. See `kubectl explain pods.spec.containers`. items: - description: A single application container that you want - to run within a pod. type: object properties: volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of a - raw block device within a container. type: object properties: devicePath: - description: devicePath is the path inside of - the container that the device will be mapped - to. type: string name: - description: name must match the name of a persistentVolumeClaim - in the pod type: string required: - devicePath - name image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' type: string imagePullPolicy: - description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag is - specified, or IfNotPresent otherwise. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -2235,64 +1154,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -2304,24 +1189,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -2329,213 +1205,83 @@ spec: required: - port stdin: - description: Whether this container should allocate - a buffer for stdin in the container runtime. If this - is not set, reads from stdin in the container will - always result in EOF. Default is false. type: boolean terminationMessagePolicy: - description: Indicate how the termination message should - be populated. File will use the contents of terminationMessagePath - to populate the container status message on both success - and failure. FallbackToLogsOnError will use the last - chunk of container log output if the termination message - file is empty and the container exited with an error. - The log output is limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to File. Cannot be - updated. type: string terminationMessagePath: - description: 'Optional: Path at which the file to which - the container''s termination message will be written - is mounted into the container''s filesystem. Message - written is intended to be brief final status, such - as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' type: string workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which - might be configured in the container image. Cannot - be updated. type: string resources: - description: ResourceRequirements describes the compute - resource requirements. type: object properties: requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields are - present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take precedence. type: object properties: privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. type: boolean runAsUser: - description: The UID to run the entrypoint of the - container process. Defaults to user specified - in image metadata if unspecified. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. type: number capabilities: - description: Adds and removes POSIX capabilities - from running containers. type: object properties: add: - description: Added capabilities type: array items: type: string drop: - description: Removed capabilities type: array items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to be - applied to the container type: object properties: role: - description: Role is a SELinux role label that - applies to the container. type: string level: - description: Level is SELinux level label that - applies to the container. type: string type: - description: Type is a SELinux type label that - applies to the container. type: string user: - description: User is a SELinux user label that - applies to the container. type: string windowsOptions: - description: WindowsSecurityContextOptions contain - Windows-specific options and credentials. type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the - GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName field. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. type: string runAsUserName: - description: The UserName in Windows to run - the entrypoint of the container process. Defaults - to the user specified in image metadata if - unspecified. May also be set in PodSecurityContext. - If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. This field is alpha-level and - it is only honored by servers that enable - the WindowsRunAsUserName feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. type: string procMount: - description: procMount denotes the type of proc - mount to use for the containers. The default is - DefaultProcMount which uses the container runtime - defaults for readonly paths and masked paths. - This requires the ProcMountType feature flag to - be enabled. type: string allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the container - process. AllowPrivilegeEscalation is true always - when the container is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of the - container process. Uses runtime default if unset. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: number runAsNonRoot: - description: Indicates that the container must run - as a non-root user. If true, the Kubelet will - validate the image at runtime to ensure that it - does not run as UID 0 (root) and fail to start - the container if it does. If unset or false, no - such validation will be performed. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. type: boolean startupProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -2547,64 +1293,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -2616,24 +1328,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -2641,120 +1344,32 @@ spec: required: - port env: - description: List of environment variables to set in - the container. Cannot be updated. type: array items: - description: EnvVar represents an environment variable - present in a Container. type: object properties: name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, - the reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a - double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether - the variable exists or not. Defaults to "".' type: string valueFrom: - description: EnvVarSource represents a source - for the value of an EnvVar. type: object properties: secretKeyRef: - description: SecretKeySelector selects a key - of a Secret. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - or its key must be defined type: boolean key: - description: The key of the secret to - select from. Must be a valid secret - key. type: string required: - key resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format type: object properties: divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the - "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | - Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M - | G | T | P | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms - is used, no quantity may represent a - number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may - be extended in the future if we require - larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type again - when it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. - No fractional digits will be emitted c. - The exponent (or suffix) is as large - as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always - use canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing - some sort of special handling code in - the hopes that that will cause implementors - to also use a fixed point implementation.' type: object properties: number: @@ -2766,191 +1381,88 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to select' type: string containerName: - description: 'Container name: required - for volumes, optional for env vars' type: string required: - resource configMapKeyRef: - description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its key must be defined type: boolean key: - description: The key to select. type: string required: - key fieldRef: - description: ObjectFieldSelector selects an - APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the - FieldPath is written in terms of, defaults - to "v1". type: string fieldPath: - description: Path of the field to select - in the specified API version. type: string required: - fieldPath required: - name ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional information - about the network connections a container uses, but - is primarily informational. Not specifying a port - here DOES NOT prevent that port from being exposed. - Any port which is listening on the default "0.0.0.0" - address inside a container will be accessible from - the network. Cannot be updated. type: array items: - description: ContainerPort represents a network port - in a single container. type: object properties: protocol: - description: Protocol for port. Must be UDP, TCP, - or SCTP. Defaults to "TCP". type: string hostIP: - description: What host IP to bind the external - port to. type: string name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in - a pod must have a unique name. Name for the - port that can be referred to by services. type: string containerPort: - description: Number of port to expose on the pod's - IP address. This must be a valid port number, - 0 < x < 65536. type: number hostPort: - description: Number of port to expose on the host. - If specified, this must be a valid port number, - 0 < x < 65536. If HostNetwork is specified, - this must match ContainerPort. Most containers - do not need this. type: number required: - containerPort command: - description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used if - this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. If - a variable cannot be resolved, the reference in the - input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be updated. - More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string volumeMounts: - description: Pod volumes to mount into the container's - filesystem. Cannot be updated. type: array items: - description: VolumeMount describes a mounting of a - Volume within a container. type: object properties: mountPath: - description: Path within the container at which - the volume should be mounted. Must not contain - ':'. type: string mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and - the other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. type: string name: - description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to - false. type: boolean subPath: - description: Path within the volume from which - the container's volume should be mounted. Defaults - to "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment - variable references $(VAR_NAME) are expanded - using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath - are mutually exclusive. This field is beta in - 1.15. type: string required: - mountPath - name args: - description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. The - $(VAR_NAME) syntax can be escaped with a double $$, - ie: $$(VAR_NAME). Escaped references will never be - expanded, regardless of whether the variable exists - or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string lifecycle: - description: Lifecycle describes actions that the management - system should take in response to container lifecycle - events. For the PostStart and PreStop lifecycle handlers, - management of the container blocks until the action - is complete, unless the container process fails, in - which case the handler is aborted. type: object properties: postStart: - description: Handler defines a specific action that - should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -2962,50 +1474,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in - container" action. type: object properties: command: - description: Command is the command line - to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP - server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -3017,24 +1503,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -3042,22 +1519,12 @@ spec: required: - port preStop: - description: Handler defines a specific action that - should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -3069,50 +1536,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in - container" action. type: object properties: command: - description: Command is the command line - to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP - server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -3124,24 +1565,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -3149,43 +1581,20 @@ spec: required: - port name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. type: string tty: - description: Whether this container should allocate - a TTY for itself, also requires 'stdin' to be true. - Default is false. type: boolean readinessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -3197,64 +1606,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -3266,24 +1641,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -3291,264 +1657,120 @@ spec: required: - port stdinOnce: - description: Whether the container runtime should close - the stdin channel after it has been opened by a single - attach. When stdin is true the stdin stream will remain - open across multiple attach sessions. If stdinOnce - is set to true, stdin is opened on container start, - is empty until the first client attaches to stdin, - and then remains open and accepts data until the client - disconnects, at which time stdin is closed and remains - closed until the container is restarted. If this flag - is false, a container processes that reads from stdin - will never receive an EOF. Default is false type: boolean envFrom: - description: List of sources to populate environment - variables in the container. The keys defined within - a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is - starting. When a key exists in multiple sources, the - value associated with the last source will take precedence. - Values defined by an Env with a duplicate key will - take precedence. Cannot be updated. type: array items: - description: EnvFromSource represents the source of - a set of ConfigMaps type: object properties: configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field - will represent the key-value pairs as environment - variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - must be defined type: boolean prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. type: string secretRef: - description: SecretEnvSource selects a Secret - to populate the environment variables with. The - contents of the target Secret's Data field will - represent the key-value pairs as environment - variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret must - be defined type: boolean required: - name containerSecurityContext: type: object description: Container-level security attributes. Will override - any matching pod-level attributes. + any matching Pod-level attributes. See `kubectl explain + pods.spec.containers.securityContext`. properties: privileged: type: boolean - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. runAsUser: type: number - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. capabilities: type: object - description: Adds and removes POSIX capabilities from - running containers. properties: add: type: array - description: Added capabilities items: type: string drop: type: array - description: Removed capabilities items: type: string seLinuxOptions: type: object - description: SELinuxOptions are the labels to be applied - to the container properties: role: type: string - description: Role is a SELinux role label that applies - to the container. level: type: string - description: Level is SELinux level label that applies - to the container. type: type: string - description: Type is a SELinux type label that applies - to the container. user: type: string - description: User is a SELinux user label that applies - to the container. windowsOptions: type: object - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. properties: gmsaCredentialSpec: type: string - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. runAsUserName: type: string - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and - it is only honored by servers that enable the WindowsRunAsUserName - feature flag. gmsaCredentialSpecName: type: string - description: GMSACredentialSpecName is the name of - the GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. procMount: type: string - description: procMount denotes the type of proc mount - to use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. allowPrivilegeEscalation: type: boolean - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent process. - This bool directly controls if the no_new_privs flag - will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' runAsGroup: type: number - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. runAsNonRoot: type: boolean - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if it - does. If unset or false, no such validation will be - performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. readOnlyRootFilesystem: type: boolean - description: Whether this container has a read-only root - filesystem. Default is false. schedulerName: type: string - description: If specified, the pod will be dispatched by specified - scheduler. If not specified, the pod will be dispatched - by default scheduler. + description: If specified, the Pod will be dispatched by the + specified scheduler. If not specified, the Pod will be dispatched + by the default scheduler. See `kubectl explain pods.spec.schedulerName`. initContainers: type: array description: Initialization containers to be included in the - server pod. + server Pod. See `kubectl explain pods.spec.initContainers`. items: - description: A single application container that you want - to run within a pod. type: object properties: volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of a - raw block device within a container. type: object properties: devicePath: - description: devicePath is the path inside of - the container that the device will be mapped - to. type: string name: - description: name must match the name of a persistentVolumeClaim - in the pod type: string required: - devicePath - name image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' type: string imagePullPolicy: - description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag is - specified, or IfNotPresent otherwise. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -3560,64 +1782,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -3629,24 +1817,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -3654,213 +1833,83 @@ spec: required: - port stdin: - description: Whether this container should allocate - a buffer for stdin in the container runtime. If this - is not set, reads from stdin in the container will - always result in EOF. Default is false. type: boolean terminationMessagePolicy: - description: Indicate how the termination message should - be populated. File will use the contents of terminationMessagePath - to populate the container status message on both success - and failure. FallbackToLogsOnError will use the last - chunk of container log output if the termination message - file is empty and the container exited with an error. - The log output is limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to File. Cannot be - updated. type: string terminationMessagePath: - description: 'Optional: Path at which the file to which - the container''s termination message will be written - is mounted into the container''s filesystem. Message - written is intended to be brief final status, such - as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' type: string workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which - might be configured in the container image. Cannot - be updated. type: string resources: - description: ResourceRequirements describes the compute - resource requirements. type: object properties: requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields are - present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take precedence. type: object properties: privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. type: boolean runAsUser: - description: The UID to run the entrypoint of the - container process. Defaults to user specified - in image metadata if unspecified. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. type: number capabilities: - description: Adds and removes POSIX capabilities - from running containers. type: object properties: add: - description: Added capabilities type: array items: type: string drop: - description: Removed capabilities type: array items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to be - applied to the container type: object properties: role: - description: Role is a SELinux role label that - applies to the container. type: string level: - description: Level is SELinux level label that - applies to the container. type: string type: - description: Type is a SELinux type label that - applies to the container. type: string user: - description: User is a SELinux user label that - applies to the container. type: string windowsOptions: - description: WindowsSecurityContextOptions contain - Windows-specific options and credentials. type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the - GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName field. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. type: string runAsUserName: - description: The UserName in Windows to run - the entrypoint of the container process. Defaults - to the user specified in image metadata if - unspecified. May also be set in PodSecurityContext. - If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. This field is alpha-level and - it is only honored by servers that enable - the WindowsRunAsUserName feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. type: string procMount: - description: procMount denotes the type of proc - mount to use for the containers. The default is - DefaultProcMount which uses the container runtime - defaults for readonly paths and masked paths. - This requires the ProcMountType feature flag to - be enabled. type: string allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the container - process. AllowPrivilegeEscalation is true always - when the container is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of the - container process. Uses runtime default if unset. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: number runAsNonRoot: - description: Indicates that the container must run - as a non-root user. If true, the Kubelet will - validate the image at runtime to ensure that it - does not run as UID 0 (root) and fail to start - the container if it does. If unset or false, no - such validation will be performed. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. type: boolean startupProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -3872,64 +1921,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -3941,24 +1956,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -3966,120 +1972,32 @@ spec: required: - port env: - description: List of environment variables to set in - the container. Cannot be updated. type: array items: - description: EnvVar represents an environment variable - present in a Container. type: object properties: name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, - the reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a - double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether - the variable exists or not. Defaults to "".' type: string valueFrom: - description: EnvVarSource represents a source - for the value of an EnvVar. type: object properties: secretKeyRef: - description: SecretKeySelector selects a key - of a Secret. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - or its key must be defined type: boolean key: - description: The key of the secret to - select from. Must be a valid secret - key. type: string required: - key resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format type: object properties: divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the - "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | - Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M - | G | T | P | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms - is used, no quantity may represent a - number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may - be extended in the future if we require - larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type again - when it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. - No fractional digits will be emitted c. - The exponent (or suffix) is as large - as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always - use canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing - some sort of special handling code in - the hopes that that will cause implementors - to also use a fixed point implementation.' type: object properties: number: @@ -4091,191 +2009,88 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to select' type: string containerName: - description: 'Container name: required - for volumes, optional for env vars' type: string required: - resource configMapKeyRef: - description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its key must be defined type: boolean key: - description: The key to select. type: string required: - key fieldRef: - description: ObjectFieldSelector selects an - APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the - FieldPath is written in terms of, defaults - to "v1". type: string fieldPath: - description: Path of the field to select - in the specified API version. type: string required: - fieldPath required: - name ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional information - about the network connections a container uses, but - is primarily informational. Not specifying a port - here DOES NOT prevent that port from being exposed. - Any port which is listening on the default "0.0.0.0" - address inside a container will be accessible from - the network. Cannot be updated. type: array items: - description: ContainerPort represents a network port - in a single container. type: object properties: protocol: - description: Protocol for port. Must be UDP, TCP, - or SCTP. Defaults to "TCP". type: string hostIP: - description: What host IP to bind the external - port to. type: string name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in - a pod must have a unique name. Name for the - port that can be referred to by services. type: string containerPort: - description: Number of port to expose on the pod's - IP address. This must be a valid port number, - 0 < x < 65536. type: number hostPort: - description: Number of port to expose on the host. - If specified, this must be a valid port number, - 0 < x < 65536. If HostNetwork is specified, - this must match ContainerPort. Most containers - do not need this. type: number required: - containerPort command: - description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used if - this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. If - a variable cannot be resolved, the reference in the - input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be updated. - More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string volumeMounts: - description: Pod volumes to mount into the container's - filesystem. Cannot be updated. type: array items: - description: VolumeMount describes a mounting of a - Volume within a container. type: object properties: mountPath: - description: Path within the container at which - the volume should be mounted. Must not contain - ':'. type: string mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and - the other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. type: string name: - description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to - false. type: boolean subPath: - description: Path within the volume from which - the container's volume should be mounted. Defaults - to "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment - variable references $(VAR_NAME) are expanded - using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath - are mutually exclusive. This field is beta in - 1.15. type: string required: - mountPath - name args: - description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. The - $(VAR_NAME) syntax can be escaped with a double $$, - ie: $$(VAR_NAME). Escaped references will never be - expanded, regardless of whether the variable exists - or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string lifecycle: - description: Lifecycle describes actions that the management - system should take in response to container lifecycle - events. For the PostStart and PreStop lifecycle handlers, - management of the container blocks until the action - is complete, unless the container process fails, in - which case the handler is aborted. type: object properties: postStart: - description: Handler defines a specific action that - should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -4287,50 +2102,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in - container" action. type: object properties: command: - description: Command is the command line - to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP - server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -4342,24 +2131,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -4367,22 +2147,12 @@ spec: required: - port preStop: - description: Handler defines a specific action that - should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -4394,50 +2164,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in - container" action. type: object properties: command: - description: Command is the command line - to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP - server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -4449,24 +2193,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -4474,43 +2209,20 @@ spec: required: - port name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. type: string tty: - description: Whether this container should allocate - a TTY for itself, also requires 'stdin' to be true. - Default is false. type: boolean readinessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -4522,64 +2234,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -4591,24 +2269,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -4616,85 +2285,44 @@ spec: required: - port stdinOnce: - description: Whether the container runtime should close - the stdin channel after it has been opened by a single - attach. When stdin is true the stdin stream will remain - open across multiple attach sessions. If stdinOnce - is set to true, stdin is opened on container start, - is empty until the first client attaches to stdin, - and then remains open and accepts data until the client - disconnects, at which time stdin is closed and remains - closed until the container is restarted. If this flag - is false, a container processes that reads from stdin - will never receive an EOF. Default is false type: boolean envFrom: - description: List of sources to populate environment - variables in the container. The keys defined within - a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is - starting. When a key exists in multiple sources, the - value associated with the last source will take precedence. - Values defined by an Env with a duplicate key will - take precedence. Cannot be updated. type: array items: - description: EnvFromSource represents the source of - a set of ConfigMaps type: object properties: configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field - will represent the key-value pairs as environment - variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - must be defined type: boolean prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. type: string secretRef: - description: SecretEnvSource selects a Secret - to populate the environment variables with. The - contents of the target Secret's Data field will - represent the key-value pairs as environment - variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret must - be defined type: boolean required: - name shutdown: type: object - description: Configures how the operator should shutdown the - server instance. + description: Configures how the operator should shut down + the server instance. properties: ignoreSessions: type: boolean description: For graceful shutdown only, indicates to ignore pending HTTP sessions during in-flight work handling. - Not required. Defaults to false. + Defaults to false. shutdownType: type: string - description: Tells the operator how to shutdown server - instances. Not required. Defaults to graceful shutdown. + description: Specifies how the operator will shut down + server instances. Defaults to graceful shutdown. enum: - Graceful - Forced @@ -4702,106 +2330,51 @@ spec: type: number description: For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting - down the server. Not required. Defaults to 30 seconds. + down the server. Defaults to 30 seconds. affinity: type: object - description: If specified, the pod's scheduling constraints + description: If specified, the Pod's scheduling constraints. + See `kubectl explain pods.spec.affinity` properties: nodeAffinity: type: object - description: Node affinity is a group of node affinity - scheduling rules. properties: requiredDuringSchedulingIgnoredDuringExecution: type: object - description: A node selector represents the union - of the results of one or more label queries over - a set of nodes; that is, it represents the OR of - the selectors represented by the node selector terms. properties: nodeSelectorTerms: type: array - description: Required. A list of node selector - terms. The terms are ORed. items: - description: A null or empty node selector term - matches no objects. The requirements of them - are ANDed. The TopologySelectorTerm type implements - a subset of the NodeSelectorTerm. type: object properties: matchExpressions: - description: A list of node selector requirements - by node's labels. type: array items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. type: array items: type: string key: - description: The label key that the - selector applies to. type: string operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. type: string required: - key - operator matchFields: - description: A list of node selector requirements - by node's fields. type: array items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. type: array items: type: string key: - description: The label key that the - selector applies to. type: string operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. type: string required: - key @@ -4810,213 +2383,83 @@ spec: - nodeSelectorTerms preferredDuringSchedulingIgnoredDuringExecution: type: array - description: The scheduler will prefer to schedule - pods to nodes that satisfy the affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. The - node that is most preferred is the one with the - greatest sum of weights, i.e. for each node that - meets all of the scheduling requirements (resource - request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements - of this field and adding "weight" to the sum if - the node matches the corresponding matchExpressions; - the node(s) with the highest sum are the most preferred. items: - description: An empty preferred scheduling term - matches all objects with implicit weight 0 (i.e. - it's a no-op). A null preferred scheduling term - matches no objects (i.e. is also a no-op). type: object properties: preference: - description: A null or empty node selector term - matches no objects. The requirements of them - are ANDed. The TopologySelectorTerm type implements - a subset of the NodeSelectorTerm. type: object properties: matchExpressions: - description: A list of node selector requirements - by node's labels. type: array items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. type: array items: type: string key: - description: The label key that the - selector applies to. type: string operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. type: string required: - key - operator matchFields: - description: A list of node selector requirements - by node's fields. type: array items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. type: array items: type: string key: - description: The label key that the - selector applies to. type: string operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. type: string required: - key - operator weight: - description: Weight associated with matching - the corresponding nodeSelectorTerm, in the - range 1-100. type: number required: - preference - weight podAffinity: type: object - description: Pod affinity is a group of inter pod affinity - scheduling rules. properties: requiredDuringSchedulingIgnoredDuringExecution: type: array - description: If the affinity requirements specified - by this field are not met at scheduling time, the - pod will not be scheduled onto the node. If the - affinity requirements specified by this field cease - to be met at some point during pod execution (e.g. - due to a pod label update), the system may or may - not try to eventually evict the pod from its node. - When there are multiple elements, the lists of nodes - corresponding to each podAffinityTerm are intersected, - i.e. all terms must be satisfied. items: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) with, - where co-located is defined as running on a node - whose value of the label with key - matches that of any node on which a pod of the - set of pods is running type: object properties: labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label - selector matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The requirements - are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: values is an array of - string values. If the operator is - In or NotIn, the values array must - be non-empty. If the operator is - Exists or DoesNotExist, the values - array must be empty. This array - is replaced during a strategic merge - patch. type: array items: type: string key: - description: key is the label key - that the selector applies to. type: string operator: - description: operator represents a - key's relationship to a set of values. - Valid operators are In, NotIn, Exists - and DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the - pods matching the labelSelector in the specified - namespaces, where co-located is defined as - running on a node whose value of the label - with key topologyKey matches that of any node - on which any of the selected pods is running. - Empty topologyKey is not allowed. type: string namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" type: array items: type: string @@ -5024,221 +2467,82 @@ spec: - topologyKey preferredDuringSchedulingIgnoredDuringExecution: type: array - description: The scheduler will prefer to schedule - pods to nodes that satisfy the affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. The - node that is most preferred is the one with the - greatest sum of weights, i.e. for each node that - meets all of the scheduling requirements (resource - request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements - of this field and adding "weight" to the sum if - the node has pods which matches the corresponding - podAffinityTerm; the node(s) with the highest sum - are the most preferred. items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred - node(s) type: object properties: podAffinityTerm: - description: Defines a set of pods (namely those - matching the labelSelector relative to the - given namespace(s)) that this pod should be - co-located (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on - which a pod of the set of pods is running type: object properties: labelSelector: - description: A label selector is a label - query over a set of resources. The result - of matchLabels and matchExpressions are - ANDed. An empty label selector matches - all objects. A null label selector matches - no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. - This array is replaced during - a strategic merge patch. type: array items: type: string key: - description: key is the label - key that the selector applies - to. type: string operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map of - {key,value} pairs. A single {key,value} - in the matchLabels map is equivalent - to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are - ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose - value of the label with key topologyKey - matches that of any node on which any - of the selected pods is running. Empty - topologyKey is not allowed. type: string namespaces: - description: namespaces specifies which - namespaces the labelSelector applies to - (matches against); null or empty list - means "this pod's namespace" type: array items: type: string required: - topologyKey weight: - description: weight associated with matching - the corresponding podAffinityTerm, in the - range 1-100. type: number required: - podAffinityTerm - weight podAntiAffinity: type: object - description: Pod anti affinity is a group of inter pod - anti affinity scheduling rules. properties: requiredDuringSchedulingIgnoredDuringExecution: type: array - description: If the anti-affinity requirements specified - by this field are not met at scheduling time, the - pod will not be scheduled onto the node. If the - anti-affinity requirements specified by this field - cease to be met at some point during pod execution - (e.g. due to a pod label update), the system may - or may not try to eventually evict the pod from - its node. When there are multiple elements, the - lists of nodes corresponding to each podAffinityTerm - are intersected, i.e. all terms must be satisfied. items: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) with, - where co-located is defined as running on a node - whose value of the label with key - matches that of any node on which a pod of the - set of pods is running type: object properties: labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label - selector matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The requirements - are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: values is an array of - string values. If the operator is - In or NotIn, the values array must - be non-empty. If the operator is - Exists or DoesNotExist, the values - array must be empty. This array - is replaced during a strategic merge - patch. type: array items: type: string key: - description: key is the label key - that the selector applies to. type: string operator: - description: operator represents a - key's relationship to a set of values. - Valid operators are In, NotIn, Exists - and DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the - pods matching the labelSelector in the specified - namespaces, where co-located is defined as - running on a node whose value of the label - with key topologyKey matches that of any node - on which any of the selected pods is running. - Empty topologyKey is not allowed. type: string namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" type: array items: type: string @@ -5246,162 +2550,90 @@ spec: - topologyKey preferredDuringSchedulingIgnoredDuringExecution: type: array - description: The scheduler will prefer to schedule - pods to nodes that satisfy the anti-affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. The - node that is most preferred is the one with the - greatest sum of weights, i.e. for each node that - meets all of the scheduling requirements (resource - request, requiredDuringScheduling anti-affinity - expressions, etc.), compute a sum by iterating through - the elements of this field and adding "weight" to - the sum if the node has pods which matches the corresponding - podAffinityTerm; the node(s) with the highest sum - are the most preferred. items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred - node(s) type: object properties: podAffinityTerm: - description: Defines a set of pods (namely those - matching the labelSelector relative to the - given namespace(s)) that this pod should be - co-located (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on - which a pod of the set of pods is running type: object properties: labelSelector: - description: A label selector is a label - query over a set of resources. The result - of matchLabels and matchExpressions are - ANDed. An empty label selector matches - all objects. A null label selector matches - no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. - This array is replaced during - a strategic merge patch. type: array items: type: string key: - description: key is the label - key that the selector applies - to. type: string operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map of - {key,value} pairs. A single {key,value} - in the matchLabels map is equivalent - to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are - ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose - value of the label with key topologyKey - matches that of any node on which any - of the selected pods is running. Empty - topologyKey is not allowed. type: string namespaces: - description: namespaces specifies which - namespaces the labelSelector applies to - (matches against); null or empty list - means "this pod's namespace" type: array items: type: string required: - topologyKey weight: - description: weight associated with matching - the corresponding podAffinityTerm, in the - range 1-100. type: number required: - podAffinityTerm - weight serverStartPolicy: type: string - description: The strategy for deciding whether to start a server. - Legal values are ALWAYS, NEVER, or IF_NEEDED. + description: 'The strategy for deciding whether to start a WebLogic + Server instance. Legal values are ALWAYS, NEVER, or IF_NEEDED. + Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.' enum: - ALWAYS - NEVER - IF_NEEDED adminService: type: object - description: Configures which of the Administration Server's WebLogic - admin channels should be exposed outside the Kubernetes cluster - via a node port service. + description: Customization affecting the generation of the Kubernetes + Service for the Administration Server. These settings can also + specify the creation of a second NodePort Service to expose + specific channels or network access points outside the Kubernetes + cluster. properties: channels: type: array description: Specifies which of the Administration Server's WebLogic channels should be exposed outside the Kubernetes - cluster via a node port service, along with the node port - for each channel. If not specified, the Administration Server's - node port service will not be created. + cluster via a NodePort Service, along with the port for + each channel. If not specified, the Administration Server's + NodePort Service will not be created. items: - description: Describes a single channel used by the Administration - Server. type: object properties: channelName: - description: "Name of channel.\n'default' refers to\ - \ the Administration Server's default channel (configured\ - \ via the ServerMBean's ListenPort) \n'default-secure'\ - \ refers to the Administration Server's default secure\ - \ channel (configured via the ServerMBean's SSLMBean's\ - \ ListenPort) \n'default-admin' refers to the Administration\ - \ Server's default administrative channel (configured\ - \ via the DomainMBean's AdministrationPort) \nOtherwise,\ - \ the name is the name of one of the Administration\ - \ Server's network access points (configured via the\ - \ ServerMBean's NetworkAccessMBeans)." + description: Name of the channel. The "default" value + refers to the Administration Server's default channel, + which is configured using the ServerMBean's ListenPort. + The "default-secure" value refers to the Administration + Server's default secure channel, which is configured + using the ServerMBean's SSLMBean's ListenPort. The + "default-admin" value refers to the Administration + Server's default administrative channel, which is + configured using the DomainMBean's AdministrationPort. + Otherwise, provide the name of one of the Administration + Server's network access points, which is configured + using the ServerMBean's NetworkAccessMBeans. The "default", + "default-secure", and "default-admin" channels may + not be specified here when using Istio. type: string nodePort: description: Specifies the port number used to access @@ -5415,7118 +2647,1784 @@ spec: type: object additionalProperties: type: string - description: Annotations to associate with the external channel - service. + description: Annotations to associate with the Administration + Server's Service(s). labels: type: object additionalProperties: type: string - description: Labels to associate with the external channel - service. + description: Labels to associate with the Administration Server's + Service(s). restartVersion: type: string - description: If present, every time this value is updated the - operator will restart the required servers. - serverPod: - type: object - description: Configuration affecting server pods. - properties: - nodeName: - type: string - description: NodeName is a request to schedule this pod onto a - specific node. If it is non-empty, the scheduler simply schedules - this pod onto that node, assuming that it fits resource requirements. - livenessProbe: - type: object - description: Settings for the liveness probe associated with a - server. - properties: - periodSeconds: - type: number - description: The number of seconds between checks. - timeoutSeconds: - type: number - description: The number of seconds with no response that indicates - a failure. - initialDelaySeconds: - type: number - description: The number of seconds before the first check - is performed. - readinessGates: - type: array - description: 'If specified, all readiness gates will be evaluated - for pod readiness. A pod is ready when all its containers are - ready AND all conditions specified in the readiness gates have - status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' - items: - description: PodReadinessGate contains the reference to a pod - condition + description: 'Changes to this field cause the operator to restart + WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.' + logHome: + type: string + description: The directory in a server's container in which to store + the domain, Node Manager, server logs, server *.out, and optionally + HTTP access log files if `httpAccessLogInLogHome` is true. Ignored + if `logHomeEnabled` is false. + includeServerOutInPodLog: + type: boolean + description: Specifies whether the server .out file will be included + in the Pod's log. Defaults to true. + clusters: + type: array + description: Lifecycle options for all of the Managed Server members + of a WebLogic cluster, including Java options, environment variables, + additional Pod content, and the ability to explicitly start, stop, + or restart cluster members. The `clusterName` field of each entry + must match a cluster that already exists in the WebLogic domain + configuration. + items: + type: object + properties: + serverStartState: + description: The WebLogic runtime state in which the server + is to be started. Use ADMIN if the server should start in + the admin state. Defaults to RUNNING. + type: string + enum: + - RUNNING + - ADMIN + serverService: + description: Customization affecting the generation of Kubernetes + Services for WebLogic Server instances. type: object properties: - conditionType: - description: ConditionType refers to a condition in the - pod's condition list with matching type. - type: string - required: - - conditionType - serviceAccountName: - type: string - description: Name of the ServiceAccount to be used to run this - pod. If it is not set, default ServiceAccount will be used. - The ServiceAccount has to exist at the time the pod is created. - podSecurityContext: - type: object - description: Pod-level security attributes. - properties: - runAsUser: - type: number - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata if - unspecified. May also be set in SecurityContext. If set - in both SecurityContext and PodSecurityContext, the value - specified in SecurityContext takes precedence for that container. - seLinuxOptions: - type: object - description: SELinuxOptions are the labels to be applied to - the container - properties: - role: - type: string - description: Role is a SELinux role label that applies - to the container. - level: - type: string - description: Level is SELinux level label that applies - to the container. - type: - type: string - description: Type is a SELinux type label that applies - to the container. - user: - type: string - description: User is a SELinux user label that applies - to the container. - fsGroup: - type: number - description: 'A special supplemental group that applies to - all containers in a pod. Some volume types allow the Kubelet - to change the ownership of that volume to be owned by the - pod: 1. The owning GID will be the FSGroup 2. The setgid - bit is set (new files created in the volume will be owned - by FSGroup) 3. The permission bits are OR''d with rw-rw---- If - unset, the Kubelet will not modify the ownership and permissions - of any volume.' - windowsOptions: - type: object - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. - properties: - gmsaCredentialSpec: - type: string - description: GMSACredentialSpec is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec named - by the GMSACredentialSpecName field. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. - runAsUserName: + precreateService: + description: If true, the operator will create Services + even for Managed Server instances without running Pods. + type: boolean + annotations: + description: The annotations to be added to generated resources. + additionalProperties: type: string - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set in - PodSecurityContext. If set in both SecurityContext and - PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and it is - only honored by servers that enable the WindowsRunAsUserName - feature flag. - gmsaCredentialSpecName: + type: object + labels: + description: The labels to be added to generated resources. + The label names must not start with "weblogic.". + additionalProperties: type: string - description: GMSACredentialSpecName is the name of the - GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. - supplementalGroups: - type: array - description: A list of groups applied to the first process - run in each container, in addition to the container's primary - GID. If unspecified, no groups will be added to any container. - items: - type: number - runAsGroup: - type: number - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be set - in SecurityContext. If set in both SecurityContext and - PodSecurityContext, the value specified in SecurityContext - takes precedence for that container. - runAsNonRoot: - type: boolean - description: Indicates that the container must run as a non-root - user. If true, the Kubelet will validate the image at runtime - to ensure that it does not run as UID 0 (root) and fail - to start the container if it does. If unset or false, no - such validation will be performed. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. - sysctls: - type: array - description: Sysctls hold a list of namespaced sysctls used - for the pod. Pods with unsupported sysctls (by the container - runtime) might fail to launch. - items: - description: Sysctl defines a kernel parameter to be set type: object - properties: - name: - description: Name of a property to set - type: string - value: - description: Value of a property to set - type: string - required: - - name - - value - priorityClassName: - type: string - description: If specified, indicates the pod's priority. "system-node-critical" - and "system-cluster-critical" are two special keywords which - indicate the highest priorities with the former being the highest - priority. Any other name must be defined by creating a PriorityClass - object with that name. If not specified, the pod priority will - be default or zero if there is no default. - volumes: - type: array - description: Additional volumes to be created in the server pod. - items: - description: Volume represents a named volume in a pod that - may be accessed by any container in the pod. + maxUnavailable: + description: The maximum number of cluster members that can + be temporarily unavailable. Defaults to 1. + type: number + minimum: 1.0 + replicas: + description: The number of cluster member Managed Server instances + to start for this WebLogic cluster. The operator will sort + cluster member Managed Server names from the WebLogic domain + configuration by normalizing any numbers in the Managed Server + name and then sorting alphabetically. This is done so that + server names such as "managed-server10" come after "managed-server9". + The operator will then start Managed Server instances from + the sorted list, up to the `replicas` count, unless specific + Managed Servers are specified as starting in their entry under + the `managedServers` field. In that case, the specified Managed + Server instances will be started and then additional cluster + members will be started, up to the `replicas` count, by finding + further cluster members in the sorted list that are not already + started. If cluster members are started because of their related + entries under `managedServers`, then this cluster may have + more cluster members running than its `replicas` count. Defaults + to 0. + type: number + minimum: 0.0 + clusterName: + description: The name of the cluster. This value must match + the name of a WebLogic cluster already defined in the WebLogic + domain configuration. Required. + type: string + allowReplicasBelowMinDynClusterSize: + description: Specifies whether the number of running cluster + members is allowed to drop below the minimum dynamic cluster + size configured in the WebLogic domain configuration. Otherwise, + the operator will ensure that the number of running cluster + members is not less than the minimum dynamic cluster setting. + This setting applies to dynamic clusters only. Defaults to + true. + type: boolean + serverPod: + description: Customization affecting the generation of Pods + for WebLogic Server instances. type: object properties: - quobyte: - description: Represents a Quobyte mount that lasts the lifetime - of a pod. Quobyte volumes do not support ownership management - or SELinux relabeling. - type: object - properties: - volume: - description: Volume is a string that references an already - created Quobyte volume by name. - type: string - registry: - description: Registry represents a single or multiple - Quobyte Registry services specified as a string as - host:port pair (multiple entries are separated with - commas) which acts as the central registry for volumes - type: string - readOnly: - description: ReadOnly here will force the Quobyte volume - to be mounted with read-only permissions. Defaults - to false. - type: boolean - user: - description: User to map volume access to Defaults to - serivceaccount user - type: string - tenant: - description: Tenant owning the given Quobyte volume - in the Backend Used with dynamically provisioned Quobyte - volumes, value is set by the plugin - type: string - group: - description: Group to map volume access to Default is - no group - type: string - required: - - registry - - volume - azureFile: - description: AzureFile represents an Azure File Service - mount on the host and bind mount to the pod. + nodeName: + description: NodeName is a request to schedule this Pod + onto a specific Node. If it is non-empty, the scheduler + simply schedules this pod onto that node, assuming that + it fits the resource requirements. See `kubectl explain + pods.spec.nodeName`. + type: string + livenessProbe: + description: Settings for the liveness probe associated + with a WebLogic Server instance. type: object properties: - secretName: - description: the name of secret that contains Azure - Storage Account Name and Key - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - shareName: - description: Share Name - type: string - required: - - secretName - - shareName - flexVolume: - description: FlexVolume represents a generic volume resource - that is provisioned/attached using an exec based plugin. + periodSeconds: + description: The number of seconds between checks. + type: number + timeoutSeconds: + description: The number of seconds with no response + that indicates a failure. + type: number + initialDelaySeconds: + description: The number of seconds before the first + check is performed. + type: number + readinessGates: + description: 'If specified, all readiness gates will be + evaluated for Pod readiness. A Pod is ready when all its + containers are ready AND all conditions specified in the + readiness gates have a status equal to "True". More info: + https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md.' + type: array + items: + type: object + properties: + conditionType: + type: string + required: + - conditionType + serviceAccountName: + description: Name of the ServiceAccount to be used to run + this Pod. If it is not set, default ServiceAccount will + be used. The ServiceAccount has to exist at the time the + Pod is created. See `kubectl explain pods.spec.serviceAccountName`. + type: string + podSecurityContext: + description: Pod-level security attributes. See `kubectl + explain pods.spec.securityContext`. type: object properties: - driver: - description: Driver is the name of the driver to use - for this volume. - type: string - options: - description: 'Optional: Extra command options if any.' - additionalProperties: - type: string - type: object - secretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. + runAsUser: + type: number + seLinuxOptions: type: object properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + role: type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' - type: boolean - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". The default filesystem depends on FlexVolume - script. - type: string - required: - - driver - secret: - description: Adapts a Secret into a volume. The contents - of the target Secret's Data field will be presented in - a volume as files using the keys in the Data field as - the file names. Secret volumes support ownership management - and SELinux relabeling. - type: object - properties: - secretName: - description: 'Name of the secret in the pod''s namespace - to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: string - defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and 0777. - Defaults to 0644. Directories within the path are - not affected by this setting. This might be in conflict - with other options that affect the file mode, like - fsGroup, and the result can be other mode bits set.' + level: + type: string + type: + type: string + user: + type: string + fsGroup: type: number - optional: - description: Specify whether the Secret or its keys - must be defined + windowsOptions: + type: object + properties: + gmsaCredentialSpec: + type: string + runAsUserName: + type: string + gmsaCredentialSpecName: + type: string + supplementalGroups: + type: array + items: + type: number + runAsGroup: + type: number + runAsNonRoot: type: boolean - items: - description: If unspecified, each key-value pair in - the Data field of the referenced Secret will be projected - into the volume as a file whose name is the key and - content is the value. If specified, the listed keys - will be projected into the specified paths, and unlisted - keys will not be present. If a key is specified which - is not present in the Secret, the volume setup will - error unless it is marked optional. Paths must be - relative and may not contain the '..' path or start - with '..'. + sysctls: type: array items: - description: Maps a string key to a path within a - volume. type: object properties: - mode: - description: 'Optional: mode bits to use on this - file, must be a value between 0 and 0777. If - not specified, the volume defaultMode will be - used. This might be in conflict with other options - that affect the file mode, like fsGroup, and - the result can be other mode bits set.' - type: number - path: - description: The relative path of the file to - map the key to. May not be an absolute path. - May not contain the path element '..'. May not - start with the string '..'. + name: type: string - key: - description: The key to project. + value: type: string required: - - key - - path - projected: - description: Represents a projected volume source - type: object - properties: - sources: - description: list of volume projections - type: array - items: - description: Projection that may be projected along - with other supported volume types + - name + - value + priorityClassName: + description: If specified, indicates the Pod's priority. + "system-node-critical" and "system-cluster-critical" are + two special keywords which indicate the highest priorities + with the former being the highest priority. Any other + name must be defined by creating a PriorityClass object + with that name. If not specified, the pod priority will + be the default or zero, if there is no default. See `kubectl + explain pods.spec.priorityClassName`. + type: string + volumes: + description: Additional volumes to be created in the server + Pod. See `kubectl explain pods.spec.volumes`. + type: array + items: + type: object + properties: + quobyte: type: object properties: - downwardAPI: - description: Represents downward API info for - projecting into a projected volume. Note that - this is identical to a downwardAPI volume source - without the default mode. + volume: + type: string + registry: + type: string + readOnly: + type: boolean + user: + type: string + tenant: + type: string + group: + type: string + required: + - registry + - volume + azureFile: + type: object + properties: + secretName: + type: string + readOnly: + type: boolean + shareName: + type: string + required: + - secretName + - shareName + flexVolume: + type: object + properties: + driver: + type: string + options: + additionalProperties: + type: string + type: object + secretRef: type: object properties: - items: - description: Items is a list of DownwardAPIVolume - file - type: array - items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field + name: + type: string + readOnly: + type: boolean + fsType: + type: string + required: + - driver + secret: + type: object + properties: + secretName: + type: string + defaultMode: + type: number + optional: + type: boolean + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + key: + type: string + required: + - key + - path + projected: + type: object + properties: + sources: + type: array + items: + type: object + properties: + downwardAPI: type: object properties: - mode: - description: 'Optional: mode bits to - use on this file, must be a value - between 0 and 0777. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' - type: number - path: - description: 'Required: Path is the - relative path name of the file to - be created. Must not be absolute or - contain the ''..'' path. Must be utf-8 - encoded. The first item of the relative - path must not start with ''..''' - type: string - resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) - and their output format - type: object - properties: - divisor: - description: 'Quantity is a fixed-point - representation of a number. It - provides convenient marshaling/unmarshaling - in JSON and YAML, in addition - to String() and AsInt64() accessors. The - serialization format is: ::= - (Note - that may be empty, from - the "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | - . | . ::= - "+" | "-" ::= - | ::= - | - | ::= - Ki | Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | - k | M | G | T | P | E (Note - that 1024 = 1Ki but 1000 = 1k; - I didn''t choose the capitalization.) - ::= "e" - | "E" No matter - which of the three exponent forms - is used, no quantity may represent - a number greater than 2^63-1 in - magnitude, nor may it have more - than 3 decimal places. Numbers - larger or more precise will be - capped or rounded up. (E.g.: 0.1m - will rounded up to 1m.) This may - be extended in the future if we - require larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same - type again when it is serialized. Before - serializing, Quantity will be - put in "canonical form". This - means that Exponent/suffix will - be adjusted up or down (with a - corresponding increase or decrease - in Mantissa) such that: a. No - precision is lost b. No fractional - digits will be emitted c. The - exponent (or suffix) is as large - as possible. The sign will be - omitted unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be - internally represented by a floating - point number. That is the whole - point of this exercise. Non-canonical - values will still parse as long - as they are well formed, but will - be re-emitted in their canonical - form. (So always use canonical - form, or don''t diff.) This format - is intended to make it difficult - to use these numbers without writing - some sort of special handling - code in the hopes that that will - cause implementors to also use - a fixed point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource - to select' - type: string - containerName: - description: 'Container name: required - for volumes, optional for env - vars' - type: string - required: - - resource - fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. - type: object - properties: - apiVersion: - description: Version of the schema - the FieldPath is written in terms - of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to - select in the specified API version. - type: string - required: - - fieldPath - required: - - path - configMap: - description: Adapts a ConfigMap into a projected - volume. The contents of the target ConfigMap's - Data field will be presented in a projected - volume as files using the keys in the Data field - as the file names, unless the items element - is populated with specific mappings of keys - to paths. Note that this is identical to a configmap - volume source without the default mode. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap - or its keys must be defined - type: boolean - items: - description: If unspecified, each key-value - pair in the Data field of the referenced - ConfigMap will be projected into the volume - as a file whose name is the key and content - is the value. If specified, the listed keys - will be projected into the specified paths, - and unlisted keys will not be present. If - a key is specified which is not present - in the ConfigMap, the volume setup will - error unless it is marked optional. Paths - must be relative and may not contain the - '..' path or start with '..'. - type: array - items: - description: Maps a string key to a path - within a volume. + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + resourceFieldRef: + type: object + properties: + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: + type: string + required: + - resource + fieldRef: + type: object + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + required: + - path + configMap: + type: object + properties: + name: + type: string + optional: + type: boolean + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + key: + type: string + required: + - key + - path + secret: + type: object + properties: + name: + type: string + optional: + type: boolean + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + key: + type: string + required: + - key + - path + serviceAccountToken: type: object properties: - mode: - description: 'Optional: mode bits to - use on this file, must be a value - between 0 and 0777. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' - type: number path: - description: The relative path of the - file to map the key to. May not be - an absolute path. May not contain - the path element '..'. May not start - with the string '..'. type: string - key: - description: The key to project. + audience: type: string + expirationSeconds: + type: number required: - - key - path - secret: - description: Adapts a secret into a projected - volume. The contents of the target Secret's - Data field will be presented in a projected - volume as files using the keys in the Data field - as the file names. Note that this is identical - to a secret volume source without the default - mode. + defaultMode: + type: number + required: + - sources + cephfs: + type: object + properties: + path: + type: string + secretRef: type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - items: - description: If unspecified, each key-value - pair in the Data field of the referenced - Secret will be projected into the volume - as a file whose name is the key and content - is the value. If specified, the listed keys - will be projected into the specified paths, - and unlisted keys will not be present. If - a key is specified which is not present - in the Secret, the volume setup will error - unless it is marked optional. Paths must - be relative and may not contain the '..' - path or start with '..'. - type: array - items: - description: Maps a string key to a path - within a volume. + secretFile: + type: string + readOnly: + type: boolean + user: + type: string + monitors: + type: array + items: + type: string + required: + - monitors + scaleIO: + type: object + properties: + system: + type: string + protectionDomain: + type: string + sslEnabled: + type: boolean + storageMode: + type: string + volumeName: + type: string + secretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + storagePool: + type: string + gateway: + type: string + required: + - gateway + - secretRef + - system + emptyDir: + type: object + properties: + sizeLimit: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + medium: + type: string + glusterfs: + type: object + properties: + path: + type: string + endpoints: + type: string + readOnly: + type: boolean + required: + - endpoints + - path + gcePersistentDisk: + type: object + properties: + partition: + type: number + readOnly: + type: boolean + pdName: + type: string + fsType: + type: string + required: + - pdName + photonPersistentDisk: + type: object + properties: + pdID: + type: string + fsType: + type: string + required: + - pdID + azureDisk: + type: object + properties: + diskName: + type: string + kind: + type: string + readOnly: + type: boolean + cachingMode: + type: string + diskURI: + type: string + fsType: + type: string + required: + - diskName + - diskURI + cinder: + type: object + properties: + secretRef: + type: object + properties: + name: + type: string + volumeID: + type: string + readOnly: + type: boolean + fsType: + type: string + required: + - volumeID + downwardAPI: + type: object + properties: + defaultMode: + type: number + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + resourceFieldRef: type: object properties: - mode: - description: 'Optional: mode bits to - use on this file, must be a value - between 0 and 0777. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' - type: number - path: - description: The relative path of the - file to map the key to. May not be - an absolute path. May not contain - the path element '..'. May not start - with the string '..'. + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: type: string - key: - description: The key to project. + containerName: type: string required: - - key - - path - serviceAccountToken: - description: ServiceAccountTokenProjection represents - a projected service account token volume. This - projection can be used to insert a service account - token into the pods runtime filesystem for use - against APIs (Kubernetes API Server or otherwise). + - resource + fieldRef: + type: object + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + required: + - path + awsElasticBlockStore: + type: object + properties: + partition: + type: number + volumeID: + type: string + readOnly: + type: boolean + fsType: + type: string + required: + - volumeID + flocker: + type: object + properties: + datasetName: + type: string + datasetUUID: + type: string + iscsi: + type: object + properties: + chapAuthSession: + type: boolean + iscsiInterface: + type: string + lun: + type: number + chapAuthDiscovery: + type: boolean + iqn: + type: string + portals: + type: array + items: + type: string + secretRef: type: object properties: - path: - description: Path is the path relative to - the mount point of the file to project the - token into. - type: string - audience: - description: Audience is the intended audience - of the token. A recipient of a token must - identify itself with an identifier specified - in the audience of the token, and otherwise - should reject the token. The audience defaults - to the identifier of the apiserver. + name: type: string - expirationSeconds: - description: ExpirationSeconds is the requested - duration of validity of the service account - token. As the token approaches expiration, - the kubelet volume plugin will proactively - rotate the service account token. The kubelet - will start trying to rotate the token if - the token is older than 80 percent of its - time to live or if the token is older than - 24 hours.Defaults to 1 hour and must be - at least 10 minutes. - type: number - required: - - path - defaultMode: - description: Mode bits to use on created files by default. - Must be a value between 0 and 0777. Directories within - the path are not affected by this setting. This might - be in conflict with other options that affect the - file mode, like fsGroup, and the result can be other - mode bits set. - type: number - required: - - sources - cephfs: - description: Represents a Ceph Filesystem mount that lasts - the lifetime of a pod Cephfs volumes do not support ownership - management or SELinux relabeling. + initiatorName: + type: string + readOnly: + type: boolean + fsType: + type: string + targetPortal: + type: string + required: + - iqn + - lun + - targetPortal + rbd: + type: object + properties: + image: + type: string + pool: + type: string + secretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + keyring: + type: string + user: + type: string + monitors: + type: array + items: + type: string + required: + - image + - monitors + configMap: + type: object + properties: + defaultMode: + type: number + name: + type: string + optional: + type: boolean + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + key: + type: string + required: + - key + - path + storageos: + type: object + properties: + volumeNamespace: + type: string + volumeName: + type: string + secretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + csi: + type: object + properties: + driver: + type: string + nodePublishSecretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + volumeAttributes: + additionalProperties: + type: string + type: object + required: + - driver + name: + type: string + nfs: + type: object + properties: + path: + type: string + server: + type: string + readOnly: + type: boolean + required: + - path + - server + persistentVolumeClaim: + type: object + properties: + claimName: + type: string + readOnly: + type: boolean + required: + - claimName + gitRepo: + type: object + properties: + repository: + type: string + directory: + type: string + revision: + type: string + required: + - repository + portworxVolume: + type: object + properties: + volumeID: + type: string + readOnly: + type: boolean + fsType: + type: string + required: + - volumeID + vsphereVolume: + type: object + properties: + storagePolicyName: + type: string + storagePolicyID: + type: string + volumePath: + type: string + fsType: + type: string + required: + - volumePath + fc: + type: object + properties: + lun: + type: number + targetWWNs: + type: array + items: + type: string + readOnly: + type: boolean + wwids: + type: array + items: + type: string + fsType: + type: string + hostPath: + type: object + properties: + path: + type: string + type: + type: string + required: + - path + required: + - name + resources: + description: Memory and CPU minimum requirements and limits + for the WebLogic Server instance. See `kubectl explain + pods.spec.containers.resources`. type: object properties: - path: - description: 'Optional: Used as the mounted root, rather - than the full Ceph tree, default is /' - type: string - secretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. + requests: + additionalProperties: + type: string type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - secretFile: - description: 'Optional: SecretFile is the path to key - ring for User, default is /etc/ceph/user.secret More - info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: boolean - user: - description: 'Optional: User is the rados user name, - default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - monitors: - description: 'Required: Monitors is a collection of - Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: array - items: + limits: + additionalProperties: type: string - required: - - monitors - scaleIO: - description: ScaleIOVolumeSource represents a persistent - ScaleIO volume + type: object + annotations: + description: The annotations to be added to generated resources. + additionalProperties: + type: string type: object - properties: - system: - description: The name of the storage system as configured - in ScaleIO. - type: string - protectionDomain: - description: The name of the ScaleIO Protection Domain - for the configured storage. - type: string - sslEnabled: - description: Flag to enable/disable SSL communication - with Gateway, default false - type: boolean - storageMode: - description: Indicates whether the storage for a volume - should be ThickProvisioned or ThinProvisioned. Default - is ThinProvisioned. - type: string - volumeName: - description: The name of a volume already created in - the ScaleIO system that is associated with this volume - source. - type: string - secretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Default is "xfs". - type: string - storagePool: - description: The ScaleIO Storage Pool associated with - the protection domain. - type: string - gateway: - description: The host address of the ScaleIO API Gateway. - type: string - required: - - gateway - - secretRef - - system - emptyDir: - description: Represents an empty directory for a pod. Empty - directory volumes support ownership management and SELinux - relabeling. + env: + description: 'A list of environment variables to set in + the container running a WebLogic Server instance. More + info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-resource/#jvm-memory-and-java-option-environment-variables. + See `kubectl explain pods.spec.containers.env`.' + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + valueFrom: + type: object + properties: + secretKeyRef: + type: object + properties: + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + resourceFieldRef: + type: object + properties: + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: + type: string + required: + - resource + configMapKeyRef: + type: object + properties: + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + fieldRef: + type: object + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + required: + - name + restartPolicy: + description: 'Restart policy for all containers within the + Pod. One of Always, OnFailure, Never. Default to Always. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy. + See `kubectl explain pods.spec.restartPolicy`.' + type: string + nodeSelector: + description: Selector which must match a Node's labels for + the Pod to be scheduled on that Node. See `kubectl explain + pods.spec.nodeSelector`. + additionalProperties: + type: string type: object - properties: - sizeLimit: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and AsInt64() - accessors. The serialization format is: ::= - (Note that may be - empty, from the "" case in .) ::= - 0 | 1 | ... | 9 ::= | - ::= | . - | . | . ::= "+" - | "-" ::= | - ::= | - | ::= Ki | Mi | Gi | - Ti | Pi | Ei (International System of units; See: - http://physics.nist.gov/cuu/Units/binary.html) ::= - m | "" | k | M | G | T | P | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms is used, - no quantity may represent a number greater than 2^63-1 - in magnitude, nor may it have more than 3 decimal - places. Numbers larger or more precise will be capped - or rounded up. (E.g.: 0.1m will rounded up to 1m.) - This may be extended in the future if we require larger - or smaller quantities. When a Quantity is parsed - from a string, it will remember the type of suffix - it had, and will use the same type again when it is - serialized. Before serializing, Quantity will be - put in "canonical form". This means that Exponent/suffix - will be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such that: a. - No precision is lost b. No fractional digits will - be emitted c. The exponent (or suffix) is as large - as possible. The sign will be omitted unless the number - is negative. Examples: 1.5 will be serialized as - "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole point - of this exercise. Non-canonical values will still - parse as long as they are well formed, but will be - re-emitted in their canonical form. (So always use - canonical form, or don''t diff.) This format is intended - to make it difficult to use these numbers without - writing some sort of special handling code in the - hopes that that will cause implementors to also use - a fixed point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - medium: - description: 'What type of storage medium should back - this directory. The default is "" which means to use - the node''s default medium. Must be an empty string - (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: string - glusterfs: - description: Represents a Glusterfs mount that lasts the - lifetime of a pod. Glusterfs volumes do not support ownership - management or SELinux relabeling. + volumeMounts: + description: Additional volume mounts for the container + running a WebLogic Server instance. See `kubectl explain + pods.spec.containers.volumeMounts`. + type: array + items: + type: object + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + labels: + description: The labels to be added to generated resources. + The label names must not start with "weblogic.". + additionalProperties: + type: string type: object - properties: - path: - description: 'Path is the Glusterfs volume path. More - info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - endpoints: - description: 'EndpointsName is the endpoint name that - details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - readOnly: - description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. Defaults - to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: boolean - required: - - endpoints - - path - gcePersistentDisk: - description: Represents a Persistent Disk resource in Google - Compute Engine. A GCE PD must exist before mounting to - a container. The disk must also be in the same GCE project - and zone as the kubelet. A GCE PD can only be mounted - as read/write once or read-only many times. GCE PDs support - ownership management and SELinux relabeling. + runtimeClassName: + description: 'RuntimeClassName refers to a RuntimeClass + object in the node.k8s.io group, which should be used + to run this Pod. If no RuntimeClass resource matches the + named class, the Pod will not be run. If unset or empty, + the "legacy" RuntimeClass will be used, which is an implicit + class with an empty definition that uses the default runtime + handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future. + See `kubectl explain pods.spec.runtimeClassName`.' + type: string + tolerations: + description: If specified, the Pod's tolerations. See `kubectl + explain pods.spec.tolerations`. + type: array + items: + type: object + properties: + effect: + type: string + tolerationSeconds: + type: number + value: + type: string + key: + type: string + operator: + type: string + readinessProbe: + description: Settings for the readiness probe associated + with a WebLogic Server instance. type: object properties: - partition: - description: 'The partition in the volume that you want - to mount. If omitted, the default is to mount by volume - name. Examples: For volume /dev/sda1, you specify - the partition as "1". Similarly, the volume partition - for /dev/sda is "0" (or you can leave the property - empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + periodSeconds: + description: The number of seconds between checks. type: number - readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: boolean - pdName: - description: 'Unique name of the PD resource in GCE. - Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - required: - - pdName - photonPersistentDisk: - description: Represents a Photon Controller persistent disk - resource. - type: object - properties: - pdID: - description: ID that identifies Photon Controller persistent - disk - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - required: - - pdID - azureDisk: - description: AzureDisk represents an Azure Data Disk mount - on the host and bind mount to the pod. - type: object - properties: - diskName: - description: The Name of the data disk in the blob storage - type: string - kind: - description: 'Expected values Shared: multiple blob - disks per storage account Dedicated: single blob - disk per storage account Managed: azure managed data - disk (only in managed availability set). defaults - to shared' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - cachingMode: - description: 'Host Caching mode: None, Read Only, Read - Write.' - type: string - diskURI: - description: The URI the data disk in the blob storage - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - required: - - diskName - - diskURI - cinder: - description: Represents a cinder volume resource in Openstack. - A Cinder volume must exist before mounting to a container. - The volume must also be in the same region as the kubelet. - Cinder volumes support ownership management and SELinux - relabeling. - type: object - properties: - secretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - volumeID: - description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: boolean - fsType: - description: 'Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - required: - - volumeID - downwardAPI: - description: DownwardAPIVolumeSource represents a volume - containing downward API info. Downward API volumes support - ownership management and SELinux relabeling. - type: object - properties: - defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and 0777. - Defaults to 0644. Directories within the path are - not affected by this setting. This might be in conflict - with other options that affect the file mode, like - fsGroup, and the result can be other mode bits set.' + timeoutSeconds: + description: The number of seconds with no response + that indicates a failure. type: number - items: - description: Items is a list of downward API volume - file - type: array - items: - description: DownwardAPIVolumeFile represents information - to create the file containing the pod field + initialDelaySeconds: + description: The number of seconds before the first + check is performed. + type: number + containers: + description: Additional containers to be included in the + server Pod. See `kubectl explain pods.spec.containers`. + type: array + items: + type: object + properties: + volumeDevices: + type: array + items: + type: object + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + image: + type: string + imagePullPolicy: + type: string + livenessProbe: type: object properties: - mode: - description: 'Optional: mode bits to use on this - file, must be a value between 0 and 0777. If - not specified, the volume defaultMode will be - used. This might be in conflict with other options - that affect the file mode, like fsGroup, and - the result can be other mode bits set.' + failureThreshold: type: number - path: - description: 'Required: Path is the relative - path name of the file to be created. Must not - be absolute or contain the ''..'' path. Must - be utf-8 encoded. The first item of the relative - path must not start with ''..''' - type: string - resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format + periodSeconds: + type: number + tcpSocket: type: object properties: - divisor: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" | - "-" ::= | - ::= | - | ::= Ki | - Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G - | T | P | E (Note that 1024 = 1Ki but - 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No matter which of - the three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be - extended in the future if we require larger - or smaller quantities. When a Quantity - is parsed from a string, it will remember - the type of suffix it had, and will use - the same type again when it is serialized. Before - serializing, Quantity will be put in "canonical - form". This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. The - sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as - "1536Mi" Note that the quantity will NEVER - be internally represented by a floating - point number. That is the whole point of - this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or - don''t diff.) This format is intended to - make it difficult to use these numbers without - writing some sort of special handling code - in the hopes that that will cause implementors - to also use a fixed point implementation.' + port: type: object properties: - number: + intValue: type: number - format: + isInt: + type: boolean + strValue: type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to select' - type: string - containerName: - description: 'Container name: required for - volumes, optional for env vars' + required: + - isInt + host: type: string required: - - resource - fieldRef: - description: ObjectFieldSelector selects an APIVersioned - field of an object. + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: type: object properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: type: string - fieldPath: - description: Path of the field to select in - the specified API version. + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value required: - - fieldPath - required: - - path - awsElasticBlockStore: - description: Represents a Persistent Disk resource in AWS. An - AWS EBS disk must exist before mounting to a container. - The disk must also be in the same AWS zone as the kubelet. - An AWS EBS disk can only be mounted as read/write once. - AWS EBS volumes support ownership management and SELinux - relabeling. - type: object - properties: - partition: - description: 'The partition in the volume that you want - to mount. If omitted, the default is to mount by volume - name. Examples: For volume /dev/sda1, you specify - the partition as "1". Similarly, the volume partition - for /dev/sda is "0" (or you can leave the property - empty).' - type: number - volumeID: - description: 'Unique ID of the persistent disk resource - in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - readOnly: - description: 'Specify "true" to force and set the ReadOnly - property in VolumeMounts to "true". If omitted, the - default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: boolean - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - required: - - volumeID - flocker: - description: Represents a Flocker volume mounted by the - Flocker agent. One and only one of datasetName and datasetUUID - should be set. Flocker volumes do not support ownership - management or SELinux relabeling. - type: object - properties: - datasetName: - description: Name of the dataset stored as metadata - -> name on the dataset for Flocker should be considered - as deprecated - type: string - datasetUUID: - description: UUID of the dataset. This is unique identifier - of a Flocker dataset - type: string - iscsi: - description: Represents an ISCSI disk. ISCSI volumes can - only be mounted as read/write once. ISCSI volumes support - ownership management and SELinux relabeling. - type: object - properties: - chapAuthSession: - description: whether support iSCSI Session CHAP authentication - type: boolean - iscsiInterface: - description: iSCSI Interface Name that uses an iSCSI - transport. Defaults to 'default' (tcp). - type: string - lun: - description: iSCSI Target Lun number. - type: number - chapAuthDiscovery: - description: whether support iSCSI Discovery CHAP authentication - type: boolean - iqn: - description: Target iSCSI Qualified Name. - type: string - portals: - description: iSCSI Target Portal List. The portal is - either an IP or ip_addr:port if the port is other - than default (typically TCP ports 860 and 3260). - type: array - items: + - port + stdin: + type: boolean + terminationMessagePolicy: type: string - secretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - initiatorName: - description: Custom iSCSI Initiator Name. If initiatorName - is specified with iscsiInterface simultaneously, new - iSCSI interface : will - be created for the connection. - type: string - readOnly: - description: ReadOnly here will force the ReadOnly setting - in VolumeMounts. Defaults to false. - type: boolean - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' - type: string - targetPortal: - description: iSCSI Target Portal. The Portal is either - an IP or ip_addr:port if the port is other than default - (typically TCP ports 860 and 3260). - type: string - required: - - iqn - - lun - - targetPortal - rbd: - description: Represents a Rados Block Device mount that - lasts the lifetime of a pod. RBD volumes support ownership - management and SELinux relabeling. - type: object - properties: - image: - description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - pool: - description: 'The rados pool name. Default is rbd. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - secretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: boolean - fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' - type: string - keyring: - description: 'Keyring is the path to key ring for RBDUser. - Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - user: - description: 'The rados user name. Default is admin. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - monitors: - description: 'A collection of Ceph monitors. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: array - items: + terminationMessagePath: type: string - required: - - image - - monitors - configMap: - description: Adapts a ConfigMap into a volume. The contents - of the target ConfigMap's Data field will be presented - in a volume as files using the keys in the Data field - as the file names, unless the items element is populated - with specific mappings of keys to paths. ConfigMap volumes - support ownership management and SELinux relabeling. - type: object - properties: - defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and 0777. - Defaults to 0644. Directories within the path are - not affected by this setting. This might be in conflict - with other options that affect the file mode, like - fsGroup, and the result can be other mode bits set.' - type: number - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap or its keys - must be defined - type: boolean - items: - description: If unspecified, each key-value pair in - the Data field of the referenced ConfigMap will be - projected into the volume as a file whose name is - the key and content is the value. If specified, the - listed keys will be projected into the specified paths, - and unlisted keys will not be present. If a key is - specified which is not present in the ConfigMap, the - volume setup will error unless it is marked optional. - Paths must be relative and may not contain the '..' - path or start with '..'. - type: array - items: - description: Maps a string key to a path within a - volume. + workingDir: + type: string + resources: type: object properties: - mode: - description: 'Optional: mode bits to use on this - file, must be a value between 0 and 0777. If - not specified, the volume defaultMode will be - used. This might be in conflict with other options - that affect the file mode, like fsGroup, and - the result can be other mode bits set.' + requests: + additionalProperties: + type: string + type: object + limits: + additionalProperties: + type: string + type: object + securityContext: + type: object + properties: + privileged: + type: boolean + runAsUser: type: number - path: - description: The relative path of the file to - map the key to. May not be an absolute path. - May not contain the path element '..'. May not - start with the string '..'. - type: string - key: - description: The key to project. + capabilities: + type: object + properties: + add: + type: array + items: + type: string + drop: + type: array + items: + type: string + seLinuxOptions: + type: object + properties: + role: + type: string + level: + type: string + type: + type: string + user: + type: string + windowsOptions: + type: object + properties: + gmsaCredentialSpec: + type: string + runAsUserName: + type: string + gmsaCredentialSpecName: + type: string + procMount: type: string - required: - - key - - path - storageos: - description: Represents a StorageOS persistent volume resource. - type: object - properties: - volumeNamespace: - description: VolumeNamespace specifies the scope of - the volume within StorageOS. If no namespace is specified - then the Pod's namespace will be used. This allows - the Kubernetes name scoping to be mirrored within - StorageOS for tighter integration. Set VolumeName - to any name to override the default behaviour. Set - to "default" if you are not using namespaces within - StorageOS. Namespaces that do not pre-exist within - StorageOS will be created. - type: string - volumeName: - description: VolumeName is the human-readable name of - the StorageOS volume. Volume names are only unique - within a namespace. - type: string - secretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - csi: - description: Represents a source location of a volume to - mount, managed by an external CSI driver - type: object - properties: - driver: - description: Driver is the name of the CSI driver that - handles this volume. Consult with your admin for the - correct name as registered in the cluster. - type: string - nodePublishSecretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - readOnly: - description: Specifies a read-only configuration for - the volume. Defaults to false (read/write). - type: boolean - fsType: - description: Filesystem type to mount. Ex. "ext4", "xfs", - "ntfs". If not provided, the empty value is passed - to the associated CSI driver which will determine - the default filesystem to apply. - type: string - volumeAttributes: - description: VolumeAttributes stores driver-specific - properties that are passed to the CSI driver. Consult - your driver's documentation for supported values. - additionalProperties: - type: string - type: object - required: - - driver - name: - description: 'Volume''s name. Must be a DNS_LABEL and unique - within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - nfs: - description: Represents an NFS mount that lasts the lifetime - of a pod. NFS volumes do not support ownership management - or SELinux relabeling. - type: object - properties: - path: - description: 'Path that is exported by the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - server: - description: 'Server is the hostname or IP address of - the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - readOnly: - description: 'ReadOnly here will force the NFS export - to be mounted with read-only permissions. Defaults - to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: boolean - required: - - path - - server - persistentVolumeClaim: - description: PersistentVolumeClaimVolumeSource references - the user's PVC in the same namespace. This volume finds - the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource - is, essentially, a wrapper around another type of volume - that is owned by someone else (the system). - type: object - properties: - claimName: - description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: string - readOnly: - description: Will force the ReadOnly setting in VolumeMounts. - Default false. - type: boolean - required: - - claimName - gitRepo: - description: 'Represents a volume that is populated with - the contents of a git repository. Git repo volumes do - not support ownership management. Git repo volumes support - SELinux relabeling. DEPRECATED: GitRepo is deprecated. - To provision a container with a git repo, mount an EmptyDir - into an InitContainer that clones the repo using git, - then mount the EmptyDir into the Pod''s container.' - type: object - properties: - repository: - description: Repository URL - type: string - directory: - description: Target directory name. Must not contain - or start with '..'. If '.' is supplied, the volume - directory will be the git repository. Otherwise, - if specified, the volume will contain the git repository - in the subdirectory with the given name. - type: string - revision: - description: Commit hash for the specified revision. - type: string - required: - - repository - portworxVolume: - description: PortworxVolumeSource represents a Portworx - volume resource. - type: object - properties: - volumeID: - description: VolumeID uniquely identifies a Portworx - volume - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - fsType: - description: FSType represents the filesystem type to - mount Must be a filesystem type supported by the host - operating system. Ex. "ext4", "xfs". Implicitly inferred - to be "ext4" if unspecified. - type: string - required: - - volumeID - vsphereVolume: - description: Represents a vSphere volume resource. - type: object - properties: - storagePolicyName: - description: Storage Policy Based Management (SPBM) - profile name. - type: string - storagePolicyID: - description: Storage Policy Based Management (SPBM) - profile ID associated with the StoragePolicyName. - type: string - volumePath: - description: Path that identifies vSphere volume vmdk - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - required: - - volumePath - fc: - description: Represents a Fibre Channel volume. Fibre Channel - volumes can only be mounted as read/write once. Fibre - Channel volumes support ownership management and SELinux - relabeling. - type: object - properties: - lun: - description: 'Optional: FC target lun number' - type: number - targetWWNs: - description: 'Optional: FC target worldwide names (WWNs)' - type: array - items: - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' - type: boolean - wwids: - description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' - type: array - items: - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. - type: string - hostPath: - description: Represents a host path mapped into a pod. Host - path volumes do not support ownership management or SELinux - relabeling. - type: object - properties: - path: - description: 'Path of the directory on the host. If - the path is a symlink, it will follow the link to - the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - type: - description: 'Type for HostPath Volume Defaults to "" - More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - required: - - path - required: - - name - resources: - type: object - description: Memory and CPU minimum requirements and limits for - the server. - properties: - requests: - type: object - additionalProperties: - type: string - description: 'Requests describes the minimum amount of compute - resources required. If Requests is omitted for a container, - it defaults to Limits if that is explicitly specified, otherwise - to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - limits: - type: object - additionalProperties: - type: string - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - annotations: - type: object - additionalProperties: - type: string - description: The annotations to be attached to generated resources. - env: - type: array - description: A list of environment variables to add to a server. - items: - description: EnvVar represents an environment variable present - in a Container. - type: object - properties: - name: - description: Name of the environment variable. Must be a - C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are expanded - using the previous defined environment variables in the - container and any service environment variables. If a - variable cannot be resolved, the reference in the input - string will be unchanged. The $(VAR_NAME) syntax can be - escaped with a double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether the variable - exists or not. Defaults to "".' - type: string - valueFrom: - description: EnvVarSource represents a source for the value - of an EnvVar. - type: object - properties: - secretKeyRef: - description: SecretKeySelector selects a key of a Secret. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - required: - - key - resourceFieldRef: - description: ResourceFieldSelector represents container - resources (cpu, memory) and their output format - type: object - properties: - divisor: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and - AsInt64() accessors. The serialization format - is: ::= (Note - that may be empty, from the "" case in - .) ::= 0 | 1 | ... - | 9 ::= | - ::= | . - | . | . ::= - "+" | "-" ::= | - ::= | - | ::= Ki | Mi | - Gi | Ti | Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T | - P | E (Note that 1024 = 1Ki but 1000 = 1k; I - didn''t choose the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms is used, - no quantity may represent a number greater than - 2^63-1 in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more precise - will be capped or rounded up. (E.g.: 0.1m will - rounded up to 1m.) This may be extended in the - future if we require larger or smaller quantities. When - a Quantity is parsed from a string, it will remember - the type of suffix it had, and will use the same - type again when it is serialized. Before serializing, - Quantity will be put in "canonical form". This - means that Exponent/suffix will be adjusted up - or down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision is lost b. - No fractional digits will be emitted c. The - exponent (or suffix) is as large as possible. - The sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole - point of this exercise. Non-canonical values - will still parse as long as they are well formed, - but will be re-emitted in their canonical form. - (So always use canonical form, or don''t diff.) This - format is intended to make it difficult to use - these numbers without writing some sort of special - handling code in the hopes that that will cause - implementors to also use a fixed point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to select' - type: string - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - required: - - resource - configMapKeyRef: - description: Selects a key from a ConfigMap. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - key: - description: The key to select. - type: string - required: - - key - fieldRef: - description: ObjectFieldSelector selects an APIVersioned - field of an object. - type: object - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the - specified API version. - type: string - required: - - fieldPath - required: - - name - restartPolicy: - type: string - description: 'Restart policy for all containers within the pod. - One of Always, OnFailure, Never. Default to Always. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' - nodeSelector: - type: object - additionalProperties: - type: string - description: Selector which must match a node's labels for the - pod to be scheduled on that node. - volumeMounts: - type: array - description: Additional volume mounts for the server pod. - items: - description: VolumeMount describes a mounting of a Volume within - a container. - type: object - properties: - mountPath: - description: Path within the container at which the volume - should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts are - propagated from the host to container and the other way - around. When not set, MountPropagationNone is used. This - field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves similarly - to SubPath but environment variable references $(VAR_NAME) - are expanded using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath are mutually - exclusive. This field is beta in 1.15. - type: string - required: - - mountPath - - name - labels: - type: object - additionalProperties: - type: string - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. - runtimeClassName: - type: string - description: 'RuntimeClassName refers to a RuntimeClass object - in the node.k8s.io group, which should be used to run this pod. If - no RuntimeClass resource matches the named class, the pod will - not be run. If unset or empty, the "legacy" RuntimeClass will - be used, which is an implicit class with an empty definition - that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md - This is an alpha feature and may change in the future.' - tolerations: - type: array - description: If specified, the pod's tolerations. - items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple using - the matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to match. - Empty means match all taint effects. When specified, allowed - values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of - time the toleration (which must be of effect NoExecute, - otherwise this field is ignored) tolerates the taint. - By default, it is not set, which means tolerate the taint - forever (do not evict). Zero and negative values will - be treated as 0 (evict immediately) by the system. - type: number - value: - description: Value is the taint value the toleration matches - to. If the operator is Exists, the value should be empty, - otherwise just a regular string. - type: string - key: - description: Key is the taint key that the toleration applies - to. Empty means match all taint keys. If the key is empty, - operator must be Exists; this combination means to match - all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to - the value. Valid operators are Exists and Equal. Defaults - to Equal. Exists is equivalent to wildcard for value, - so that a pod can tolerate all taints of a particular - category. - type: string - readinessProbe: - type: object - description: Settings for the readiness probe associated with - a server. - properties: - periodSeconds: - type: number - description: The number of seconds between checks. - timeoutSeconds: - type: number - description: The number of seconds with no response that indicates - a failure. - initialDelaySeconds: - type: number - description: The number of seconds before the first check - is performed. - containers: - type: array - description: Additional containers to be included in the server - pod. - items: - description: A single application container that you want to - run within a pod. - type: object - properties: - volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. - type: array - items: - description: volumeDevice describes a mapping of a raw - block device within a container. - type: object - properties: - devicePath: - description: devicePath is the path inside of the - container that the device will be mapped to. - type: string - name: - description: name must match the name of a persistentVolumeClaim - in the pod - type: string - required: - - devicePath - - name - image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config management - to default or override container images in workload controllers - like Deployments and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One of Always, Never, IfNotPresent. - Defaults to Always if :latest tag is specified, or IfNotPresent - otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - livenessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive or - ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum - value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - stdin: - description: Whether this container should allocate a buffer - for stdin in the container runtime. If this is not set, - reads from stdin in the container will always result in - EOF. Default is false. - type: boolean - terminationMessagePolicy: - description: Indicate how the termination message should - be populated. File will use the contents of terminationMessagePath - to populate the container status message on both success - and failure. FallbackToLogsOnError will use the last chunk - of container log output if the termination message file - is empty and the container exited with an error. The log - output is limited to 2048 bytes or 80 lines, whichever - is smaller. Defaults to File. Cannot be updated. - type: string - terminationMessagePath: - description: 'Optional: Path at which the file to which - the container''s termination message will be written is - mounted into the container''s filesystem. Message written - is intended to be brief final status, such as an assertion - failure message. Will be truncated by the node if greater - than 4096 bytes. The total message length across all containers - will be limited to 12kb. Defaults to /dev/termination-log. - Cannot be updated.' - type: string - workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which might - be configured in the container image. Cannot be updated. - type: string - resources: - description: ResourceRequirements describes the compute - resource requirements. - type: object - properties: - requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is omitted - for a container, it defaults to Limits if that is - explicitly specified, otherwise to an implementation-defined - value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - limits: - description: 'Limits describes the maximum amount of - compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields are present - in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take precedence. - type: object - properties: - privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. - type: boolean - runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - type: number - capabilities: - description: Adds and removes POSIX capabilities from - running containers. - type: object - properties: - add: - description: Added capabilities - type: array - items: - type: string - drop: - description: Removed capabilities - type: array - items: - type: string - seLinuxOptions: - description: SELinuxOptions are the labels to be applied - to the container - type: object - properties: - role: - description: Role is a SELinux role label that applies - to the container. - type: string - level: - description: Level is SELinux level label that applies - to the container. - type: string - type: - description: Type is a SELinux type label that applies - to the container. - type: string - user: - description: User is a SELinux user label that applies - to the container. - type: string - windowsOptions: - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. - type: string - runAsUserName: - description: The UserName in Windows to run the - entrypoint of the container process. Defaults - to the user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - This field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. - type: string - procMount: - description: procMount denotes the type of proc mount - to use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. - type: string - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent - process. This bool directly controls if the no_new_privs - flag will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' - type: boolean - runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. - type: number - runAsNonRoot: - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if - it does. If unset or false, no such validation will - be performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - type: boolean - readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. - type: boolean - startupProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive or - ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum - value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - env: - description: List of environment variables to set in the - container. Cannot be updated. - type: array - items: - description: EnvVar represents an environment variable - present in a Container. - type: object - properties: - name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are - expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Defaults to "".' - type: string - valueFrom: - description: EnvVarSource represents a source for - the value of an EnvVar. - type: object - properties: - secretKeyRef: - description: SecretKeySelector selects a key of - a Secret. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - required: - - key - resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format - type: object - properties: - divisor: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" | - "-" ::= | - ::= | - | ::= Ki | - Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G - | T | P | E (Note that 1024 = 1Ki but - 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No matter which of - the three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be - extended in the future if we require larger - or smaller quantities. When a Quantity - is parsed from a string, it will remember - the type of suffix it had, and will use - the same type again when it is serialized. Before - serializing, Quantity will be put in "canonical - form". This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. The - sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as - "1536Mi" Note that the quantity will NEVER - be internally represented by a floating - point number. That is the whole point of - this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or - don''t diff.) This format is intended to - make it difficult to use these numbers without - writing some sort of special handling code - in the hopes that that will cause implementors - to also use a fixed point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to select' - type: string - containerName: - description: 'Container name: required for - volumes, optional for env vars' - type: string - required: - - resource - configMapKeyRef: - description: Selects a key from a ConfigMap. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - key: - description: The key to select. - type: string - required: - - key - fieldRef: - description: ObjectFieldSelector selects an APIVersioned - field of an object. - type: object - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in - the specified API version. - type: string - required: - - fieldPath - required: - - name - ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional information - about the network connections a container uses, but is - primarily informational. Not specifying a port here DOES - NOT prevent that port from being exposed. Any port which - is listening on the default "0.0.0.0" address inside a - container will be accessible from the network. Cannot - be updated. - type: array - items: - description: ContainerPort represents a network port in - a single container. - type: object - properties: - protocol: - description: Protocol for port. Must be UDP, TCP, - or SCTP. Defaults to "TCP". - type: string - hostIP: - description: What host IP to bind the external port - to. - type: string - name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in a - pod must have a unique name. Name for the port that - can be referred to by services. - type: string - containerPort: - description: Number of port to expose on the pod's - IP address. This must be a valid port number, 0 - < x < 65536. - type: number - hostPort: - description: Number of port to expose on the host. - If specified, this must be a valid port number, - 0 < x < 65536. If HostNetwork is specified, this - must match ContainerPort. Most containers do not - need this. - type: number - required: - - containerPort - command: - description: 'Entrypoint array. Not executed within a shell. - The docker image''s ENTRYPOINT is used if this is not - provided. Variable references $(VAR_NAME) are expanded - using the container''s environment. If a variable cannot - be resolved, the reference in the input string will be - unchanged. The $(VAR_NAME) syntax can be escaped with - a double $$, ie: $$(VAR_NAME). Escaped references will - never be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: - type: string - volumeMounts: - description: Pod volumes to mount into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes a mounting of a Volume - within a container. - type: object - properties: - mountPath: - description: Path within the container at which the - volume should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and the - other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the - container's volume should be mounted. Defaults to - "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment variable - references $(VAR_NAME) are expanded using the container's - environment. Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field is - beta in 1.15. - type: string - required: - - mountPath - - name - args: - description: 'Arguments to the entrypoint. The docker image''s - CMD is used if this is not provided. Variable references - $(VAR_NAME) are expanded using the container''s environment. - If a variable cannot be resolved, the reference in the - input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). Escaped - references will never be expanded, regardless of whether - the variable exists or not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: - type: string - lifecycle: - description: Lifecycle describes actions that the management - system should take in response to container lifecycle - events. For the PostStart and PreStop lifecycle handlers, - management of the container blocks until the action is - complete, unless the container process fails, in which - case the handler is aborted. - type: object - properties: - postStart: - description: Handler defines a specific action that - should be taken - type: object - properties: - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - preStop: - description: Handler defines a specific action that - should be taken - type: object - properties: - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. - type: string - tty: - description: Whether this container should allocate a TTY - for itself, also requires 'stdin' to be true. Default - is false. - type: boolean - readinessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive or - ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum - value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - stdinOnce: - description: Whether the container runtime should close - the stdin channel after it has been opened by a single - attach. When stdin is true the stdin stream will remain - open across multiple attach sessions. If stdinOnce is - set to true, stdin is opened on container start, is empty - until the first client attaches to stdin, and then remains - open and accepts data until the client disconnects, at - which time stdin is closed and remains closed until the - container is restarted. If this flag is false, a container - processes that reads from stdin will never receive an - EOF. Default is false - type: boolean - envFrom: - description: List of sources to populate environment variables - in the container. The keys defined within a source must - be a C_IDENTIFIER. All invalid keys will be reported as - an event when the container is starting. When a key exists - in multiple sources, the value associated with the last - source will take precedence. Values defined by an Env - with a duplicate key will take precedence. Cannot be updated. - type: array - items: - description: EnvFromSource represents the source of a - set of ConfigMaps - type: object - properties: - configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field will - represent the key-value pairs as environment variables. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap must - be defined - type: boolean - prefix: - description: An optional identifier to prepend to - each key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: SecretEnvSource selects a Secret to populate - the environment variables with. The contents of - the target Secret's Data field will represent the - key-value pairs as environment variables. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret must be - defined - type: boolean - required: - - name - containerSecurityContext: - type: object - description: Container-level security attributes. Will override - any matching pod-level attributes. - properties: - privileged: - type: boolean - description: Run container in privileged mode. Processes in - privileged containers are essentially equivalent to root - on the host. Defaults to false. - runAsUser: - type: number - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata if - unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. - capabilities: - type: object - description: Adds and removes POSIX capabilities from running - containers. - properties: - add: - type: array - description: Added capabilities - items: - type: string - drop: - type: array - description: Removed capabilities - items: - type: string - seLinuxOptions: - type: object - description: SELinuxOptions are the labels to be applied to - the container - properties: - role: - type: string - description: Role is a SELinux role label that applies - to the container. - level: - type: string - description: Level is SELinux level label that applies - to the container. - type: - type: string - description: Type is a SELinux type label that applies - to the container. - user: - type: string - description: User is a SELinux user label that applies - to the container. - windowsOptions: - type: object - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. - properties: - gmsaCredentialSpec: - type: string - description: GMSACredentialSpec is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec named - by the GMSACredentialSpecName field. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. - runAsUserName: - type: string - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set in - PodSecurityContext. If set in both SecurityContext and - PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and it is - only honored by servers that enable the WindowsRunAsUserName - feature flag. - gmsaCredentialSpecName: - type: string - description: GMSACredentialSpecName is the name of the - GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. - procMount: - type: string - description: procMount denotes the type of proc mount to use - for the containers. The default is DefaultProcMount which - uses the container runtime defaults for readonly paths and - masked paths. This requires the ProcMountType feature flag - to be enabled. - allowPrivilegeEscalation: - type: boolean - description: 'AllowPrivilegeEscalation controls whether a - process can gain more privileges than its parent process. - This bool directly controls if the no_new_privs flag will - be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' - runAsGroup: - type: number - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be set - in PodSecurityContext. If set in both SecurityContext and - PodSecurityContext, the value specified in SecurityContext - takes precedence. - runAsNonRoot: - type: boolean - description: Indicates that the container must run as a non-root - user. If true, the Kubelet will validate the image at runtime - to ensure that it does not run as UID 0 (root) and fail - to start the container if it does. If unset or false, no - such validation will be performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. - readOnlyRootFilesystem: - type: boolean - description: Whether this container has a read-only root filesystem. - Default is false. - schedulerName: - type: string - description: If specified, the pod will be dispatched by specified - scheduler. If not specified, the pod will be dispatched by default - scheduler. - initContainers: - type: array - description: Initialization containers to be included in the server - pod. - items: - description: A single application container that you want to - run within a pod. - type: object - properties: - volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. - type: array - items: - description: volumeDevice describes a mapping of a raw - block device within a container. - type: object - properties: - devicePath: - description: devicePath is the path inside of the - container that the device will be mapped to. - type: string - name: - description: name must match the name of a persistentVolumeClaim - in the pod - type: string - required: - - devicePath - - name - image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config management - to default or override container images in workload controllers - like Deployments and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One of Always, Never, IfNotPresent. - Defaults to Always if :latest tag is specified, or IfNotPresent - otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - livenessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive or - ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum - value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - stdin: - description: Whether this container should allocate a buffer - for stdin in the container runtime. If this is not set, - reads from stdin in the container will always result in - EOF. Default is false. - type: boolean - terminationMessagePolicy: - description: Indicate how the termination message should - be populated. File will use the contents of terminationMessagePath - to populate the container status message on both success - and failure. FallbackToLogsOnError will use the last chunk - of container log output if the termination message file - is empty and the container exited with an error. The log - output is limited to 2048 bytes or 80 lines, whichever - is smaller. Defaults to File. Cannot be updated. - type: string - terminationMessagePath: - description: 'Optional: Path at which the file to which - the container''s termination message will be written is - mounted into the container''s filesystem. Message written - is intended to be brief final status, such as an assertion - failure message. Will be truncated by the node if greater - than 4096 bytes. The total message length across all containers - will be limited to 12kb. Defaults to /dev/termination-log. - Cannot be updated.' - type: string - workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which might - be configured in the container image. Cannot be updated. - type: string - resources: - description: ResourceRequirements describes the compute - resource requirements. - type: object - properties: - requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is omitted - for a container, it defaults to Limits if that is - explicitly specified, otherwise to an implementation-defined - value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - limits: - description: 'Limits describes the maximum amount of - compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields are present - in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take precedence. - type: object - properties: - privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. - type: boolean - runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - type: number - capabilities: - description: Adds and removes POSIX capabilities from - running containers. - type: object - properties: - add: - description: Added capabilities - type: array - items: - type: string - drop: - description: Removed capabilities - type: array - items: - type: string - seLinuxOptions: - description: SELinuxOptions are the labels to be applied - to the container - type: object - properties: - role: - description: Role is a SELinux role label that applies - to the container. - type: string - level: - description: Level is SELinux level label that applies - to the container. - type: string - type: - description: Type is a SELinux type label that applies - to the container. - type: string - user: - description: User is a SELinux user label that applies - to the container. - type: string - windowsOptions: - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. - type: string - runAsUserName: - description: The UserName in Windows to run the - entrypoint of the container process. Defaults - to the user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - This field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. - type: string - procMount: - description: procMount denotes the type of proc mount - to use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. - type: string - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent - process. This bool directly controls if the no_new_privs - flag will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' - type: boolean - runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. - type: number - runAsNonRoot: - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if - it does. If unset or false, no such validation will - be performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - type: boolean - readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. - type: boolean - startupProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive or - ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum - value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - env: - description: List of environment variables to set in the - container. Cannot be updated. - type: array - items: - description: EnvVar represents an environment variable - present in a Container. - type: object - properties: - name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are - expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Defaults to "".' - type: string - valueFrom: - description: EnvVarSource represents a source for - the value of an EnvVar. - type: object - properties: - secretKeyRef: - description: SecretKeySelector selects a key of - a Secret. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - required: - - key - resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format - type: object - properties: - divisor: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" | - "-" ::= | - ::= | - | ::= Ki | - Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G - | T | P | E (Note that 1024 = 1Ki but - 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No matter which of - the three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be - extended in the future if we require larger - or smaller quantities. When a Quantity - is parsed from a string, it will remember - the type of suffix it had, and will use - the same type again when it is serialized. Before - serializing, Quantity will be put in "canonical - form". This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. The - sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as - "1536Mi" Note that the quantity will NEVER - be internally represented by a floating - point number. That is the whole point of - this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or - don''t diff.) This format is intended to - make it difficult to use these numbers without - writing some sort of special handling code - in the hopes that that will cause implementors - to also use a fixed point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to select' - type: string - containerName: - description: 'Container name: required for - volumes, optional for env vars' - type: string - required: - - resource - configMapKeyRef: - description: Selects a key from a ConfigMap. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - key: - description: The key to select. - type: string - required: - - key - fieldRef: - description: ObjectFieldSelector selects an APIVersioned - field of an object. - type: object - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in - the specified API version. - type: string - required: - - fieldPath - required: - - name - ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional information - about the network connections a container uses, but is - primarily informational. Not specifying a port here DOES - NOT prevent that port from being exposed. Any port which - is listening on the default "0.0.0.0" address inside a - container will be accessible from the network. Cannot - be updated. - type: array - items: - description: ContainerPort represents a network port in - a single container. - type: object - properties: - protocol: - description: Protocol for port. Must be UDP, TCP, - or SCTP. Defaults to "TCP". - type: string - hostIP: - description: What host IP to bind the external port - to. - type: string - name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in a - pod must have a unique name. Name for the port that - can be referred to by services. - type: string - containerPort: - description: Number of port to expose on the pod's - IP address. This must be a valid port number, 0 - < x < 65536. - type: number - hostPort: - description: Number of port to expose on the host. - If specified, this must be a valid port number, - 0 < x < 65536. If HostNetwork is specified, this - must match ContainerPort. Most containers do not - need this. - type: number - required: - - containerPort - command: - description: 'Entrypoint array. Not executed within a shell. - The docker image''s ENTRYPOINT is used if this is not - provided. Variable references $(VAR_NAME) are expanded - using the container''s environment. If a variable cannot - be resolved, the reference in the input string will be - unchanged. The $(VAR_NAME) syntax can be escaped with - a double $$, ie: $$(VAR_NAME). Escaped references will - never be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: - type: string - volumeMounts: - description: Pod volumes to mount into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes a mounting of a Volume - within a container. - type: object - properties: - mountPath: - description: Path within the container at which the - volume should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and the - other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the - container's volume should be mounted. Defaults to - "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment variable - references $(VAR_NAME) are expanded using the container's - environment. Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field is - beta in 1.15. - type: string - required: - - mountPath - - name - args: - description: 'Arguments to the entrypoint. The docker image''s - CMD is used if this is not provided. Variable references - $(VAR_NAME) are expanded using the container''s environment. - If a variable cannot be resolved, the reference in the - input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). Escaped - references will never be expanded, regardless of whether - the variable exists or not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: - type: string - lifecycle: - description: Lifecycle describes actions that the management - system should take in response to container lifecycle - events. For the PostStart and PreStop lifecycle handlers, - management of the container blocks until the action is - complete, unless the container process fails, in which - case the handler is aborted. - type: object - properties: - postStart: - description: Handler defines a specific action that - should be taken - type: object - properties: - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - preStop: - description: Handler defines a specific action that - should be taken - type: object - properties: - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. - type: string - tty: - description: Whether this container should allocate a TTY - for itself, also requires 'stdin' to be true. Default - is false. - type: boolean - readinessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive or - ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum - value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - stdinOnce: - description: Whether the container runtime should close - the stdin channel after it has been opened by a single - attach. When stdin is true the stdin stream will remain - open across multiple attach sessions. If stdinOnce is - set to true, stdin is opened on container start, is empty - until the first client attaches to stdin, and then remains - open and accepts data until the client disconnects, at - which time stdin is closed and remains closed until the - container is restarted. If this flag is false, a container - processes that reads from stdin will never receive an - EOF. Default is false - type: boolean - envFrom: - description: List of sources to populate environment variables - in the container. The keys defined within a source must - be a C_IDENTIFIER. All invalid keys will be reported as - an event when the container is starting. When a key exists - in multiple sources, the value associated with the last - source will take precedence. Values defined by an Env - with a duplicate key will take precedence. Cannot be updated. - type: array - items: - description: EnvFromSource represents the source of a - set of ConfigMaps - type: object - properties: - configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field will - represent the key-value pairs as environment variables. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap must - be defined - type: boolean - prefix: - description: An optional identifier to prepend to - each key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: SecretEnvSource selects a Secret to populate - the environment variables with. The contents of - the target Secret's Data field will represent the - key-value pairs as environment variables. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret must be - defined - type: boolean - required: - - name - shutdown: - type: object - description: Configures how the operator should shutdown the server - instance. - properties: - ignoreSessions: - type: boolean - description: For graceful shutdown only, indicates to ignore - pending HTTP sessions during in-flight work handling. Not - required. Defaults to false. - shutdownType: - type: string - description: Tells the operator how to shutdown server instances. - Not required. Defaults to graceful shutdown. - enum: - - Graceful - - Forced - timeoutSeconds: - type: number - description: For graceful shutdown only, number of seconds - to wait before aborting in-flight work and shutting down - the server. Not required. Defaults to 30 seconds. - affinity: - type: object - description: If specified, the pod's scheduling constraints - properties: - nodeAffinity: - type: object - description: Node affinity is a group of node affinity scheduling - rules. - properties: - requiredDuringSchedulingIgnoredDuringExecution: - type: object - description: A node selector represents the union of the - results of one or more label queries over a set of nodes; - that is, it represents the OR of the selectors represented - by the node selector terms. - properties: - nodeSelectorTerms: - type: array - description: Required. A list of node selector terms. - The terms are ORed. - items: - description: A null or empty node selector term - matches no objects. The requirements of them are - ANDed. The TopologySelectorTerm type implements - a subset of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - type: array - items: - description: A node selector requirement is - a selector that contains values, a key, - and an operator that relates the key and - values. - type: object - properties: - values: - description: An array of string values. - If the operator is In or NotIn, the - values array must be non-empty. If the - operator is Exists or DoesNotExist, - the values array must be empty. If the - operator is Gt or Lt, the values array - must have a single element, which will - be interpreted as an integer. This array - is replaced during a strategic merge - patch. - type: array - items: - type: string - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. - type: string - required: - - key - - operator - matchFields: - description: A list of node selector requirements - by node's fields. - type: array - items: - description: A node selector requirement is - a selector that contains values, a key, - and an operator that relates the key and - values. - type: object - properties: - values: - description: An array of string values. - If the operator is In or NotIn, the - values array must be non-empty. If the - operator is Exists or DoesNotExist, - the values array must be empty. If the - operator is Gt or Lt, the values array - must have a single element, which will - be interpreted as an integer. This array - is replaced during a strategic merge - patch. - type: array - items: - type: string - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. - type: string - required: - - key - - operator - required: - - nodeSelectorTerms - preferredDuringSchedulingIgnoredDuringExecution: - type: array - description: The scheduler will prefer to schedule pods - to nodes that satisfy the affinity expressions specified - by this field, but it may choose a node that violates - one or more of the expressions. The node that is most - preferred is the one with the greatest sum of weights, - i.e. for each node that meets all of the scheduling - requirements (resource request, requiredDuringScheduling - affinity expressions, etc.), compute a sum by iterating - through the elements of this field and adding "weight" - to the sum if the node matches the corresponding matchExpressions; - the node(s) with the highest sum are the most preferred. - items: - description: An empty preferred scheduling term matches - all objects with implicit weight 0 (i.e. it's a no-op). - A null preferred scheduling term matches no objects - (i.e. is also a no-op). - type: object - properties: - preference: - description: A null or empty node selector term - matches no objects. The requirements of them are - ANDed. The TopologySelectorTerm type implements - a subset of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - type: array - items: - description: A node selector requirement is - a selector that contains values, a key, - and an operator that relates the key and - values. - type: object - properties: - values: - description: An array of string values. - If the operator is In or NotIn, the - values array must be non-empty. If the - operator is Exists or DoesNotExist, - the values array must be empty. If the - operator is Gt or Lt, the values array - must have a single element, which will - be interpreted as an integer. This array - is replaced during a strategic merge - patch. - type: array - items: - type: string - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. - type: string - required: - - key - - operator - matchFields: - description: A list of node selector requirements - by node's fields. - type: array - items: - description: A node selector requirement is - a selector that contains values, a key, - and an operator that relates the key and - values. - type: object - properties: - values: - description: An array of string values. - If the operator is In or NotIn, the - values array must be non-empty. If the - operator is Exists or DoesNotExist, - the values array must be empty. If the - operator is Gt or Lt, the values array - must have a single element, which will - be interpreted as an integer. This array - is replaced during a strategic merge - patch. - type: array - items: - type: string - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. - type: string - required: - - key - - operator - weight: - description: Weight associated with matching the - corresponding nodeSelectorTerm, in the range 1-100. - type: number - required: - - preference - - weight - podAffinity: - type: object - description: Pod affinity is a group of inter pod affinity - scheduling rules. - properties: - requiredDuringSchedulingIgnoredDuringExecution: - type: array - description: If the affinity requirements specified by - this field are not met at scheduling time, the pod will - not be scheduled onto the node. If the affinity requirements - specified by this field cease to be met at some point - during pod execution (e.g. due to a pod label update), - the system may or may not try to eventually evict the - pod from its node. When there are multiple elements, - the lists of nodes corresponding to each podAffinityTerm - are intersected, i.e. all terms must be satisfied. - items: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or not - co-located (anti-affinity) with, where co-located - is defined as running on a node whose value of the - label with key matches that of any node - on which a pod of the set of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label query over - a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label selector - matches no objects. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - type: array - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - type: object - properties: - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - type: array - items: - type: string - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - additionalProperties: - type: string - type: object - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified namespaces, - where co-located is defined as running on a node - whose value of the label with key topologyKey - matches that of any node on which any of the selected - pods is running. Empty topologyKey is not allowed. - type: string - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - type: array - items: - type: string - required: - - topologyKey - preferredDuringSchedulingIgnoredDuringExecution: - type: array - description: The scheduler will prefer to schedule pods - to nodes that satisfy the affinity expressions specified - by this field, but it may choose a node that violates - one or more of the expressions. The node that is most - preferred is the one with the greatest sum of weights, - i.e. for each node that meets all of the scheduling - requirements (resource request, requiredDuringScheduling - affinity expressions, etc.), compute a sum by iterating - through the elements of this field and adding "weight" - to the sum if the node has pods which matches the corresponding - podAffinityTerm; the node(s) with the highest sum are - the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred - node(s) - type: object - properties: - podAffinityTerm: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) with, - where co-located is defined as running on a node - whose value of the label with key - matches that of any node on which a pod of the - set of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label - selector matches no objects. - type: object - properties: - matchExpressions: - description: matchExpressions is a list - of label selector requirements. The requirements - are ANDed. - type: array - items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: values is an array of - string values. If the operator is - In or NotIn, the values array must - be non-empty. If the operator is - Exists or DoesNotExist, the values - array must be empty. This array - is replaced during a strategic merge - patch. - type: array - items: - type: string - key: - description: key is the label key - that the selector applies to. - type: string - operator: - description: operator represents a - key's relationship to a set of values. - Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. - additionalProperties: - type: string - type: object - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the - pods matching the labelSelector in the specified - namespaces, where co-located is defined as - running on a node whose value of the label - with key topologyKey matches that of any node - on which any of the selected pods is running. - Empty topologyKey is not allowed. - type: string - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - type: array - items: - type: string - required: - - topologyKey - weight: - description: weight associated with matching the - corresponding podAffinityTerm, in the range 1-100. - type: number - required: - - podAffinityTerm - - weight - podAntiAffinity: - type: object - description: Pod anti affinity is a group of inter pod anti - affinity scheduling rules. - properties: - requiredDuringSchedulingIgnoredDuringExecution: - type: array - description: If the anti-affinity requirements specified - by this field are not met at scheduling time, the pod - will not be scheduled onto the node. If the anti-affinity - requirements specified by this field cease to be met - at some point during pod execution (e.g. due to a pod - label update), the system may or may not try to eventually - evict the pod from its node. When there are multiple - elements, the lists of nodes corresponding to each podAffinityTerm - are intersected, i.e. all terms must be satisfied. - items: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or not - co-located (anti-affinity) with, where co-located - is defined as running on a node whose value of the - label with key matches that of any node - on which a pod of the set of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label query over - a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label selector - matches no objects. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - type: array - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - type: object - properties: - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - type: array - items: - type: string - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - additionalProperties: - type: string - type: object - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified namespaces, - where co-located is defined as running on a node - whose value of the label with key topologyKey - matches that of any node on which any of the selected - pods is running. Empty topologyKey is not allowed. - type: string - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - type: array - items: - type: string - required: - - topologyKey - preferredDuringSchedulingIgnoredDuringExecution: - type: array - description: The scheduler will prefer to schedule pods - to nodes that satisfy the anti-affinity expressions - specified by this field, but it may choose a node that - violates one or more of the expressions. The node that - is most preferred is the one with the greatest sum of - weights, i.e. for each node that meets all of the scheduling - requirements (resource request, requiredDuringScheduling - anti-affinity expressions, etc.), compute a sum by iterating - through the elements of this field and adding "weight" - to the sum if the node has pods which matches the corresponding - podAffinityTerm; the node(s) with the highest sum are - the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred - node(s) - type: object - properties: - podAffinityTerm: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) with, - where co-located is defined as running on a node - whose value of the label with key - matches that of any node on which a pod of the - set of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label - selector matches no objects. - type: object - properties: - matchExpressions: - description: matchExpressions is a list - of label selector requirements. The requirements - are ANDed. - type: array - items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: values is an array of - string values. If the operator is - In or NotIn, the values array must - be non-empty. If the operator is - Exists or DoesNotExist, the values - array must be empty. This array - is replaced during a strategic merge - patch. - type: array - items: - type: string - key: - description: key is the label key - that the selector applies to. - type: string - operator: - description: operator represents a - key's relationship to a set of values. - Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. - additionalProperties: - type: string - type: object - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the - pods matching the labelSelector in the specified - namespaces, where co-located is defined as - running on a node whose value of the label - with key topologyKey matches that of any node - on which any of the selected pods is running. - Empty topologyKey is not allowed. - type: string - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - type: array - items: - type: string - required: - - topologyKey - weight: - description: weight associated with matching the - corresponding podAffinityTerm, in the range 1-100. - type: number - required: - - podAffinityTerm - - weight - logHome: - type: string - description: The in-pod name of the directory in which to store the - domain, Node Manager, server logs, and server *.out files. - includeServerOutInPodLog: - type: boolean - description: If true (the default), then the server .out file will - be included in the pod's stdout. - managedServers: - type: array - description: Configuration for individual Managed Servers. - items: - description: ManagedServer represents the operator configuration - for a single Managed Server. - type: object - properties: - serverStartState: - description: The state in which the server is to be started. - Use ADMIN if server should start in the admin state. Defaults - to RUNNING. - type: string - enum: - - RUNNING - - ADMIN - serverService: - description: Customization affecting ClusterIP Kubernetes services - for WebLogic Server instances. - type: object - properties: - precreateService: - description: If true, operator will create server services - even for server instances without running pods. - type: boolean - annotations: - description: The annotations to be attached to generated - resources. - additionalProperties: - type: string - type: object - labels: - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. - additionalProperties: - type: string - type: object - serverName: - description: The name of the Managed Server. Required. - type: string - serverPod: - description: Configuration affecting server pods. - type: object - properties: - nodeName: - description: NodeName is a request to schedule this pod - onto a specific node. If it is non-empty, the scheduler - simply schedules this pod onto that node, assuming that - it fits resource requirements. - type: string - livenessProbe: - description: Settings for the liveness probe associated - with a server. - type: object - properties: - periodSeconds: - description: The number of seconds between checks. - type: number - timeoutSeconds: - description: The number of seconds with no response - that indicates a failure. - type: number - initialDelaySeconds: - description: The number of seconds before the first - check is performed. - type: number - readinessGates: - description: 'If specified, all readiness gates will be - evaluated for pod readiness. A pod is ready when all its - containers are ready AND all conditions specified in the - readiness gates have status equal to "True" More info: - https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' - type: array - items: - description: PodReadinessGate contains the reference to - a pod condition - type: object - properties: - conditionType: - description: ConditionType refers to a condition in - the pod's condition list with matching type. - type: string - required: - - conditionType - serviceAccountName: - description: Name of the ServiceAccount to be used to run - this pod. If it is not set, default ServiceAccount will - be used. The ServiceAccount has to exist at the time the - pod is created. - type: string - podSecurityContext: - description: Pod-level security attributes. - type: object - properties: - runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence - for that container. - type: number - seLinuxOptions: - description: SELinuxOptions are the labels to be applied - to the container - type: object - properties: - role: - description: Role is a SELinux role label that applies - to the container. - type: string - level: - description: Level is SELinux level label that applies - to the container. - type: string - type: - description: Type is a SELinux type label that applies - to the container. - type: string - user: - description: User is a SELinux user label that applies - to the container. - type: string - fsGroup: - description: 'A special supplemental group that applies - to all containers in a pod. Some volume types allow - the Kubelet to change the ownership of that volume - to be owned by the pod: 1. The owning GID will be - the FSGroup 2. The setgid bit is set (new files created - in the volume will be owned by FSGroup) 3. The permission - bits are OR''d with rw-rw---- If unset, the Kubelet - will not modify the ownership and permissions of any - volume.' - type: number - windowsOptions: - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. - type: string - runAsUserName: - description: The UserName in Windows to run the - entrypoint of the container process. Defaults - to the user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - This field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. - type: string - supplementalGroups: - description: A list of groups applied to the first process - run in each container, in addition to the container's - primary GID. If unspecified, no groups will be added - to any container. - type: array - items: - type: number - runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in SecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence for that container. - type: number - runAsNonRoot: - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if - it does. If unset or false, no such validation will - be performed. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - type: boolean - sysctls: - description: Sysctls hold a list of namespaced sysctls - used for the pod. Pods with unsupported sysctls (by - the container runtime) might fail to launch. - type: array - items: - description: Sysctl defines a kernel parameter to - be set - type: object - properties: - name: - description: Name of a property to set - type: string - value: - description: Value of a property to set - type: string - required: - - name - - value - priorityClassName: - description: If specified, indicates the pod's priority. - "system-node-critical" and "system-cluster-critical" are - two special keywords which indicate the highest priorities - with the former being the highest priority. Any other - name must be defined by creating a PriorityClass object - with that name. If not specified, the pod priority will - be default or zero if there is no default. - type: string - volumes: - description: Additional volumes to be created in the server - pod. - type: array - items: - description: Volume represents a named volume in a pod - that may be accessed by any container in the pod. - type: object - properties: - quobyte: - description: Represents a Quobyte mount that lasts - the lifetime of a pod. Quobyte volumes do not support - ownership management or SELinux relabeling. - type: object - properties: - volume: - description: Volume is a string that references - an already created Quobyte volume by name. - type: string - registry: - description: Registry represents a single or multiple - Quobyte Registry services specified as a string - as host:port pair (multiple entries are separated - with commas) which acts as the central registry - for volumes - type: string - readOnly: - description: ReadOnly here will force the Quobyte - volume to be mounted with read-only permissions. - Defaults to false. - type: boolean - user: - description: User to map volume access to Defaults - to serivceaccount user - type: string - tenant: - description: Tenant owning the given Quobyte volume - in the Backend Used with dynamically provisioned - Quobyte volumes, value is set by the plugin - type: string - group: - description: Group to map volume access to Default - is no group - type: string - required: - - registry - - volume - azureFile: - description: AzureFile represents an Azure File Service - mount on the host and bind mount to the pod. - type: object - properties: - secretName: - description: the name of secret that contains - Azure Storage Account Name and Key - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - shareName: - description: Share Name - type: string - required: - - secretName - - shareName - flexVolume: - description: FlexVolume represents a generic volume - resource that is provisioned/attached using an exec - based plugin. - type: object - properties: - driver: - description: Driver is the name of the driver - to use for this volume. - type: string - options: - description: 'Optional: Extra command options - if any.' - additionalProperties: - type: string - type: object - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' - type: boolean - fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". The default - filesystem depends on FlexVolume script. - type: string - required: - - driver - secret: - description: Adapts a Secret into a volume. The contents - of the target Secret's Data field will be presented - in a volume as files using the keys in the Data - field as the file names. Secret volumes support - ownership management and SELinux relabeling. - type: object - properties: - secretName: - description: 'Name of the secret in the pod''s - namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: string - defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 - and 0777. Defaults to 0644. Directories within - the path are not affected by this setting. This - might be in conflict with other options that - affect the file mode, like fsGroup, and the - result can be other mode bits set.' - type: number - optional: - description: Specify whether the Secret or its - keys must be defined - type: boolean - items: - description: If unspecified, each key-value pair - in the Data field of the referenced Secret will - be projected into the volume as a file whose - name is the key and content is the value. If - specified, the listed keys will be projected - into the specified paths, and unlisted keys - will not be present. If a key is specified which - is not present in the Secret, the volume setup - will error unless it is marked optional. Paths - must be relative and may not contain the '..' - path or start with '..'. - type: array - items: - description: Maps a string key to a path within - a volume. - type: object - properties: - mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might be - in conflict with other options that affect - the file mode, like fsGroup, and the result - can be other mode bits set.' - type: number - path: - description: The relative path of the file - to map the key to. May not be an absolute - path. May not contain the path element - '..'. May not start with the string '..'. - type: string - key: - description: The key to project. - type: string - required: - - key - - path - projected: - description: Represents a projected volume source - type: object - properties: - sources: - description: list of volume projections - type: array - items: - description: Projection that may be projected - along with other supported volume types - type: object - properties: - downwardAPI: - description: Represents downward API info - for projecting into a projected volume. - Note that this is identical to a downwardAPI - volume source without the default mode. - type: object - properties: - items: - description: Items is a list of DownwardAPIVolume - file - type: array - items: - description: DownwardAPIVolumeFile - represents information to create - the file containing the pod field - type: object - properties: - mode: - description: 'Optional: mode bits - to use on this file, must be - a value between 0 and 0777. - If not specified, the volume - defaultMode will be used. This - might be in conflict with other - options that affect the file - mode, like fsGroup, and the - result can be other mode bits - set.' - type: number - path: - description: 'Required: Path is the - relative path name of the file - to be created. Must not be absolute - or contain the ''..'' path. - Must be utf-8 encoded. The first - item of the relative path must - not start with ''..''' - type: string - resourceFieldRef: - description: ResourceFieldSelector - represents container resources - (cpu, memory) and their output - format - type: object - properties: - divisor: - description: 'Quantity is - a fixed-point representation - of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition - to String() and AsInt64() - accessors. The serialization - format is: ::= - (Note - that may be empty, - from the "" case in .) - ::= 0 - | 1 | ... | 9 ::= - | - ::= - | . | . - | . ::= - "+" | "-" ::= - | - ::= - | | - ::= Ki - | Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m - | "" | k | M | G | T | P - | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t - choose the capitalization.) - ::= "e" - | "E" No - matter which of the three - exponent forms is used, - no quantity may represent - a number greater than 2^63-1 - in magnitude, nor may it - have more than 3 decimal - places. Numbers larger or - more precise will be capped - or rounded up. (E.g.: 0.1m - will rounded up to 1m.) - This may be extended in - the future if we require - larger or smaller quantities. When - a Quantity is parsed from - a string, it will remember - the type of suffix it had, - and will use the same type - again when it is serialized. Before - serializing, Quantity will - be put in "canonical form". - This means that Exponent/suffix - will be adjusted up or down - (with a corresponding increase - or decrease in Mantissa) - such that: a. No precision - is lost b. No fractional - digits will be emitted c. - The exponent (or suffix) - is as large as possible. - The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER - be internally represented - by a floating point number. - That is the whole point - of this exercise. Non-canonical - values will still parse - as long as they are well - formed, but will be re-emitted - in their canonical form. - (So always use canonical - form, or don''t diff.) This - format is intended to make - it difficult to use these - numbers without writing - some sort of special handling - code in the hopes that that - will cause implementors - to also use a fixed point - implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource - to select' - type: string - containerName: - description: 'Container name: - required for volumes, optional - for env vars' - type: string - required: - - resource - fieldRef: - description: ObjectFieldSelector - selects an APIVersioned field - of an object. - type: object - properties: - apiVersion: - description: Version of the - schema the FieldPath is - written in terms of, defaults - to "v1". - type: string - fieldPath: - description: Path of the field - to select in the specified - API version. - type: string - required: - - fieldPath - required: - - path - configMap: - description: Adapts a ConfigMap into a projected - volume. The contents of the target ConfigMap's - Data field will be presented in a projected - volume as files using the keys in the - Data field as the file names, unless the - items element is populated with specific - mappings of keys to paths. Note that this - is identical to a configmap volume source - without the default mode. - type: object - properties: - name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap - or its keys must be defined - type: boolean - items: - description: If unspecified, each key-value - pair in the Data field of the referenced - ConfigMap will be projected into the - volume as a file whose name is the - key and content is the value. If specified, - the listed keys will be projected - into the specified paths, and unlisted - keys will not be present. If a key - is specified which is not present - in the ConfigMap, the volume setup - will error unless it is marked optional. - Paths must be relative and may not - contain the '..' path or start with - '..'. - type: array - items: - description: Maps a string key to - a path within a volume. - type: object - properties: - mode: - description: 'Optional: mode bits - to use on this file, must be - a value between 0 and 0777. - If not specified, the volume - defaultMode will be used. This - might be in conflict with other - options that affect the file - mode, like fsGroup, and the - result can be other mode bits - set.' - type: number - path: - description: The relative path - of the file to map the key to. - May not be an absolute path. - May not contain the path element - '..'. May not start with the - string '..'. - type: string - key: - description: The key to project. - type: string - required: - - key - - path - secret: - description: Adapts a secret into a projected - volume. The contents of the target Secret's - Data field will be presented in a projected - volume as files using the keys in the - Data field as the file names. Note that - this is identical to a secret volume source - without the default mode. - type: object - properties: - name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - items: - description: If unspecified, each key-value - pair in the Data field of the referenced - Secret will be projected into the - volume as a file whose name is the - key and content is the value. If specified, - the listed keys will be projected - into the specified paths, and unlisted - keys will not be present. If a key - is specified which is not present - in the Secret, the volume setup will - error unless it is marked optional. - Paths must be relative and may not - contain the '..' path or start with - '..'. - type: array - items: - description: Maps a string key to - a path within a volume. - type: object - properties: - mode: - description: 'Optional: mode bits - to use on this file, must be - a value between 0 and 0777. - If not specified, the volume - defaultMode will be used. This - might be in conflict with other - options that affect the file - mode, like fsGroup, and the - result can be other mode bits - set.' - type: number - path: - description: The relative path - of the file to map the key to. - May not be an absolute path. - May not contain the path element - '..'. May not start with the - string '..'. - type: string - key: - description: The key to project. - type: string - required: - - key - - path - serviceAccountToken: - description: ServiceAccountTokenProjection - represents a projected service account - token volume. This projection can be used - to insert a service account token into - the pods runtime filesystem for use against - APIs (Kubernetes API Server or otherwise). - type: object - properties: - path: - description: Path is the path relative - to the mount point of the file to - project the token into. - type: string - audience: - description: Audience is the intended - audience of the token. A recipient - of a token must identify itself with - an identifier specified in the audience - of the token, and otherwise should - reject the token. The audience defaults - to the identifier of the apiserver. - type: string - expirationSeconds: - description: ExpirationSeconds is the - requested duration of validity of - the service account token. As the - token approaches expiration, the kubelet - volume plugin will proactively rotate - the service account token. The kubelet - will start trying to rotate the token - if the token is older than 80 percent - of its time to live or if the token - is older than 24 hours.Defaults to - 1 hour and must be at least 10 minutes. - type: number - required: - - path - defaultMode: - description: Mode bits to use on created files - by default. Must be a value between 0 and 0777. - Directories within the path are not affected - by this setting. This might be in conflict with - other options that affect the file mode, like - fsGroup, and the result can be other mode bits - set. - type: number - required: - - sources - cephfs: - description: Represents a Ceph Filesystem mount that - lasts the lifetime of a pod Cephfs volumes do not - support ownership management or SELinux relabeling. - type: object - properties: - path: - description: 'Optional: Used as the mounted root, - rather than the full Ceph tree, default is /' - type: string - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - secretFile: - description: 'Optional: SecretFile is the path - to key ring for User, default is /etc/ceph/user.secret - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: boolean - user: - description: 'Optional: User is the rados user - name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - monitors: - description: 'Required: Monitors is a collection - of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: array - items: - type: string - required: - - monitors - scaleIO: - description: ScaleIOVolumeSource represents a persistent - ScaleIO volume - type: object - properties: - system: - description: The name of the storage system as - configured in ScaleIO. - type: string - protectionDomain: - description: The name of the ScaleIO Protection - Domain for the configured storage. - type: string - sslEnabled: - description: Flag to enable/disable SSL communication - with Gateway, default false - type: boolean - storageMode: - description: Indicates whether the storage for - a volume should be ThickProvisioned or ThinProvisioned. - Default is ThinProvisioned. - type: string - volumeName: - description: The name of a volume already created - in the ScaleIO system that is associated with - this volume source. - type: string - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Default is - "xfs". - type: string - storagePool: - description: The ScaleIO Storage Pool associated - with the protection domain. - type: string - gateway: - description: The host address of the ScaleIO API - Gateway. - type: string - required: - - gateway - - secretRef - - system - emptyDir: - description: Represents an empty directory for a pod. - Empty directory volumes support ownership management - and SELinux relabeling. - type: object - properties: - sizeLimit: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and - AsInt64() accessors. The serialization format - is: ::= (Note - that may be empty, from the "" case - in .) ::= 0 | 1 - | ... | 9 ::= | - ::= | . - | . | . ::= - "+" | "-" ::= | - ::= | - | ::= Ki | Mi - | Gi | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T - | P | E (Note that 1024 = 1Ki but 1000 = 1k; - I didn''t choose the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms is - used, no quantity may represent a number greater - than 2^63-1 in magnitude, nor may it have more - than 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be extended - in the future if we require larger or smaller - quantities. When a Quantity is parsed from - a string, it will remember the type of suffix - it had, and will use the same type again when - it is serialized. Before serializing, Quantity - will be put in "canonical form". This means - that Exponent/suffix will be adjusted up or - down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision is - lost b. No fractional digits will be emitted c. - The exponent (or suffix) is as large as possible. - The sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole - point of this exercise. Non-canonical values - will still parse as long as they are well formed, - but will be re-emitted in their canonical form. - (So always use canonical form, or don''t diff.) This - format is intended to make it difficult to use - these numbers without writing some sort of special - handling code in the hopes that that will cause - implementors to also use a fixed point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - medium: - description: 'What type of storage medium should - back this directory. The default is "" which - means to use the node''s default medium. Must - be an empty string (default) or Memory. More - info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: string - glusterfs: - description: Represents a Glusterfs mount that lasts - the lifetime of a pod. Glusterfs volumes do not - support ownership management or SELinux relabeling. - type: object - properties: - path: - description: 'Path is the Glusterfs volume path. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - endpoints: - description: 'EndpointsName is the endpoint name - that details Glusterfs topology. More info: - https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - readOnly: - description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. - Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: boolean - required: - - endpoints - - path - gcePersistentDisk: - description: Represents a Persistent Disk resource - in Google Compute Engine. A GCE PD must exist before - mounting to a container. The disk must also be in - the same GCE project and zone as the kubelet. A - GCE PD can only be mounted as read/write once or - read-only many times. GCE PDs support ownership - management and SELinux relabeling. - type: object - properties: - partition: - description: 'The partition in the volume that - you want to mount. If omitted, the default is - to mount by volume name. Examples: For volume - /dev/sda1, you specify the partition as "1". - Similarly, the volume partition for /dev/sda - is "0" (or you can leave the property empty). - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: number - readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: boolean - pdName: - description: 'Unique name of the PD resource in - GCE. Used to identify the disk in GCE. More - info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - required: - - pdName - photonPersistentDisk: - description: Represents a Photon Controller persistent - disk resource. - type: object - properties: - pdID: - description: ID that identifies Photon Controller - persistent disk - type: string - fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. - type: string - required: - - pdID - azureDisk: - description: AzureDisk represents an Azure Data Disk - mount on the host and bind mount to the pod. - type: object - properties: - diskName: - description: The Name of the data disk in the - blob storage - type: string - kind: - description: 'Expected values Shared: multiple - blob disks per storage account Dedicated: single - blob disk per storage account Managed: azure - managed data disk (only in managed availability - set). defaults to shared' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - cachingMode: - description: 'Host Caching mode: None, Read Only, - Read Write.' - type: string - diskURI: - description: The URI the data disk in the blob - storage - type: string - fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. - type: string - required: - - diskName - - diskURI - cinder: - description: Represents a cinder volume resource in - Openstack. A Cinder volume must exist before mounting - to a container. The volume must also be in the same - region as the kubelet. Cinder volumes support ownership - management and SELinux relabeling. - type: object - properties: - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - volumeID: - description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: boolean - fsType: - description: 'Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - required: - - volumeID - downwardAPI: - description: DownwardAPIVolumeSource represents a - volume containing downward API info. Downward API - volumes support ownership management and SELinux - relabeling. - type: object - properties: - defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 - and 0777. Defaults to 0644. Directories within - the path are not affected by this setting. This - might be in conflict with other options that - affect the file mode, like fsGroup, and the - result can be other mode bits set.' - type: number - items: - description: Items is a list of downward API volume - file - type: array - items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field - type: object - properties: - mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might be - in conflict with other options that affect - the file mode, like fsGroup, and the result - can be other mode bits set.' - type: number - path: - description: 'Required: Path is the relative - path name of the file to be created. Must - not be absolute or contain the ''..'' - path. Must be utf-8 encoded. The first - item of the relative path must not start - with ''..''' - type: string - resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and - their output format - type: object - properties: - divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= - (Note that - may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= - "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi - | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | - M | G | T | P | E (Note that 1024 - = 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent - forms is used, no quantity may represent - a number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This - may be extended in the future if we - require larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type - again when it is serialized. Before - serializing, Quantity will be put - in "canonical form". This means that - Exponent/suffix will be adjusted up - or down (with a corresponding increase - or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. - The sign will be omitted unless the - number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as - they are well formed, but will be - re-emitted in their canonical form. - (So always use canonical form, or - don''t diff.) This format is intended - to make it difficult to use these - numbers without writing some sort - of special handling code in the hopes - that that will cause implementors - to also use a fixed point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to - select' - type: string - containerName: - description: 'Container name: required - for volumes, optional for env vars' - type: string - required: - - resource - fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. - type: object - properties: - apiVersion: - description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath - required: - - path - awsElasticBlockStore: - description: Represents a Persistent Disk resource - in AWS. An AWS EBS disk must exist before mounting - to a container. The disk must also be in the same - AWS zone as the kubelet. An AWS EBS disk can only - be mounted as read/write once. AWS EBS volumes support - ownership management and SELinux relabeling. - type: object - properties: - partition: - description: 'The partition in the volume that - you want to mount. If omitted, the default is - to mount by volume name. Examples: For volume - /dev/sda1, you specify the partition as "1". - Similarly, the volume partition for /dev/sda - is "0" (or you can leave the property empty).' - type: number - volumeID: - description: 'Unique ID of the persistent disk - resource in AWS (Amazon EBS volume). More info: - https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - readOnly: - description: 'Specify "true" to force and set - the ReadOnly property in VolumeMounts to "true". - If omitted, the default is "false". More info: - https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: boolean - fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - required: - - volumeID - flocker: - description: Represents a Flocker volume mounted by - the Flocker agent. One and only one of datasetName - and datasetUUID should be set. Flocker volumes do - not support ownership management or SELinux relabeling. - type: object - properties: - datasetName: - description: Name of the dataset stored as metadata - -> name on the dataset for Flocker should be - considered as deprecated - type: string - datasetUUID: - description: UUID of the dataset. This is unique - identifier of a Flocker dataset - type: string - iscsi: - description: Represents an ISCSI disk. ISCSI volumes - can only be mounted as read/write once. ISCSI volumes - support ownership management and SELinux relabeling. - type: object - properties: - chapAuthSession: - description: whether support iSCSI Session CHAP - authentication - type: boolean - iscsiInterface: - description: iSCSI Interface Name that uses an - iSCSI transport. Defaults to 'default' (tcp). - type: string - lun: - description: iSCSI Target Lun number. - type: number - chapAuthDiscovery: - description: whether support iSCSI Discovery CHAP - authentication - type: boolean - iqn: - description: Target iSCSI Qualified Name. - type: string - portals: - description: iSCSI Target Portal List. The portal - is either an IP or ip_addr:port if the port - is other than default (typically TCP ports 860 - and 3260). - type: array - items: - type: string - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - initiatorName: - description: Custom iSCSI Initiator Name. If initiatorName - is specified with iscsiInterface simultaneously, - new iSCSI interface : will be created for the connection. - type: string - readOnly: - description: ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. - type: boolean - fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#iscsi' - type: string - targetPortal: - description: iSCSI Target Portal. The Portal is - either an IP or ip_addr:port if the port is - other than default (typically TCP ports 860 - and 3260). - type: string - required: - - iqn - - lun - - targetPortal - rbd: - description: Represents a Rados Block Device mount - that lasts the lifetime of a pod. RBD volumes support - ownership management and SELinux relabeling. - type: object - properties: - image: - description: 'The rados image name. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - pool: - description: 'The rados pool name. Default is - rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: boolean - fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#rbd' - type: string - keyring: - description: 'Keyring is the path to key ring - for RBDUser. Default is /etc/ceph/keyring. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - user: - description: 'The rados user name. Default is - admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - monitors: - description: 'A collection of Ceph monitors. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: array - items: - type: string - required: - - image - - monitors - configMap: - description: Adapts a ConfigMap into a volume. The - contents of the target ConfigMap's Data field will - be presented in a volume as files using the keys - in the Data field as the file names, unless the - items element is populated with specific mappings - of keys to paths. ConfigMap volumes support ownership - management and SELinux relabeling. - type: object - properties: - defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 - and 0777. Defaults to 0644. Directories within - the path are not affected by this setting. This - might be in conflict with other options that - affect the file mode, like fsGroup, and the - result can be other mode bits set.' - type: number - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap or - its keys must be defined - type: boolean - items: - description: If unspecified, each key-value pair - in the Data field of the referenced ConfigMap - will be projected into the volume as a file - whose name is the key and content is the value. - If specified, the listed keys will be projected - into the specified paths, and unlisted keys - will not be present. If a key is specified which - is not present in the ConfigMap, the volume - setup will error unless it is marked optional. - Paths must be relative and may not contain the - '..' path or start with '..'. - type: array - items: - description: Maps a string key to a path within - a volume. - type: object - properties: - mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might be - in conflict with other options that affect - the file mode, like fsGroup, and the result - can be other mode bits set.' - type: number - path: - description: The relative path of the file - to map the key to. May not be an absolute - path. May not contain the path element - '..'. May not start with the string '..'. - type: string - key: - description: The key to project. - type: string - required: - - key - - path - storageos: - description: Represents a StorageOS persistent volume - resource. - type: object - properties: - volumeNamespace: - description: VolumeNamespace specifies the scope - of the volume within StorageOS. If no namespace - is specified then the Pod's namespace will be - used. This allows the Kubernetes name scoping - to be mirrored within StorageOS for tighter - integration. Set VolumeName to any name to override - the default behaviour. Set to "default" if you - are not using namespaces within StorageOS. Namespaces - that do not pre-exist within StorageOS will - be created. - type: string - volumeName: - description: VolumeName is the human-readable - name of the StorageOS volume. Volume names - are only unique within a namespace. - type: string - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. + allowPrivilegeEscalation: type: boolean - fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. - type: string - csi: - description: Represents a source location of a volume - to mount, managed by an external CSI driver + runAsGroup: + type: number + runAsNonRoot: + type: boolean + readOnlyRootFilesystem: + type: boolean + startupProbe: type: object properties: - driver: - description: Driver is the name of the CSI driver - that handles this volume. Consult with your - admin for the correct name as registered in - the cluster. - type: string - nodePublishSecretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: type: object properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: type: string - readOnly: - description: Specifies a read-only configuration - for the volume. Defaults to false (read/write). - type: boolean - fsType: - description: Filesystem type to mount. Ex. "ext4", - "xfs", "ntfs". If not provided, the empty value - is passed to the associated CSI driver which - will determine the default filesystem to apply. - type: string - volumeAttributes: - description: VolumeAttributes stores driver-specific - properties that are passed to the CSI driver. - Consult your driver's documentation for supported - values. - additionalProperties: - type: string - type: object - required: - - driver - name: - description: 'Volume''s name. Must be a DNS_LABEL - and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - nfs: - description: Represents an NFS mount that lasts the - lifetime of a pod. NFS volumes do not support ownership - management or SELinux relabeling. - type: object - properties: - path: - description: 'Path that is exported by the NFS - server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - server: - description: 'Server is the hostname or IP address - of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - readOnly: - description: 'ReadOnly here will force the NFS - export to be mounted with read-only permissions. - Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: boolean - required: - - path - - server - persistentVolumeClaim: - description: PersistentVolumeClaimVolumeSource references - the user's PVC in the same namespace. This volume - finds the bound PV and mounts that volume for the - pod. A PersistentVolumeClaimVolumeSource is, essentially, - a wrapper around another type of volume that is - owned by someone else (the system). - type: object - properties: - claimName: - description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this - volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: string - readOnly: - description: Will force the ReadOnly setting in - VolumeMounts. Default false. - type: boolean - required: - - claimName - gitRepo: - description: 'Represents a volume that is populated - with the contents of a git repository. Git repo - volumes do not support ownership management. Git - repo volumes support SELinux relabeling. DEPRECATED: - GitRepo is deprecated. To provision a container - with a git repo, mount an EmptyDir into an InitContainer - that clones the repo using git, then mount the EmptyDir - into the Pod''s container.' - type: object - properties: - repository: - description: Repository URL - type: string - directory: - description: Target directory name. Must not contain - or start with '..'. If '.' is supplied, the - volume directory will be the git repository. Otherwise, - if specified, the volume will contain the git - repository in the subdirectory with the given - name. - type: string - revision: - description: Commit hash for the specified revision. - type: string - required: - - repository - portworxVolume: - description: PortworxVolumeSource represents a Portworx - volume resource. - type: object - properties: - volumeID: - description: VolumeID uniquely identifies a Portworx - volume - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - fsType: - description: FSType represents the filesystem - type to mount Must be a filesystem type supported - by the host operating system. Ex. "ext4", "xfs". - Implicitly inferred to be "ext4" if unspecified. - type: string - required: - - volumeID - vsphereVolume: - description: Represents a vSphere volume resource. - type: object - properties: - storagePolicyName: - description: Storage Policy Based Management (SPBM) - profile name. - type: string - storagePolicyID: - description: Storage Policy Based Management (SPBM) - profile ID associated with the StoragePolicyName. - type: string - volumePath: - description: Path that identifies vSphere volume - vmdk - type: string - fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. - type: string - required: - - volumePath - fc: - description: Represents a Fibre Channel volume. Fibre - Channel volumes can only be mounted as read/write - once. Fibre Channel volumes support ownership management - and SELinux relabeling. - type: object - properties: - lun: - description: 'Optional: FC target lun number' + required: + - port + timeoutSeconds: type: number - targetWWNs: - description: 'Optional: FC target worldwide names - (WWNs)' - type: array - items: + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + env: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + valueFrom: + type: object + properties: + secretKeyRef: + type: object + properties: + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + resourceFieldRef: + type: object + properties: + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: + type: string + required: + - resource + configMapKeyRef: + type: object + properties: + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + fieldRef: + type: object + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + required: + - name + ports: + type: array + items: + type: object + properties: + protocol: type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' - type: boolean - wwids: - description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' - type: array - items: + hostIP: type: string - fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. - type: string - hostPath: - description: Represents a host path mapped into a - pod. Host path volumes do not support ownership - management or SELinux relabeling. + name: + type: string + containerPort: + type: number + hostPort: + type: number + required: + - containerPort + command: + type: array + items: + type: string + volumeMounts: + type: array + items: + type: object + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + args: + type: array + items: + type: string + lifecycle: type: object properties: - path: - description: 'Path of the directory on the host. - If the path is a symlink, it will follow the - link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - type: - description: 'Type for HostPath Volume Defaults - to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - required: - - path - required: - - name - resources: - description: Memory and CPU minimum requirements and limits - for the server. - type: object - properties: - requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is omitted - for a container, it defaults to Limits if that is - explicitly specified, otherwise to an implementation-defined - value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - limits: - description: 'Limits describes the maximum amount of - compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - annotations: - description: The annotations to be attached to generated - resources. - additionalProperties: - type: string - type: object - env: - description: A list of environment variables to add to a - server. - type: array - items: - description: EnvVar represents an environment variable - present in a Container. - type: object - properties: + postStart: + type: object + properties: + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + preStop: + type: object + properties: + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are - expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Defaults to "".' type: string - valueFrom: - description: EnvVarSource represents a source for - the value of an EnvVar. + tty: + type: boolean + readinessProbe: type: object properties: - secretKeyRef: - description: SecretKeySelector selects a key of - a Secret. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - required: - - key - resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: type: object properties: - divisor: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" | - "-" ::= | - ::= | - | ::= Ki | - Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G - | T | P | E (Note that 1024 = 1Ki but - 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No matter which of - the three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be - extended in the future if we require larger - or smaller quantities. When a Quantity - is parsed from a string, it will remember - the type of suffix it had, and will use - the same type again when it is serialized. Before - serializing, Quantity will be put in "canonical - form". This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. The - sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as - "1536Mi" Note that the quantity will NEVER - be internally represented by a floating - point number. That is the whole point of - this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or - don''t diff.) This format is intended to - make it difficult to use these numbers without - writing some sort of special handling code - in the hopes that that will cause implementors - to also use a fixed point implementation.' + port: type: object properties: - number: + intValue: type: number - format: + isInt: + type: boolean + strValue: type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to select' - type: string - containerName: - description: 'Container name: required for - volumes, optional for env vars' + required: + - isInt + host: type: string required: - - resource - configMapKeyRef: - description: Selects a key from a ConfigMap. + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: type: object properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - key: - description: The key to select. - type: string - required: - - key - fieldRef: - description: ObjectFieldSelector selects an APIVersioned - field of an object. + command: + type: array + items: + type: string + httpGet: type: object properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". + path: type: string - fieldPath: - description: Path of the field to select in - the specified API version. + scheme: type: string - required: - - fieldPath - required: - - name - restartPolicy: - description: 'Restart policy for all containers within the - pod. One of Always, OnFailure, Never. Default to Always. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' - type: string - nodeSelector: - description: Selector which must match a node's labels for - the pod to be scheduled on that node. - additionalProperties: - type: string - type: object - volumeMounts: - description: Additional volume mounts for the server pod. - type: array - items: - description: VolumeMount describes a mounting of a Volume - within a container. - type: object - properties: - mountPath: - description: Path within the container at which the - volume should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and the - other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to false. + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + stdinOnce: type: boolean - subPath: - description: Path within the volume from which the - container's volume should be mounted. Defaults to - "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment variable - references $(VAR_NAME) are expanded using the container's - environment. Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field is - beta in 1.15. - type: string + envFrom: + type: array + items: + type: object + properties: + configMapRef: + type: object + properties: + name: + type: string + optional: + type: boolean + prefix: + type: string + secretRef: + type: object + properties: + name: + type: string + optional: + type: boolean required: - - mountPath - name - labels: - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. - additionalProperties: - type: string - type: object - runtimeClassName: - description: 'RuntimeClassName refers to a RuntimeClass - object in the node.k8s.io group, which should be used - to run this pod. If no RuntimeClass resource matches - the named class, the pod will not be run. If unset or - empty, the "legacy" RuntimeClass will be used, which is - an implicit class with an empty definition that uses the - default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md - This is an alpha feature and may change in the future.' - type: string - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple - using the matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to - match. Empty means match all taint effects. When - specified, allowed values are NoSchedule, PreferNoSchedule - and NoExecute. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period - of time the toleration (which must be of effect - NoExecute, otherwise this field is ignored) tolerates - the taint. By default, it is not set, which means - tolerate the taint forever (do not evict). Zero - and negative values will be treated as 0 (evict - immediately) by the system. - type: number - value: - description: Value is the taint value the toleration - matches to. If the operator is Exists, the value - should be empty, otherwise just a regular string. - type: string - key: - description: Key is the taint key that the toleration - applies to. Empty means match all taint keys. If - the key is empty, operator must be Exists; this - combination means to match all values and all keys. - type: string - operator: - description: Operator represents a key's relationship - to the value. Valid operators are Exists and Equal. - Defaults to Equal. Exists is equivalent to wildcard - for value, so that a pod can tolerate all taints - of a particular category. - type: string - readinessProbe: - description: Settings for the readiness probe associated - with a server. + containerSecurityContext: + description: Container-level security attributes. Will override + any matching Pod-level attributes. See `kubectl explain + pods.spec.containers.securityContext`. type: object properties: - periodSeconds: - description: The number of seconds between checks. - type: number - timeoutSeconds: - description: The number of seconds with no response - that indicates a failure. + privileged: + type: boolean + runAsUser: type: number - initialDelaySeconds: - description: The number of seconds before the first - check is performed. + capabilities: + type: object + properties: + add: + type: array + items: + type: string + drop: + type: array + items: + type: string + seLinuxOptions: + type: object + properties: + role: + type: string + level: + type: string + type: + type: string + user: + type: string + windowsOptions: + type: object + properties: + gmsaCredentialSpec: + type: string + runAsUserName: + type: string + gmsaCredentialSpecName: + type: string + procMount: + type: string + allowPrivilegeEscalation: + type: boolean + runAsGroup: type: number - containers: - description: Additional containers to be included in the - server pod. + runAsNonRoot: + type: boolean + readOnlyRootFilesystem: + type: boolean + schedulerName: + description: If specified, the Pod will be dispatched by + the specified scheduler. If not specified, the Pod will + be dispatched by the default scheduler. See `kubectl explain + pods.spec.schedulerName`. + type: string + initContainers: + description: Initialization containers to be included in + the server Pod. See `kubectl explain pods.spec.initContainers`. type: array items: - description: A single application container that you want - to run within a pod. type: object properties: volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of - a raw block device within a container. type: object properties: devicePath: - description: devicePath is the path inside of - the container that the device will be mapped - to. type: string name: - description: name must match the name of a persistentVolumeClaim - in the pod type: string required: - devicePath - name image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' type: string - imagePullPolicy: - description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. Cannot - be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + imagePullPolicy: + type: string + livenessProbe: + type: object + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + stdin: + type: boolean + terminationMessagePolicy: + type: string + terminationMessagePath: type: string - livenessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + workingDir: + type: string + resources: + type: object + properties: + requests: + additionalProperties: + type: string + type: object + limits: + additionalProperties: + type: string + type: object + securityContext: + type: object + properties: + privileged: + type: boolean + runAsUser: + type: number + capabilities: + type: object + properties: + add: + type: array + items: + type: string + drop: + type: array + items: + type: string + seLinuxOptions: + type: object + properties: + role: + type: string + level: + type: string + type: + type: string + user: + type: string + windowsOptions: + type: object + properties: + gmsaCredentialSpec: + type: string + runAsUserName: + type: string + gmsaCredentialSpecName: + type: string + procMount: + type: string + allowPrivilegeEscalation: + type: boolean + runAsGroup: + type: number + runAsNonRoot: + type: boolean + readOnlyRootFilesystem: + type: boolean + startupProbe: type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -12538,65 +4436,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -12608,245 +4471,273 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name - value required: - port - stdin: - description: Whether this container should allocate - a buffer for stdin in the container runtime. If - this is not set, reads from stdin in the container - will always result in EOF. Default is false. - type: boolean - terminationMessagePolicy: - description: Indicate how the termination message - should be populated. File will use the contents - of terminationMessagePath to populate the container - status message on both success and failure. FallbackToLogsOnError - will use the last chunk of container log output - if the termination message file is empty and the - container exited with an error. The log output is - limited to 2048 bytes or 80 lines, whichever is - smaller. Defaults to File. Cannot be updated. - type: string - terminationMessagePath: - description: 'Optional: Path at which the file to - which the container''s termination message will - be written is mounted into the container''s filesystem. - Message written is intended to be brief final status, - such as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' - type: string - workingDir: - description: Container's working directory. If not - specified, the container runtime's default will - be used, which might be configured in the container - image. Cannot be updated. - type: string - resources: - description: ResourceRequirements describes the compute - resource requirements. - type: object - properties: - requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: + env: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + valueFrom: + type: object + properties: + secretKeyRef: + type: object + properties: + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + resourceFieldRef: + type: object + properties: + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: + type: string + required: + - resource + configMapKeyRef: + type: object + properties: + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + fieldRef: + type: object + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + required: + - name + ports: + type: array + items: + type: object + properties: + protocol: + type: string + hostIP: + type: string + name: type: string - type: object - limits: - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: + containerPort: + type: number + hostPort: + type: number + required: + - containerPort + command: + type: array + items: + type: string + volumeMounts: + type: array + items: + type: object + properties: + mountPath: type: string - type: object - securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields - are present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take - precedence. + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + args: + type: array + items: + type: string + lifecycle: type: object properties: - privileged: - description: Run container in privileged mode. - Processes in privileged containers are essentially - equivalent to root on the host. Defaults to - false. - type: boolean - runAsUser: - description: The UID to run the entrypoint of - the container process. Defaults to user specified - in image metadata if unspecified. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. - type: number - capabilities: - description: Adds and removes POSIX capabilities - from running containers. - type: object - properties: - add: - description: Added capabilities - type: array - items: - type: string - drop: - description: Removed capabilities - type: array - items: - type: string - seLinuxOptions: - description: SELinuxOptions are the labels to - be applied to the container + postStart: type: object properties: - role: - description: Role is a SELinux role label - that applies to the container. - type: string - level: - description: Level is SELinux level label - that applies to the container. - type: string - type: - description: Type is a SELinux type label - that applies to the container. - type: string - user: - description: User is a SELinux user label - that applies to the container. - type: string - windowsOptions: - description: WindowsSecurityContextOptions contain - Windows-specific options and credentials. + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + preStop: type: object properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the - GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName - field. This field is alpha-level and is - only honored by servers that enable the - WindowsGMSA feature flag. - type: string - runAsUserName: - description: The UserName in Windows to run - the entrypoint of the container process. - Defaults to the user specified in image - metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. This - field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the - name of the GMSA credential spec to use. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. - type: string - procMount: - description: procMount denotes the type of proc - mount to use for the containers. The default - is DefaultProcMount which uses the container - runtime defaults for readonly paths and masked - paths. This requires the ProcMountType feature - flag to be enabled. - type: string - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the - container process. AllowPrivilegeEscalation - is true always when the container is: 1) run - as Privileged 2) has CAP_SYS_ADMIN' - type: boolean - runAsGroup: - description: The GID to run the entrypoint of - the container process. Uses runtime default - if unset. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. - type: number - runAsNonRoot: - description: Indicates that the container must - run as a non-root user. If true, the Kubelet - will validate the image at runtime to ensure - that it does not run as UID 0 (root) and fail - to start the container if it does. If unset - or false, no such validation will be performed. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. - type: boolean - readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. - type: boolean - startupProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + name: + type: string + tty: + type: boolean + readinessProbe: type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -12858,2956 +4749,2919 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string - httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + stdinOnce: + type: boolean + envFrom: + type: array + items: + type: object + properties: + configMapRef: + type: object + properties: + name: + type: string + optional: + type: boolean + prefix: + type: string + secretRef: + type: object + properties: + name: + type: string + optional: + type: boolean + required: + - name + shutdown: + description: Configures how the operator should shut down + the server instance. + type: object + properties: + ignoreSessions: + description: For graceful shutdown only, indicates to + ignore pending HTTP sessions during in-flight work + handling. Defaults to false. + type: boolean + shutdownType: + description: Specifies how the operator will shut down + server instances. Defaults to graceful shutdown. + type: string + enum: + - Graceful + - Forced + timeoutSeconds: + description: For graceful shutdown only, number of seconds + to wait before aborting in-flight work and shutting + down the server. Defaults to 30 seconds. + type: number + affinity: + description: If specified, the Pod's scheduling constraints. + See `kubectl explain pods.spec.affinity` + type: object + properties: + nodeAffinity: + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: object + properties: + nodeSelectorTerms: + type: array + items: + type: object + properties: + matchExpressions: + type: array + items: + type: object + properties: + values: + type: array + items: + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + matchFields: + type: array + items: + type: object + properties: + values: + type: array + items: + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + required: + - nodeSelectorTerms + preferredDuringSchedulingIgnoredDuringExecution: + type: array + items: + type: object + properties: + preference: + type: object + properties: + matchExpressions: + type: array + items: + type: object + properties: + values: + type: array + items: + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + matchFields: + type: array + items: + type: object + properties: + values: + type: array + items: + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + weight: + type: number + required: + - preference + - weight + podAffinity: + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + items: + type: object + properties: + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: + type: object + properties: + values: + type: array + items: + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + matchLabels: + additionalProperties: + type: string + type: object + topologyKey: + type: string + namespaces: + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + items: type: object properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + podAffinityTerm: type: object properties: - intValue: - type: number - isInt: - type: boolean - strValue: + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: + type: object + properties: + values: + type: array + items: + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + matchLabels: + additionalProperties: + type: string + type: object + topologyKey: type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value + namespaces: + type: array + items: type: string - required: - - name - - value + required: + - topologyKey + weight: + type: number required: - - port - env: - description: List of environment variables to set - in the container. Cannot be updated. - type: array - items: - description: EnvVar represents an environment variable - present in a Container. - type: object - properties: - name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service - environment variables. If a variable cannot - be resolved, the reference in the input string - will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, - regardless of whether the variable exists - or not. Defaults to "".' - type: string - valueFrom: - description: EnvVarSource represents a source - for the value of an EnvVar. - type: object - properties: - secretKeyRef: - description: SecretKeySelector selects a - key of a Secret. - type: object - properties: - name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - required: - - key - resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and - their output format - type: object - properties: - divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= - (Note that - may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= - "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi - | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | - M | G | T | P | E (Note that 1024 - = 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent - forms is used, no quantity may represent - a number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This - may be extended in the future if we - require larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type - again when it is serialized. Before - serializing, Quantity will be put - in "canonical form". This means that - Exponent/suffix will be adjusted up - or down (with a corresponding increase - or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. - The sign will be omitted unless the - number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as - they are well formed, but will be - re-emitted in their canonical form. - (So always use canonical form, or - don''t diff.) This format is intended - to make it difficult to use these - numbers without writing some sort - of special handling code in the hopes - that that will cause implementors - to also use a fixed point implementation.' + - podAffinityTerm + - weight + podAntiAffinity: + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + items: + type: object + properties: + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: type: object properties: - number: - type: number - format: + values: + type: array + items: + type: string + key: + type: string + operator: type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to - select' - type: string - containerName: - description: 'Container name: required - for volumes, optional for env vars' - type: string - required: - - resource - configMapKeyRef: - description: Selects a key from a ConfigMap. - type: object - properties: - name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - key: - description: The key to select. - type: string - required: - - key - fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. - type: object - properties: - apiVersion: - description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". + required: + - key + - operator + matchLabels: + additionalProperties: type: string - fieldPath: - description: Path of the field to select - in the specified API version. + type: object + topologyKey: + type: string + namespaces: + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + items: + type: object + properties: + podAffinityTerm: + type: object + properties: + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: + type: object + properties: + values: + type: array + items: + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + matchLabels: + additionalProperties: + type: string + type: object + topologyKey: + type: string + namespaces: + type: array + items: type: string - required: - - fieldPath - required: - - name - ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional - information about the network connections a container - uses, but is primarily informational. Not specifying - a port here DOES NOT prevent that port from being - exposed. Any port which is listening on the default - "0.0.0.0" address inside a container will be accessible - from the network. Cannot be updated. - type: array - items: - description: ContainerPort represents a network - port in a single container. - type: object - properties: - protocol: - description: Protocol for port. Must be UDP, - TCP, or SCTP. Defaults to "TCP". - type: string - hostIP: - description: What host IP to bind the external - port to. - type: string - name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port - in a pod must have a unique name. Name for - the port that can be referred to by services. - type: string - containerPort: - description: Number of port to expose on the - pod's IP address. This must be a valid port - number, 0 < x < 65536. - type: number - hostPort: - description: Number of port to expose on the - host. If specified, this must be a valid port - number, 0 < x < 65536. If HostNetwork is specified, - this must match ContainerPort. Most containers - do not need this. - type: number - required: - - containerPort - command: - description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used - if this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. - If a variable cannot be resolved, the reference - in the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be - updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: - type: string - volumeMounts: - description: Pod volumes to mount into the container's - filesystem. Cannot be updated. - type: array - items: - description: VolumeMount describes a mounting of - a Volume within a container. - type: object - properties: - mountPath: - description: Path within the container at which - the volume should be mounted. Must not contain - ':'. - type: string - mountPropagation: - description: mountPropagation determines how - mounts are propagated from the host to container - and the other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults - to false. - type: boolean - subPath: - description: Path within the volume from which - the container's volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume - from which the container's volume should be - mounted. Behaves similarly to SubPath but - environment variable references $(VAR_NAME) - are expanded using the container's environment. - Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field - is beta in 1.15. - type: string - required: - - mountPath - - name - args: - description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + required: + - topologyKey + weight: + type: number + required: + - podAffinityTerm + - weight + clusterService: + description: Customization affecting Kubernetes Service generated + for this WebLogic cluster. + type: object + properties: + annotations: + description: The annotations to be added to generated resources. + additionalProperties: + type: string + type: object + labels: + description: The labels to be added to generated resources. + The label names must not start with "weblogic.". + additionalProperties: + type: string + type: object + serverStartPolicy: + description: 'The strategy for deciding whether to start a WebLogic + Server instance. Legal values are NEVER, or IF_NEEDED. Defaults + to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.' + type: string + enum: + - NEVER + - IF_NEEDED + maxConcurrentStartup: + description: The maximum number of Managed Servers instances + that the operator will start in parallel for this cluster + in response to a change in the `replicas` count. If more Managed + Server instances must be started, the operator will wait until + a Managed Server Pod is in the `Ready` state before starting + the next Managed Server instance. A value of 0 means all Managed + Server instances will start in parallel. Defaults to 0. + type: number + minimum: 0.0 + restartVersion: + description: 'Changes to this field cause the operator to restart + WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.' + type: string + required: + - clusterName + serverStartState: + type: string + description: The WebLogic runtime state in which the server is to + be started. Use ADMIN if the server should start in the admin state. + Defaults to RUNNING. + enum: + - RUNNING + - ADMIN + image: + type: string + description: The WebLogic container image; required when `domainHomeSourceType` + is Image or FromModel; otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4. + imagePullPolicy: + type: string + description: The image pull policy for the WebLogic container image. + Legal values are Always, Never, and IfNotPresent. Defaults to Always + if image ends in :latest; IfNotPresent, otherwise. + enum: + - Always + - Never + - IfNotPresent + maxClusterConcurrentStartup: + type: number + description: The maximum number of cluster member Managed Server instances + that the operator will start in parallel for a given cluster, if + `maxConcurrentStartup` is not specified for a specific cluster under + the `clusters` field. A value of 0 means there is no configured + limit. Defaults to 0. + minimum: 0.0 + replicas: + type: number + description: The default number of cluster member Managed Server instances + to start for each WebLogic cluster in the domain configuration, + unless `replicas` is specified for that cluster under the `clusters` + field. For each cluster, the operator will sort cluster member Managed + Server names from the WebLogic domain configuration by normalizing + any numbers in the Managed Server name and then sorting alphabetically. + This is done so that server names such as "managed-server10" come + after "managed-server9". The operator will then start Managed Servers + from the sorted list, up to the `replicas` count, unless specific + Managed Servers are specified as starting in their entry under the + `managedServers` field. In that case, the specified Managed Servers + will be started and then additional cluster members will be started, + up to the `replicas` count, by finding further cluster members in + the sorted list that are not already started. If cluster members + are started because of their entries under `managedServers`, then + a cluster may have more cluster members running than its `replicas` + count. Defaults to 0. + minimum: 0.0 + domainHomeInImage: + type: boolean + description: Deprecated. Use `domainHomeSourceType` instead. Ignored + if `domainHomeSourceType` is specified. True indicates that the + domain home file system is present in the container image specified + by the image field. False indicates that the domain home file system + is located on a persistent volume. Defaults to unset. + serverStartPolicy: + type: string + description: 'The strategy for deciding whether to start a WebLogic + Server instance. Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED. + Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.' + enum: + - NEVER + - IF_NEEDED + - ADMIN_ONLY + restartVersion: + type: string + description: 'Changes to this field cause the operator to restart + WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.' + introspectVersion: + type: string + description: 'Changes to this field cause the operator to repeat its + introspection of the WebLogic domain configuration. Repeating introspection + is required for the operator to recognize changes to the domain + configuration, such as adding a new WebLogic cluster or Managed + Server instance, to regenerate configuration overrides, or to regenerate + the WebLogic domain home when the `domainHomeSourceType` is FromModel. + Introspection occurs automatically, without requiring change to + this field, when servers are first started or restarted after a + full domain shut down. For the FromModel `domainHomeSourceType`, + introspection also occurs when a running server must be restarted + because of changes to any of the fields listed here: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#properties-that-cause-servers-to-be-restarted. + See also `domains.spec.configuration.overridesConfigurationStrategy`.' + dataHome: + type: string + description: An optional directory in a server's container for data + storage of default and custom file stores. If `dataHome` is not + specified or its value is either not set or empty, then the data + storage directories are determined from the WebLogic domain configuration. + configOverrides: + type: string + description: Deprecated. Use `configuration.overridesConfigMap` instead. + Ignored if `configuration.overridesConfigMap` is specified. The + name of the ConfigMap for optional WebLogic configuration overrides. + logHomeEnabled: + type: boolean + description: Specifies whether the log home folder is enabled. Defaults + to true if `domainHomeSourceType` is PersistentVolume; false, otherwise. + allowReplicasBelowMinDynClusterSize: + type: boolean + description: Whether to allow the number of running cluster member + Managed Server instances to drop below the minimum dynamic cluster + size configured in the WebLogic domain configuration, if this is + not specified for a specific cluster under the `clusters` field. + Defaults to true. + serverPod: + type: object + description: Customization affecting the generation of Pods for WebLogic + Server instances. + properties: + nodeName: + type: string + description: NodeName is a request to schedule this Pod onto a + specific Node. If it is non-empty, the scheduler simply schedules + this pod onto that node, assuming that it fits the resource + requirements. See `kubectl explain pods.spec.nodeName`. + livenessProbe: + type: object + description: Settings for the liveness probe associated with a + WebLogic Server instance. + properties: + periodSeconds: + type: number + description: The number of seconds between checks. + timeoutSeconds: + type: number + description: The number of seconds with no response that indicates + a failure. + initialDelaySeconds: + type: number + description: The number of seconds before the first check + is performed. + readinessGates: + type: array + description: 'If specified, all readiness gates will be evaluated + for Pod readiness. A Pod is ready when all its containers are + ready AND all conditions specified in the readiness gates have + a status equal to "True". More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md.' + items: + type: object + properties: + conditionType: + type: string + required: + - conditionType + serviceAccountName: + type: string + description: Name of the ServiceAccount to be used to run this + Pod. If it is not set, default ServiceAccount will be used. + The ServiceAccount has to exist at the time the Pod is created. + See `kubectl explain pods.spec.serviceAccountName`. + podSecurityContext: + type: object + description: Pod-level security attributes. See `kubectl explain + pods.spec.securityContext`. + properties: + runAsUser: + type: number + seLinuxOptions: + type: object + properties: + role: + type: string + level: + type: string + type: + type: string + user: + type: string + fsGroup: + type: number + windowsOptions: + type: object + properties: + gmsaCredentialSpec: + type: string + runAsUserName: + type: string + gmsaCredentialSpecName: + type: string + supplementalGroups: + type: array + items: + type: number + runAsGroup: + type: number + runAsNonRoot: + type: boolean + sysctls: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + priorityClassName: + type: string + description: If specified, indicates the Pod's priority. "system-node-critical" + and "system-cluster-critical" are two special keywords which + indicate the highest priorities with the former being the highest + priority. Any other name must be defined by creating a PriorityClass + object with that name. If not specified, the pod priority will + be the default or zero, if there is no default. See `kubectl + explain pods.spec.priorityClassName`. + volumes: + type: array + description: Additional volumes to be created in the server Pod. + See `kubectl explain pods.spec.volumes`. + items: + type: object + properties: + quobyte: + type: object + properties: + volume: + type: string + registry: + type: string + readOnly: + type: boolean + user: + type: string + tenant: + type: string + group: + type: string + required: + - registry + - volume + azureFile: + type: object + properties: + secretName: + type: string + readOnly: + type: boolean + shareName: + type: string + required: + - secretName + - shareName + flexVolume: + type: object + properties: + driver: + type: string + options: + additionalProperties: + type: string + type: object + secretRef: + type: object + properties: + name: type: string - lifecycle: - description: Lifecycle describes actions that the - management system should take in response to container - lifecycle events. For the PostStart and PreStop - lifecycle handlers, management of the container - blocks until the action is complete, unless the - container process fails, in which case the handler - is aborted. + readOnly: + type: boolean + fsType: + type: string + required: + - driver + secret: + type: object + properties: + secretName: + type: string + defaultMode: + type: number + optional: + type: boolean + items: + type: array + items: type: object properties: - postStart: - description: Handler defines a specific action - that should be taken + mode: + type: number + path: + type: string + key: + type: string + required: + - key + - path + projected: + type: object + properties: + sources: + type: array + items: + type: object + properties: + downwardAPI: type: object properties: - tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in - container" action. - type: object - properties: - command: - description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. - type: array - items: + items: + type: array + items: + type: object + properties: + mode: + type: number + path: type: string - httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP - server. - type: string - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a - custom header to be used in HTTP probes + resourceFieldRef: type: object properties: - name: - description: The header field name + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: type: string - value: - description: The header field value + containerName: type: string required: - - name - - value - required: - - port - preStop: - description: Handler defines a specific action - that should be taken - type: object - properties: - tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in - container" action. - type: object - properties: - command: - description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP - server. - type: string - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a - custom header to be used in HTTP probes + - resource + fieldRef: type: object properties: - name: - description: The header field name + apiVersion: type: string - value: - description: The header field value + fieldPath: type: string required: - - name - - value - required: - - port - name: - description: Name of the container specified as a - DNS_LABEL. Each container in a pod must have a unique - name (DNS_LABEL). Cannot be updated. - type: string - tty: - description: Whether this container should allocate - a TTY for itself, also requires 'stdin' to be true. - Default is false. - type: boolean - readinessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + - fieldPath + required: + - path + configMap: type: object properties: - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + name: type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. + optional: + type: boolean + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + key: + type: string + required: + - key + - path + secret: type: object properties: - command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. + name: + type: string + optional: + type: boolean + items: type: array items: - type: string - httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + type: object + properties: + mode: + type: number + path: + type: string + key: + type: string + required: + - key + - path + serviceAccountToken: type: object properties: path: - description: Path to access on the HTTP server. type: string - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + audience: type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + expirationSeconds: + type: number + required: + - path + defaultMode: + type: number + required: + - sources + cephfs: + type: object + properties: + path: + type: string + secretRef: + type: object + properties: + name: + type: string + secretFile: + type: string + readOnly: + type: boolean + user: + type: string + monitors: + type: array + items: + type: string + required: + - monitors + scaleIO: + type: object + properties: + system: + type: string + protectionDomain: + type: string + sslEnabled: + type: boolean + storageMode: + type: string + volumeName: + type: string + secretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + storagePool: + type: string + gateway: + type: string + required: + - gateway + - secretRef + - system + emptyDir: + type: object + properties: + sizeLimit: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + medium: + type: string + glusterfs: + type: object + properties: + path: + type: string + endpoints: + type: string + readOnly: + type: boolean + required: + - endpoints + - path + gcePersistentDisk: + type: object + properties: + partition: + type: number + readOnly: + type: boolean + pdName: + type: string + fsType: + type: string + required: + - pdName + photonPersistentDisk: + type: object + properties: + pdID: + type: string + fsType: + type: string + required: + - pdID + azureDisk: + type: object + properties: + diskName: + type: string + kind: + type: string + readOnly: + type: boolean + cachingMode: + type: string + diskURI: + type: string + fsType: + type: string + required: + - diskName + - diskURI + cinder: + type: object + properties: + secretRef: + type: object + properties: + name: + type: string + volumeID: + type: string + readOnly: + type: boolean + fsType: + type: string + required: + - volumeID + downwardAPI: + type: object + properties: + defaultMode: + type: number + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + resourceFieldRef: + type: object + properties: + divisor: type: object properties: - intValue: + number: type: number - isInt: - type: boolean - strValue: + format: type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: type: string - httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value required: - - port - stdinOnce: - description: Whether the container runtime should - close the stdin channel after it has been opened - by a single attach. When stdin is true the stdin - stream will remain open across multiple attach sessions. - If stdinOnce is set to true, stdin is opened on - container start, is empty until the first client - attaches to stdin, and then remains open and accepts - data until the client disconnects, at which time - stdin is closed and remains closed until the container - is restarted. If this flag is false, a container - processes that reads from stdin will never receive - an EOF. Default is false - type: boolean - envFrom: - description: List of sources to populate environment - variables in the container. The keys defined within - a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container - is starting. When a key exists in multiple sources, - the value associated with the last source will take - precedence. Values defined by an Env with a duplicate - key will take precedence. Cannot be updated. - type: array - items: - description: EnvFromSource represents the source - of a set of ConfigMaps - type: object - properties: - configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field - will represent the key-value pairs as environment - variables. - type: object - properties: - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap - must be defined - type: boolean - prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: SecretEnvSource selects a Secret - to populate the environment variables with. The - contents of the target Secret's Data field - will represent the key-value pairs as environment - variables. - type: object - properties: - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret - must be defined - type: boolean - required: - - name - containerSecurityContext: - description: Container-level security attributes. Will override - any matching pod-level attributes. + - resource + fieldRef: + type: object + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + required: + - path + awsElasticBlockStore: + type: object + properties: + partition: + type: number + volumeID: + type: string + readOnly: + type: boolean + fsType: + type: string + required: + - volumeID + flocker: + type: object + properties: + datasetName: + type: string + datasetUUID: + type: string + iscsi: + type: object + properties: + chapAuthSession: + type: boolean + iscsiInterface: + type: string + lun: + type: number + chapAuthDiscovery: + type: boolean + iqn: + type: string + portals: + type: array + items: + type: string + secretRef: + type: object + properties: + name: + type: string + initiatorName: + type: string + readOnly: + type: boolean + fsType: + type: string + targetPortal: + type: string + required: + - iqn + - lun + - targetPortal + rbd: + type: object + properties: + image: + type: string + pool: + type: string + secretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + keyring: + type: string + user: + type: string + monitors: + type: array + items: + type: string + required: + - image + - monitors + configMap: + type: object + properties: + defaultMode: + type: number + name: + type: string + optional: + type: boolean + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + key: + type: string + required: + - key + - path + storageos: + type: object + properties: + volumeNamespace: + type: string + volumeName: + type: string + secretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + csi: + type: object + properties: + driver: + type: string + nodePublishSecretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + volumeAttributes: + additionalProperties: + type: string + type: object + required: + - driver + name: + type: string + nfs: + type: object + properties: + path: + type: string + server: + type: string + readOnly: + type: boolean + required: + - path + - server + persistentVolumeClaim: + type: object + properties: + claimName: + type: string + readOnly: + type: boolean + required: + - claimName + gitRepo: + type: object + properties: + repository: + type: string + directory: + type: string + revision: + type: string + required: + - repository + portworxVolume: type: object properties: - privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. + volumeID: + type: string + readOnly: type: boolean - runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. + fsType: + type: string + required: + - volumeID + vsphereVolume: + type: object + properties: + storagePolicyName: + type: string + storagePolicyID: + type: string + volumePath: + type: string + fsType: + type: string + required: + - volumePath + fc: + type: object + properties: + lun: type: number - capabilities: - description: Adds and removes POSIX capabilities from - running containers. + targetWWNs: + type: array + items: + type: string + readOnly: + type: boolean + wwids: + type: array + items: + type: string + fsType: + type: string + hostPath: + type: object + properties: + path: + type: string + type: + type: string + required: + - path + required: + - name + resources: + type: object + description: Memory and CPU minimum requirements and limits for + the WebLogic Server instance. See `kubectl explain pods.spec.containers.resources`. + properties: + requests: + type: object + additionalProperties: + type: string + limits: + type: object + additionalProperties: + type: string + annotations: + type: object + additionalProperties: + type: string + description: The annotations to be added to generated resources. + env: + type: array + description: 'A list of environment variables to set in the container + running a WebLogic Server instance. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-resource/#jvm-memory-and-java-option-environment-variables. + See `kubectl explain pods.spec.containers.env`.' + items: + type: object + properties: + name: + type: string + value: + type: string + valueFrom: + type: object + properties: + secretKeyRef: type: object properties: - add: - description: Added capabilities - type: array - items: - type: string - drop: - description: Removed capabilities - type: array - items: - type: string - seLinuxOptions: - description: SELinuxOptions are the labels to be applied - to the container + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + resourceFieldRef: type: object properties: - role: - description: Role is a SELinux role label that applies - to the container. + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: type: string - level: - description: Level is SELinux level label that applies - to the container. + containerName: type: string - type: - description: Type is a SELinux type label that applies - to the container. + required: + - resource + configMapKeyRef: + type: object + properties: + name: type: string - user: - description: User is a SELinux user label that applies - to the container. + optional: + type: boolean + key: type: string - windowsOptions: - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. + required: + - key + fieldRef: type: object properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. - type: string - runAsUserName: - description: The UserName in Windows to run the - entrypoint of the container process. Defaults - to the user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - This field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. + apiVersion: type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + fieldPath: type: string - procMount: - description: procMount denotes the type of proc mount - to use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. - type: string - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent - process. This bool directly controls if the no_new_privs - flag will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' - type: boolean - runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. - type: number - runAsNonRoot: - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if - it does. If unset or false, no such validation will - be performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - type: boolean - readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. - type: boolean - schedulerName: - description: If specified, the pod will be dispatched by - specified scheduler. If not specified, the pod will be - dispatched by default scheduler. + required: + - fieldPath + required: + - name + restartPolicy: + type: string + description: 'Restart policy for all containers within the Pod. + One of Always, OnFailure, Never. Default to Always. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy. + See `kubectl explain pods.spec.restartPolicy`.' + nodeSelector: + type: object + additionalProperties: + type: string + description: Selector which must match a Node's labels for the + Pod to be scheduled on that Node. See `kubectl explain pods.spec.nodeSelector`. + volumeMounts: + type: array + description: Additional volume mounts for the container running + a WebLogic Server instance. See `kubectl explain pods.spec.containers.volumeMounts`. + items: + type: object + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + labels: + type: object + additionalProperties: + type: string + description: The labels to be added to generated resources. The + label names must not start with "weblogic.". + runtimeClassName: + type: string + description: 'RuntimeClassName refers to a RuntimeClass object + in the node.k8s.io group, which should be used to run this Pod. + If no RuntimeClass resource matches the named class, the Pod + will not be run. If unset or empty, the "legacy" RuntimeClass + will be used, which is an implicit class with an empty definition + that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future. See `kubectl + explain pods.spec.runtimeClassName`.' + tolerations: + type: array + description: If specified, the Pod's tolerations. See `kubectl + explain pods.spec.tolerations`. + items: + type: object + properties: + effect: type: string - initContainers: - description: Initialization containers to be included in - the server pod. + tolerationSeconds: + type: number + value: + type: string + key: + type: string + operator: + type: string + readinessProbe: + type: object + description: Settings for the readiness probe associated with + a WebLogic Server instance. + properties: + periodSeconds: + type: number + description: The number of seconds between checks. + timeoutSeconds: + type: number + description: The number of seconds with no response that indicates + a failure. + initialDelaySeconds: + type: number + description: The number of seconds before the first check + is performed. + containers: + type: array + description: Additional containers to be included in the server + Pod. See `kubectl explain pods.spec.containers`. + items: + type: object + properties: + volumeDevices: type: array items: - description: A single application container that you want - to run within a pod. type: object properties: - volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. - type: array - items: - description: volumeDevice describes a mapping of - a raw block device within a container. + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + image: + type: string + imagePullPolicy: + type: string + livenessProbe: + type: object + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: + type: object + properties: + port: type: object properties: - devicePath: - description: devicePath is the path inside of - the container that the device will be mapped - to. + intValue: + type: number + isInt: + type: boolean + strValue: type: string - name: - description: name must match the name of a persistentVolumeClaim - in the pod + required: + - isInt + host: + type: string + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: type: string required: - - devicePath - - name - image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. Cannot - be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - livenessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + - isInt + host: + type: string + httpHeaders: + type: array + items: type: object properties: - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + name: + type: string + value: type: string required: - - port - timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + - name + - value + required: + - port + stdin: + type: boolean + terminationMessagePolicy: + type: string + terminationMessagePath: + type: string + workingDir: + type: string + resources: + type: object + properties: + requests: + additionalProperties: + type: string + type: object + limits: + additionalProperties: + type: string + type: object + securityContext: + type: object + properties: + privileged: + type: boolean + runAsUser: + type: number + capabilities: + type: object + properties: + add: + type: array + items: + type: string + drop: + type: array + items: + type: string + seLinuxOptions: + type: object + properties: + role: + type: string + level: + type: string + type: + type: string + user: + type: string + windowsOptions: + type: object + properties: + gmsaCredentialSpec: + type: string + runAsUserName: + type: string + gmsaCredentialSpecName: + type: string + procMount: + type: string + allowPrivilegeEscalation: + type: boolean + runAsGroup: + type: number + runAsNonRoot: + type: boolean + readOnlyRootFilesystem: + type: boolean + startupProbe: + type: object + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: type: object properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + name: type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + value: type: string - httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value required: - - port - stdin: - description: Whether this container should allocate - a buffer for stdin in the container runtime. If - this is not set, reads from stdin in the container - will always result in EOF. Default is false. - type: boolean - terminationMessagePolicy: - description: Indicate how the termination message - should be populated. File will use the contents - of terminationMessagePath to populate the container - status message on both success and failure. FallbackToLogsOnError - will use the last chunk of container log output - if the termination message file is empty and the - container exited with an error. The log output is - limited to 2048 bytes or 80 lines, whichever is - smaller. Defaults to File. Cannot be updated. - type: string - terminationMessagePath: - description: 'Optional: Path at which the file to - which the container''s termination message will - be written is mounted into the container''s filesystem. - Message written is intended to be brief final status, - such as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' + - name + - value + required: + - port + env: + type: array + items: + type: object + properties: + name: type: string - workingDir: - description: Container's working directory. If not - specified, the container runtime's default will - be used, which might be configured in the container - image. Cannot be updated. + value: type: string - resources: - description: ResourceRequirements describes the compute - resource requirements. - type: object - properties: - requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - limits: - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields - are present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take - precedence. + valueFrom: type: object properties: - privileged: - description: Run container in privileged mode. - Processes in privileged containers are essentially - equivalent to root on the host. Defaults to - false. - type: boolean - runAsUser: - description: The UID to run the entrypoint of - the container process. Defaults to user specified - in image metadata if unspecified. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. - type: number - capabilities: - description: Adds and removes POSIX capabilities - from running containers. + secretKeyRef: type: object properties: - add: - description: Added capabilities - type: array - items: - type: string - drop: - description: Removed capabilities - type: array - items: - type: string - seLinuxOptions: - description: SELinuxOptions are the labels to - be applied to the container + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + resourceFieldRef: type: object properties: - role: - description: Role is a SELinux role label - that applies to the container. + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: type: string - level: - description: Level is SELinux level label - that applies to the container. + containerName: type: string - type: - description: Type is a SELinux type label - that applies to the container. + required: + - resource + configMapKeyRef: + type: object + properties: + name: type: string - user: - description: User is a SELinux user label - that applies to the container. + optional: + type: boolean + key: type: string - windowsOptions: - description: WindowsSecurityContextOptions contain - Windows-specific options and credentials. + required: + - key + fieldRef: type: object properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the - GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName - field. This field is alpha-level and is - only honored by servers that enable the - WindowsGMSA feature flag. + apiVersion: type: string - runAsUserName: - description: The UserName in Windows to run - the entrypoint of the container process. - Defaults to the user specified in image - metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. This - field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. + fieldPath: type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the - name of the GMSA credential spec to use. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. + required: + - fieldPath + required: + - name + ports: + type: array + items: + type: object + properties: + protocol: + type: string + hostIP: + type: string + name: + type: string + containerPort: + type: number + hostPort: + type: number + required: + - containerPort + command: + type: array + items: + type: string + volumeMounts: + type: array + items: + type: object + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + args: + type: array + items: + type: string + lifecycle: + type: object + properties: + postStart: + type: object + properties: + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + exec: + type: object + properties: + command: + type: array + items: type: string - procMount: - description: procMount denotes the type of proc - mount to use for the containers. The default - is DefaultProcMount which uses the container - runtime defaults for readonly paths and masked - paths. This requires the ProcMountType feature - flag to be enabled. - type: string - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the - container process. AllowPrivilegeEscalation - is true always when the container is: 1) run - as Privileged 2) has CAP_SYS_ADMIN' - type: boolean - runAsGroup: - description: The GID to run the entrypoint of - the container process. Uses runtime default - if unset. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. - type: number - runAsNonRoot: - description: Indicates that the container must - run as a non-root user. If true, the Kubelet - will validate the image at runtime to ensure - that it does not run as UID 0 (root) and fail - to start the container if it does. If unset - or false, no such validation will be performed. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. - type: boolean - readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. - type: boolean - startupProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + preStop: + type: object + properties: + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: type: object properties: - intValue: - type: number - isInt: - type: boolean - strValue: + name: + type: string + value: type: string required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + - name + - value + required: + - port + name: + type: string + tty: + type: boolean + readinessProbe: + type: object + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: type: object properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + name: type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + value: type: string - httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value required: - - port - env: - description: List of environment variables to set - in the container. Cannot be updated. - type: array - items: - description: EnvVar represents an environment variable - present in a Container. + - name + - value + required: + - port + stdinOnce: + type: boolean + envFrom: + type: array + items: + type: object + properties: + configMapRef: + type: object + properties: + name: + type: string + optional: + type: boolean + prefix: + type: string + secretRef: + type: object + properties: + name: + type: string + optional: + type: boolean + required: + - name + containerSecurityContext: + type: object + description: Container-level security attributes. Will override + any matching Pod-level attributes. See `kubectl explain pods.spec.containers.securityContext`. + properties: + privileged: + type: boolean + runAsUser: + type: number + capabilities: + type: object + properties: + add: + type: array + items: + type: string + drop: + type: array + items: + type: string + seLinuxOptions: + type: object + properties: + role: + type: string + level: + type: string + type: + type: string + user: + type: string + windowsOptions: + type: object + properties: + gmsaCredentialSpec: + type: string + runAsUserName: + type: string + gmsaCredentialSpecName: + type: string + procMount: + type: string + allowPrivilegeEscalation: + type: boolean + runAsGroup: + type: number + runAsNonRoot: + type: boolean + readOnlyRootFilesystem: + type: boolean + schedulerName: + type: string + description: If specified, the Pod will be dispatched by the specified + scheduler. If not specified, the Pod will be dispatched by the + default scheduler. See `kubectl explain pods.spec.schedulerName`. + initContainers: + type: array + description: Initialization containers to be included in the server + Pod. See `kubectl explain pods.spec.initContainers`. + items: + type: object + properties: + volumeDevices: + type: array + items: + type: object + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + image: + type: string + imagePullPolicy: + type: string + livenessProbe: + type: object + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: + type: object + properties: + port: type: object properties: - name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service - environment variables. If a variable cannot - be resolved, the reference in the input string - will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, - regardless of whether the variable exists - or not. Defaults to "".' + intValue: + type: number + isInt: + type: boolean + strValue: type: string - valueFrom: - description: EnvVarSource represents a source - for the value of an EnvVar. - type: object - properties: - secretKeyRef: - description: SecretKeySelector selects a - key of a Secret. - type: object - properties: - name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - required: - - key - resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and - their output format - type: object - properties: - divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= - (Note that - may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= - "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi - | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | - M | G | T | P | E (Note that 1024 - = 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent - forms is used, no quantity may represent - a number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This - may be extended in the future if we - require larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type - again when it is serialized. Before - serializing, Quantity will be put - in "canonical form". This means that - Exponent/suffix will be adjusted up - or down (with a corresponding increase - or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. - The sign will be omitted unless the - number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as - they are well formed, but will be - re-emitted in their canonical form. - (So always use canonical form, or - don''t diff.) This format is intended - to make it difficult to use these - numbers without writing some sort - of special handling code in the hopes - that that will cause implementors - to also use a fixed point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to - select' - type: string - containerName: - description: 'Container name: required - for volumes, optional for env vars' - type: string - required: - - resource - configMapKeyRef: - description: Selects a key from a ConfigMap. - type: object - properties: - name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - key: - description: The key to select. - type: string - required: - - key - fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. - type: object - properties: - apiVersion: - description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath required: - - name - ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional - information about the network connections a container - uses, but is primarily informational. Not specifying - a port here DOES NOT prevent that port from being - exposed. Any port which is listening on the default - "0.0.0.0" address inside a container will be accessible - from the network. Cannot be updated. - type: array - items: - description: ContainerPort represents a network - port in a single container. + - isInt + host: + type: string + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: type: object properties: - protocol: - description: Protocol for port. Must be UDP, - TCP, or SCTP. Defaults to "TCP". - type: string - hostIP: - description: What host IP to bind the external - port to. - type: string - name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port - in a pod must have a unique name. Name for - the port that can be referred to by services. - type: string - containerPort: - description: Number of port to expose on the - pod's IP address. This must be a valid port - number, 0 < x < 65536. - type: number - hostPort: - description: Number of port to expose on the - host. If specified, this must be a valid port - number, 0 < x < 65536. If HostNetwork is specified, - this must match ContainerPort. Most containers - do not need this. + intValue: type: number + isInt: + type: boolean + strValue: + type: string required: - - containerPort - command: - description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used - if this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. - If a variable cannot be resolved, the reference - in the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be - updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + - isInt + host: type: string - volumeMounts: - description: Pod volumes to mount into the container's - filesystem. Cannot be updated. - type: array - items: - description: VolumeMount describes a mounting of - a Volume within a container. + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + stdin: + type: boolean + terminationMessagePolicy: + type: string + terminationMessagePath: + type: string + workingDir: + type: string + resources: + type: object + properties: + requests: + additionalProperties: + type: string + type: object + limits: + additionalProperties: + type: string + type: object + securityContext: + type: object + properties: + privileged: + type: boolean + runAsUser: + type: number + capabilities: + type: object + properties: + add: + type: array + items: + type: string + drop: + type: array + items: + type: string + seLinuxOptions: + type: object + properties: + role: + type: string + level: + type: string + type: + type: string + user: + type: string + windowsOptions: + type: object + properties: + gmsaCredentialSpec: + type: string + runAsUserName: + type: string + gmsaCredentialSpecName: + type: string + procMount: + type: string + allowPrivilegeEscalation: + type: boolean + runAsGroup: + type: number + runAsNonRoot: + type: boolean + readOnlyRootFilesystem: + type: boolean + startupProbe: + type: object + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: + type: object + properties: + port: type: object properties: - mountPath: - description: Path within the container at which - the volume should be mounted. Must not contain - ':'. - type: string - mountPropagation: - description: mountPropagation determines how - mounts are propagated from the host to container - and the other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults - to false. + intValue: + type: number + isInt: type: boolean - subPath: - description: Path within the volume from which - the container's volume should be mounted. - Defaults to "" (volume's root). + strValue: type: string - subPathExpr: - description: Expanded path within the volume - from which the container's volume should be - mounted. Behaves similarly to SubPath but - environment variable references $(VAR_NAME) - are expanded using the container's environment. - Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field - is beta in 1.15. + required: + - isInt + host: + type: string + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: type: string required: - - mountPath - - name - args: - description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + - isInt + host: type: string - lifecycle: - description: Lifecycle describes actions that the - management system should take in response to container - lifecycle events. For the PostStart and PreStop - lifecycle handlers, management of the container - blocks until the action is complete, unless the - container process fails, in which case the handler - is aborted. - type: object - properties: - postStart: - description: Handler defines a specific action - that should be taken - type: object - properties: - tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in - container" action. - type: object - properties: - command: - description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP - server. - type: string - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a - custom header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - preStop: - description: Handler defines a specific action - that should be taken + httpHeaders: + type: array + items: type: object properties: - tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in - container" action. - type: object - properties: - command: - description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP - server. - type: string - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a - custom header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - name: - description: Name of the container specified as a - DNS_LABEL. Each container in a pod must have a unique - name (DNS_LABEL). Cannot be updated. - type: string - tty: - description: Whether this container should allocate - a TTY for itself, also requires 'stdin' to be true. - Default is false. - type: boolean - readinessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + env: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + valueFrom: type: object properties: - failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + secretKeyRef: type: object properties: - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + resourceFieldRef: + type: object + properties: + divisor: type: object properties: - intValue: + number: type: number - isInt: - type: boolean - strValue: + format: type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: type: string required: - - port - timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. + - resource + configMapKeyRef: type: object properties: - command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + fieldRef: type: object properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + apiVersion: type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + fieldPath: type: string - httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value required: - - port - stdinOnce: - description: Whether the container runtime should - close the stdin channel after it has been opened - by a single attach. When stdin is true the stdin - stream will remain open across multiple attach sessions. - If stdinOnce is set to true, stdin is opened on - container start, is empty until the first client - attaches to stdin, and then remains open and accepts - data until the client disconnects, at which time - stdin is closed and remains closed until the container - is restarted. If this flag is false, a container - processes that reads from stdin will never receive - an EOF. Default is false + - fieldPath + required: + - name + ports: + type: array + items: + type: object + properties: + protocol: + type: string + hostIP: + type: string + name: + type: string + containerPort: + type: number + hostPort: + type: number + required: + - containerPort + command: + type: array + items: + type: string + volumeMounts: + type: array + items: + type: object + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: type: boolean - envFrom: - description: List of sources to populate environment - variables in the container. The keys defined within - a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container - is starting. When a key exists in multiple sources, - the value associated with the last source will take - precedence. Values defined by an Env with a duplicate - key will take precedence. Cannot be updated. - type: array - items: - description: EnvFromSource represents the source - of a set of ConfigMaps + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + args: + type: array + items: + type: string + lifecycle: + type: object + properties: + postStart: + type: object + properties: + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: type: object properties: - configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field - will represent the key-value pairs as environment - variables. + path: + type: string + scheme: + type: string + port: type: object properties: - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap - must be defined + intValue: + type: number + isInt: type: boolean - prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. + strValue: + type: string + required: + - isInt + host: type: string - secretRef: - description: SecretEnvSource selects a Secret - to populate the environment variables with. The - contents of the target Secret's Data field - will represent the key-value pairs as environment - variables. + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + preStop: + type: object + properties: + tcpSocket: + type: object + properties: + port: type: object properties: - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + intValue: + type: number + isInt: + type: boolean + strValue: type: string - optional: - description: Specify whether the Secret - must be defined + required: + - isInt + host: + type: string + required: + - port + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: type: boolean - required: - - name - shutdown: - description: Configures how the operator should shutdown - the server instance. + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + name: + type: string + tty: + type: boolean + readinessProbe: type: object properties: - ignoreSessions: - description: For graceful shutdown only, indicates to - ignore pending HTTP sessions during in-flight work - handling. Not required. Defaults to false. - type: boolean - shutdownType: - description: Tells the operator how to shutdown server - instances. Not required. Defaults to graceful shutdown. - type: string - enum: - - Graceful - - Forced - timeoutSeconds: - description: For graceful shutdown only, number of seconds - to wait before aborting in-flight work and shutting - down the server. Not required. Defaults to 30 seconds. + failureThreshold: type: number - affinity: - description: If specified, the pod's scheduling constraints - type: object - properties: - nodeAffinity: - description: Node affinity is a group of node affinity - scheduling rules. + periodSeconds: + type: number + tcpSocket: type: object properties: - requiredDuringSchedulingIgnoredDuringExecution: - description: A node selector represents the union - of the results of one or more label queries over - a set of nodes; that is, it represents the OR - of the selectors represented by the node selector - terms. + port: type: object properties: - nodeSelectorTerms: - description: Required. A list of node selector - terms. The terms are ORed. - type: array - items: - description: A null or empty node selector - term matches no objects. The requirements - of them are ANDed. The TopologySelectorTerm - type implements a subset of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - type: array - items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - type: array - items: - type: string - key: - description: The label key that - the selector applies to. - type: string - operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. - type: string - required: - - key - - operator - matchFields: - description: A list of node selector requirements - by node's fields. - type: array - items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - type: array - items: - type: string - key: - description: The label key that - the selector applies to. - type: string - operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. - type: string - required: - - key - - operator + intValue: + type: number + isInt: + type: boolean + strValue: + type: string required: - - nodeSelectorTerms - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule - pods to nodes that satisfy the affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. - The node that is most preferred is the one with - the greatest sum of weights, i.e. for each node - that meets all of the scheduling requirements - (resource request, requiredDuringScheduling affinity - expressions, etc.), compute a sum by iterating - through the elements of this field and adding - "weight" to the sum if the node matches the corresponding - matchExpressions; the node(s) with the highest - sum are the most preferred. - type: array - items: - description: An empty preferred scheduling term - matches all objects with implicit weight 0 (i.e. - it's a no-op). A null preferred scheduling term - matches no objects (i.e. is also a no-op). - type: object - properties: - preference: - description: A null or empty node selector - term matches no objects. The requirements - of them are ANDed. The TopologySelectorTerm - type implements a subset of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - type: array - items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - type: array - items: - type: string - key: - description: The label key that - the selector applies to. - type: string - operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. - type: string - required: - - key - - operator - matchFields: - description: A list of node selector requirements - by node's fields. - type: array - items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - type: array - items: - type: string - key: - description: The label key that - the selector applies to. - type: string - operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. - type: string - required: - - key - - operator - weight: - description: Weight associated with matching - the corresponding nodeSelectorTerm, in the - range 1-100. - type: number - required: - - preference - - weight - podAffinity: - description: Pod affinity is a group of inter pod affinity - scheduling rules. + - isInt + host: + type: string + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: type: object properties: - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified - by this field are not met at scheduling time, - the pod will not be scheduled onto the node. If - the affinity requirements specified by this field - cease to be met at some point during pod execution - (e.g. due to a pod label update), the system may - or may not try to eventually evict the pod from - its node. When there are multiple elements, the - lists of nodes corresponding to each podAffinityTerm - are intersected, i.e. all terms must be satisfied. + command: type: array items: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which - a pod of the set of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty - label selector matches all objects. A null - label selector matches no objects. - type: object - properties: - matchExpressions: - description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. - type: array - items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. This - array is replaced during a strategic - merge patch. - type: array - items: - type: string - key: - description: key is the label key - that the selector applies to. - type: string - operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. - additionalProperties: - type: string - type: object - topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose value - of the label with key topologyKey matches - that of any node on which any of the selected - pods is running. Empty topologyKey is not - allowed. - type: string - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - type: array - items: - type: string - required: - - topologyKey - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule - pods to nodes that satisfy the affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. - The node that is most preferred is the one with - the greatest sum of weights, i.e. for each node - that meets all of the scheduling requirements - (resource request, requiredDuringScheduling affinity - expressions, etc.), compute a sum by iterating - through the elements of this field and adding - "weight" to the sum if the node has pods which - matches the corresponding podAffinityTerm; the - node(s) with the highest sum are the most preferred. + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: type: array items: - description: The weights of all of the matched - WeightedPodAffinityTerm fields are added per-node - to find the most preferred node(s) type: object properties: - podAffinityTerm: - description: Defines a set of pods (namely - those matching the labelSelector relative - to the given namespace(s)) that this pod - should be co-located (affinity) or not co-located - (anti-affinity) with, where co-located is - defined as running on a node whose value - of the label with key matches - that of any node on which a pod of the set - of pods is running + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + stdinOnce: + type: boolean + envFrom: + type: array + items: + type: object + properties: + configMapRef: + type: object + properties: + name: + type: string + optional: + type: boolean + prefix: + type: string + secretRef: + type: object + properties: + name: + type: string + optional: + type: boolean + required: + - name + shutdown: + type: object + description: Configures how the operator should shut down the + server instance. + properties: + ignoreSessions: + type: boolean + description: For graceful shutdown only, indicates to ignore + pending HTTP sessions during in-flight work handling. Defaults + to false. + shutdownType: + type: string + description: Specifies how the operator will shut down server + instances. Defaults to graceful shutdown. + enum: + - Graceful + - Forced + timeoutSeconds: + type: number + description: For graceful shutdown only, number of seconds + to wait before aborting in-flight work and shutting down + the server. Defaults to 30 seconds. + affinity: + type: object + description: If specified, the Pod's scheduling constraints. See + `kubectl explain pods.spec.affinity` + properties: + nodeAffinity: + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: object + properties: + nodeSelectorTerms: + type: array + items: + type: object + properties: + matchExpressions: + type: array + items: type: object properties: - labelSelector: - description: A label selector is a label - query over a set of resources. The result - of matchLabels and matchExpressions - are ANDed. An empty label selector matches - all objects. A null label selector matches - no objects. - type: object - properties: - matchExpressions: - description: matchExpressions is a - list of label selector requirements. - The requirements are ANDed. - type: array - items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: values is an array - of string values. If the operator - is In or NotIn, the values - array must be non-empty. If - the operator is Exists or - DoesNotExist, the values array - must be empty. This array - is replaced during a strategic - merge patch. - type: array - items: - type: string - key: - description: key is the label - key that the selector applies - to. - type: string - operator: - description: operator represents - a key's relationship to a - set of values. Valid operators - are In, NotIn, Exists and - DoesNotExist. - type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map - of {key,value} pairs. A single {key,value} - in the matchLabels map is equivalent - to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are - ANDed. - additionalProperties: - type: string - type: object - topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose - value of the label with key topologyKey - matches that of any node on which any - of the selected pods is running. Empty - topologyKey is not allowed. + values: + type: array + items: + type: string + key: type: string - namespaces: - description: namespaces specifies which - namespaces the labelSelector applies - to (matches against); null or empty - list means "this pod's namespace" + operator: + type: string + required: + - key + - operator + matchFields: + type: array + items: + type: object + properties: + values: type: array items: type: string + key: + type: string + operator: + type: string required: - - topologyKey - weight: - description: weight associated with matching - the corresponding podAffinityTerm, in the - range 1-100. - type: number - required: - - podAffinityTerm - - weight - podAntiAffinity: - description: Pod anti affinity is a group of inter pod - anti affinity scheduling rules. + - key + - operator + required: + - nodeSelectorTerms + preferredDuringSchedulingIgnoredDuringExecution: + type: array + items: type: object properties: - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified - by this field are not met at scheduling time, - the pod will not be scheduled onto the node. If - the anti-affinity requirements specified by this - field cease to be met at some point during pod - execution (e.g. due to a pod label update), the - system may or may not try to eventually evict - the pod from its node. When there are multiple - elements, the lists of nodes corresponding to - each podAffinityTerm are intersected, i.e. all - terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which - a pod of the set of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty - label selector matches all objects. A null - label selector matches no objects. + preference: + type: object + properties: + matchExpressions: + type: array + items: + type: object + properties: + values: + type: array + items: + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + matchFields: + type: array + items: type: object properties: - matchExpressions: - description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. + values: type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. This - array is replaced during a strategic - merge patch. - type: array - items: - type: string - key: - description: key is the label key - that the selector applies to. - type: string - operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. - additionalProperties: type: string - type: object - topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose value - of the label with key topologyKey matches - that of any node on which any of the selected - pods is running. Empty topologyKey is not - allowed. + key: + type: string + operator: + type: string + required: + - key + - operator + weight: + type: number + required: + - preference + - weight + podAffinity: + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + items: + type: object + properties: + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: + type: object + properties: + values: + type: array + items: + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + matchLabels: + additionalProperties: type: string - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - type: array - items: - type: string - required: - - topologyKey - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule - pods to nodes that satisfy the anti-affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. - The node that is most preferred is the one with - the greatest sum of weights, i.e. for each node - that meets all of the scheduling requirements - (resource request, requiredDuringScheduling anti-affinity - expressions, etc.), compute a sum by iterating - through the elements of this field and adding - "weight" to the sum if the node has pods which - matches the corresponding podAffinityTerm; the - node(s) with the highest sum are the most preferred. + type: object + topologyKey: + type: string + namespaces: type: array items: - description: The weights of all of the matched - WeightedPodAffinityTerm fields are added per-node - to find the most preferred node(s) - type: object - properties: - podAffinityTerm: - description: Defines a set of pods (namely - those matching the labelSelector relative - to the given namespace(s)) that this pod - should be co-located (affinity) or not co-located - (anti-affinity) with, where co-located is - defined as running on a node whose value - of the label with key matches - that of any node on which a pod of the set - of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label - query over a set of resources. The result - of matchLabels and matchExpressions - are ANDed. An empty label selector matches - all objects. A null label selector matches - no objects. + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + items: + type: object + properties: + podAffinityTerm: + type: object + properties: + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: type: object properties: - matchExpressions: - description: matchExpressions is a - list of label selector requirements. - The requirements are ANDed. + values: type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: values is an array - of string values. If the operator - is In or NotIn, the values - array must be non-empty. If - the operator is Exists or - DoesNotExist, the values array - must be empty. This array - is replaced during a strategic - merge patch. - type: array - items: - type: string - key: - description: key is the label - key that the selector applies - to. - type: string - operator: - description: operator represents - a key's relationship to a - set of values. Valid operators - are In, NotIn, Exists and - DoesNotExist. - type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map - of {key,value} pairs. A single {key,value} - in the matchLabels map is equivalent - to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are - ANDed. - additionalProperties: type: string - type: object - topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose - value of the label with key topologyKey - matches that of any node on which any - of the selected pods is running. Empty - topologyKey is not allowed. + key: + type: string + operator: + type: string + required: + - key + - operator + matchLabels: + additionalProperties: type: string - namespaces: - description: namespaces specifies which - namespaces the labelSelector applies - to (matches against); null or empty - list means "this pod's namespace" + type: object + topologyKey: + type: string + namespaces: + type: array + items: + type: string + required: + - topologyKey + weight: + type: number + required: + - podAffinityTerm + - weight + podAntiAffinity: + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + items: + type: object + properties: + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: + type: object + properties: + values: type: array items: type: string + key: + type: string + operator: + type: string required: - - topologyKey - weight: - description: weight associated with matching - the corresponding podAffinityTerm, in the - range 1-100. - type: number - required: - - podAffinityTerm - - weight - serverStartPolicy: - description: The strategy for deciding whether to start a server. - Legal values are ALWAYS, NEVER, or IF_NEEDED. - type: string - enum: - - ALWAYS - - NEVER - - IF_NEEDED - restartVersion: - description: If present, every time this value is updated the - operator will restart the required servers. - type: string - required: - - serverName - clusters: + - key + - operator + matchLabels: + additionalProperties: + type: string + type: object + topologyKey: + type: string + namespaces: + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + items: + type: object + properties: + podAffinityTerm: + type: object + properties: + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: + type: object + properties: + values: + type: array + items: + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + matchLabels: + additionalProperties: + type: string + type: object + topologyKey: + type: string + namespaces: + type: array + items: + type: string + required: + - topologyKey + weight: + type: number + required: + - podAffinityTerm + - weight + managedServers: type: array - description: Configuration for the clusters. + description: Lifecycle options for individual Managed Servers, including + Java options, environment variables, additional Pod content, and + the ability to explicitly start, stop, or restart a named server + instance. The `serverName` field of each entry must match a Managed + Server that already exists in the WebLogic domain configuration + or that matches a dynamic cluster member based on the server template. items: - description: An element representing a cluster in the domain configuration. type: object properties: serverStartState: - description: The state in which the server is to be started. - Use ADMIN if server should start in the admin state. Defaults - to RUNNING. + description: The WebLogic runtime state in which the server + is to be started. Use ADMIN if the server should start in + the admin state. Defaults to RUNNING. type: string enum: - RUNNING - ADMIN serverService: - description: Customization affecting ClusterIP Kubernetes services - for WebLogic Server instances. + description: Customization affecting the generation of Kubernetes + Services for WebLogic Server instances. type: object properties: precreateService: - description: If true, operator will create server services - even for server instances without running pods. + description: If true, the operator will create Services + even for Managed Server instances without running Pods. type: boolean annotations: - description: The annotations to be attached to generated - resources. + description: The annotations to be added to generated resources. additionalProperties: type: string type: object labels: - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. + description: The labels to be added to generated resources. + The label names must not start with "weblogic.". additionalProperties: type: string type: object - maxUnavailable: - description: The maximum number of cluster members that can - be temporarily unavailable. Defaults to 1. - type: number - minimum: 1.0 - replicas: - description: The number of cluster members to run. - type: number - minimum: 0.0 - clusterName: - description: The name of this cluster. Required + serverName: + description: The name of the Managed Server. This name must + match the name of a Managed Server instance or of a dynamic + cluster member name from a server template already defined + in the WebLogic domain configuration. Required. type: string serverPod: - description: Configuration affecting server pods. + description: Customization affecting the generation of Pods + for WebLogic Server instances. type: object properties: nodeName: - description: NodeName is a request to schedule this pod - onto a specific node. If it is non-empty, the scheduler + description: NodeName is a request to schedule this Pod + onto a specific Node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that - it fits resource requirements. + it fits the resource requirements. See `kubectl explain + pods.spec.nodeName`. type: string livenessProbe: description: Settings for the liveness probe associated - with a server. + with a WebLogic Server instance. type: object properties: periodSeconds: @@ -15823,465 +7677,187 @@ spec: type: number readinessGates: description: 'If specified, all readiness gates will be - evaluated for pod readiness. A pod is ready when all its + evaluated for Pod readiness. A Pod is ready when all its containers are ready AND all conditions specified in the - readiness gates have status equal to "True" More info: - https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + readiness gates have a status equal to "True". More info: + https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md.' type: array items: - description: PodReadinessGate contains the reference to - a pod condition type: object properties: conditionType: - description: ConditionType refers to a condition in - the pod's condition list with matching type. type: string required: - conditionType serviceAccountName: description: Name of the ServiceAccount to be used to run - this pod. If it is not set, default ServiceAccount will + this Pod. If it is not set, default ServiceAccount will be used. The ServiceAccount has to exist at the time the - pod is created. + Pod is created. See `kubectl explain pods.spec.serviceAccountName`. type: string podSecurityContext: - description: Pod-level security attributes. + description: Pod-level security attributes. See `kubectl + explain pods.spec.securityContext`. type: object properties: runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence - for that container. type: number seLinuxOptions: - description: SELinuxOptions are the labels to be applied - to the container type: object properties: role: - description: Role is a SELinux role label that applies - to the container. type: string level: - description: Level is SELinux level label that applies - to the container. type: string type: - description: Type is a SELinux type label that applies - to the container. type: string user: - description: User is a SELinux user label that applies - to the container. type: string fsGroup: - description: 'A special supplemental group that applies - to all containers in a pod. Some volume types allow - the Kubelet to change the ownership of that volume - to be owned by the pod: 1. The owning GID will be - the FSGroup 2. The setgid bit is set (new files created - in the volume will be owned by FSGroup) 3. The permission - bits are OR''d with rw-rw---- If unset, the Kubelet - will not modify the ownership and permissions of any - volume.' type: number windowsOptions: - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. type: string runAsUserName: - description: The UserName in Windows to run the - entrypoint of the container process. Defaults - to the user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - This field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. type: string supplementalGroups: - description: A list of groups applied to the first process - run in each container, in addition to the container's - primary GID. If unspecified, no groups will be added - to any container. type: array items: type: number runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in SecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence for that container. type: number runAsNonRoot: - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if - it does. If unset or false, no such validation will - be performed. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: boolean sysctls: - description: Sysctls hold a list of namespaced sysctls - used for the pod. Pods with unsupported sysctls (by - the container runtime) might fail to launch. type: array items: - description: Sysctl defines a kernel parameter to - be set type: object properties: name: - description: Name of a property to set type: string value: - description: Value of a property to set type: string required: - name - value priorityClassName: - description: If specified, indicates the pod's priority. + description: If specified, indicates the Pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will - be default or zero if there is no default. + be the default or zero, if there is no default. See `kubectl + explain pods.spec.priorityClassName`. type: string volumes: description: Additional volumes to be created in the server - pod. + Pod. See `kubectl explain pods.spec.volumes`. type: array items: - description: Volume represents a named volume in a pod - that may be accessed by any container in the pod. type: object properties: quobyte: - description: Represents a Quobyte mount that lasts - the lifetime of a pod. Quobyte volumes do not support - ownership management or SELinux relabeling. type: object properties: volume: - description: Volume is a string that references - an already created Quobyte volume by name. type: string registry: - description: Registry represents a single or multiple - Quobyte Registry services specified as a string - as host:port pair (multiple entries are separated - with commas) which acts as the central registry - for volumes type: string readOnly: - description: ReadOnly here will force the Quobyte - volume to be mounted with read-only permissions. - Defaults to false. type: boolean user: - description: User to map volume access to Defaults - to serivceaccount user type: string tenant: - description: Tenant owning the given Quobyte volume - in the Backend Used with dynamically provisioned - Quobyte volumes, value is set by the plugin type: string group: - description: Group to map volume access to Default - is no group type: string required: - registry - volume azureFile: - description: AzureFile represents an Azure File Service - mount on the host and bind mount to the pod. type: object properties: secretName: - description: the name of secret that contains - Azure Storage Account Name and Key type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean shareName: - description: Share Name type: string required: - secretName - shareName flexVolume: - description: FlexVolume represents a generic volume - resource that is provisioned/attached using an exec - based plugin. type: object properties: driver: - description: Driver is the name of the driver - to use for this volume. type: string options: - description: 'Optional: Extra command options - if any.' additionalProperties: type: string type: object - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + secretRef: type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' type: boolean fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". The default - filesystem depends on FlexVolume script. type: string required: - driver secret: - description: Adapts a Secret into a volume. The contents - of the target Secret's Data field will be presented - in a volume as files using the keys in the Data - field as the file names. Secret volumes support - ownership management and SELinux relabeling. type: object properties: secretName: - description: 'Name of the secret in the pod''s - namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' type: string defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 - and 0777. Defaults to 0644. Directories within - the path are not affected by this setting. This - might be in conflict with other options that - affect the file mode, like fsGroup, and the - result can be other mode bits set.' type: number optional: - description: Specify whether the Secret or its - keys must be defined type: boolean items: - description: If unspecified, each key-value pair - in the Data field of the referenced Secret will - be projected into the volume as a file whose - name is the key and content is the value. If - specified, the listed keys will be projected - into the specified paths, and unlisted keys - will not be present. If a key is specified which - is not present in the Secret, the volume setup - will error unless it is marked optional. Paths - must be relative and may not contain the '..' - path or start with '..'. type: array items: - description: Maps a string key to a path within - a volume. type: object properties: mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might be - in conflict with other options that affect - the file mode, like fsGroup, and the result - can be other mode bits set.' type: number path: - description: The relative path of the file - to map the key to. May not be an absolute - path. May not contain the path element - '..'. May not start with the string '..'. type: string key: - description: The key to project. type: string required: - key - path projected: - description: Represents a projected volume source type: object properties: sources: - description: list of volume projections type: array items: - description: Projection that may be projected - along with other supported volume types type: object properties: downwardAPI: - description: Represents downward API info - for projecting into a projected volume. - Note that this is identical to a downwardAPI - volume source without the default mode. type: object properties: items: - description: Items is a list of DownwardAPIVolume - file type: array items: - description: DownwardAPIVolumeFile - represents information to create - the file containing the pod field type: object properties: mode: - description: 'Optional: mode bits - to use on this file, must be - a value between 0 and 0777. - If not specified, the volume - defaultMode will be used. This - might be in conflict with other - options that affect the file - mode, like fsGroup, and the - result can be other mode bits - set.' type: number path: - description: 'Required: Path is the - relative path name of the file - to be created. Must not be absolute - or contain the ''..'' path. - Must be utf-8 encoded. The first - item of the relative path must - not start with ''..''' type: string resourceFieldRef: - description: ResourceFieldSelector - represents container resources - (cpu, memory) and their output - format type: object properties: divisor: - description: 'Quantity is - a fixed-point representation - of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition - to String() and AsInt64() - accessors. The serialization - format is: ::= - (Note - that may be empty, - from the "" case in .) - ::= 0 - | 1 | ... | 9 ::= - | - ::= - | . | . - | . ::= - "+" | "-" ::= - | - ::= - | | - ::= Ki - | Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m - | "" | k | M | G | T | P - | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t - choose the capitalization.) - ::= "e" - | "E" No - matter which of the three - exponent forms is used, - no quantity may represent - a number greater than 2^63-1 - in magnitude, nor may it - have more than 3 decimal - places. Numbers larger or - more precise will be capped - or rounded up. (E.g.: 0.1m - will rounded up to 1m.) - This may be extended in - the future if we require - larger or smaller quantities. When - a Quantity is parsed from - a string, it will remember - the type of suffix it had, - and will use the same type - again when it is serialized. Before - serializing, Quantity will - be put in "canonical form". - This means that Exponent/suffix - will be adjusted up or down - (with a corresponding increase - or decrease in Mantissa) - such that: a. No precision - is lost b. No fractional - digits will be emitted c. - The exponent (or suffix) - is as large as possible. - The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER - be internally represented - by a floating point number. - That is the whole point - of this exercise. Non-canonical - values will still parse - as long as they are well - formed, but will be re-emitted - in their canonical form. - (So always use canonical - form, or don''t diff.) This - format is intended to make - it difficult to use these - numbers without writing - some sort of special handling - code in the hopes that that - will cause implementors - to also use a fixed point - implementation.' type: object properties: number: @@ -16293,375 +7869,135 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource - to select' type: string containerName: - description: 'Container name: - required for volumes, optional - for env vars' type: string required: - resource fieldRef: - description: ObjectFieldSelector - selects an APIVersioned field - of an object. type: object properties: apiVersion: - description: Version of the - schema the FieldPath is - written in terms of, defaults - to "v1". type: string fieldPath: - description: Path of the field - to select in the specified - API version. type: string required: - fieldPath required: - path configMap: - description: Adapts a ConfigMap into a projected - volume. The contents of the target ConfigMap's - Data field will be presented in a projected - volume as files using the keys in the - Data field as the file names, unless the - items element is populated with specific - mappings of keys to paths. Note that this - is identical to a configmap volume source - without the default mode. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its keys must be defined type: boolean items: - description: If unspecified, each key-value - pair in the Data field of the referenced - ConfigMap will be projected into the - volume as a file whose name is the - key and content is the value. If specified, - the listed keys will be projected - into the specified paths, and unlisted - keys will not be present. If a key - is specified which is not present - in the ConfigMap, the volume setup - will error unless it is marked optional. - Paths must be relative and may not - contain the '..' path or start with - '..'. type: array items: - description: Maps a string key to - a path within a volume. type: object properties: mode: - description: 'Optional: mode bits - to use on this file, must be - a value between 0 and 0777. - If not specified, the volume - defaultMode will be used. This - might be in conflict with other - options that affect the file - mode, like fsGroup, and the - result can be other mode bits - set.' type: number path: - description: The relative path - of the file to map the key to. - May not be an absolute path. - May not contain the path element - '..'. May not start with the - string '..'. type: string key: - description: The key to project. type: string required: - key - path secret: - description: Adapts a secret into a projected - volume. The contents of the target Secret's - Data field will be presented in a projected - volume as files using the keys in the - Data field as the file names. Note that - this is identical to a secret volume source - without the default mode. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - or its key must be defined type: boolean items: - description: If unspecified, each key-value - pair in the Data field of the referenced - Secret will be projected into the - volume as a file whose name is the - key and content is the value. If specified, - the listed keys will be projected - into the specified paths, and unlisted - keys will not be present. If a key - is specified which is not present - in the Secret, the volume setup will - error unless it is marked optional. - Paths must be relative and may not - contain the '..' path or start with - '..'. type: array items: - description: Maps a string key to - a path within a volume. type: object properties: mode: - description: 'Optional: mode bits - to use on this file, must be - a value between 0 and 0777. - If not specified, the volume - defaultMode will be used. This - might be in conflict with other - options that affect the file - mode, like fsGroup, and the - result can be other mode bits - set.' type: number path: - description: The relative path - of the file to map the key to. - May not be an absolute path. - May not contain the path element - '..'. May not start with the - string '..'. type: string key: - description: The key to project. type: string required: - key - path serviceAccountToken: - description: ServiceAccountTokenProjection - represents a projected service account - token volume. This projection can be used - to insert a service account token into - the pods runtime filesystem for use against - APIs (Kubernetes API Server or otherwise). type: object properties: path: - description: Path is the path relative - to the mount point of the file to - project the token into. type: string audience: - description: Audience is the intended - audience of the token. A recipient - of a token must identify itself with - an identifier specified in the audience - of the token, and otherwise should - reject the token. The audience defaults - to the identifier of the apiserver. type: string expirationSeconds: - description: ExpirationSeconds is the - requested duration of validity of - the service account token. As the - token approaches expiration, the kubelet - volume plugin will proactively rotate - the service account token. The kubelet - will start trying to rotate the token - if the token is older than 80 percent - of its time to live or if the token - is older than 24 hours.Defaults to - 1 hour and must be at least 10 minutes. type: number required: - path defaultMode: - description: Mode bits to use on created files - by default. Must be a value between 0 and 0777. - Directories within the path are not affected - by this setting. This might be in conflict with - other options that affect the file mode, like - fsGroup, and the result can be other mode bits - set. type: number required: - sources cephfs: - description: Represents a Ceph Filesystem mount that - lasts the lifetime of a pod Cephfs volumes do not - support ownership management or SELinux relabeling. type: object properties: path: - description: 'Optional: Used as the mounted root, - rather than the full Ceph tree, default is /' type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string secretFile: - description: 'Optional: SecretFile is the path - to key ring for User, default is /etc/ceph/user.secret - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: boolean user: - description: 'Optional: User is the rados user - name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string monitors: - description: 'Required: Monitors is a collection - of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: array items: type: string required: - monitors scaleIO: - description: ScaleIOVolumeSource represents a persistent - ScaleIO volume type: object properties: system: - description: The name of the storage system as - configured in ScaleIO. type: string protectionDomain: - description: The name of the ScaleIO Protection - Domain for the configured storage. type: string sslEnabled: - description: Flag to enable/disable SSL communication - with Gateway, default false type: boolean storageMode: - description: Indicates whether the storage for - a volume should be ThickProvisioned or ThinProvisioned. - Default is ThinProvisioned. type: string volumeName: - description: The name of a volume already created - in the ScaleIO system that is associated with - this volume source. type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Default is - "xfs". type: string storagePool: - description: The ScaleIO Storage Pool associated - with the protection domain. type: string gateway: - description: The host address of the ScaleIO API - Gateway. type: string required: - gateway - secretRef - system emptyDir: - description: Represents an empty directory for a pod. - Empty directory volumes support ownership management - and SELinux relabeling. type: object properties: sizeLimit: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and - AsInt64() accessors. The serialization format - is: ::= (Note - that may be empty, from the "" case - in .) ::= 0 | 1 - | ... | 9 ::= | - ::= | . - | . | . ::= - "+" | "-" ::= | - ::= | - | ::= Ki | Mi - | Gi | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T - | P | E (Note that 1024 = 1Ki but 1000 = 1k; - I didn''t choose the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms is - used, no quantity may represent a number greater - than 2^63-1 in magnitude, nor may it have more - than 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be extended - in the future if we require larger or smaller - quantities. When a Quantity is parsed from - a string, it will remember the type of suffix - it had, and will use the same type again when - it is serialized. Before serializing, Quantity - will be put in "canonical form". This means - that Exponent/suffix will be adjusted up or - down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision is - lost b. No fractional digits will be emitted c. - The exponent (or suffix) is as large as possible. - The sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole - point of this exercise. Non-canonical values - will still parse as long as they are well formed, - but will be re-emitted in their canonical form. - (So always use canonical form, or don''t diff.) This - format is intended to make it difficult to use - these numbers without writing some sort of special - handling code in the hopes that that will cause - implementors to also use a fixed point implementation.' type: object properties: number: @@ -16673,276 +8009,93 @@ spec: - DECIMAL_SI - BINARY_SI medium: - description: 'What type of storage medium should - back this directory. The default is "" which - means to use the node''s default medium. Must - be an empty string (default) or Memory. More - info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' type: string glusterfs: - description: Represents a Glusterfs mount that lasts - the lifetime of a pod. Glusterfs volumes do not - support ownership management or SELinux relabeling. type: object properties: path: - description: 'Path is the Glusterfs volume path. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string endpoints: - description: 'EndpointsName is the endpoint name - that details Glusterfs topology. More info: - https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string readOnly: - description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. - Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: boolean required: - endpoints - path gcePersistentDisk: - description: Represents a Persistent Disk resource - in Google Compute Engine. A GCE PD must exist before - mounting to a container. The disk must also be in - the same GCE project and zone as the kubelet. A - GCE PD can only be mounted as read/write once or - read-only many times. GCE PDs support ownership - management and SELinux relabeling. type: object properties: partition: - description: 'The partition in the volume that - you want to mount. If omitted, the default is - to mount by volume name. Examples: For volume - /dev/sda1, you specify the partition as "1". - Similarly, the volume partition for /dev/sda - is "0" (or you can leave the property empty). - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: number readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: boolean pdName: - description: 'Unique name of the PD resource in - GCE. Used to identify the disk in GCE. More - info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string required: - pdName photonPersistentDisk: - description: Represents a Photon Controller persistent - disk resource. type: object properties: pdID: - description: ID that identifies Photon Controller - persistent disk type: string fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string required: - pdID azureDisk: - description: AzureDisk represents an Azure Data Disk - mount on the host and bind mount to the pod. type: object properties: diskName: - description: The Name of the data disk in the - blob storage type: string kind: - description: 'Expected values Shared: multiple - blob disks per storage account Dedicated: single - blob disk per storage account Managed: azure - managed data disk (only in managed availability - set). defaults to shared' type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean cachingMode: - description: 'Host Caching mode: None, Read Only, - Read Write.' type: string diskURI: - description: The URI the data disk in the blob - storage type: string fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string required: - diskName - diskURI cinder: - description: Represents a cinder volume resource in - Openstack. A Cinder volume must exist before mounting - to a container. The volume must also be in the same - region as the kubelet. Cinder volumes support ownership - management and SELinux relabeling. type: object properties: secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string volumeID: - description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: boolean fsType: - description: 'Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://examples.k8s.io/mysql-cinder-pd/README.md' type: string required: - volumeID - downwardAPI: - description: DownwardAPIVolumeSource represents a - volume containing downward API info. Downward API - volumes support ownership management and SELinux - relabeling. - type: object - properties: - defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 - and 0777. Defaults to 0644. Directories within - the path are not affected by this setting. This - might be in conflict with other options that - affect the file mode, like fsGroup, and the - result can be other mode bits set.' + downwardAPI: + type: object + properties: + defaultMode: type: number items: - description: Items is a list of downward API volume - file type: array items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field type: object properties: mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might be - in conflict with other options that affect - the file mode, like fsGroup, and the result - can be other mode bits set.' type: number path: - description: 'Required: Path is the relative - path name of the file to be created. Must - not be absolute or contain the ''..'' - path. Must be utf-8 encoded. The first - item of the relative path must not start - with ''..''' type: string resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and - their output format type: object properties: divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= - (Note that - may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= - "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi - | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | - M | G | T | P | E (Note that 1024 - = 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent - forms is used, no quantity may represent - a number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This - may be extended in the future if we - require larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type - again when it is serialized. Before - serializing, Quantity will be put - in "canonical form". This means that - Exponent/suffix will be adjusted up - or down (with a corresponding increase - or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. - The sign will be omitted unless the - number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as - they are well formed, but will be - re-emitted in their canonical form. - (So always use canonical form, or - don''t diff.) This format is intended - to make it difficult to use these - numbers without writing some sort - of special handling code in the hopes - that that will cause implementors - to also use a fixed point implementation.' type: object properties: number: @@ -16954,206 +8107,97 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to - select' type: string containerName: - description: 'Container name: required - for volumes, optional for env vars' type: string required: - resource fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". type: string fieldPath: - description: Path of the field to select - in the specified API version. type: string required: - fieldPath required: - path awsElasticBlockStore: - description: Represents a Persistent Disk resource - in AWS. An AWS EBS disk must exist before mounting - to a container. The disk must also be in the same - AWS zone as the kubelet. An AWS EBS disk can only - be mounted as read/write once. AWS EBS volumes support - ownership management and SELinux relabeling. type: object properties: partition: - description: 'The partition in the volume that - you want to mount. If omitted, the default is - to mount by volume name. Examples: For volume - /dev/sda1, you specify the partition as "1". - Similarly, the volume partition for /dev/sda - is "0" (or you can leave the property empty).' type: number volumeID: - description: 'Unique ID of the persistent disk - resource in AWS (Amazon EBS volume). More info: - https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string readOnly: - description: 'Specify "true" to force and set - the ReadOnly property in VolumeMounts to "true". - If omitted, the default is "false". More info: - https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: boolean fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string required: - volumeID flocker: - description: Represents a Flocker volume mounted by - the Flocker agent. One and only one of datasetName - and datasetUUID should be set. Flocker volumes do - not support ownership management or SELinux relabeling. type: object properties: datasetName: - description: Name of the dataset stored as metadata - -> name on the dataset for Flocker should be - considered as deprecated type: string datasetUUID: - description: UUID of the dataset. This is unique - identifier of a Flocker dataset type: string iscsi: - description: Represents an ISCSI disk. ISCSI volumes - can only be mounted as read/write once. ISCSI volumes - support ownership management and SELinux relabeling. type: object properties: chapAuthSession: - description: whether support iSCSI Session CHAP - authentication type: boolean iscsiInterface: - description: iSCSI Interface Name that uses an - iSCSI transport. Defaults to 'default' (tcp). type: string lun: - description: iSCSI Target Lun number. type: number chapAuthDiscovery: - description: whether support iSCSI Discovery CHAP - authentication type: boolean iqn: - description: Target iSCSI Qualified Name. type: string portals: - description: iSCSI Target Portal List. The portal - is either an IP or ip_addr:port if the port - is other than default (typically TCP ports 860 - and 3260). type: array items: type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string initiatorName: - description: Custom iSCSI Initiator Name. If initiatorName - is specified with iscsiInterface simultaneously, - new iSCSI interface : will be created for the connection. type: string readOnly: - description: ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. type: boolean fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#iscsi' type: string targetPortal: - description: iSCSI Target Portal. The Portal is - either an IP or ip_addr:port if the port is - other than default (typically TCP ports 860 - and 3260). type: string required: - iqn - lun - targetPortal rbd: - description: Represents a Rados Block Device mount - that lasts the lifetime of a pod. RBD volumes support - ownership management and SELinux relabeling. type: object properties: image: - description: 'The rados image name. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string pool: - description: 'The rados pool name. Default is - rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: boolean fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#rbd' type: string keyring: - description: 'Keyring is the path to key ring - for RBDUser. Default is /etc/ceph/keyring. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string user: - description: 'The rados user name. Default is - admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string monitors: - description: 'A collection of Ceph monitors. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: array items: type: string @@ -17161,460 +8205,200 @@ spec: - image - monitors configMap: - description: Adapts a ConfigMap into a volume. The - contents of the target ConfigMap's Data field will - be presented in a volume as files using the keys - in the Data field as the file names, unless the - items element is populated with specific mappings - of keys to paths. ConfigMap volumes support ownership - management and SELinux relabeling. type: object properties: defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 - and 0777. Defaults to 0644. Directories within - the path are not affected by this setting. This - might be in conflict with other options that - affect the file mode, like fsGroup, and the - result can be other mode bits set.' type: number name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap or - its keys must be defined type: boolean items: - description: If unspecified, each key-value pair - in the Data field of the referenced ConfigMap - will be projected into the volume as a file - whose name is the key and content is the value. - If specified, the listed keys will be projected - into the specified paths, and unlisted keys - will not be present. If a key is specified which - is not present in the ConfigMap, the volume - setup will error unless it is marked optional. - Paths must be relative and may not contain the - '..' path or start with '..'. type: array items: - description: Maps a string key to a path within - a volume. type: object properties: mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might be - in conflict with other options that affect - the file mode, like fsGroup, and the result - can be other mode bits set.' type: number path: - description: The relative path of the file - to map the key to. May not be an absolute - path. May not contain the path element - '..'. May not start with the string '..'. type: string key: - description: The key to project. type: string required: - key - path storageos: - description: Represents a StorageOS persistent volume - resource. type: object properties: volumeNamespace: - description: VolumeNamespace specifies the scope - of the volume within StorageOS. If no namespace - is specified then the Pod's namespace will be - used. This allows the Kubernetes name scoping - to be mirrored within StorageOS for tighter - integration. Set VolumeName to any name to override - the default behaviour. Set to "default" if you - are not using namespaces within StorageOS. Namespaces - that do not pre-exist within StorageOS will - be created. - type: string - volumeName: - description: VolumeName is the human-readable - name of the StorageOS volume. Volume names - are only unique within a namespace. + type: string + volumeName: type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string csi: - description: Represents a source location of a volume - to mount, managed by an external CSI driver type: object properties: driver: - description: Driver is the name of the CSI driver - that handles this volume. Consult with your - admin for the correct name as registered in - the cluster. type: string nodePublishSecretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: Specifies a read-only configuration - for the volume. Defaults to false (read/write). type: boolean fsType: - description: Filesystem type to mount. Ex. "ext4", - "xfs", "ntfs". If not provided, the empty value - is passed to the associated CSI driver which - will determine the default filesystem to apply. type: string volumeAttributes: - description: VolumeAttributes stores driver-specific - properties that are passed to the CSI driver. - Consult your driver's documentation for supported - values. additionalProperties: type: string type: object required: - driver name: - description: 'Volume''s name. Must be a DNS_LABEL - and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string nfs: - description: Represents an NFS mount that lasts the - lifetime of a pod. NFS volumes do not support ownership - management or SELinux relabeling. type: object properties: path: - description: 'Path that is exported by the NFS - server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string server: - description: 'Server is the hostname or IP address - of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string readOnly: - description: 'ReadOnly here will force the NFS - export to be mounted with read-only permissions. - Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: boolean required: - path - server persistentVolumeClaim: - description: PersistentVolumeClaimVolumeSource references - the user's PVC in the same namespace. This volume - finds the bound PV and mounts that volume for the - pod. A PersistentVolumeClaimVolumeSource is, essentially, - a wrapper around another type of volume that is - owned by someone else (the system). type: object properties: claimName: - description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this - volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' type: string readOnly: - description: Will force the ReadOnly setting in - VolumeMounts. Default false. type: boolean required: - claimName gitRepo: - description: 'Represents a volume that is populated - with the contents of a git repository. Git repo - volumes do not support ownership management. Git - repo volumes support SELinux relabeling. DEPRECATED: - GitRepo is deprecated. To provision a container - with a git repo, mount an EmptyDir into an InitContainer - that clones the repo using git, then mount the EmptyDir - into the Pod''s container.' type: object properties: repository: - description: Repository URL type: string directory: - description: Target directory name. Must not contain - or start with '..'. If '.' is supplied, the - volume directory will be the git repository. Otherwise, - if specified, the volume will contain the git - repository in the subdirectory with the given - name. type: string revision: - description: Commit hash for the specified revision. type: string required: - repository portworxVolume: - description: PortworxVolumeSource represents a Portworx - volume resource. type: object properties: volumeID: - description: VolumeID uniquely identifies a Portworx - volume type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: FSType represents the filesystem - type to mount Must be a filesystem type supported - by the host operating system. Ex. "ext4", "xfs". - Implicitly inferred to be "ext4" if unspecified. type: string required: - volumeID vsphereVolume: - description: Represents a vSphere volume resource. type: object properties: storagePolicyName: - description: Storage Policy Based Management (SPBM) - profile name. type: string storagePolicyID: - description: Storage Policy Based Management (SPBM) - profile ID associated with the StoragePolicyName. type: string volumePath: - description: Path that identifies vSphere volume - vmdk type: string fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string required: - volumePath fc: - description: Represents a Fibre Channel volume. Fibre - Channel volumes can only be mounted as read/write - once. Fibre Channel volumes support ownership management - and SELinux relabeling. type: object properties: lun: - description: 'Optional: FC target lun number' type: number targetWWNs: - description: 'Optional: FC target worldwide names - (WWNs)' type: array items: type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' type: boolean wwids: - description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' type: array items: type: string fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string hostPath: - description: Represents a host path mapped into a - pod. Host path volumes do not support ownership - management or SELinux relabeling. type: object properties: path: - description: 'Path of the directory on the host. - If the path is a symlink, it will follow the - link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string type: - description: 'Type for HostPath Volume Defaults - to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string required: - path - required: - - name - resources: - description: Memory and CPU minimum requirements and limits - for the server. - type: object - properties: - requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is omitted - for a container, it defaults to Limits if that is - explicitly specified, otherwise to an implementation-defined - value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - limits: - description: 'Limits describes the maximum amount of - compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - annotations: - description: The annotations to be attached to generated - resources. - additionalProperties: - type: string - type: object - env: - description: A list of environment variables to add to a - server. - type: array - items: - description: EnvVar represents an environment variable - present in a Container. - type: object - properties: - name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are - expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Defaults to "".' - type: string - valueFrom: - description: EnvVarSource represents a source for - the value of an EnvVar. - type: object - properties: - secretKeyRef: - description: SecretKeySelector selects a key of - a Secret. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - required: - - key - resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format - type: object - properties: - divisor: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" | - "-" ::= | - ::= | - | ::= Ki | - Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G - | T | P | E (Note that 1024 = 1Ki but - 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No matter which of - the three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be - extended in the future if we require larger - or smaller quantities. When a Quantity - is parsed from a string, it will remember - the type of suffix it had, and will use - the same type again when it is serialized. Before - serializing, Quantity will be put in "canonical - form". This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. The - sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as - "1536Mi" Note that the quantity will NEVER - be internally represented by a floating - point number. That is the whole point of - this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or - don''t diff.) This format is intended to - make it difficult to use these numbers without - writing some sort of special handling code - in the hopes that that will cause implementors - to also use a fixed point implementation.' + required: + - name + resources: + description: Memory and CPU minimum requirements and limits + for the WebLogic Server instance. See `kubectl explain + pods.spec.containers.resources`. + type: object + properties: + requests: + additionalProperties: + type: string + type: object + limits: + additionalProperties: + type: string + type: object + annotations: + description: The annotations to be added to generated resources. + additionalProperties: + type: string + type: object + env: + description: 'A list of environment variables to set in + the container running a WebLogic Server instance. More + info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-resource/#jvm-memory-and-java-option-environment-variables. + See `kubectl explain pods.spec.containers.env`.' + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + valueFrom: + type: object + properties: + secretKeyRef: + type: object + properties: + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + resourceFieldRef: + type: object + properties: + divisor: type: object properties: number: @@ -17626,43 +8410,28 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to select' type: string containerName: - description: 'Container name: required for - volumes, optional for env vars' type: string required: - resource configMapKeyRef: - description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its key must be defined type: boolean key: - description: The key to select. type: string required: - key fieldRef: - description: ObjectFieldSelector selects an APIVersioned - field of an object. type: object properties: apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". type: string fieldPath: - description: Path of the field to select in - the specified API version. type: string required: - fieldPath @@ -17670,118 +8439,77 @@ spec: - name restartPolicy: description: 'Restart policy for all containers within the - pod. One of Always, OnFailure, Never. Default to Always. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + Pod. One of Always, OnFailure, Never. Default to Always. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy. + See `kubectl explain pods.spec.restartPolicy`.' type: string nodeSelector: - description: Selector which must match a node's labels for - the pod to be scheduled on that node. + description: Selector which must match a Node's labels for + the Pod to be scheduled on that Node. See `kubectl explain + pods.spec.nodeSelector`. additionalProperties: type: string type: object volumeMounts: - description: Additional volume mounts for the server pod. + description: Additional volume mounts for the container + running a WebLogic Server instance. See `kubectl explain + pods.spec.containers.volumeMounts`. type: array items: - description: VolumeMount describes a mounting of a Volume - within a container. type: object properties: mountPath: - description: Path within the container at which the - volume should be mounted. Must not contain ':'. type: string mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and the - other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. type: string name: - description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to false. type: boolean subPath: - description: Path within the volume from which the - container's volume should be mounted. Defaults to - "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment variable - references $(VAR_NAME) are expanded using the container's - environment. Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field is - beta in 1.15. type: string required: - mountPath - name labels: - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. + description: The labels to be added to generated resources. + The label names must not start with "weblogic.". additionalProperties: type: string type: object runtimeClassName: description: 'RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used - to run this pod. If no RuntimeClass resource matches - the named class, the pod will not be run. If unset or - empty, the "legacy" RuntimeClass will be used, which is - an implicit class with an empty definition that uses the - default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md - This is an alpha feature and may change in the future.' + to run this Pod. If no RuntimeClass resource matches the + named class, the Pod will not be run. If unset or empty, + the "legacy" RuntimeClass will be used, which is an implicit + class with an empty definition that uses the default runtime + handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future. + See `kubectl explain pods.spec.runtimeClassName`.' type: string tolerations: - description: If specified, the pod's tolerations. + description: If specified, the Pod's tolerations. See `kubectl + explain pods.spec.tolerations`. type: array items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple - using the matching operator . type: object properties: effect: - description: Effect indicates the taint effect to - match. Empty means match all taint effects. When - specified, allowed values are NoSchedule, PreferNoSchedule - and NoExecute. type: string tolerationSeconds: - description: TolerationSeconds represents the period - of time the toleration (which must be of effect - NoExecute, otherwise this field is ignored) tolerates - the taint. By default, it is not set, which means - tolerate the taint forever (do not evict). Zero - and negative values will be treated as 0 (evict - immediately) by the system. type: number value: - description: Value is the taint value the toleration - matches to. If the operator is Exists, the value - should be empty, otherwise just a regular string. type: string key: - description: Key is the taint key that the toleration - applies to. Empty means match all taint keys. If - the key is empty, operator must be Exists; this - combination means to match all values and all keys. type: string operator: - description: Operator represents a key's relationship - to the value. Valid operators are Exists and Equal. - Defaults to Equal. Exists is equivalent to wildcard - for value, so that a pod can tolerate all taints - of a particular category. type: string readinessProbe: description: Settings for the readiness probe associated - with a server. + with a WebLogic Server instance. type: object properties: periodSeconds: @@ -17797,74 +8525,38 @@ spec: type: number containers: description: Additional containers to be included in the - server pod. + server Pod. See `kubectl explain pods.spec.containers`. type: array items: - description: A single application container that you want - to run within a pod. type: object properties: volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of - a raw block device within a container. type: object properties: devicePath: - description: devicePath is the path inside of - the container that the device will be mapped - to. type: string name: - description: name must match the name of a persistentVolumeClaim - in the pod type: string required: - devicePath - name image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' type: string imagePullPolicy: - description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. Cannot - be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -17876,65 +8568,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -17946,24 +8603,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -17971,220 +8619,83 @@ spec: required: - port stdin: - description: Whether this container should allocate - a buffer for stdin in the container runtime. If - this is not set, reads from stdin in the container - will always result in EOF. Default is false. type: boolean terminationMessagePolicy: - description: Indicate how the termination message - should be populated. File will use the contents - of terminationMessagePath to populate the container - status message on both success and failure. FallbackToLogsOnError - will use the last chunk of container log output - if the termination message file is empty and the - container exited with an error. The log output is - limited to 2048 bytes or 80 lines, whichever is - smaller. Defaults to File. Cannot be updated. type: string terminationMessagePath: - description: 'Optional: Path at which the file to - which the container''s termination message will - be written is mounted into the container''s filesystem. - Message written is intended to be brief final status, - such as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' type: string workingDir: - description: Container's working directory. If not - specified, the container runtime's default will - be used, which might be configured in the container - image. Cannot be updated. type: string resources: - description: ResourceRequirements describes the compute - resource requirements. type: object properties: requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields - are present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take - precedence. type: object properties: privileged: - description: Run container in privileged mode. - Processes in privileged containers are essentially - equivalent to root on the host. Defaults to - false. - type: boolean - runAsUser: - description: The UID to run the entrypoint of - the container process. Defaults to user specified - in image metadata if unspecified. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. + type: boolean + runAsUser: type: number capabilities: - description: Adds and removes POSIX capabilities - from running containers. type: object properties: add: - description: Added capabilities type: array items: type: string drop: - description: Removed capabilities type: array items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to - be applied to the container type: object properties: role: - description: Role is a SELinux role label - that applies to the container. type: string level: - description: Level is SELinux level label - that applies to the container. type: string type: - description: Type is a SELinux type label - that applies to the container. type: string user: - description: User is a SELinux user label - that applies to the container. type: string windowsOptions: - description: WindowsSecurityContextOptions contain - Windows-specific options and credentials. type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the - GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName - field. This field is alpha-level and is - only honored by servers that enable the - WindowsGMSA feature flag. type: string runAsUserName: - description: The UserName in Windows to run - the entrypoint of the container process. - Defaults to the user specified in image - metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. This - field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the - name of the GMSA credential spec to use. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. type: string procMount: - description: procMount denotes the type of proc - mount to use for the containers. The default - is DefaultProcMount which uses the container - runtime defaults for readonly paths and masked - paths. This requires the ProcMountType feature - flag to be enabled. type: string allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the - container process. AllowPrivilegeEscalation - is true always when the container is: 1) run - as Privileged 2) has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of - the container process. Uses runtime default - if unset. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. type: number runAsNonRoot: - description: Indicates that the container must - run as a non-root user. If true, the Kubelet - will validate the image at runtime to ensure - that it does not run as UID 0 (root) and fail - to start the container if it does. If unset - or false, no such validation will be performed. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. type: boolean startupProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -18196,65 +8707,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -18266,24 +8742,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -18291,124 +8758,32 @@ spec: required: - port env: - description: List of environment variables to set - in the container. Cannot be updated. type: array items: - description: EnvVar represents an environment variable - present in a Container. type: object properties: name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service - environment variables. If a variable cannot - be resolved, the reference in the input string - will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, - regardless of whether the variable exists - or not. Defaults to "".' type: string valueFrom: - description: EnvVarSource represents a source - for the value of an EnvVar. type: object properties: secretKeyRef: - description: SecretKeySelector selects a - key of a Secret. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - or its key must be defined type: boolean key: - description: The key of the secret to - select from. Must be a valid secret - key. type: string required: - key resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and - their output format type: object properties: divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= - (Note that - may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= - "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi - | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | - M | G | T | P | E (Note that 1024 - = 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent - forms is used, no quantity may represent - a number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This - may be extended in the future if we - require larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type - again when it is serialized. Before - serializing, Quantity will be put - in "canonical form". This means that - Exponent/suffix will be adjusted up - or down (with a corresponding increase - or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. - The sign will be omitted unless the - number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as - they are well formed, but will be - re-emitted in their canonical form. - (So always use canonical form, or - don''t diff.) This format is intended - to make it difficult to use these - numbers without writing some sort - of special handling code in the hopes - that that will cause implementors - to also use a fixed point implementation.' type: object properties: number: @@ -18420,194 +8795,88 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to - select' type: string containerName: - description: 'Container name: required - for volumes, optional for env vars' type: string required: - resource configMapKeyRef: - description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its key must be defined type: boolean key: - description: The key to select. type: string required: - key fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". type: string fieldPath: - description: Path of the field to select - in the specified API version. type: string required: - fieldPath required: - name ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional - information about the network connections a container - uses, but is primarily informational. Not specifying - a port here DOES NOT prevent that port from being - exposed. Any port which is listening on the default - "0.0.0.0" address inside a container will be accessible - from the network. Cannot be updated. type: array items: - description: ContainerPort represents a network - port in a single container. type: object properties: protocol: - description: Protocol for port. Must be UDP, - TCP, or SCTP. Defaults to "TCP". type: string - hostIP: - description: What host IP to bind the external - port to. + hostIP: type: string name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port - in a pod must have a unique name. Name for - the port that can be referred to by services. type: string containerPort: - description: Number of port to expose on the - pod's IP address. This must be a valid port - number, 0 < x < 65536. type: number hostPort: - description: Number of port to expose on the - host. If specified, this must be a valid port - number, 0 < x < 65536. If HostNetwork is specified, - this must match ContainerPort. Most containers - do not need this. type: number required: - containerPort command: - description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used - if this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. - If a variable cannot be resolved, the reference - in the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be - updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string volumeMounts: - description: Pod volumes to mount into the container's - filesystem. Cannot be updated. type: array items: - description: VolumeMount describes a mounting of - a Volume within a container. type: object properties: mountPath: - description: Path within the container at which - the volume should be mounted. Must not contain - ':'. type: string mountPropagation: - description: mountPropagation determines how - mounts are propagated from the host to container - and the other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. type: string name: - description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults - to false. type: boolean subPath: - description: Path within the volume from which - the container's volume should be mounted. - Defaults to "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume - from which the container's volume should be - mounted. Behaves similarly to SubPath but - environment variable references $(VAR_NAME) - are expanded using the container's environment. - Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field - is beta in 1.15. type: string required: - mountPath - name args: - description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string lifecycle: - description: Lifecycle describes actions that the - management system should take in response to container - lifecycle events. For the PostStart and PreStop - lifecycle handlers, management of the container - blocks until the action is complete, unless the - container process fails, in which case the handler - is aborted. type: object properties: postStart: - description: Handler defines a specific action - that should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. type: object properties: intValue: @@ -18619,52 +8888,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in - container" action. type: object properties: command: - description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP - server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. type: object properties: intValue: @@ -18676,24 +8917,15 @@ spec: required: - isInt host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a - custom header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -18701,23 +8933,12 @@ spec: required: - port preStop: - description: Handler defines a specific action - that should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. type: object properties: intValue: @@ -18729,52 +8950,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in - container" action. type: object properties: command: - description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP - server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. type: object properties: intValue: @@ -18786,24 +8979,15 @@ spec: required: - isInt host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a - custom header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -18811,43 +8995,20 @@ spec: required: - port name: - description: Name of the container specified as a - DNS_LABEL. Each container in a pod must have a unique - name (DNS_LABEL). Cannot be updated. type: string tty: - description: Whether this container should allocate - a TTY for itself, also requires 'stdin' to be true. - Default is false. type: boolean readinessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -18859,65 +9020,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -18929,24 +9055,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -18954,266 +9071,121 @@ spec: required: - port stdinOnce: - description: Whether the container runtime should - close the stdin channel after it has been opened - by a single attach. When stdin is true the stdin - stream will remain open across multiple attach sessions. - If stdinOnce is set to true, stdin is opened on - container start, is empty until the first client - attaches to stdin, and then remains open and accepts - data until the client disconnects, at which time - stdin is closed and remains closed until the container - is restarted. If this flag is false, a container - processes that reads from stdin will never receive - an EOF. Default is false type: boolean envFrom: - description: List of sources to populate environment - variables in the container. The keys defined within - a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container - is starting. When a key exists in multiple sources, - the value associated with the last source will take - precedence. Values defined by an Env with a duplicate - key will take precedence. Cannot be updated. type: array items: - description: EnvFromSource represents the source - of a set of ConfigMaps type: object properties: - configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field - will represent the key-value pairs as environment - variables. + configMapRef: type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - must be defined type: boolean prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. type: string secretRef: - description: SecretEnvSource selects a Secret - to populate the environment variables with. The - contents of the target Secret's Data field - will represent the key-value pairs as environment - variables. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - must be defined type: boolean required: - name containerSecurityContext: description: Container-level security attributes. Will override - any matching pod-level attributes. + any matching Pod-level attributes. See `kubectl explain + pods.spec.containers.securityContext`. type: object properties: privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. type: boolean runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: number capabilities: - description: Adds and removes POSIX capabilities from - running containers. type: object properties: add: - description: Added capabilities type: array items: type: string drop: - description: Removed capabilities type: array items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to be applied - to the container type: object properties: role: - description: Role is a SELinux role label that applies - to the container. type: string level: - description: Level is SELinux level label that applies - to the container. type: string type: - description: Type is a SELinux type label that applies - to the container. type: string user: - description: User is a SELinux user label that applies - to the container. type: string windowsOptions: - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. type: string runAsUserName: - description: The UserName in Windows to run the - entrypoint of the container process. Defaults - to the user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - This field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. type: string procMount: - description: procMount denotes the type of proc mount - to use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. type: string allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent - process. This bool directly controls if the no_new_privs - flag will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. type: number runAsNonRoot: - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if - it does. If unset or false, no such validation will - be performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. type: boolean schedulerName: - description: If specified, the pod will be dispatched by - specified scheduler. If not specified, the pod will be - dispatched by default scheduler. + description: If specified, the Pod will be dispatched by + the specified scheduler. If not specified, the Pod will + be dispatched by the default scheduler. See `kubectl explain + pods.spec.schedulerName`. type: string initContainers: description: Initialization containers to be included in - the server pod. + the server Pod. See `kubectl explain pods.spec.initContainers`. type: array items: - description: A single application container that you want - to run within a pod. type: object properties: volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of - a raw block device within a container. type: object properties: devicePath: - description: devicePath is the path inside of - the container that the device will be mapped - to. type: string name: - description: name must match the name of a persistentVolumeClaim - in the pod type: string required: - devicePath - name image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' type: string imagePullPolicy: - description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. Cannot - be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -19225,65 +9197,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -19295,24 +9232,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -19320,220 +9248,83 @@ spec: required: - port stdin: - description: Whether this container should allocate - a buffer for stdin in the container runtime. If - this is not set, reads from stdin in the container - will always result in EOF. Default is false. type: boolean terminationMessagePolicy: - description: Indicate how the termination message - should be populated. File will use the contents - of terminationMessagePath to populate the container - status message on both success and failure. FallbackToLogsOnError - will use the last chunk of container log output - if the termination message file is empty and the - container exited with an error. The log output is - limited to 2048 bytes or 80 lines, whichever is - smaller. Defaults to File. Cannot be updated. type: string terminationMessagePath: - description: 'Optional: Path at which the file to - which the container''s termination message will - be written is mounted into the container''s filesystem. - Message written is intended to be brief final status, - such as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' type: string workingDir: - description: Container's working directory. If not - specified, the container runtime's default will - be used, which might be configured in the container - image. Cannot be updated. type: string resources: - description: ResourceRequirements describes the compute - resource requirements. type: object properties: requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields - are present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take - precedence. type: object properties: privileged: - description: Run container in privileged mode. - Processes in privileged containers are essentially - equivalent to root on the host. Defaults to - false. type: boolean runAsUser: - description: The UID to run the entrypoint of - the container process. Defaults to user specified - in image metadata if unspecified. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. type: number capabilities: - description: Adds and removes POSIX capabilities - from running containers. type: object properties: add: - description: Added capabilities type: array items: type: string drop: - description: Removed capabilities type: array items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to - be applied to the container type: object properties: role: - description: Role is a SELinux role label - that applies to the container. type: string level: - description: Level is SELinux level label - that applies to the container. type: string type: - description: Type is a SELinux type label - that applies to the container. type: string user: - description: User is a SELinux user label - that applies to the container. type: string windowsOptions: - description: WindowsSecurityContextOptions contain - Windows-specific options and credentials. type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the - GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName - field. This field is alpha-level and is - only honored by servers that enable the - WindowsGMSA feature flag. - type: string - runAsUserName: - description: The UserName in Windows to run - the entrypoint of the container process. - Defaults to the user specified in image - metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. This - field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. + type: string + runAsUserName: type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the - name of the GMSA credential spec to use. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. type: string procMount: - description: procMount denotes the type of proc - mount to use for the containers. The default - is DefaultProcMount which uses the container - runtime defaults for readonly paths and masked - paths. This requires the ProcMountType feature - flag to be enabled. type: string allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the - container process. AllowPrivilegeEscalation - is true always when the container is: 1) run - as Privileged 2) has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of - the container process. Uses runtime default - if unset. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. type: number runAsNonRoot: - description: Indicates that the container must - run as a non-root user. If true, the Kubelet - will validate the image at runtime to ensure - that it does not run as UID 0 (root) and fail - to start the container if it does. If unset - or false, no such validation will be performed. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. type: boolean startupProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -19545,65 +9336,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -19615,24 +9371,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -19640,124 +9387,32 @@ spec: required: - port env: - description: List of environment variables to set - in the container. Cannot be updated. type: array items: - description: EnvVar represents an environment variable - present in a Container. type: object properties: name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service - environment variables. If a variable cannot - be resolved, the reference in the input string - will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, - regardless of whether the variable exists - or not. Defaults to "".' type: string valueFrom: - description: EnvVarSource represents a source - for the value of an EnvVar. type: object properties: secretKeyRef: - description: SecretKeySelector selects a - key of a Secret. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - or its key must be defined type: boolean key: - description: The key of the secret to - select from. Must be a valid secret - key. type: string required: - key resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and - their output format type: object properties: divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= - (Note that - may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= - "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi - | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | - M | G | T | P | E (Note that 1024 - = 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent - forms is used, no quantity may represent - a number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This - may be extended in the future if we - require larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type - again when it is serialized. Before - serializing, Quantity will be put - in "canonical form". This means that - Exponent/suffix will be adjusted up - or down (with a corresponding increase - or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. - The sign will be omitted unless the - number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as - they are well formed, but will be - re-emitted in their canonical form. - (So always use canonical form, or - don''t diff.) This format is intended - to make it difficult to use these - numbers without writing some sort - of special handling code in the hopes - that that will cause implementors - to also use a fixed point implementation.' type: object properties: number: @@ -19769,194 +9424,88 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to - select' type: string containerName: - description: 'Container name: required - for volumes, optional for env vars' type: string required: - resource configMapKeyRef: - description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its key must be defined type: boolean key: - description: The key to select. type: string required: - key fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". type: string fieldPath: - description: Path of the field to select - in the specified API version. type: string required: - fieldPath required: - name ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional - information about the network connections a container - uses, but is primarily informational. Not specifying - a port here DOES NOT prevent that port from being - exposed. Any port which is listening on the default - "0.0.0.0" address inside a container will be accessible - from the network. Cannot be updated. type: array items: - description: ContainerPort represents a network - port in a single container. type: object properties: protocol: - description: Protocol for port. Must be UDP, - TCP, or SCTP. Defaults to "TCP". type: string hostIP: - description: What host IP to bind the external - port to. type: string name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port - in a pod must have a unique name. Name for - the port that can be referred to by services. type: string containerPort: - description: Number of port to expose on the - pod's IP address. This must be a valid port - number, 0 < x < 65536. type: number hostPort: - description: Number of port to expose on the - host. If specified, this must be a valid port - number, 0 < x < 65536. If HostNetwork is specified, - this must match ContainerPort. Most containers - do not need this. type: number required: - containerPort command: - description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used - if this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. - If a variable cannot be resolved, the reference - in the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be - updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string volumeMounts: - description: Pod volumes to mount into the container's - filesystem. Cannot be updated. type: array items: - description: VolumeMount describes a mounting of - a Volume within a container. type: object properties: mountPath: - description: Path within the container at which - the volume should be mounted. Must not contain - ':'. type: string mountPropagation: - description: mountPropagation determines how - mounts are propagated from the host to container - and the other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. type: string name: - description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults - to false. type: boolean subPath: - description: Path within the volume from which - the container's volume should be mounted. - Defaults to "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume - from which the container's volume should be - mounted. Behaves similarly to SubPath but - environment variable references $(VAR_NAME) - are expanded using the container's environment. - Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field - is beta in 1.15. type: string required: - mountPath - name args: - description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string lifecycle: - description: Lifecycle describes actions that the - management system should take in response to container - lifecycle events. For the PostStart and PreStop - lifecycle handlers, management of the container - blocks until the action is complete, unless the - container process fails, in which case the handler - is aborted. type: object properties: postStart: - description: Handler defines a specific action - that should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. type: object properties: intValue: @@ -19968,52 +9517,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in - container" action. type: object properties: command: - description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP - server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. type: object properties: intValue: @@ -20025,24 +9546,15 @@ spec: required: - isInt host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a - custom header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -20050,23 +9562,12 @@ spec: required: - port preStop: - description: Handler defines a specific action - that should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. type: object properties: intValue: @@ -20078,52 +9579,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in - container" action. type: object properties: command: - description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP - server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. type: object properties: intValue: @@ -20135,24 +9608,15 @@ spec: required: - isInt host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a - custom header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -20160,43 +9624,20 @@ spec: required: - port name: - description: Name of the container specified as a - DNS_LABEL. Each container in a pod must have a unique - name (DNS_LABEL). Cannot be updated. type: string tty: - description: Whether this container should allocate - a TTY for itself, also requires 'stdin' to be true. - Default is false. type: boolean readinessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -20208,65 +9649,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -20278,24 +9684,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -20303,85 +9700,43 @@ spec: required: - port stdinOnce: - description: Whether the container runtime should - close the stdin channel after it has been opened - by a single attach. When stdin is true the stdin - stream will remain open across multiple attach sessions. - If stdinOnce is set to true, stdin is opened on - container start, is empty until the first client - attaches to stdin, and then remains open and accepts - data until the client disconnects, at which time - stdin is closed and remains closed until the container - is restarted. If this flag is false, a container - processes that reads from stdin will never receive - an EOF. Default is false type: boolean envFrom: - description: List of sources to populate environment - variables in the container. The keys defined within - a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container - is starting. When a key exists in multiple sources, - the value associated with the last source will take - precedence. Values defined by an Env with a duplicate - key will take precedence. Cannot be updated. type: array items: - description: EnvFromSource represents the source - of a set of ConfigMaps type: object properties: configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field - will represent the key-value pairs as environment - variables. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - must be defined type: boolean prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. type: string secretRef: - description: SecretEnvSource selects a Secret - to populate the environment variables with. The - contents of the target Secret's Data field - will represent the key-value pairs as environment - variables. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - must be defined type: boolean required: - name shutdown: - description: Configures how the operator should shutdown + description: Configures how the operator should shut down the server instance. type: object properties: ignoreSessions: description: For graceful shutdown only, indicates to ignore pending HTTP sessions during in-flight work - handling. Not required. Defaults to false. + handling. Defaults to false. type: boolean shutdownType: - description: Tells the operator how to shutdown server - instances. Not required. Defaults to graceful shutdown. + description: Specifies how the operator will shut down + server instances. Defaults to graceful shutdown. type: string enum: - Graceful @@ -20389,112 +9744,52 @@ spec: timeoutSeconds: description: For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting - down the server. Not required. Defaults to 30 seconds. + down the server. Defaults to 30 seconds. type: number affinity: - description: If specified, the pod's scheduling constraints + description: If specified, the Pod's scheduling constraints. + See `kubectl explain pods.spec.affinity` type: object properties: nodeAffinity: - description: Node affinity is a group of node affinity - scheduling rules. type: object properties: requiredDuringSchedulingIgnoredDuringExecution: - description: A node selector represents the union - of the results of one or more label queries over - a set of nodes; that is, it represents the OR - of the selectors represented by the node selector - terms. type: object properties: nodeSelectorTerms: - description: Required. A list of node selector - terms. The terms are ORed. - type: array - items: - description: A null or empty node selector - term matches no objects. The requirements - of them are ANDed. The TopologySelectorTerm - type implements a subset of the NodeSelectorTerm. + type: array + items: type: object properties: matchExpressions: - description: A list of node selector requirements - by node's labels. type: array items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. type: array items: type: string key: - description: The label key that - the selector applies to. type: string operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. type: string required: - key - operator matchFields: - description: A list of node selector requirements - by node's fields. type: array items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. type: array items: type: string key: - description: The label key that - the selector applies to. type: string operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. type: string required: - key @@ -20502,609 +9797,235 @@ spec: required: - nodeSelectorTerms preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule - pods to nodes that satisfy the affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. - The node that is most preferred is the one with - the greatest sum of weights, i.e. for each node - that meets all of the scheduling requirements - (resource request, requiredDuringScheduling affinity - expressions, etc.), compute a sum by iterating - through the elements of this field and adding - "weight" to the sum if the node matches the corresponding - matchExpressions; the node(s) with the highest - sum are the most preferred. type: array items: - description: An empty preferred scheduling term - matches all objects with implicit weight 0 (i.e. - it's a no-op). A null preferred scheduling term - matches no objects (i.e. is also a no-op). type: object properties: preference: - description: A null or empty node selector - term matches no objects. The requirements - of them are ANDed. The TopologySelectorTerm - type implements a subset of the NodeSelectorTerm. type: object properties: matchExpressions: - description: A list of node selector requirements - by node's labels. type: array items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. type: array items: type: string key: - description: The label key that - the selector applies to. type: string operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. type: string required: - key - operator matchFields: - description: A list of node selector requirements - by node's fields. type: array items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. type: array items: type: string key: - description: The label key that - the selector applies to. type: string operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. type: string required: - key - operator weight: - description: Weight associated with matching - the corresponding nodeSelectorTerm, in the - range 1-100. type: number required: - preference - weight podAffinity: - description: Pod affinity is a group of inter pod affinity - scheduling rules. type: object properties: requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified - by this field are not met at scheduling time, - the pod will not be scheduled onto the node. If - the affinity requirements specified by this field - cease to be met at some point during pod execution - (e.g. due to a pod label update), the system may - or may not try to eventually evict the pod from - its node. When there are multiple elements, the - lists of nodes corresponding to each podAffinityTerm - are intersected, i.e. all terms must be satisfied. type: array items: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which - a pod of the set of pods is running type: object properties: labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty - label selector matches all objects. A null - label selector matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. This - array is replaced during a strategic - merge patch. type: array items: type: string key: - description: key is the label key - that the selector applies to. type: string operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose value - of the label with key topologyKey matches - that of any node on which any of the selected - pods is running. Empty topologyKey is not - allowed. type: string namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" type: array items: type: string required: - topologyKey preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule - pods to nodes that satisfy the affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. - The node that is most preferred is the one with - the greatest sum of weights, i.e. for each node - that meets all of the scheduling requirements - (resource request, requiredDuringScheduling affinity - expressions, etc.), compute a sum by iterating - through the elements of this field and adding - "weight" to the sum if the node has pods which - matches the corresponding podAffinityTerm; the - node(s) with the highest sum are the most preferred. type: array items: - description: The weights of all of the matched - WeightedPodAffinityTerm fields are added per-node - to find the most preferred node(s) type: object properties: podAffinityTerm: - description: Defines a set of pods (namely - those matching the labelSelector relative - to the given namespace(s)) that this pod - should be co-located (affinity) or not co-located - (anti-affinity) with, where co-located is - defined as running on a node whose value - of the label with key matches - that of any node on which a pod of the set - of pods is running type: object properties: labelSelector: - description: A label selector is a label - query over a set of resources. The result - of matchLabels and matchExpressions - are ANDed. An empty label selector matches - all objects. A null label selector matches - no objects. type: object properties: matchExpressions: - description: matchExpressions is a - list of label selector requirements. - The requirements are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: values is an array - of string values. If the operator - is In or NotIn, the values - array must be non-empty. If - the operator is Exists or - DoesNotExist, the values array - must be empty. This array - is replaced during a strategic - merge patch. type: array items: type: string key: - description: key is the label - key that the selector applies - to. - type: string - operator: - description: operator represents - a key's relationship to a - set of values. Valid operators - are In, NotIn, Exists and - DoesNotExist. - type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map - of {key,value} pairs. A single {key,value} - in the matchLabels map is equivalent - to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are - ANDed. + type: string + operator: + type: string + required: + - key + - operator + matchLabels: additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose - value of the label with key topologyKey - matches that of any node on which any - of the selected pods is running. Empty - topologyKey is not allowed. type: string namespaces: - description: namespaces specifies which - namespaces the labelSelector applies - to (matches against); null or empty - list means "this pod's namespace" type: array items: type: string required: - topologyKey weight: - description: weight associated with matching - the corresponding podAffinityTerm, in the - range 1-100. type: number required: - podAffinityTerm - weight podAntiAffinity: - description: Pod anti affinity is a group of inter pod - anti affinity scheduling rules. type: object properties: requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified - by this field are not met at scheduling time, - the pod will not be scheduled onto the node. If - the anti-affinity requirements specified by this - field cease to be met at some point during pod - execution (e.g. due to a pod label update), the - system may or may not try to eventually evict - the pod from its node. When there are multiple - elements, the lists of nodes corresponding to - each podAffinityTerm are intersected, i.e. all - terms must be satisfied. type: array items: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which - a pod of the set of pods is running type: object properties: labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty - label selector matches all objects. A null - label selector matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. This - array is replaced during a strategic - merge patch. type: array items: type: string key: - description: key is the label key - that the selector applies to. type: string operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose value - of the label with key topologyKey matches - that of any node on which any of the selected - pods is running. Empty topologyKey is not - allowed. type: string namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" type: array items: type: string required: - topologyKey preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule - pods to nodes that satisfy the anti-affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. - The node that is most preferred is the one with - the greatest sum of weights, i.e. for each node - that meets all of the scheduling requirements - (resource request, requiredDuringScheduling anti-affinity - expressions, etc.), compute a sum by iterating - through the elements of this field and adding - "weight" to the sum if the node has pods which - matches the corresponding podAffinityTerm; the - node(s) with the highest sum are the most preferred. type: array items: - description: The weights of all of the matched - WeightedPodAffinityTerm fields are added per-node - to find the most preferred node(s) type: object properties: podAffinityTerm: - description: Defines a set of pods (namely - those matching the labelSelector relative - to the given namespace(s)) that this pod - should be co-located (affinity) or not co-located - (anti-affinity) with, where co-located is - defined as running on a node whose value - of the label with key matches - that of any node on which a pod of the set - of pods is running type: object properties: labelSelector: - description: A label selector is a label - query over a set of resources. The result - of matchLabels and matchExpressions - are ANDed. An empty label selector matches - all objects. A null label selector matches - no objects. type: object properties: matchExpressions: - description: matchExpressions is a - list of label selector requirements. - The requirements are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: values is an array - of string values. If the operator - is In or NotIn, the values - array must be non-empty. If - the operator is Exists or - DoesNotExist, the values array - must be empty. This array - is replaced during a strategic - merge patch. type: array items: type: string key: - description: key is the label - key that the selector applies - to. type: string operator: - description: operator represents - a key's relationship to a - set of values. Valid operators - are In, NotIn, Exists and - DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map - of {key,value} pairs. A single {key,value} - in the matchLabels map is equivalent - to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are - ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose - value of the label with key topologyKey - matches that of any node on which any - of the selected pods is running. Empty - topologyKey is not allowed. type: string namespaces: - description: namespaces specifies which - namespaces the labelSelector applies - to (matches against); null or empty - list means "this pod's namespace" type: array items: type: string required: - topologyKey weight: - description: weight associated with matching - the corresponding podAffinityTerm, in the - range 1-100. type: number required: - podAffinityTerm - weight - clusterService: - description: Customization affecting ClusterIP Kubernetes services - for the WebLogic cluster. - type: object - properties: - annotations: - description: The annotations to be attached to generated - resources. - additionalProperties: - type: string - type: object - labels: - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. - additionalProperties: - type: string - type: object serverStartPolicy: - description: The strategy for deciding whether to start a server. - Legal values are NEVER, or IF_NEEDED. + description: 'The strategy for deciding whether to start a WebLogic + Server instance. Legal values are ALWAYS, NEVER, or IF_NEEDED. + Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.' type: string enum: + - ALWAYS - NEVER - IF_NEEDED restartVersion: - description: If present, every time this value is updated the - operator will restart the required servers. + description: 'Changes to this field cause the operator to restart + WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.' type: string required: - - clusterName + - serverName status: type: object - description: DomainStatus represents information about the status of a - domain. Status may trail the actual state of a system. + description: The current status of the operation of the WebLogic domain. + Updated automatically by the operator. properties: reason: type: string @@ -21117,31 +10038,32 @@ spec: type: object properties: nodeName: - description: Name of node that is hosting the Pod containing - this WebLogic Server. + description: Name of Node that is hosting the Pod containing + this WebLogic Server instance. type: string desiredState: - description: Desired state of this WebLogic Server. Values are - RUNNING, ADMIN, or SHUTDOWN. + description: Desired state of this WebLogic Server instance. + Values are RUNNING, ADMIN, or SHUTDOWN. type: string clusterName: - description: WebLogic cluster name, if the server is part of - a cluster. + description: WebLogic cluster name, if the server is a member + of a cluster. type: string serverName: - description: WebLogic Server name. Required. + description: WebLogic Server instance name. type: string health: description: Current status and health of a specific WebLogic - Server. + Server instance. type: object properties: overallHealth: - description: Server health of this WebLogic Server. If the - value is "Not available", the operator has failed to read - the health. If the value is "Not available (possibly overloaded)", - the operator has failed to read the health of the server - possibly due to the server is in overloaded state. + description: Server health of this WebLogic Server instance. + If the value is "Not available", the operator has failed + to read the health. If the value is "Not available (possibly + overloaded)", the operator has failed to read the health + of the server possibly due to the server is in the overloaded + state. type: string activationTime: format: date-time @@ -21160,22 +10082,23 @@ spec: items: type: string health: - description: Server health of this WebLogic Server. - Required. + description: Server health of this WebLogic Server + instance. type: string subsystemName: description: Name of subsystem providing symptom information. - Required. type: string state: - description: Current state of this WebLogic Server. Required. + description: Current state of this WebLogic Server instance. type: string replicas: type: number - description: The number of running Managed Servers in the WebLogic - cluster if there is only one cluster in the domain and where the - cluster does not explicitly configure its replicas in a cluster - specification. + description: The number of running cluster member Managed Servers + in the WebLogic cluster if there is exactly one cluster defined + in the domain configuration and where the `replicas` field is set + at the `spec` level rather than for the specific cluster under `clusters`. + This field is provided to support use of Kubernetes scaling for + this limited use case. minimum: 0.0 startTime: type: string @@ -21185,7 +10108,7 @@ spec: format: date-time conditions: type: array - description: Current service state of domain. + description: Current service state of the domain. items: type: object properties: @@ -21195,7 +10118,7 @@ spec: type: string type: description: The type of the condition. Valid types are Progressing, - Available, and Failed. Required. + Available, and Failed. type: string enum: - Progressing @@ -21215,8 +10138,8 @@ spec: description: Last time we probed the condition. type: string status: - description: Status is the status of the condition. Can be True, - False, Unknown. Required. + description: The status of the condition. Can be True, False, + Unknown. type: string message: type: string @@ -21233,24 +10156,24 @@ spec: type: number minimum: 0.0 maximumReplicas: - description: The maximum number of cluster members. Required. + description: The maximum number of cluster members. type: number minimum: 0.0 replicas: - description: The number of intended cluster members. Required. + description: The number of currently running cluster members. type: number minimum: 0.0 clusterName: - description: WebLogic cluster name. Required. + description: WebLogic cluster name. type: string readyReplicas: - description: The number of ready cluster members. Required. + description: The number of ready cluster members. type: number minimum: 0.0 replicasGoal: - description: The requested number of cluster members from the - domain spec. Cluster members will be started by the operator - if this value is larger than zero. + description: The requested number of cluster members. Cluster + members will be started by the operator if this value is larger + than zero. type: number minimum: 0.0 served: true @@ -21260,7 +10183,7 @@ spec: specReplicasPath: .spec.replicas statusReplicasPath: .status.replicas status: {} - - name: v6 + - name: v7 schema: openAPIV3Schema: type: object @@ -21289,6 +10212,23 @@ spec: - Always - Never - IfNotPresent + configuration: + type: object + description: Properties affecting the WebLogic domain configuration. + properties: + istio: + type: object + description: The Istio service mesh integration settings + properties: + readinessPort: + type: number + description: The WebLogic readiness port for Istio. Defaults + to 8888. Not required. + enabled: + type: boolean + description: True, if this domain is deployed under an Istio + service mesh. Defaults to true when the 'istio' element + is included. Not required. replicas: type: number description: The number of managed servers to run in any cluster that @@ -21322,23 +10262,6 @@ spec: description: Domain unique identifier. Must be unique across the Kubernetes cluster. Not required. Defaults to the value of metadata.name. pattern: ^[a-z0-9-.]{1,253}$ - experimental: - type: object - description: Experimental feature configurations. - properties: - istio: - type: object - description: Istio service mesh integration configuration. - properties: - readinessPort: - type: number - description: The WebLogic readiness port for Istio. Defaults - to 8888. Not required. - enabled: - type: boolean - description: True, if this domain is deployed under an Istio - service mesh. Defaults to true when the 'istio' element - is included. Not required. serverStartPolicy: type: string description: The strategy for deciding whether to start a server. diff --git a/kubernetes/crd/domain-crdv7-260.yaml b/kubernetes/crd/domain-crdv7-260.yaml new file mode 100644 index 00000000000..b2cafd2974d --- /dev/null +++ b/kubernetes/crd/domain-crdv7-260.yaml @@ -0,0 +1,42506 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: domains.weblogic.oracle +spec: + group: weblogic.oracle + names: + kind: Domain + plural: domains + shortNames: + - dom + singular: domain + preserveUnknownFields: false + scope: Namespaced + versions: + - name: v7 + schema: + openAPIV3Schema: + type: object + properties: + spec: + type: object + description: DomainSpec is a description of a domain. + properties: + serverStartState: + type: string + description: The state in which the server is to be started. Use ADMIN + if server should start in the admin state. Defaults to RUNNING. + enum: + - RUNNING + - ADMIN + image: + type: string + description: The WebLogic Docker image; required when domainHomeInImage + is true; otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4. + imagePullPolicy: + type: string + description: The image pull policy for the WebLogic Docker image. + Legal values are Always, Never and IfNotPresent. Defaults to Always + if image ends in :latest, IfNotPresent otherwise. + enum: + - Always + - Never + - IfNotPresent + configuration: + type: object + description: Properties affecting the WebLogic domain configuration. + properties: + istio: + type: object + description: The Istio service mesh integration settings + properties: + readinessPort: + type: number + description: The WebLogic readiness port for Istio. Defaults + to 8888. Not required. + enabled: + type: boolean + description: True, if this domain is deployed under an Istio + service mesh. Defaults to true when the 'istio' element + is included. Not required. + replicas: + type: number + description: The number of managed servers to run in any cluster that + does not specify a replica count. + minimum: 0.0 + configOverrideSecrets: + type: array + description: A list of names of the secrets for optional WebLogic + configuration overrides. + items: + type: string + imagePullSecrets: + type: array + description: A list of image pull secrets for the WebLogic Docker + image. + items: + description: LocalObjectReference contains enough information to + let you locate the referenced object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + domainHomeInImage: + type: boolean + description: True indicates that the domain home file system is contained + in the Docker image specified by the image field. False indicates + that the domain home file system is located on a persistent volume. + domainUID: + type: string + description: Domain unique identifier. Must be unique across the Kubernetes + cluster. Not required. Defaults to the value of metadata.name. + pattern: ^[a-z0-9-.]{1,253}$ + serverStartPolicy: + type: string + description: The strategy for deciding whether to start a server. + Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED. + enum: + - NEVER + - IF_NEEDED + - ADMIN_ONLY + restartVersion: + type: string + description: If present, every time this value is updated the operator + will restart the required servers. + dataHome: + type: string + description: 'An optional, in-pod location for data storage of default + and custom file stores. If dataHome is not specified or its value + is either not set or empty (e.g. dataHome: "") then the data storage + directories are determined from the WebLogic domain home configuration.' + configOverrides: + type: string + description: The name of the config map for optional WebLogic configuration + overrides. + serverService: + type: object + description: Customization affecting ClusterIP Kubernetes services + for WebLogic Server instances. + properties: + precreateService: + type: boolean + description: If true, operator will create server services even + for server instances without running pods. + annotations: + type: object + additionalProperties: + type: string + description: The annotations to be attached to generated resources. + labels: + type: object + additionalProperties: + type: string + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + domainHome: + type: string + description: The folder for the WebLogic Domain. Not required. Defaults + to /shared/domains/domains/domainUID if domainHomeInImage is false. + Defaults to /u01/oracle/user_projects/domains/ if domainHomeInImage + is true. + logHomeEnabled: + type: boolean + description: 'Specified whether the log home folder is enabled. Not + required. Defaults to true if domainHomeInImage is false. Defaults + to false if domainHomeInImage is true. ' + webLogicCredentialsSecret: + type: object + description: The name of a pre-created Kubernetes secret, in the domain's + namespace, that holds the username and password needed to boot WebLogic + Server under the 'username' and 'password' fields. + properties: + name: + type: string + description: Name is unique within a namespace to reference a + secret resource. + namespace: + type: string + description: Namespace defines the space within which the secret + name must be unique. + adminServer: + type: object + description: Configuration for the Administration Server. + properties: + serverStartState: + type: string + description: The state in which the server is to be started. Use + ADMIN if server should start in the admin state. Defaults to + RUNNING. + enum: + - RUNNING + - ADMIN + serverService: + type: object + description: Customization affecting ClusterIP Kubernetes services + for WebLogic Server instances. + properties: + precreateService: + type: boolean + description: If true, operator will create server services + even for server instances without running pods. + annotations: + type: object + additionalProperties: + type: string + description: The annotations to be attached to generated resources. + labels: + type: object + additionalProperties: + type: string + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + serverPod: + type: object + description: Configuration affecting server pods. + properties: + nodeName: + type: string + description: NodeName is a request to schedule this pod onto + a specific node. If it is non-empty, the scheduler simply + schedules this pod onto that node, assuming that it fits + resource requirements. + livenessProbe: + type: object + description: Settings for the liveness probe associated with + a server. + properties: + periodSeconds: + type: number + description: The number of seconds between checks. + timeoutSeconds: + type: number + description: The number of seconds with no response that + indicates a failure. + initialDelaySeconds: + type: number + description: The number of seconds before the first check + is performed. + readinessGates: + type: array + description: 'If specified, all readiness gates will be evaluated + for pod readiness. A pod is ready when all its containers + are ready AND all conditions specified in the readiness + gates have status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + items: + description: PodReadinessGate contains the reference to + a pod condition + type: object + properties: + conditionType: + description: ConditionType refers to a condition in + the pod's condition list with matching type. + type: string + required: + - conditionType + serviceAccountName: + type: string + description: Name of the ServiceAccount to be used to run + this pod. If it is not set, default ServiceAccount will + be used. The ServiceAccount has to exist at the time the + pod is created. + podSecurityContext: + type: object + description: Pod-level security attributes. + properties: + runAsUser: + type: number + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence + for that container. + seLinuxOptions: + type: object + description: SELinuxOptions are the labels to be applied + to the container + properties: + role: + type: string + description: Role is a SELinux role label that applies + to the container. + level: + type: string + description: Level is SELinux level label that applies + to the container. + type: + type: string + description: Type is a SELinux type label that applies + to the container. + user: + type: string + description: User is a SELinux user label that applies + to the container. + fsGroup: + type: number + description: 'A special supplemental group that applies + to all containers in a pod. Some volume types allow + the Kubelet to change the ownership of that volume to + be owned by the pod: 1. The owning GID will be the + FSGroup 2. The setgid bit is set (new files created + in the volume will be owned by FSGroup) 3. The permission + bits are OR''d with rw-rw---- If unset, the Kubelet + will not modify the ownership and permissions of any + volume.' + windowsOptions: + type: object + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + properties: + gmsaCredentialSpec: + type: string + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + runAsUserName: + type: string + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and + it is only honored by servers that enable the WindowsRunAsUserName + feature flag. + gmsaCredentialSpecName: + type: string + description: GMSACredentialSpecName is the name of + the GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. + supplementalGroups: + type: array + description: A list of groups applied to the first process + run in each container, in addition to the container's + primary GID. If unspecified, no groups will be added + to any container. + items: + type: number + runAsGroup: + type: number + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in SecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence for that container. + runAsNonRoot: + type: boolean + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if it + does. If unset or false, no such validation will be + performed. May also be set in SecurityContext. If set + in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. + sysctls: + type: array + description: Sysctls hold a list of namespaced sysctls + used for the pod. Pods with unsupported sysctls (by + the container runtime) might fail to launch. + items: + description: Sysctl defines a kernel parameter to be + set + type: object + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + priorityClassName: + type: string + description: If specified, indicates the pod's priority. "system-node-critical" + and "system-cluster-critical" are two special keywords which + indicate the highest priorities with the former being the + highest priority. Any other name must be defined by creating + a PriorityClass object with that name. If not specified, + the pod priority will be default or zero if there is no + default. + volumes: + type: array + description: Additional volumes to be created in the server + pod. + items: + description: Volume represents a named volume in a pod that + may be accessed by any container in the pod. + type: object + properties: + quobyte: + description: Represents a Quobyte mount that lasts the + lifetime of a pod. Quobyte volumes do not support + ownership management or SELinux relabeling. + type: object + properties: + volume: + description: Volume is a string that references + an already created Quobyte volume by name. + type: string + registry: + description: Registry represents a single or multiple + Quobyte Registry services specified as a string + as host:port pair (multiple entries are separated + with commas) which acts as the central registry + for volumes + type: string + readOnly: + description: ReadOnly here will force the Quobyte + volume to be mounted with read-only permissions. + Defaults to false. + type: boolean + user: + description: User to map volume access to Defaults + to serivceaccount user + type: string + tenant: + description: Tenant owning the given Quobyte volume + in the Backend Used with dynamically provisioned + Quobyte volumes, value is set by the plugin + type: string + group: + description: Group to map volume access to Default + is no group + type: string + required: + - registry + - volume + azureFile: + description: AzureFile represents an Azure File Service + mount on the host and bind mount to the pod. + type: object + properties: + secretName: + description: the name of secret that contains Azure + Storage Account Name and Key + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + shareName: + description: Share Name + type: string + required: + - secretName + - shareName + flexVolume: + description: FlexVolume represents a generic volume + resource that is provisioned/attached using an exec + based plugin. + type: object + properties: + driver: + description: Driver is the name of the driver to + use for this volume. + type: string + options: + description: 'Optional: Extra command options if + any.' + additionalProperties: + type: string + type: object + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' + type: boolean + fsType: + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". The default + filesystem depends on FlexVolume script. + type: string + required: + - driver + secret: + description: Adapts a Secret into a volume. The contents + of the target Secret's Data field will be presented + in a volume as files using the keys in the Data field + as the file names. Secret volumes support ownership + management and SELinux relabeling. + type: object + properties: + secretName: + description: 'Name of the secret in the pod''s namespace + to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the + path are not affected by this setting. This might + be in conflict with other options that affect + the file mode, like fsGroup, and the result can + be other mode bits set.' + type: number + optional: + description: Specify whether the Secret or its keys + must be defined + type: boolean + items: + description: If unspecified, each key-value pair + in the Data field of the referenced Secret will + be projected into the volume as a file whose name + is the key and content is the value. If specified, + the listed keys will be projected into the specified + paths, and unlisted keys will not be present. + If a key is specified which is not present in + the Secret, the volume setup will error unless + it is marked optional. Paths must be relative + and may not contain the '..' path or start with + '..'. + type: array + items: + description: Maps a string key to a path within + a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use on + this file, must be a value between 0 and + 0777. If not specified, the volume defaultMode + will be used. This might be in conflict + with other options that affect the file + mode, like fsGroup, and the result can be + other mode bits set.' + type: number + path: + description: The relative path of the file + to map the key to. May not be an absolute + path. May not contain the path element '..'. + May not start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + projected: + description: Represents a projected volume source + type: object + properties: + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected + along with other supported volume types + type: object + properties: + downwardAPI: + description: Represents downward API info + for projecting into a projected volume. + Note that this is identical to a downwardAPI + volume source without the default mode. + type: object + properties: + items: + description: Items is a list of DownwardAPIVolume + file + type: array + items: + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be a + value between 0 and 0777. If not + specified, the volume defaultMode + will be used. This might be in + conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode + bits set.' + type: number + path: + description: 'Required: Path is the + relative path name of the file + to be created. Must not be absolute + or contain the ''..'' path. Must + be utf-8 encoded. The first item + of the relative path must not + start with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector + represents container resources + (cpu, memory) and their output + format + type: object + properties: + divisor: + description: 'Quantity is a + fixed-point representation + of a number. It provides convenient + marshaling/unmarshaling in + JSON and YAML, in addition + to String() and AsInt64() + accessors. The serialization + format is: ::= + (Note + that may be empty, + from the "" case in .) + ::= 0 | + 1 | ... | 9 ::= + | + ::= + | . | . + | . ::= + "+" | "-" ::= + | + ::= + | | + ::= Ki | + Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | + "" | k | M | G | T | P | E (Note + that 1024 = 1Ki but 1000 = + 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No + matter which of the three + exponent forms is used, no + quantity may represent a number + greater than 2^63-1 in magnitude, + nor may it have more than + 3 decimal places. Numbers + larger or more precise will + be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) + This may be extended in the + future if we require larger + or smaller quantities. When + a Quantity is parsed from + a string, it will remember + the type of suffix it had, + and will use the same type + again when it is serialized. Before + serializing, Quantity will + be put in "canonical form". + This means that Exponent/suffix + will be adjusted up or down + (with a corresponding increase + or decrease in Mantissa) such + that: a. No precision is + lost b. No fractional digits + will be emitted c. The exponent + (or suffix) is as large as + possible. The sign will be + omitted unless the number + is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER + be internally represented + by a floating point number. + That is the whole point of + this exercise. Non-canonical + values will still parse as + long as they are well formed, + but will be re-emitted in + their canonical form. (So + always use canonical form, + or don''t diff.) This format + is intended to make it difficult + to use these numbers without + writing some sort of special + handling code in the hopes + that that will cause implementors + to also use a fixed point + implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource + to select' + type: string + containerName: + description: 'Container name: + required for volumes, optional + for env vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector + selects an APIVersioned field + of an object. + type: object + properties: + apiVersion: + description: Version of the + schema the FieldPath is written + in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field + to select in the specified + API version. + type: string + required: + - fieldPath + required: + - path + configMap: + description: Adapts a ConfigMap into a projected + volume. The contents of the target ConfigMap's + Data field will be presented in a projected + volume as files using the keys in the Data + field as the file names, unless the items + element is populated with specific mappings + of keys to paths. Note that this is identical + to a configmap volume source without the + default mode. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its keys must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + ConfigMap will be projected into the + volume as a file whose name is the key + and content is the value. If specified, + the listed keys will be projected into + the specified paths, and unlisted keys + will not be present. If a key is specified + which is not present in the ConfigMap, + the volume setup will error unless it + is marked optional. Paths must be relative + and may not contain the '..' path or + start with '..'. + type: array + items: + description: Maps a string key to a + path within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be a + value between 0 and 0777. If not + specified, the volume defaultMode + will be used. This might be in + conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode + bits set.' + type: number + path: + description: The relative path of + the file to map the key to. May + not be an absolute path. May not + contain the path element '..'. + May not start with the string + '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + secret: + description: Adapts a secret into a projected + volume. The contents of the target Secret's + Data field will be presented in a projected + volume as files using the keys in the Data + field as the file names. Note that this + is identical to a secret volume source without + the default mode. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + Secret will be projected into the volume + as a file whose name is the key and + content is the value. If specified, + the listed keys will be projected into + the specified paths, and unlisted keys + will not be present. If a key is specified + which is not present in the Secret, + the volume setup will error unless it + is marked optional. Paths must be relative + and may not contain the '..' path or + start with '..'. + type: array + items: + description: Maps a string key to a + path within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be a + value between 0 and 0777. If not + specified, the volume defaultMode + will be used. This might be in + conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode + bits set.' + type: number + path: + description: The relative path of + the file to map the key to. May + not be an absolute path. May not + contain the path element '..'. + May not start with the string + '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + serviceAccountToken: + description: ServiceAccountTokenProjection + represents a projected service account token + volume. This projection can be used to insert + a service account token into the pods runtime + filesystem for use against APIs (Kubernetes + API Server or otherwise). + type: object + properties: + path: + description: Path is the path relative + to the mount point of the file to project + the token into. + type: string + audience: + description: Audience is the intended + audience of the token. A recipient of + a token must identify itself with an + identifier specified in the audience + of the token, and otherwise should reject + the token. The audience defaults to + the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the + requested duration of validity of the + service account token. As the token + approaches expiration, the kubelet volume + plugin will proactively rotate the service + account token. The kubelet will start + trying to rotate the token if the token + is older than 80 percent of its time + to live or if the token is older than + 24 hours.Defaults to 1 hour and must + be at least 10 minutes. + type: number + required: + - path + defaultMode: + description: Mode bits to use on created files by + default. Must be a value between 0 and 0777. Directories + within the path are not affected by this setting. + This might be in conflict with other options that + affect the file mode, like fsGroup, and the result + can be other mode bits set. + type: number + required: + - sources + cephfs: + description: Represents a Ceph Filesystem mount that + lasts the lifetime of a pod Cephfs volumes do not + support ownership management or SELinux relabeling. + type: object + properties: + path: + description: 'Optional: Used as the mounted root, + rather than the full Ceph tree, default is /' + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + secretFile: + description: 'Optional: SecretFile is the path to + key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + user: + description: 'Optional: User is the rados user name, + default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + monitors: + description: 'Required: Monitors is a collection + of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: + type: string + required: + - monitors + scaleIO: + description: ScaleIOVolumeSource represents a persistent + ScaleIO volume + type: object + properties: + system: + description: The name of the storage system as configured + in ScaleIO. + type: string + protectionDomain: + description: The name of the ScaleIO Protection + Domain for the configured storage. + type: string + sslEnabled: + description: Flag to enable/disable SSL communication + with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for a + volume should be ThickProvisioned or ThinProvisioned. + Default is ThinProvisioned. + type: string + volumeName: + description: The name of a volume already created + in the ScaleIO system that is associated with + this volume source. + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Default is + "xfs". + type: string + storagePool: + description: The ScaleIO Storage Pool associated + with the protection domain. + type: string + gateway: + description: The host address of the ScaleIO API + Gateway. + type: string + required: + - gateway + - secretRef + - system + emptyDir: + description: Represents an empty directory for a pod. + Empty directory volumes support ownership management + and SELinux relabeling. + type: object + properties: + sizeLimit: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and + AsInt64() accessors. The serialization format + is: ::= (Note + that may be empty, from the "" case in + .) ::= 0 | 1 | ... + | 9 ::= | + ::= | . + | . | . ::= + "+" | "-" ::= | + ::= | + | ::= Ki | Mi | + Gi | Ti | Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T | + P | E (Note that 1024 = 1Ki but 1000 = 1k; I + didn''t choose the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms is used, + no quantity may represent a number greater than + 2^63-1 in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more precise + will be capped or rounded up. (E.g.: 0.1m will + rounded up to 1m.) This may be extended in the + future if we require larger or smaller quantities. When + a Quantity is parsed from a string, it will remember + the type of suffix it had, and will use the same + type again when it is serialized. Before serializing, + Quantity will be put in "canonical form". This + means that Exponent/suffix will be adjusted up + or down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision is lost b. + No fractional digits will be emitted c. The + exponent (or suffix) is as large as possible. + The sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole + point of this exercise. Non-canonical values + will still parse as long as they are well formed, + but will be re-emitted in their canonical form. + (So always use canonical form, or don''t diff.) This + format is intended to make it difficult to use + these numbers without writing some sort of special + handling code in the hopes that that will cause + implementors to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + medium: + description: 'What type of storage medium should + back this directory. The default is "" which means + to use the node''s default medium. Must be an + empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: string + glusterfs: + description: Represents a Glusterfs mount that lasts + the lifetime of a pod. Glusterfs volumes do not support + ownership management or SELinux relabeling. + type: object + properties: + path: + description: 'Path is the Glusterfs volume path. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + endpoints: + description: 'EndpointsName is the endpoint name + that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs + volume to be mounted with read-only permissions. + Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + required: + - endpoints + - path + gcePersistentDisk: + description: Represents a Persistent Disk resource in + Google Compute Engine. A GCE PD must exist before + mounting to a container. The disk must also be in + the same GCE project and zone as the kubelet. A GCE + PD can only be mounted as read/write once or read-only + many times. GCE PDs support ownership management and + SELinux relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that you + want to mount. If omitted, the default is to mount + by volume name. Examples: For volume /dev/sda1, + you specify the partition as "1". Similarly, the + volume partition for /dev/sda is "0" (or you can + leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: number + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. More + info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + pdName: + description: 'Unique name of the PD resource in + GCE. Used to identify the disk in GCE. More info: + https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + required: + - pdName + photonPersistentDisk: + description: Represents a Photon Controller persistent + disk resource. + type: object + properties: + pdID: + description: ID that identifies Photon Controller + persistent disk + type: string + fsType: + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - pdID + azureDisk: + description: AzureDisk represents an Azure Data Disk + mount on the host and bind mount to the pod. + type: object + properties: + diskName: + description: The Name of the data disk in the blob + storage + type: string + kind: + description: 'Expected values Shared: multiple blob + disks per storage account Dedicated: single blob + disk per storage account Managed: azure managed + data disk (only in managed availability set). + defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + cachingMode: + description: 'Host Caching mode: None, Read Only, + Read Write.' + type: string + diskURI: + description: The URI the data disk in the blob storage + type: string + fsType: + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - diskName + - diskURI + cinder: + description: Represents a cinder volume resource in + Openstack. A Cinder volume must exist before mounting + to a container. The volume must also be in the same + region as the kubelet. Cinder volumes support ownership + management and SELinux relabeling. + type: object + properties: + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + volumeID: + description: 'volume id used to identify the volume + in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + fsType: + description: 'Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + required: + - volumeID + downwardAPI: + description: DownwardAPIVolumeSource represents a volume + containing downward API info. Downward API volumes + support ownership management and SELinux relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the + path are not affected by this setting. This might + be in conflict with other options that affect + the file mode, like fsGroup, and the result can + be other mode bits set.' + type: number + items: + description: Items is a list of downward API volume + file + type: array + items: + description: DownwardAPIVolumeFile represents + information to create the file containing the + pod field + type: object + properties: + mode: + description: 'Optional: mode bits to use on + this file, must be a value between 0 and + 0777. If not specified, the volume defaultMode + will be used. This might be in conflict + with other options that affect the file + mode, like fsGroup, and the result can be + other mode bits set.' + type: number + path: + description: 'Required: Path is the relative + path name of the file to be created. Must + not be absolute or contain the ''..'' path. + Must be utf-8 encoded. The first item of + the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the + "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | + Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M + | G | T | P | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms + is used, no quantity may represent a + number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may + be extended in the future if we require + larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type again + when it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. + No fractional digits will be emitted c. + The exponent (or suffix) is as large + as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always + use canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing + some sort of special handling code in + the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector selects an + APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, defaults + to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - path + awsElasticBlockStore: + description: Represents a Persistent Disk resource in + AWS. An AWS EBS disk must exist before mounting to + a container. The disk must also be in the same AWS + zone as the kubelet. An AWS EBS disk can only be mounted + as read/write once. AWS EBS volumes support ownership + management and SELinux relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that you + want to mount. If omitted, the default is to mount + by volume name. Examples: For volume /dev/sda1, + you specify the partition as "1". Similarly, the + volume partition for /dev/sda is "0" (or you can + leave the property empty).' + type: number + volumeID: + description: 'Unique ID of the persistent disk resource + in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + readOnly: + description: 'Specify "true" to force and set the + ReadOnly property in VolumeMounts to "true". If + omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + required: + - volumeID + flocker: + description: Represents a Flocker volume mounted by + the Flocker agent. One and only one of datasetName + and datasetUUID should be set. Flocker volumes do + not support ownership management or SELinux relabeling. + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata + -> name on the dataset for Flocker should be considered + as deprecated + type: string + datasetUUID: + description: UUID of the dataset. This is unique + identifier of a Flocker dataset + type: string + iscsi: + description: Represents an ISCSI disk. ISCSI volumes + can only be mounted as read/write once. ISCSI volumes + support ownership management and SELinux relabeling. + type: object + properties: + chapAuthSession: + description: whether support iSCSI Session CHAP + authentication + type: boolean + iscsiInterface: + description: iSCSI Interface Name that uses an iSCSI + transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: number + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP + authentication + type: boolean + iqn: + description: Target iSCSI Qualified Name. + type: string + portals: + description: iSCSI Target Portal List. The portal + is either an IP or ip_addr:port if the port is + other than default (typically TCP ports 860 and + 3260). + type: array + items: + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName + is specified with iscsiInterface simultaneously, + new iSCSI interface : + will be created for the connection. + type: string + readOnly: + description: ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' + type: string + targetPortal: + description: iSCSI Target Portal. The Portal is + either an IP or ip_addr:port if the port is other + than default (typically TCP ports 860 and 3260). + type: string + required: + - iqn + - lun + - targetPortal + rbd: + description: Represents a Rados Block Device mount that + lasts the lifetime of a pod. RBD volumes support ownership + management and SELinux relabeling. + type: object + properties: + image: + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + pool: + description: 'The rados pool name. Default is rbd. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' + type: string + keyring: + description: 'Keyring is the path to key ring for + RBDUser. Default is /etc/ceph/keyring. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + user: + description: 'The rados user name. Default is admin. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: + type: string + required: + - image + - monitors + configMap: + description: Adapts a ConfigMap into a volume. The + contents of the target ConfigMap's Data field will + be presented in a volume as files using the keys in + the Data field as the file names, unless the items + element is populated with specific mappings of keys + to paths. ConfigMap volumes support ownership management + and SELinux relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the + path are not affected by this setting. This might + be in conflict with other options that affect + the file mode, like fsGroup, and the result can + be other mode bits set.' + type: number + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap or its + keys must be defined + type: boolean + items: + description: If unspecified, each key-value pair + in the Data field of the referenced ConfigMap + will be projected into the volume as a file whose + name is the key and content is the value. If specified, + the listed keys will be projected into the specified + paths, and unlisted keys will not be present. + If a key is specified which is not present in + the ConfigMap, the volume setup will error unless + it is marked optional. Paths must be relative + and may not contain the '..' path or start with + '..'. + type: array + items: + description: Maps a string key to a path within + a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use on + this file, must be a value between 0 and + 0777. If not specified, the volume defaultMode + will be used. This might be in conflict + with other options that affect the file + mode, like fsGroup, and the result can be + other mode bits set.' + type: number + path: + description: The relative path of the file + to map the key to. May not be an absolute + path. May not contain the path element '..'. + May not start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + storageos: + description: Represents a StorageOS persistent volume + resource. + type: object + properties: + volumeNamespace: + description: VolumeNamespace specifies the scope + of the volume within StorageOS. If no namespace + is specified then the Pod's namespace will be + used. This allows the Kubernetes name scoping + to be mirrored within StorageOS for tighter integration. + Set VolumeName to any name to override the default + behaviour. Set to "default" if you are not using + namespaces within StorageOS. Namespaces that do + not pre-exist within StorageOS will be created. + type: string + volumeName: + description: VolumeName is the human-readable name + of the StorageOS volume. Volume names are only + unique within a namespace. + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + csi: + description: Represents a source location of a volume + to mount, managed by an external CSI driver + type: object + properties: + driver: + description: Driver is the name of the CSI driver + that handles this volume. Consult with your admin + for the correct name as registered in the cluster. + type: string + nodePublishSecretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Specifies a read-only configuration + for the volume. Defaults to false (read/write). + type: boolean + fsType: + description: Filesystem type to mount. Ex. "ext4", + "xfs", "ntfs". If not provided, the empty value + is passed to the associated CSI driver which will + determine the default filesystem to apply. + type: string + volumeAttributes: + description: VolumeAttributes stores driver-specific + properties that are passed to the CSI driver. + Consult your driver's documentation for supported + values. + additionalProperties: + type: string + type: object + required: + - driver + name: + description: 'Volume''s name. Must be a DNS_LABEL and + unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: Represents an NFS mount that lasts the + lifetime of a pod. NFS volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + path: + description: 'Path that is exported by the NFS server. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + server: + description: 'Server is the hostname or IP address + of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS export + to be mounted with read-only permissions. Defaults + to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + required: + - path + - server + persistentVolumeClaim: + description: PersistentVolumeClaimVolumeSource references + the user's PVC in the same namespace. This volume + finds the bound PV and mounts that volume for the + pod. A PersistentVolumeClaimVolumeSource is, essentially, + a wrapper around another type of volume that is owned + by someone else (the system). + type: object + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim + in the same namespace as the pod using this volume. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in + VolumeMounts. Default false. + type: boolean + required: + - claimName + gitRepo: + description: 'Represents a volume that is populated + with the contents of a git repository. Git repo volumes + do not support ownership management. Git repo volumes + support SELinux relabeling. DEPRECATED: GitRepo is + deprecated. To provision a container with a git repo, + mount an EmptyDir into an InitContainer that clones + the repo using git, then mount the EmptyDir into the + Pod''s container.' + type: object + properties: + repository: + description: Repository URL + type: string + directory: + description: Target directory name. Must not contain + or start with '..'. If '.' is supplied, the volume + directory will be the git repository. Otherwise, + if specified, the volume will contain the git + repository in the subdirectory with the given + name. + type: string + revision: + description: Commit hash for the specified revision. + type: string + required: + - repository + portworxVolume: + description: PortworxVolumeSource represents a Portworx + volume resource. + type: object + properties: + volumeID: + description: VolumeID uniquely identifies a Portworx + volume + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: FSType represents the filesystem type + to mount Must be a filesystem type supported by + the host operating system. Ex. "ext4", "xfs". + Implicitly inferred to be "ext4" if unspecified. + type: string + required: + - volumeID + vsphereVolume: + description: Represents a vSphere volume resource. + type: object + properties: + storagePolicyName: + description: Storage Policy Based Management (SPBM) + profile name. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) + profile ID associated with the StoragePolicyName. + type: string + volumePath: + description: Path that identifies vSphere volume + vmdk + type: string + fsType: + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - volumePath + fc: + description: Represents a Fibre Channel volume. Fibre + Channel volumes can only be mounted as read/write + once. Fibre Channel volumes support ownership management + and SELinux relabeling. + type: object + properties: + lun: + description: 'Optional: FC target lun number' + type: number + targetWWNs: + description: 'Optional: FC target worldwide names + (WWNs)' + type: array + items: + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' + type: boolean + wwids: + description: 'Optional: FC volume world wide identifiers + (wwids) Either wwids or combination of targetWWNs + and lun must be set, but not both simultaneously.' + type: array + items: + type: string + fsType: + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + hostPath: + description: Represents a host path mapped into a pod. + Host path volumes do not support ownership management + or SELinux relabeling. + type: object + properties: + path: + description: 'Path of the directory on the host. + If the path is a symlink, it will follow the link + to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults + to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + required: + - path + required: + - name + resources: + type: object + description: Memory and CPU minimum requirements and limits + for the server. + properties: + requests: + type: object + additionalProperties: + type: string + description: 'Requests describes the minimum amount of + compute resources required. If Requests is omitted for + a container, it defaults to Limits if that is explicitly + specified, otherwise to an implementation-defined value. + More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + limits: + type: object + additionalProperties: + type: string + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + annotations: + type: object + additionalProperties: + type: string + description: The annotations to be attached to generated resources. + env: + type: array + description: A list of environment variables to add to a server. + items: + description: EnvVar represents an environment variable present + in a Container. + type: object + properties: + name: + description: Name of the environment variable. Must + be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded + using the previous defined environment variables in + the container and any service environment variables. + If a variable cannot be resolved, the reference in + the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Defaults to + "".' + type: string + valueFrom: + description: EnvVarSource represents a source for the + value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key of + a Secret. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents container + resources (cpu, memory) and their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" case + in .) ::= 0 | + 1 | ... | 9 ::= + | ::= + | . | . | . + ::= "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | Ti | + Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | + T | P | E (Note that 1024 = 1Ki but 1000 + = 1k; I didn''t choose the capitalization.) + ::= "e" | + "E" No matter which of the + three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than 3 + decimal places. Numbers larger or more precise + will be capped or rounded up. (E.g.: 0.1m + will rounded up to 1m.) This may be extended + in the future if we require larger or smaller + quantities. When a Quantity is parsed from + a string, it will remember the type of suffix + it had, and will use the same type again when + it is serialized. Before serializing, Quantity + will be put in "canonical form". This means + that Exponent/suffix will be adjusted up or + down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision + is lost b. No fractional digits will be + emitted c. The exponent (or suffix) is as + large as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi will + be serialized as "1536Mi" Note that the quantity + will NEVER be internally represented by a + floating point number. That is the whole point + of this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or don''t + diff.) This format is intended to make it + difficult to use these numbers without writing + some sort of special handling code in the + hopes that that will cause implementors to + also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap or + its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an APIVersioned + field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in + the specified API version. + type: string + required: + - fieldPath + required: + - name + restartPolicy: + type: string + description: 'Restart policy for all containers within the + pod. One of Always, OnFailure, Never. Default to Always. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + nodeSelector: + type: object + additionalProperties: + type: string + description: Selector which must match a node's labels for + the pod to be scheduled on that node. + volumeMounts: + type: array + description: Additional volume mounts for the server pod. + items: + description: VolumeMount describes a mounting of a Volume + within a container. + type: object + properties: + mountPath: + description: Path within the container at which the + volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and the + other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise + (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's + volume should be mounted. Defaults to "" (volume's + root). + type: string + subPathExpr: + description: Expanded path within the volume from which + the container's volume should be mounted. Behaves + similarly to SubPath but environment variable references + $(VAR_NAME) are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in 1.15. + type: string + required: + - mountPath + - name + labels: + type: object + additionalProperties: + type: string + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + runtimeClassName: + type: string + description: 'RuntimeClassName refers to a RuntimeClass object + in the node.k8s.io group, which should be used to run this + pod. If no RuntimeClass resource matches the named class, + the pod will not be run. If unset or empty, the "legacy" + RuntimeClass will be used, which is an implicit class with + an empty definition that uses the default runtime handler. + More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future.' + tolerations: + type: array + description: If specified, the pod's tolerations. + items: + description: The pod this Toleration is attached to tolerates + any taint that matches the triple using + the matching operator . + type: object + properties: + effect: + description: Effect indicates the taint effect to match. + Empty means match all taint effects. When specified, + allowed values are NoSchedule, PreferNoSchedule and + NoExecute. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period + of time the toleration (which must be of effect NoExecute, + otherwise this field is ignored) tolerates the taint. + By default, it is not set, which means tolerate the + taint forever (do not evict). Zero and negative values + will be treated as 0 (evict immediately) by the system. + type: number + value: + description: Value is the taint value the toleration + matches to. If the operator is Exists, the value should + be empty, otherwise just a regular string. + type: string + key: + description: Key is the taint key that the toleration + applies to. Empty means match all taint keys. If the + key is empty, operator must be Exists; this combination + means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship + to the value. Valid operators are Exists and Equal. + Defaults to Equal. Exists is equivalent to wildcard + for value, so that a pod can tolerate all taints of + a particular category. + type: string + readinessProbe: + type: object + description: Settings for the readiness probe associated with + a server. + properties: + periodSeconds: + type: number + description: The number of seconds between checks. + timeoutSeconds: + type: number + description: The number of seconds with no response that + indicates a failure. + initialDelaySeconds: + type: number + description: The number of seconds before the first check + is performed. + containers: + type: array + description: Additional containers to be included in the server + pod. + items: + description: A single application container that you want + to run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of a + raw block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of + the container that the device will be mapped + to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, + IfNotPresent. Defaults to Always if :latest tag is + specified, or IfNotPresent otherwise. Cannot be updated. + More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate + a buffer for stdin in the container runtime. If this + is not set, reads from stdin in the container will + always result in EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message should + be populated. File will use the contents of terminationMessagePath + to populate the container status message on both success + and failure. FallbackToLogsOnError will use the last + chunk of container log output if the termination message + file is empty and the container exited with an error. + The log output is limited to 2048 bytes or 80 lines, + whichever is smaller. Defaults to File. Cannot be + updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to which + the container''s termination message will be written + is mounted into the container''s filesystem. Message + written is intended to be brief final status, such + as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' + type: string + workingDir: + description: Container's working directory. If not specified, + the container runtime's default will be used, which + might be configured in the container image. Cannot + be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields are + present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the + container process. Defaults to user specified + in image metadata if unspecified. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in + SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities + from running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to be + applied to the container + type: object + properties: + role: + description: Role is a SELinux role label that + applies to the container. + type: string + level: + description: Level is SELinux level label that + applies to the container. + type: string + type: + description: Type is a SELinux type label that + applies to the container. + type: string + user: + description: User is a SELinux user label that + applies to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain + Windows-specific options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the + GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential + spec named by the GMSACredentialSpecName field. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. + type: string + runAsUserName: + description: The UserName in Windows to run + the entrypoint of the container process. Defaults + to the user specified in image metadata if + unspecified. May also be set in PodSecurityContext. + If set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. This field is alpha-level and + it is only honored by servers that enable + the WindowsRunAsUserName feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + procMount: + description: procMount denotes the type of proc + mount to use for the containers. The default is + DefaultProcMount which uses the container runtime + defaults for readonly paths and masked paths. + This requires the ProcMountType feature flag to + be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the container + process. AllowPrivilegeEscalation is true always + when the container is: 1) run as Privileged 2) + has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the + container process. Uses runtime default if unset. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run + as a non-root user. If true, the Kubelet will + validate the image at runtime to ensure that it + does not run as UID 0 (root) and fail to start + the container if it does. If unset or false, no + such validation will be performed. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in + SecurityContext takes precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set in + the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. + Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) + are expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, + the reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a + double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether + the variable exists or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source + for the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key + of a Secret. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the + "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | + Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M + | G | T | P | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms + is used, no quantity may represent a + number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may + be extended in the future if we require + larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type again + when it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. + No fractional digits will be emitted c. + The exponent (or suffix) is as large + as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always + use canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing + some sort of special handling code in + the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an + APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, defaults + to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional information + about the network connections a container uses, but + is primarily informational. Not specifying a port + here DOES NOT prevent that port from being exposed. + Any port which is listening on the default "0.0.0.0" + address inside a container will be accessible from + the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network port + in a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, TCP, + or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external + port to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port in + a pod must have a unique name. Name for the + port that can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the pod's + IP address. This must be a valid port number, + 0 < x < 65536. + type: number + hostPort: + description: Number of port to expose on the host. + If specified, this must be a valid port number, + 0 < x < 65536. If HostNetwork is specified, + this must match ContainerPort. Most containers + do not need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within + a shell. The docker image''s ENTRYPOINT is used if + this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. If + a variable cannot be resolved, the reference in the + input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be updated. + More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's + filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a + Volume within a container. + type: object + properties: + mountPath: + description: Path within the container at which + the volume should be mounted. Must not contain + ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and + the other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults to + false. + type: boolean + subPath: + description: Path within the volume from which + the container's volume should be mounted. Defaults + to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment + variable references $(VAR_NAME) are expanded + using the container's environment. Defaults + to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in + 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. The + $(VAR_NAME) syntax can be escaped with a double $$, + ie: $$(VAR_NAME). Escaped references will never be + expanded, regardless of whether the variable exists + or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the management + system should take in response to container lifecycle + events. For the PostStart and PreStop lifecycle handlers, + management of the container blocks until the action + is complete, unless the container process fails, in + which case the handler is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a DNS_LABEL. + Each container in a pod must have a unique name (DNS_LABEL). + Cannot be updated. + type: string + tty: + description: Whether this container should allocate + a TTY for itself, also requires 'stdin' to be true. + Default is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should close + the stdin channel after it has been opened by a single + attach. When stdin is true the stdin stream will remain + open across multiple attach sessions. If stdinOnce + is set to true, stdin is opened on container start, + is empty until the first client attaches to stdin, + and then remains open and accepts data until the client + disconnects, at which time stdin is closed and remains + closed until the container is restarted. If this flag + is false, a container processes that reads from stdin + will never receive an EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment + variables in the container. The keys defined within + a source must be a C_IDENTIFIER. All invalid keys + will be reported as an event when the container is + starting. When a key exists in multiple sources, the + value associated with the last source will take precedence. + Values defined by an Env with a duplicate key will + take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of + a set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + must be defined + type: boolean + prefix: + description: An optional identifier to prepend + to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret + to populate the environment variables with. The + contents of the target Secret's Data field will + represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret must + be defined + type: boolean + required: + - name + containerSecurityContext: + type: object + description: Container-level security attributes. Will override + any matching pod-level attributes. + properties: + privileged: + type: boolean + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + runAsUser: + type: number + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + capabilities: + type: object + description: Adds and removes POSIX capabilities from + running containers. + properties: + add: + type: array + description: Added capabilities + items: + type: string + drop: + type: array + description: Removed capabilities + items: + type: string + seLinuxOptions: + type: object + description: SELinuxOptions are the labels to be applied + to the container + properties: + role: + type: string + description: Role is a SELinux role label that applies + to the container. + level: + type: string + description: Level is SELinux level label that applies + to the container. + type: + type: string + description: Type is a SELinux type label that applies + to the container. + user: + type: string + description: User is a SELinux user label that applies + to the container. + windowsOptions: + type: object + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + properties: + gmsaCredentialSpec: + type: string + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + runAsUserName: + type: string + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and + it is only honored by servers that enable the WindowsRunAsUserName + feature flag. + gmsaCredentialSpecName: + type: string + description: GMSACredentialSpecName is the name of + the GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. + procMount: + type: string + description: procMount denotes the type of proc mount + to use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. This requires the ProcMountType + feature flag to be enabled. + allowPrivilegeEscalation: + type: boolean + description: 'AllowPrivilegeEscalation controls whether + a process can gain more privileges than its parent process. + This bool directly controls if the no_new_privs flag + will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' + runAsGroup: + type: number + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + runAsNonRoot: + type: boolean + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if it + does. If unset or false, no such validation will be + performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + readOnlyRootFilesystem: + type: boolean + description: Whether this container has a read-only root + filesystem. Default is false. + schedulerName: + type: string + description: If specified, the pod will be dispatched by specified + scheduler. If not specified, the pod will be dispatched + by default scheduler. + initContainers: + type: array + description: Initialization containers to be included in the + server pod. + items: + description: A single application container that you want + to run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of a + raw block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of + the container that the device will be mapped + to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, + IfNotPresent. Defaults to Always if :latest tag is + specified, or IfNotPresent otherwise. Cannot be updated. + More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate + a buffer for stdin in the container runtime. If this + is not set, reads from stdin in the container will + always result in EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message should + be populated. File will use the contents of terminationMessagePath + to populate the container status message on both success + and failure. FallbackToLogsOnError will use the last + chunk of container log output if the termination message + file is empty and the container exited with an error. + The log output is limited to 2048 bytes or 80 lines, + whichever is smaller. Defaults to File. Cannot be + updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to which + the container''s termination message will be written + is mounted into the container''s filesystem. Message + written is intended to be brief final status, such + as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' + type: string + workingDir: + description: Container's working directory. If not specified, + the container runtime's default will be used, which + might be configured in the container image. Cannot + be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields are + present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the + container process. Defaults to user specified + in image metadata if unspecified. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in + SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities + from running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to be + applied to the container + type: object + properties: + role: + description: Role is a SELinux role label that + applies to the container. + type: string + level: + description: Level is SELinux level label that + applies to the container. + type: string + type: + description: Type is a SELinux type label that + applies to the container. + type: string + user: + description: User is a SELinux user label that + applies to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain + Windows-specific options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the + GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential + spec named by the GMSACredentialSpecName field. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. + type: string + runAsUserName: + description: The UserName in Windows to run + the entrypoint of the container process. Defaults + to the user specified in image metadata if + unspecified. May also be set in PodSecurityContext. + If set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. This field is alpha-level and + it is only honored by servers that enable + the WindowsRunAsUserName feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + procMount: + description: procMount denotes the type of proc + mount to use for the containers. The default is + DefaultProcMount which uses the container runtime + defaults for readonly paths and masked paths. + This requires the ProcMountType feature flag to + be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the container + process. AllowPrivilegeEscalation is true always + when the container is: 1) run as Privileged 2) + has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the + container process. Uses runtime default if unset. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run + as a non-root user. If true, the Kubelet will + validate the image at runtime to ensure that it + does not run as UID 0 (root) and fail to start + the container if it does. If unset or false, no + such validation will be performed. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in + SecurityContext takes precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set in + the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. + Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) + are expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, + the reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a + double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether + the variable exists or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source + for the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key + of a Secret. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the + "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | + Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M + | G | T | P | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms + is used, no quantity may represent a + number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may + be extended in the future if we require + larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type again + when it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. + No fractional digits will be emitted c. + The exponent (or suffix) is as large + as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always + use canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing + some sort of special handling code in + the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an + APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, defaults + to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional information + about the network connections a container uses, but + is primarily informational. Not specifying a port + here DOES NOT prevent that port from being exposed. + Any port which is listening on the default "0.0.0.0" + address inside a container will be accessible from + the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network port + in a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, TCP, + or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external + port to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port in + a pod must have a unique name. Name for the + port that can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the pod's + IP address. This must be a valid port number, + 0 < x < 65536. + type: number + hostPort: + description: Number of port to expose on the host. + If specified, this must be a valid port number, + 0 < x < 65536. If HostNetwork is specified, + this must match ContainerPort. Most containers + do not need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within + a shell. The docker image''s ENTRYPOINT is used if + this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. If + a variable cannot be resolved, the reference in the + input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be updated. + More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's + filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a + Volume within a container. + type: object + properties: + mountPath: + description: Path within the container at which + the volume should be mounted. Must not contain + ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and + the other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults to + false. + type: boolean + subPath: + description: Path within the volume from which + the container's volume should be mounted. Defaults + to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment + variable references $(VAR_NAME) are expanded + using the container's environment. Defaults + to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in + 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. The + $(VAR_NAME) syntax can be escaped with a double $$, + ie: $$(VAR_NAME). Escaped references will never be + expanded, regardless of whether the variable exists + or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the management + system should take in response to container lifecycle + events. For the PostStart and PreStop lifecycle handlers, + management of the container blocks until the action + is complete, unless the container process fails, in + which case the handler is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a DNS_LABEL. + Each container in a pod must have a unique name (DNS_LABEL). + Cannot be updated. + type: string + tty: + description: Whether this container should allocate + a TTY for itself, also requires 'stdin' to be true. + Default is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should close + the stdin channel after it has been opened by a single + attach. When stdin is true the stdin stream will remain + open across multiple attach sessions. If stdinOnce + is set to true, stdin is opened on container start, + is empty until the first client attaches to stdin, + and then remains open and accepts data until the client + disconnects, at which time stdin is closed and remains + closed until the container is restarted. If this flag + is false, a container processes that reads from stdin + will never receive an EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment + variables in the container. The keys defined within + a source must be a C_IDENTIFIER. All invalid keys + will be reported as an event when the container is + starting. When a key exists in multiple sources, the + value associated with the last source will take precedence. + Values defined by an Env with a duplicate key will + take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of + a set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + must be defined + type: boolean + prefix: + description: An optional identifier to prepend + to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret + to populate the environment variables with. The + contents of the target Secret's Data field will + represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret must + be defined + type: boolean + required: + - name + shutdown: + type: object + description: Configures how the operator should shutdown the + server instance. + properties: + ignoreSessions: + type: boolean + description: For graceful shutdown only, indicates to + ignore pending HTTP sessions during in-flight work handling. + Not required. Defaults to false. + shutdownType: + type: string + description: Tells the operator how to shutdown server + instances. Not required. Defaults to graceful shutdown. + enum: + - Graceful + - Forced + timeoutSeconds: + type: number + description: For graceful shutdown only, number of seconds + to wait before aborting in-flight work and shutting + down the server. Not required. Defaults to 30 seconds. + affinity: + type: object + description: If specified, the pod's scheduling constraints + properties: + nodeAffinity: + type: object + description: Node affinity is a group of node affinity + scheduling rules. + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: object + description: A node selector represents the union + of the results of one or more label queries over + a set of nodes; that is, it represents the OR of + the selectors represented by the node selector terms. + properties: + nodeSelectorTerms: + type: array + description: Required. A list of node selector + terms. The terms are ORed. + items: + description: A null or empty node selector term + matches no objects. The requirements of them + are ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + required: + - nodeSelectorTerms + preferredDuringSchedulingIgnoredDuringExecution: + type: array + description: The scheduler will prefer to schedule + pods to nodes that satisfy the affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. The + node that is most preferred is the one with the + greatest sum of weights, i.e. for each node that + meets all of the scheduling requirements (resource + request, requiredDuringScheduling affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if + the node matches the corresponding matchExpressions; + the node(s) with the highest sum are the most preferred. + items: + description: An empty preferred scheduling term + matches all objects with implicit weight 0 (i.e. + it's a no-op). A null preferred scheduling term + matches no objects (i.e. is also a no-op). + type: object + properties: + preference: + description: A null or empty node selector term + matches no objects. The requirements of them + are ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + weight: + description: Weight associated with matching + the corresponding nodeSelectorTerm, in the + range 1-100. + type: number + required: + - preference + - weight + podAffinity: + type: object + description: Pod affinity is a group of inter pod affinity + scheduling rules. + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + description: If the affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the + affinity requirements specified by this field cease + to be met at some point during pod execution (e.g. + due to a pod label update), the system may or may + not try to eventually evict the pod from its node. + When there are multiple elements, the lists of nodes + corresponding to each podAffinityTerm are intersected, + i.e. all terms must be satisfied. + items: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node + whose value of the label with key + matches that of any node on which a pod of the + set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label + selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The requirements + are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the + pods matching the labelSelector in the specified + namespaces, where co-located is defined as + running on a node whose value of the label + with key topologyKey matches that of any node + on which any of the selected pods is running. + Empty topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + description: The scheduler will prefer to schedule + pods to nodes that satisfy the affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. The + node that is most preferred is the one with the + greatest sum of weights, i.e. for each node that + meets all of the scheduling requirements (resource + request, requiredDuringScheduling affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if + the node has pods which matches the corresponding + podAffinityTerm; the node(s) with the highest sum + are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely those + matching the labelSelector relative to the + given namespace(s)) that this pod should be + co-located (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on + which a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label + query over a set of resources. The result + of matchLabels and matchExpressions are + ANDed. An empty label selector matches + all objects. A null label selector matches + no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. + type: array + items: + type: string + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of + {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose + value of the label with key topologyKey + matches that of any node on which any + of the selected pods is running. Empty + topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which + namespaces the labelSelector applies to + (matches against); null or empty list + means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching + the corresponding podAffinityTerm, in the + range 1-100. + type: number + required: + - podAffinityTerm + - weight + podAntiAffinity: + type: object + description: Pod anti affinity is a group of inter pod + anti affinity scheduling rules. + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + description: If the anti-affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the + anti-affinity requirements specified by this field + cease to be met at some point during pod execution + (e.g. due to a pod label update), the system may + or may not try to eventually evict the pod from + its node. When there are multiple elements, the + lists of nodes corresponding to each podAffinityTerm + are intersected, i.e. all terms must be satisfied. + items: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node + whose value of the label with key + matches that of any node on which a pod of the + set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label + selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The requirements + are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the + pods matching the labelSelector in the specified + namespaces, where co-located is defined as + running on a node whose value of the label + with key topologyKey matches that of any node + on which any of the selected pods is running. + Empty topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + description: The scheduler will prefer to schedule + pods to nodes that satisfy the anti-affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. The + node that is most preferred is the one with the + greatest sum of weights, i.e. for each node that + meets all of the scheduling requirements (resource + request, requiredDuringScheduling anti-affinity + expressions, etc.), compute a sum by iterating through + the elements of this field and adding "weight" to + the sum if the node has pods which matches the corresponding + podAffinityTerm; the node(s) with the highest sum + are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely those + matching the labelSelector relative to the + given namespace(s)) that this pod should be + co-located (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on + which a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label + query over a set of resources. The result + of matchLabels and matchExpressions are + ANDed. An empty label selector matches + all objects. A null label selector matches + no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. + type: array + items: + type: string + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of + {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose + value of the label with key topologyKey + matches that of any node on which any + of the selected pods is running. Empty + topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which + namespaces the labelSelector applies to + (matches against); null or empty list + means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching + the corresponding podAffinityTerm, in the + range 1-100. + type: number + required: + - podAffinityTerm + - weight + serverStartPolicy: + type: string + description: The strategy for deciding whether to start a server. + Legal values are ALWAYS, NEVER, or IF_NEEDED. + enum: + - ALWAYS + - NEVER + - IF_NEEDED + adminService: + type: object + description: Configures which of the Administration Server's WebLogic + admin channels should be exposed outside the Kubernetes cluster + via a node port service. + properties: + channels: + type: array + description: Specifies which of the Administration Server's + WebLogic channels should be exposed outside the Kubernetes + cluster via a node port service, along with the node port + for each channel. If not specified, the Administration Server's + node port service will not be created. + items: + description: Describes a single channel used by the Administration + Server. + type: object + properties: + channelName: + description: "Name of channel.\n'default' refers to\ + \ the Administration Server's default channel (configured\ + \ via the ServerMBean's ListenPort) \n'default-secure'\ + \ refers to the Administration Server's default secure\ + \ channel (configured via the ServerMBean's SSLMBean's\ + \ ListenPort) \n'default-admin' refers to the Administration\ + \ Server's default administrative channel (configured\ + \ via the DomainMBean's AdministrationPort) \nOtherwise,\ + \ the name is the name of one of the Administration\ + \ Server's network access points (configured via the\ + \ ServerMBean's NetworkAccessMBeans)." + type: string + nodePort: + description: Specifies the port number used to access + the WebLogic channel outside of the Kubernetes cluster. + If not specified, defaults to the port defined by + the WebLogic channel. + type: number + required: + - channelName + annotations: + type: object + additionalProperties: + type: string + description: Annotations to associate with the external channel + service. + labels: + type: object + additionalProperties: + type: string + description: Labels to associate with the external channel + service. + restartVersion: + type: string + description: If present, every time this value is updated the + operator will restart the required servers. + serverPod: + type: object + description: Configuration affecting server pods. + properties: + nodeName: + type: string + description: NodeName is a request to schedule this pod onto a + specific node. If it is non-empty, the scheduler simply schedules + this pod onto that node, assuming that it fits resource requirements. + livenessProbe: + type: object + description: Settings for the liveness probe associated with a + server. + properties: + periodSeconds: + type: number + description: The number of seconds between checks. + timeoutSeconds: + type: number + description: The number of seconds with no response that indicates + a failure. + initialDelaySeconds: + type: number + description: The number of seconds before the first check + is performed. + readinessGates: + type: array + description: 'If specified, all readiness gates will be evaluated + for pod readiness. A pod is ready when all its containers are + ready AND all conditions specified in the readiness gates have + status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + items: + description: PodReadinessGate contains the reference to a pod + condition + type: object + properties: + conditionType: + description: ConditionType refers to a condition in the + pod's condition list with matching type. + type: string + required: + - conditionType + serviceAccountName: + type: string + description: Name of the ServiceAccount to be used to run this + pod. If it is not set, default ServiceAccount will be used. + The ServiceAccount has to exist at the time the pod is created. + podSecurityContext: + type: object + description: Pod-level security attributes. + properties: + runAsUser: + type: number + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata if + unspecified. May also be set in SecurityContext. If set + in both SecurityContext and PodSecurityContext, the value + specified in SecurityContext takes precedence for that container. + seLinuxOptions: + type: object + description: SELinuxOptions are the labels to be applied to + the container + properties: + role: + type: string + description: Role is a SELinux role label that applies + to the container. + level: + type: string + description: Level is SELinux level label that applies + to the container. + type: + type: string + description: Type is a SELinux type label that applies + to the container. + user: + type: string + description: User is a SELinux user label that applies + to the container. + fsGroup: + type: number + description: 'A special supplemental group that applies to + all containers in a pod. Some volume types allow the Kubelet + to change the ownership of that volume to be owned by the + pod: 1. The owning GID will be the FSGroup 2. The setgid + bit is set (new files created in the volume will be owned + by FSGroup) 3. The permission bits are OR''d with rw-rw---- If + unset, the Kubelet will not modify the ownership and permissions + of any volume.' + windowsOptions: + type: object + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + properties: + gmsaCredentialSpec: + type: string + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named + by the GMSACredentialSpecName field. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. + runAsUserName: + type: string + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set in + PodSecurityContext. If set in both SecurityContext and + PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and it is + only honored by servers that enable the WindowsRunAsUserName + feature flag. + gmsaCredentialSpecName: + type: string + description: GMSACredentialSpecName is the name of the + GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. + supplementalGroups: + type: array + description: A list of groups applied to the first process + run in each container, in addition to the container's primary + GID. If unspecified, no groups will be added to any container. + items: + type: number + runAsGroup: + type: number + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be set + in SecurityContext. If set in both SecurityContext and + PodSecurityContext, the value specified in SecurityContext + takes precedence for that container. + runAsNonRoot: + type: boolean + description: Indicates that the container must run as a non-root + user. If true, the Kubelet will validate the image at runtime + to ensure that it does not run as UID 0 (root) and fail + to start the container if it does. If unset or false, no + such validation will be performed. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. + sysctls: + type: array + description: Sysctls hold a list of namespaced sysctls used + for the pod. Pods with unsupported sysctls (by the container + runtime) might fail to launch. + items: + description: Sysctl defines a kernel parameter to be set + type: object + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + priorityClassName: + type: string + description: If specified, indicates the pod's priority. "system-node-critical" + and "system-cluster-critical" are two special keywords which + indicate the highest priorities with the former being the highest + priority. Any other name must be defined by creating a PriorityClass + object with that name. If not specified, the pod priority will + be default or zero if there is no default. + volumes: + type: array + description: Additional volumes to be created in the server pod. + items: + description: Volume represents a named volume in a pod that + may be accessed by any container in the pod. + type: object + properties: + quobyte: + description: Represents a Quobyte mount that lasts the lifetime + of a pod. Quobyte volumes do not support ownership management + or SELinux relabeling. + type: object + properties: + volume: + description: Volume is a string that references an already + created Quobyte volume by name. + type: string + registry: + description: Registry represents a single or multiple + Quobyte Registry services specified as a string as + host:port pair (multiple entries are separated with + commas) which acts as the central registry for volumes + type: string + readOnly: + description: ReadOnly here will force the Quobyte volume + to be mounted with read-only permissions. Defaults + to false. + type: boolean + user: + description: User to map volume access to Defaults to + serivceaccount user + type: string + tenant: + description: Tenant owning the given Quobyte volume + in the Backend Used with dynamically provisioned Quobyte + volumes, value is set by the plugin + type: string + group: + description: Group to map volume access to Default is + no group + type: string + required: + - registry + - volume + azureFile: + description: AzureFile represents an Azure File Service + mount on the host and bind mount to the pod. + type: object + properties: + secretName: + description: the name of secret that contains Azure + Storage Account Name and Key + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + shareName: + description: Share Name + type: string + required: + - secretName + - shareName + flexVolume: + description: FlexVolume represents a generic volume resource + that is provisioned/attached using an exec based plugin. + type: object + properties: + driver: + description: Driver is the name of the driver to use + for this volume. + type: string + options: + description: 'Optional: Extra command options if any.' + additionalProperties: + type: string + type: object + secretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + fsType: + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. "ext4", + "xfs", "ntfs". The default filesystem depends on FlexVolume + script. + type: string + required: + - driver + secret: + description: Adapts a Secret into a volume. The contents + of the target Secret's Data field will be presented in + a volume as files using the keys in the Data field as + the file names. Secret volumes support ownership management + and SELinux relabeling. + type: object + properties: + secretName: + description: 'Name of the secret in the pod''s namespace + to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 and 0777. + Defaults to 0644. Directories within the path are + not affected by this setting. This might be in conflict + with other options that affect the file mode, like + fsGroup, and the result can be other mode bits set.' + type: number + optional: + description: Specify whether the Secret or its keys + must be defined + type: boolean + items: + description: If unspecified, each key-value pair in + the Data field of the referenced Secret will be projected + into the volume as a file whose name is the key and + content is the value. If specified, the listed keys + will be projected into the specified paths, and unlisted + keys will not be present. If a key is specified which + is not present in the Secret, the volume setup will + error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start + with '..'. + type: array + items: + description: Maps a string key to a path within a + volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use on this + file, must be a value between 0 and 0777. If + not specified, the volume defaultMode will be + used. This might be in conflict with other options + that affect the file mode, like fsGroup, and + the result can be other mode bits set.' + type: number + path: + description: The relative path of the file to + map the key to. May not be an absolute path. + May not contain the path element '..'. May not + start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + projected: + description: Represents a projected volume source + type: object + properties: + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected along + with other supported volume types + type: object + properties: + downwardAPI: + description: Represents downward API info for + projecting into a projected volume. Note that + this is identical to a downwardAPI volume source + without the default mode. + type: object + properties: + items: + description: Items is a list of DownwardAPIVolume + file + type: array + items: + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field + type: object + properties: + mode: + description: 'Optional: mode bits to + use on this file, must be a value + between 0 and 0777. If not specified, + the volume defaultMode will be used. + This might be in conflict with other + options that affect the file mode, + like fsGroup, and the result can be + other mode bits set.' + type: number + path: + description: 'Required: Path is the + relative path name of the file to + be created. Must not be absolute or + contain the ''..'' path. Must be utf-8 + encoded. The first item of the relative + path must not start with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) + and their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It + provides convenient marshaling/unmarshaling + in JSON and YAML, in addition + to String() and AsInt64() accessors. The + serialization format is: ::= + (Note + that may be empty, from + the "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | + . | . ::= + "+" | "-" ::= + | ::= + | + | ::= + Ki | Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | + k | M | G | T | P | E (Note + that 1024 = 1Ki but 1000 = 1k; + I didn''t choose the capitalization.) + ::= "e" + | "E" No matter + which of the three exponent forms + is used, no quantity may represent + a number greater than 2^63-1 in + magnitude, nor may it have more + than 3 decimal places. Numbers + larger or more precise will be + capped or rounded up. (E.g.: 0.1m + will rounded up to 1m.) This may + be extended in the future if we + require larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same + type again when it is serialized. Before + serializing, Quantity will be + put in "canonical form". This + means that Exponent/suffix will + be adjusted up or down (with a + corresponding increase or decrease + in Mantissa) such that: a. No + precision is lost b. No fractional + digits will be emitted c. The + exponent (or suffix) is as large + as possible. The sign will be + omitted unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be + internally represented by a floating + point number. That is the whole + point of this exercise. Non-canonical + values will still parse as long + as they are well formed, but will + be re-emitted in their canonical + form. (So always use canonical + form, or don''t diff.) This format + is intended to make it difficult + to use these numbers without writing + some sort of special handling + code in the hopes that that will + cause implementors to also use + a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource + to select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env + vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector selects + an APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema + the FieldPath is written in terms + of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to + select in the specified API version. + type: string + required: + - fieldPath + required: + - path + configMap: + description: Adapts a ConfigMap into a projected + volume. The contents of the target ConfigMap's + Data field will be presented in a projected + volume as files using the keys in the Data field + as the file names, unless the items element + is populated with specific mappings of keys + to paths. Note that this is identical to a configmap + volume source without the default mode. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its keys must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + ConfigMap will be projected into the volume + as a file whose name is the key and content + is the value. If specified, the listed keys + will be projected into the specified paths, + and unlisted keys will not be present. If + a key is specified which is not present + in the ConfigMap, the volume setup will + error unless it is marked optional. Paths + must be relative and may not contain the + '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path + within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to + use on this file, must be a value + between 0 and 0777. If not specified, + the volume defaultMode will be used. + This might be in conflict with other + options that affect the file mode, + like fsGroup, and the result can be + other mode bits set.' + type: number + path: + description: The relative path of the + file to map the key to. May not be + an absolute path. May not contain + the path element '..'. May not start + with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + secret: + description: Adapts a secret into a projected + volume. The contents of the target Secret's + Data field will be presented in a projected + volume as files using the keys in the Data field + as the file names. Note that this is identical + to a secret volume source without the default + mode. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + Secret will be projected into the volume + as a file whose name is the key and content + is the value. If specified, the listed keys + will be projected into the specified paths, + and unlisted keys will not be present. If + a key is specified which is not present + in the Secret, the volume setup will error + unless it is marked optional. Paths must + be relative and may not contain the '..' + path or start with '..'. + type: array + items: + description: Maps a string key to a path + within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to + use on this file, must be a value + between 0 and 0777. If not specified, + the volume defaultMode will be used. + This might be in conflict with other + options that affect the file mode, + like fsGroup, and the result can be + other mode bits set.' + type: number + path: + description: The relative path of the + file to map the key to. May not be + an absolute path. May not contain + the path element '..'. May not start + with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + serviceAccountToken: + description: ServiceAccountTokenProjection represents + a projected service account token volume. This + projection can be used to insert a service account + token into the pods runtime filesystem for use + against APIs (Kubernetes API Server or otherwise). + type: object + properties: + path: + description: Path is the path relative to + the mount point of the file to project the + token into. + type: string + audience: + description: Audience is the intended audience + of the token. A recipient of a token must + identify itself with an identifier specified + in the audience of the token, and otherwise + should reject the token. The audience defaults + to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the requested + duration of validity of the service account + token. As the token approaches expiration, + the kubelet volume plugin will proactively + rotate the service account token. The kubelet + will start trying to rotate the token if + the token is older than 80 percent of its + time to live or if the token is older than + 24 hours.Defaults to 1 hour and must be + at least 10 minutes. + type: number + required: + - path + defaultMode: + description: Mode bits to use on created files by default. + Must be a value between 0 and 0777. Directories within + the path are not affected by this setting. This might + be in conflict with other options that affect the + file mode, like fsGroup, and the result can be other + mode bits set. + type: number + required: + - sources + cephfs: + description: Represents a Ceph Filesystem mount that lasts + the lifetime of a pod Cephfs volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + path: + description: 'Optional: Used as the mounted root, rather + than the full Ceph tree, default is /' + type: string + secretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + secretFile: + description: 'Optional: SecretFile is the path to key + ring for User, default is /etc/ceph/user.secret More + info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + user: + description: 'Optional: User is the rados user name, + default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + monitors: + description: 'Required: Monitors is a collection of + Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: + type: string + required: + - monitors + scaleIO: + description: ScaleIOVolumeSource represents a persistent + ScaleIO volume + type: object + properties: + system: + description: The name of the storage system as configured + in ScaleIO. + type: string + protectionDomain: + description: The name of the ScaleIO Protection Domain + for the configured storage. + type: string + sslEnabled: + description: Flag to enable/disable SSL communication + with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for a volume + should be ThickProvisioned or ThinProvisioned. Default + is ThinProvisioned. + type: string + volumeName: + description: The name of a volume already created in + the ScaleIO system that is associated with this volume + source. + type: string + secretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. "ext4", + "xfs", "ntfs". Default is "xfs". + type: string + storagePool: + description: The ScaleIO Storage Pool associated with + the protection domain. + type: string + gateway: + description: The host address of the ScaleIO API Gateway. + type: string + required: + - gateway + - secretRef + - system + emptyDir: + description: Represents an empty directory for a pod. Empty + directory volumes support ownership management and SELinux + relabeling. + type: object + properties: + sizeLimit: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and AsInt64() + accessors. The serialization format is: ::= + (Note that may be + empty, from the "" case in .) ::= + 0 | 1 | ... | 9 ::= | + ::= | . + | . | . ::= "+" + | "-" ::= | + ::= | + | ::= Ki | Mi | Gi | + Ti | Pi | Ei (International System of units; See: + http://physics.nist.gov/cuu/Units/binary.html) ::= + m | "" | k | M | G | T | P | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms is used, + no quantity may represent a number greater than 2^63-1 + in magnitude, nor may it have more than 3 decimal + places. Numbers larger or more precise will be capped + or rounded up. (E.g.: 0.1m will rounded up to 1m.) + This may be extended in the future if we require larger + or smaller quantities. When a Quantity is parsed + from a string, it will remember the type of suffix + it had, and will use the same type again when it is + serialized. Before serializing, Quantity will be + put in "canonical form". This means that Exponent/suffix + will be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such that: a. + No precision is lost b. No fractional digits will + be emitted c. The exponent (or suffix) is as large + as possible. The sign will be omitted unless the number + is negative. Examples: 1.5 will be serialized as + "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole point + of this exercise. Non-canonical values will still + parse as long as they are well formed, but will be + re-emitted in their canonical form. (So always use + canonical form, or don''t diff.) This format is intended + to make it difficult to use these numbers without + writing some sort of special handling code in the + hopes that that will cause implementors to also use + a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + medium: + description: 'What type of storage medium should back + this directory. The default is "" which means to use + the node''s default medium. Must be an empty string + (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: string + glusterfs: + description: Represents a Glusterfs mount that lasts the + lifetime of a pod. Glusterfs volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + path: + description: 'Path is the Glusterfs volume path. More + info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + endpoints: + description: 'EndpointsName is the endpoint name that + details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs + volume to be mounted with read-only permissions. Defaults + to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + required: + - endpoints + - path + gcePersistentDisk: + description: Represents a Persistent Disk resource in Google + Compute Engine. A GCE PD must exist before mounting to + a container. The disk must also be in the same GCE project + and zone as the kubelet. A GCE PD can only be mounted + as read/write once or read-only many times. GCE PDs support + ownership management and SELinux relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that you want + to mount. If omitted, the default is to mount by volume + name. Examples: For volume /dev/sda1, you specify + the partition as "1". Similarly, the volume partition + for /dev/sda is "0" (or you can leave the property + empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: number + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. More info: + https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + pdName: + description: 'Unique name of the PD resource in GCE. + Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + fsType: + description: 'Filesystem type of the volume that you + want to mount. Tip: Ensure that the filesystem type + is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + required: + - pdName + photonPersistentDisk: + description: Represents a Photon Controller persistent disk + resource. + type: object + properties: + pdID: + description: ID that identifies Photon Controller persistent + disk + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. "ext4", + "xfs", "ntfs". Implicitly inferred to be "ext4" if + unspecified. + type: string + required: + - pdID + azureDisk: + description: AzureDisk represents an Azure Data Disk mount + on the host and bind mount to the pod. + type: object + properties: + diskName: + description: The Name of the data disk in the blob storage + type: string + kind: + description: 'Expected values Shared: multiple blob + disks per storage account Dedicated: single blob + disk per storage account Managed: azure managed data + disk (only in managed availability set). defaults + to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + cachingMode: + description: 'Host Caching mode: None, Read Only, Read + Write.' + type: string + diskURI: + description: The URI the data disk in the blob storage + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. "ext4", + "xfs", "ntfs". Implicitly inferred to be "ext4" if + unspecified. + type: string + required: + - diskName + - diskURI + cinder: + description: Represents a cinder volume resource in Openstack. + A Cinder volume must exist before mounting to a container. + The volume must also be in the same region as the kubelet. + Cinder volumes support ownership management and SELinux + relabeling. + type: object + properties: + secretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + volumeID: + description: 'volume id used to identify the volume + in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + fsType: + description: 'Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + required: + - volumeID + downwardAPI: + description: DownwardAPIVolumeSource represents a volume + containing downward API info. Downward API volumes support + ownership management and SELinux relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 and 0777. + Defaults to 0644. Directories within the path are + not affected by this setting. This might be in conflict + with other options that affect the file mode, like + fsGroup, and the result can be other mode bits set.' + type: number + items: + description: Items is a list of downward API volume + file + type: array + items: + description: DownwardAPIVolumeFile represents information + to create the file containing the pod field + type: object + properties: + mode: + description: 'Optional: mode bits to use on this + file, must be a value between 0 and 0777. If + not specified, the volume defaultMode will be + used. This might be in conflict with other options + that affect the file mode, like fsGroup, and + the result can be other mode bits set.' + type: number + path: + description: 'Required: Path is the relative + path name of the file to be created. Must not + be absolute or contain the ''..'' path. Must + be utf-8 encoded. The first item of the relative + path must not start with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" | + "-" ::= | + ::= | + | ::= Ki | + Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G + | T | P | E (Note that 1024 = 1Ki but + 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No matter which of + the three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be + extended in the future if we require larger + or smaller quantities. When a Quantity + is parsed from a string, it will remember + the type of suffix it had, and will use + the same type again when it is serialized. Before + serializing, Quantity will be put in "canonical + form". This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. The + sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as + "1536Mi" Note that the quantity will NEVER + be internally represented by a floating + point number. That is the whole point of + this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or + don''t diff.) This format is intended to + make it difficult to use these numbers without + writing some sort of special handling code + in the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required for + volumes, optional for env vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector selects an APIVersioned + field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in + the specified API version. + type: string + required: + - fieldPath + required: + - path + awsElasticBlockStore: + description: Represents a Persistent Disk resource in AWS. An + AWS EBS disk must exist before mounting to a container. + The disk must also be in the same AWS zone as the kubelet. + An AWS EBS disk can only be mounted as read/write once. + AWS EBS volumes support ownership management and SELinux + relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that you want + to mount. If omitted, the default is to mount by volume + name. Examples: For volume /dev/sda1, you specify + the partition as "1". Similarly, the volume partition + for /dev/sda is "0" (or you can leave the property + empty).' + type: number + volumeID: + description: 'Unique ID of the persistent disk resource + in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + readOnly: + description: 'Specify "true" to force and set the ReadOnly + property in VolumeMounts to "true". If omitted, the + default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + fsType: + description: 'Filesystem type of the volume that you + want to mount. Tip: Ensure that the filesystem type + is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + required: + - volumeID + flocker: + description: Represents a Flocker volume mounted by the + Flocker agent. One and only one of datasetName and datasetUUID + should be set. Flocker volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata + -> name on the dataset for Flocker should be considered + as deprecated + type: string + datasetUUID: + description: UUID of the dataset. This is unique identifier + of a Flocker dataset + type: string + iscsi: + description: Represents an ISCSI disk. ISCSI volumes can + only be mounted as read/write once. ISCSI volumes support + ownership management and SELinux relabeling. + type: object + properties: + chapAuthSession: + description: whether support iSCSI Session CHAP authentication + type: boolean + iscsiInterface: + description: iSCSI Interface Name that uses an iSCSI + transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: number + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP authentication + type: boolean + iqn: + description: Target iSCSI Qualified Name. + type: string + portals: + description: iSCSI Target Portal List. The portal is + either an IP or ip_addr:port if the port is other + than default (typically TCP ports 860 and 3260). + type: array + items: + type: string + secretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName + is specified with iscsiInterface simultaneously, new + iSCSI interface : will + be created for the connection. + type: string + readOnly: + description: ReadOnly here will force the ReadOnly setting + in VolumeMounts. Defaults to false. + type: boolean + fsType: + description: 'Filesystem type of the volume that you + want to mount. Tip: Ensure that the filesystem type + is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' + type: string + targetPortal: + description: iSCSI Target Portal. The Portal is either + an IP or ip_addr:port if the port is other than default + (typically TCP ports 860 and 3260). + type: string + required: + - iqn + - lun + - targetPortal + rbd: + description: Represents a Rados Block Device mount that + lasts the lifetime of a pod. RBD volumes support ownership + management and SELinux relabeling. + type: object + properties: + image: + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + pool: + description: 'The rados pool name. Default is rbd. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + secretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + fsType: + description: 'Filesystem type of the volume that you + want to mount. Tip: Ensure that the filesystem type + is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' + type: string + keyring: + description: 'Keyring is the path to key ring for RBDUser. + Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + user: + description: 'The rados user name. Default is admin. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: + type: string + required: + - image + - monitors + configMap: + description: Adapts a ConfigMap into a volume. The contents + of the target ConfigMap's Data field will be presented + in a volume as files using the keys in the Data field + as the file names, unless the items element is populated + with specific mappings of keys to paths. ConfigMap volumes + support ownership management and SELinux relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 and 0777. + Defaults to 0644. Directories within the path are + not affected by this setting. This might be in conflict + with other options that affect the file mode, like + fsGroup, and the result can be other mode bits set.' + type: number + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap or its keys + must be defined + type: boolean + items: + description: If unspecified, each key-value pair in + the Data field of the referenced ConfigMap will be + projected into the volume as a file whose name is + the key and content is the value. If specified, the + listed keys will be projected into the specified paths, + and unlisted keys will not be present. If a key is + specified which is not present in the ConfigMap, the + volume setup will error unless it is marked optional. + Paths must be relative and may not contain the '..' + path or start with '..'. + type: array + items: + description: Maps a string key to a path within a + volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use on this + file, must be a value between 0 and 0777. If + not specified, the volume defaultMode will be + used. This might be in conflict with other options + that affect the file mode, like fsGroup, and + the result can be other mode bits set.' + type: number + path: + description: The relative path of the file to + map the key to. May not be an absolute path. + May not contain the path element '..'. May not + start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + storageos: + description: Represents a StorageOS persistent volume resource. + type: object + properties: + volumeNamespace: + description: VolumeNamespace specifies the scope of + the volume within StorageOS. If no namespace is specified + then the Pod's namespace will be used. This allows + the Kubernetes name scoping to be mirrored within + StorageOS for tighter integration. Set VolumeName + to any name to override the default behaviour. Set + to "default" if you are not using namespaces within + StorageOS. Namespaces that do not pre-exist within + StorageOS will be created. + type: string + volumeName: + description: VolumeName is the human-readable name of + the StorageOS volume. Volume names are only unique + within a namespace. + type: string + secretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. "ext4", + "xfs", "ntfs". Implicitly inferred to be "ext4" if + unspecified. + type: string + csi: + description: Represents a source location of a volume to + mount, managed by an external CSI driver + type: object + properties: + driver: + description: Driver is the name of the CSI driver that + handles this volume. Consult with your admin for the + correct name as registered in the cluster. + type: string + nodePublishSecretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Specifies a read-only configuration for + the volume. Defaults to false (read/write). + type: boolean + fsType: + description: Filesystem type to mount. Ex. "ext4", "xfs", + "ntfs". If not provided, the empty value is passed + to the associated CSI driver which will determine + the default filesystem to apply. + type: string + volumeAttributes: + description: VolumeAttributes stores driver-specific + properties that are passed to the CSI driver. Consult + your driver's documentation for supported values. + additionalProperties: + type: string + type: object + required: + - driver + name: + description: 'Volume''s name. Must be a DNS_LABEL and unique + within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: Represents an NFS mount that lasts the lifetime + of a pod. NFS volumes do not support ownership management + or SELinux relabeling. + type: object + properties: + path: + description: 'Path that is exported by the NFS server. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + server: + description: 'Server is the hostname or IP address of + the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS export + to be mounted with read-only permissions. Defaults + to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + required: + - path + - server + persistentVolumeClaim: + description: PersistentVolumeClaimVolumeSource references + the user's PVC in the same namespace. This volume finds + the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource + is, essentially, a wrapper around another type of volume + that is owned by someone else (the system). + type: object + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim + in the same namespace as the pod using this volume. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in VolumeMounts. + Default false. + type: boolean + required: + - claimName + gitRepo: + description: 'Represents a volume that is populated with + the contents of a git repository. Git repo volumes do + not support ownership management. Git repo volumes support + SELinux relabeling. DEPRECATED: GitRepo is deprecated. + To provision a container with a git repo, mount an EmptyDir + into an InitContainer that clones the repo using git, + then mount the EmptyDir into the Pod''s container.' + type: object + properties: + repository: + description: Repository URL + type: string + directory: + description: Target directory name. Must not contain + or start with '..'. If '.' is supplied, the volume + directory will be the git repository. Otherwise, + if specified, the volume will contain the git repository + in the subdirectory with the given name. + type: string + revision: + description: Commit hash for the specified revision. + type: string + required: + - repository + portworxVolume: + description: PortworxVolumeSource represents a Portworx + volume resource. + type: object + properties: + volumeID: + description: VolumeID uniquely identifies a Portworx + volume + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: FSType represents the filesystem type to + mount Must be a filesystem type supported by the host + operating system. Ex. "ext4", "xfs". Implicitly inferred + to be "ext4" if unspecified. + type: string + required: + - volumeID + vsphereVolume: + description: Represents a vSphere volume resource. + type: object + properties: + storagePolicyName: + description: Storage Policy Based Management (SPBM) + profile name. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) + profile ID associated with the StoragePolicyName. + type: string + volumePath: + description: Path that identifies vSphere volume vmdk + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. "ext4", + "xfs", "ntfs". Implicitly inferred to be "ext4" if + unspecified. + type: string + required: + - volumePath + fc: + description: Represents a Fibre Channel volume. Fibre Channel + volumes can only be mounted as read/write once. Fibre + Channel volumes support ownership management and SELinux + relabeling. + type: object + properties: + lun: + description: 'Optional: FC target lun number' + type: number + targetWWNs: + description: 'Optional: FC target worldwide names (WWNs)' + type: array + items: + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + wwids: + description: 'Optional: FC volume world wide identifiers + (wwids) Either wwids or combination of targetWWNs + and lun must be set, but not both simultaneously.' + type: array + items: + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. "ext4", + "xfs", "ntfs". Implicitly inferred to be "ext4" if + unspecified. + type: string + hostPath: + description: Represents a host path mapped into a pod. Host + path volumes do not support ownership management or SELinux + relabeling. + type: object + properties: + path: + description: 'Path of the directory on the host. If + the path is a symlink, it will follow the link to + the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults to "" + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + required: + - path + required: + - name + resources: + type: object + description: Memory and CPU minimum requirements and limits for + the server. + properties: + requests: + type: object + additionalProperties: + type: string + description: 'Requests describes the minimum amount of compute + resources required. If Requests is omitted for a container, + it defaults to Limits if that is explicitly specified, otherwise + to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + limits: + type: object + additionalProperties: + type: string + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + annotations: + type: object + additionalProperties: + type: string + description: The annotations to be attached to generated resources. + env: + type: array + description: A list of environment variables to add to a server. + items: + description: EnvVar represents an environment variable present + in a Container. + type: object + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded + using the previous defined environment variables in the + container and any service environment variables. If a + variable cannot be resolved, the reference in the input + string will be unchanged. The $(VAR_NAME) syntax can be + escaped with a double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether the variable + exists or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source for the value + of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key of a Secret. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents container + resources (cpu, memory) and their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and + AsInt64() accessors. The serialization format + is: ::= (Note + that may be empty, from the "" case in + .) ::= 0 | 1 | ... + | 9 ::= | + ::= | . + | . | . ::= + "+" | "-" ::= | + ::= | + | ::= Ki | Mi | + Gi | Ti | Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T | + P | E (Note that 1024 = 1Ki but 1000 = 1k; I + didn''t choose the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms is used, + no quantity may represent a number greater than + 2^63-1 in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more precise + will be capped or rounded up. (E.g.: 0.1m will + rounded up to 1m.) This may be extended in the + future if we require larger or smaller quantities. When + a Quantity is parsed from a string, it will remember + the type of suffix it had, and will use the same + type again when it is serialized. Before serializing, + Quantity will be put in "canonical form". This + means that Exponent/suffix will be adjusted up + or down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision is lost b. + No fractional digits will be emitted c. The + exponent (or suffix) is as large as possible. + The sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole + point of this exercise. Non-canonical values + will still parse as long as they are well formed, + but will be re-emitted in their canonical form. + (So always use canonical form, or don''t diff.) This + format is intended to make it difficult to use + these numbers without writing some sort of special + handling code in the hopes that that will cause + implementors to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an APIVersioned + field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + required: + - name + restartPolicy: + type: string + description: 'Restart policy for all containers within the pod. + One of Always, OnFailure, Never. Default to Always. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + nodeSelector: + type: object + additionalProperties: + type: string + description: Selector which must match a node's labels for the + pod to be scheduled on that node. + volumeMounts: + type: array + description: Additional volume mounts for the server pod. + items: + description: VolumeMount describes a mounting of a Volume within + a container. + type: object + properties: + mountPath: + description: Path within the container at which the volume + should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are + propagated from the host to container and the other way + around. When not set, MountPropagationNone is used. This + field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise + (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's + volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which + the container's volume should be mounted. Behaves similarly + to SubPath but environment variable references $(VAR_NAME) + are expanded using the container's environment. Defaults + to "" (volume's root). SubPathExpr and SubPath are mutually + exclusive. This field is beta in 1.15. + type: string + required: + - mountPath + - name + labels: + type: object + additionalProperties: + type: string + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + runtimeClassName: + type: string + description: 'RuntimeClassName refers to a RuntimeClass object + in the node.k8s.io group, which should be used to run this pod. If + no RuntimeClass resource matches the named class, the pod will + not be run. If unset or empty, the "legacy" RuntimeClass will + be used, which is an implicit class with an empty definition + that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future.' + tolerations: + type: array + description: If specified, the pod's tolerations. + items: + description: The pod this Toleration is attached to tolerates + any taint that matches the triple using + the matching operator . + type: object + properties: + effect: + description: Effect indicates the taint effect to match. + Empty means match all taint effects. When specified, allowed + values are NoSchedule, PreferNoSchedule and NoExecute. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of + time the toleration (which must be of effect NoExecute, + otherwise this field is ignored) tolerates the taint. + By default, it is not set, which means tolerate the taint + forever (do not evict). Zero and negative values will + be treated as 0 (evict immediately) by the system. + type: number + value: + description: Value is the taint value the toleration matches + to. If the operator is Exists, the value should be empty, + otherwise just a regular string. + type: string + key: + description: Key is the taint key that the toleration applies + to. Empty means match all taint keys. If the key is empty, + operator must be Exists; this combination means to match + all values and all keys. + type: string + operator: + description: Operator represents a key's relationship to + the value. Valid operators are Exists and Equal. Defaults + to Equal. Exists is equivalent to wildcard for value, + so that a pod can tolerate all taints of a particular + category. + type: string + readinessProbe: + type: object + description: Settings for the readiness probe associated with + a server. + properties: + periodSeconds: + type: number + description: The number of seconds between checks. + timeoutSeconds: + type: number + description: The number of seconds with no response that indicates + a failure. + initialDelaySeconds: + type: number + description: The number of seconds before the first check + is performed. + containers: + type: array + description: Additional containers to be included in the server + pod. + items: + description: A single application container that you want to + run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of a raw + block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of the + container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config management + to default or override container images in workload controllers + like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. + Defaults to Always if :latest tag is specified, or IfNotPresent + otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive or + ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action based + on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum + value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. The command is simply exec'd, it is + not run inside a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you need + to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is + unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate a buffer + for stdin in the container runtime. If this is not set, + reads from stdin in the container will always result in + EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message should + be populated. File will use the contents of terminationMessagePath + to populate the container status message on both success + and failure. FallbackToLogsOnError will use the last chunk + of container log output if the termination message file + is empty and the container exited with an error. The log + output is limited to 2048 bytes or 80 lines, whichever + is smaller. Defaults to File. Cannot be updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to which + the container''s termination message will be written is + mounted into the container''s filesystem. Message written + is intended to be brief final status, such as an assertion + failure message. Will be truncated by the node if greater + than 4096 bytes. The total message length across all containers + will be limited to 12kb. Defaults to /dev/termination-log. + Cannot be updated.' + type: string + workingDir: + description: Container's working directory. If not specified, + the container runtime's default will be used, which might + be configured in the container image. Cannot be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is omitted + for a container, it defaults to Limits if that is + explicitly specified, otherwise to an implementation-defined + value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount of + compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields are present + in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities from + running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to be applied + to the container + type: object + properties: + role: + description: Role is a SELinux role label that applies + to the container. + type: string + level: + description: Level is SELinux level label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + This field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + procMount: + description: procMount denotes the type of proc mount + to use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. This requires the ProcMountType + feature flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether + a process can gain more privileges than its parent + process. This bool directly controls if the no_new_privs + flag will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if + it does. If unset or false, no such validation will + be performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive or + ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action based + on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum + value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. The command is simply exec'd, it is + not run inside a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you need + to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is + unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set in the + container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. Must + be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are + expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source for + the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key of + a Secret. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" | + "-" ::= | + ::= | + | ::= Ki | + Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G + | T | P | E (Note that 1024 = 1Ki but + 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No matter which of + the three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be + extended in the future if we require larger + or smaller quantities. When a Quantity + is parsed from a string, it will remember + the type of suffix it had, and will use + the same type again when it is serialized. Before + serializing, Quantity will be put in "canonical + form". This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. The + sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as + "1536Mi" Note that the quantity will NEVER + be internally represented by a floating + point number. That is the whole point of + this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or + don''t diff.) This format is intended to + make it difficult to use these numbers without + writing some sort of special handling code + in the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required for + volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an APIVersioned + field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in + the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional information + about the network connections a container uses, but is + primarily informational. Not specifying a port here DOES + NOT prevent that port from being exposed. Any port which + is listening on the default "0.0.0.0" address inside a + container will be accessible from the network. Cannot + be updated. + type: array + items: + description: ContainerPort represents a network port in + a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, TCP, + or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external port + to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port in a + pod must have a unique name. Name for the port that + can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the pod's + IP address. This must be a valid port number, 0 + < x < 65536. + type: number + hostPort: + description: Number of port to expose on the host. + If specified, this must be a valid port number, + 0 < x < 65536. If HostNetwork is specified, this + must match ContainerPort. Most containers do not + need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within a shell. + The docker image''s ENTRYPOINT is used if this is not + provided. Variable references $(VAR_NAME) are expanded + using the container''s environment. If a variable cannot + be resolved, the reference in the input string will be + unchanged. The $(VAR_NAME) syntax can be escaped with + a double $$, ie: $$(VAR_NAME). Escaped references will + never be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. + Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume + within a container. + type: object + properties: + mountPath: + description: Path within the container at which the + volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and the + other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the + container's volume should be mounted. Defaults to + "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment variable + references $(VAR_NAME) are expanded using the container's + environment. Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field is + beta in 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker image''s + CMD is used if this is not provided. Variable references + $(VAR_NAME) are expanded using the container''s environment. + If a variable cannot be resolved, the reference in the + input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). Escaped + references will never be expanded, regardless of whether + the variable exists or not. Cannot be updated. More info: + https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the management + system should take in response to container lifecycle + events. For the PostStart and PreStop lifecycle handlers, + management of the container blocks until the action is + complete, unless the container process fails, in which + case the handler is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a DNS_LABEL. + Each container in a pod must have a unique name (DNS_LABEL). + Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY + for itself, also requires 'stdin' to be true. Default + is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive or + ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action based + on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum + value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. The command is simply exec'd, it is + not run inside a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you need + to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is + unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should close + the stdin channel after it has been opened by a single + attach. When stdin is true the stdin stream will remain + open across multiple attach sessions. If stdinOnce is + set to true, stdin is opened on container start, is empty + until the first client attaches to stdin, and then remains + open and accepts data until the client disconnects, at + which time stdin is closed and remains closed until the + container is restarted. If this flag is false, a container + processes that reads from stdin will never receive an + EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment variables + in the container. The keys defined within a source must + be a C_IDENTIFIER. All invalid keys will be reported as + an event when the container is starting. When a key exists + in multiple sources, the value associated with the last + source will take precedence. Values defined by an Env + with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a + set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field will + represent the key-value pairs as environment variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap must + be defined + type: boolean + prefix: + description: An optional identifier to prepend to + each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret to populate + the environment variables with. The contents of + the target Secret's Data field will represent the + key-value pairs as environment variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret must be + defined + type: boolean + required: + - name + containerSecurityContext: + type: object + description: Container-level security attributes. Will override + any matching pod-level attributes. + properties: + privileged: + type: boolean + description: Run container in privileged mode. Processes in + privileged containers are essentially equivalent to root + on the host. Defaults to false. + runAsUser: + type: number + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata if + unspecified. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. + capabilities: + type: object + description: Adds and removes POSIX capabilities from running + containers. + properties: + add: + type: array + description: Added capabilities + items: + type: string + drop: + type: array + description: Removed capabilities + items: + type: string + seLinuxOptions: + type: object + description: SELinuxOptions are the labels to be applied to + the container + properties: + role: + type: string + description: Role is a SELinux role label that applies + to the container. + level: + type: string + description: Level is SELinux level label that applies + to the container. + type: + type: string + description: Type is a SELinux type label that applies + to the container. + user: + type: string + description: User is a SELinux user label that applies + to the container. + windowsOptions: + type: object + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + properties: + gmsaCredentialSpec: + type: string + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named + by the GMSACredentialSpecName field. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. + runAsUserName: + type: string + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set in + PodSecurityContext. If set in both SecurityContext and + PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and it is + only honored by servers that enable the WindowsRunAsUserName + feature flag. + gmsaCredentialSpecName: + type: string + description: GMSACredentialSpecName is the name of the + GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. + procMount: + type: string + description: procMount denotes the type of proc mount to use + for the containers. The default is DefaultProcMount which + uses the container runtime defaults for readonly paths and + masked paths. This requires the ProcMountType feature flag + to be enabled. + allowPrivilegeEscalation: + type: boolean + description: 'AllowPrivilegeEscalation controls whether a + process can gain more privileges than its parent process. + This bool directly controls if the no_new_privs flag will + be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' + runAsGroup: + type: number + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be set + in PodSecurityContext. If set in both SecurityContext and + PodSecurityContext, the value specified in SecurityContext + takes precedence. + runAsNonRoot: + type: boolean + description: Indicates that the container must run as a non-root + user. If true, the Kubelet will validate the image at runtime + to ensure that it does not run as UID 0 (root) and fail + to start the container if it does. If unset or false, no + such validation will be performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. + readOnlyRootFilesystem: + type: boolean + description: Whether this container has a read-only root filesystem. + Default is false. + schedulerName: + type: string + description: If specified, the pod will be dispatched by specified + scheduler. If not specified, the pod will be dispatched by default + scheduler. + initContainers: + type: array + description: Initialization containers to be included in the server + pod. + items: + description: A single application container that you want to + run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of a raw + block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of the + container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config management + to default or override container images in workload controllers + like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. + Defaults to Always if :latest tag is specified, or IfNotPresent + otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive or + ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action based + on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum + value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. The command is simply exec'd, it is + not run inside a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you need + to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is + unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate a buffer + for stdin in the container runtime. If this is not set, + reads from stdin in the container will always result in + EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message should + be populated. File will use the contents of terminationMessagePath + to populate the container status message on both success + and failure. FallbackToLogsOnError will use the last chunk + of container log output if the termination message file + is empty and the container exited with an error. The log + output is limited to 2048 bytes or 80 lines, whichever + is smaller. Defaults to File. Cannot be updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to which + the container''s termination message will be written is + mounted into the container''s filesystem. Message written + is intended to be brief final status, such as an assertion + failure message. Will be truncated by the node if greater + than 4096 bytes. The total message length across all containers + will be limited to 12kb. Defaults to /dev/termination-log. + Cannot be updated.' + type: string + workingDir: + description: Container's working directory. If not specified, + the container runtime's default will be used, which might + be configured in the container image. Cannot be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is omitted + for a container, it defaults to Limits if that is + explicitly specified, otherwise to an implementation-defined + value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount of + compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields are present + in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities from + running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to be applied + to the container + type: object + properties: + role: + description: Role is a SELinux role label that applies + to the container. + type: string + level: + description: Level is SELinux level label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + This field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + procMount: + description: procMount denotes the type of proc mount + to use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. This requires the ProcMountType + feature flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether + a process can gain more privileges than its parent + process. This bool directly controls if the no_new_privs + flag will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if + it does. If unset or false, no such validation will + be performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive or + ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action based + on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum + value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. The command is simply exec'd, it is + not run inside a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you need + to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is + unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set in the + container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. Must + be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are + expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source for + the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key of + a Secret. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" | + "-" ::= | + ::= | + | ::= Ki | + Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G + | T | P | E (Note that 1024 = 1Ki but + 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No matter which of + the three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be + extended in the future if we require larger + or smaller quantities. When a Quantity + is parsed from a string, it will remember + the type of suffix it had, and will use + the same type again when it is serialized. Before + serializing, Quantity will be put in "canonical + form". This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. The + sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as + "1536Mi" Note that the quantity will NEVER + be internally represented by a floating + point number. That is the whole point of + this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or + don''t diff.) This format is intended to + make it difficult to use these numbers without + writing some sort of special handling code + in the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required for + volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an APIVersioned + field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in + the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional information + about the network connections a container uses, but is + primarily informational. Not specifying a port here DOES + NOT prevent that port from being exposed. Any port which + is listening on the default "0.0.0.0" address inside a + container will be accessible from the network. Cannot + be updated. + type: array + items: + description: ContainerPort represents a network port in + a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, TCP, + or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external port + to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port in a + pod must have a unique name. Name for the port that + can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the pod's + IP address. This must be a valid port number, 0 + < x < 65536. + type: number + hostPort: + description: Number of port to expose on the host. + If specified, this must be a valid port number, + 0 < x < 65536. If HostNetwork is specified, this + must match ContainerPort. Most containers do not + need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within a shell. + The docker image''s ENTRYPOINT is used if this is not + provided. Variable references $(VAR_NAME) are expanded + using the container''s environment. If a variable cannot + be resolved, the reference in the input string will be + unchanged. The $(VAR_NAME) syntax can be escaped with + a double $$, ie: $$(VAR_NAME). Escaped references will + never be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. + Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume + within a container. + type: object + properties: + mountPath: + description: Path within the container at which the + volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and the + other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the + container's volume should be mounted. Defaults to + "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment variable + references $(VAR_NAME) are expanded using the container's + environment. Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field is + beta in 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker image''s + CMD is used if this is not provided. Variable references + $(VAR_NAME) are expanded using the container''s environment. + If a variable cannot be resolved, the reference in the + input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). Escaped + references will never be expanded, regardless of whether + the variable exists or not. Cannot be updated. More info: + https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the management + system should take in response to container lifecycle + events. For the PostStart and PreStop lifecycle handlers, + management of the container blocks until the action is + complete, unless the container process fails, in which + case the handler is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a DNS_LABEL. + Each container in a pod must have a unique name (DNS_LABEL). + Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY + for itself, also requires 'stdin' to be true. Default + is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive or + ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action based + on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum + value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. The command is simply exec'd, it is + not run inside a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you need + to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is + unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should close + the stdin channel after it has been opened by a single + attach. When stdin is true the stdin stream will remain + open across multiple attach sessions. If stdinOnce is + set to true, stdin is opened on container start, is empty + until the first client attaches to stdin, and then remains + open and accepts data until the client disconnects, at + which time stdin is closed and remains closed until the + container is restarted. If this flag is false, a container + processes that reads from stdin will never receive an + EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment variables + in the container. The keys defined within a source must + be a C_IDENTIFIER. All invalid keys will be reported as + an event when the container is starting. When a key exists + in multiple sources, the value associated with the last + source will take precedence. Values defined by an Env + with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a + set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field will + represent the key-value pairs as environment variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap must + be defined + type: boolean + prefix: + description: An optional identifier to prepend to + each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret to populate + the environment variables with. The contents of + the target Secret's Data field will represent the + key-value pairs as environment variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret must be + defined + type: boolean + required: + - name + shutdown: + type: object + description: Configures how the operator should shutdown the server + instance. + properties: + ignoreSessions: + type: boolean + description: For graceful shutdown only, indicates to ignore + pending HTTP sessions during in-flight work handling. Not + required. Defaults to false. + shutdownType: + type: string + description: Tells the operator how to shutdown server instances. + Not required. Defaults to graceful shutdown. + enum: + - Graceful + - Forced + timeoutSeconds: + type: number + description: For graceful shutdown only, number of seconds + to wait before aborting in-flight work and shutting down + the server. Not required. Defaults to 30 seconds. + affinity: + type: object + description: If specified, the pod's scheduling constraints + properties: + nodeAffinity: + type: object + description: Node affinity is a group of node affinity scheduling + rules. + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: object + description: A node selector represents the union of the + results of one or more label queries over a set of nodes; + that is, it represents the OR of the selectors represented + by the node selector terms. + properties: + nodeSelectorTerms: + type: array + description: Required. A list of node selector terms. + The terms are ORed. + items: + description: A null or empty node selector term + matches no objects. The requirements of them are + ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement is + a selector that contains values, a key, + and an operator that relates the key and + values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If the + operator is Exists or DoesNotExist, + the values array must be empty. If the + operator is Gt or Lt, the values array + must have a single element, which will + be interpreted as an integer. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement is + a selector that contains values, a key, + and an operator that relates the key and + values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If the + operator is Exists or DoesNotExist, + the values array must be empty. If the + operator is Gt or Lt, the values array + must have a single element, which will + be interpreted as an integer. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + required: + - nodeSelectorTerms + preferredDuringSchedulingIgnoredDuringExecution: + type: array + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node matches the corresponding matchExpressions; + the node(s) with the highest sum are the most preferred. + items: + description: An empty preferred scheduling term matches + all objects with implicit weight 0 (i.e. it's a no-op). + A null preferred scheduling term matches no objects + (i.e. is also a no-op). + type: object + properties: + preference: + description: A null or empty node selector term + matches no objects. The requirements of them are + ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement is + a selector that contains values, a key, + and an operator that relates the key and + values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If the + operator is Exists or DoesNotExist, + the values array must be empty. If the + operator is Gt or Lt, the values array + must have a single element, which will + be interpreted as an integer. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement is + a selector that contains values, a key, + and an operator that relates the key and + values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If the + operator is Exists or DoesNotExist, + the values array must be empty. If the + operator is Gt or Lt, the values array + must have a single element, which will + be interpreted as an integer. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + weight: + description: Weight associated with matching the + corresponding nodeSelectorTerm, in the range 1-100. + type: number + required: + - preference + - weight + podAffinity: + type: object + description: Pod affinity is a group of inter pod affinity + scheduling rules. + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + description: If the affinity requirements specified by + this field are not met at scheduling time, the pod will + not be scheduled onto the node. If the affinity requirements + specified by this field cease to be met at some point + during pod execution (e.g. due to a pod label update), + the system may or may not try to eventually evict the + pod from its node. When there are multiple elements, + the lists of nodes corresponding to each podAffinityTerm + are intersected, i.e. all terms must be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or not + co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any node + on which a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query over + a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label selector + matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + type: object + properties: + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only "value". + The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified namespaces, + where co-located is defined as running on a node + whose value of the label with key topologyKey + matches that of any node on which any of the selected + pods is running. Empty topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node has pods which matches the corresponding + podAffinityTerm; the node(s) with the highest sum are + the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node + whose value of the label with key + matches that of any node on which a pod of the + set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label + selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The requirements + are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the + pods matching the labelSelector in the specified + namespaces, where co-located is defined as + running on a node whose value of the label + with key topologyKey matches that of any node + on which any of the selected pods is running. + Empty topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching the + corresponding podAffinityTerm, in the range 1-100. + type: number + required: + - podAffinityTerm + - weight + podAntiAffinity: + type: object + description: Pod anti affinity is a group of inter pod anti + affinity scheduling rules. + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + description: If the anti-affinity requirements specified + by this field are not met at scheduling time, the pod + will not be scheduled onto the node. If the anti-affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a pod + label update), the system may or may not try to eventually + evict the pod from its node. When there are multiple + elements, the lists of nodes corresponding to each podAffinityTerm + are intersected, i.e. all terms must be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or not + co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any node + on which a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query over + a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label selector + matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + type: object + properties: + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only "value". + The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified namespaces, + where co-located is defined as running on a node + whose value of the label with key topologyKey + matches that of any node on which any of the selected + pods is running. Empty topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + description: The scheduler will prefer to schedule pods + to nodes that satisfy the anti-affinity expressions + specified by this field, but it may choose a node that + violates one or more of the expressions. The node that + is most preferred is the one with the greatest sum of + weights, i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + anti-affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node has pods which matches the corresponding + podAffinityTerm; the node(s) with the highest sum are + the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node + whose value of the label with key + matches that of any node on which a pod of the + set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label + selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The requirements + are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the + pods matching the labelSelector in the specified + namespaces, where co-located is defined as + running on a node whose value of the label + with key topologyKey matches that of any node + on which any of the selected pods is running. + Empty topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching the + corresponding podAffinityTerm, in the range 1-100. + type: number + required: + - podAffinityTerm + - weight + logHome: + type: string + description: The in-pod name of the directory in which to store the + domain, Node Manager, server logs, and server *.out files + includeServerOutInPodLog: + type: boolean + description: If true (the default), then the server .out file will + be included in the pod's stdout. + managedServers: + type: array + description: Configuration for individual Managed Servers. + items: + description: ManagedServer represents the operator configuration + for a single Managed Server. + type: object + properties: + serverStartState: + description: The state in which the server is to be started. + Use ADMIN if server should start in the admin state. Defaults + to RUNNING. + type: string + enum: + - RUNNING + - ADMIN + serverService: + description: Customization affecting ClusterIP Kubernetes services + for WebLogic Server instances. + type: object + properties: + precreateService: + description: If true, operator will create server services + even for server instances without running pods. + type: boolean + annotations: + description: The annotations to be attached to generated + resources. + additionalProperties: + type: string + type: object + labels: + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + additionalProperties: + type: string + type: object + serverName: + description: The name of the Managed Server. Required. + type: string + serverPod: + description: Configuration affecting server pods. + type: object + properties: + nodeName: + description: NodeName is a request to schedule this pod + onto a specific node. If it is non-empty, the scheduler + simply schedules this pod onto that node, assuming that + it fits resource requirements. + type: string + livenessProbe: + description: Settings for the liveness probe associated + with a server. + type: object + properties: + periodSeconds: + description: The number of seconds between checks. + type: number + timeoutSeconds: + description: The number of seconds with no response + that indicates a failure. + type: number + initialDelaySeconds: + description: The number of seconds before the first + check is performed. + type: number + readinessGates: + description: 'If specified, all readiness gates will be + evaluated for pod readiness. A pod is ready when all its + containers are ready AND all conditions specified in the + readiness gates have status equal to "True" More info: + https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + type: array + items: + description: PodReadinessGate contains the reference to + a pod condition + type: object + properties: + conditionType: + description: ConditionType refers to a condition in + the pod's condition list with matching type. + type: string + required: + - conditionType + serviceAccountName: + description: Name of the ServiceAccount to be used to run + this pod. If it is not set, default ServiceAccount will + be used. The ServiceAccount has to exist at the time the + pod is created. + type: string + podSecurityContext: + description: Pod-level security attributes. + type: object + properties: + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence + for that container. + type: number + seLinuxOptions: + description: SELinuxOptions are the labels to be applied + to the container + type: object + properties: + role: + description: Role is a SELinux role label that applies + to the container. + type: string + level: + description: Level is SELinux level label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + fsGroup: + description: 'A special supplemental group that applies + to all containers in a pod. Some volume types allow + the Kubelet to change the ownership of that volume + to be owned by the pod: 1. The owning GID will be + the FSGroup 2. The setgid bit is set (new files created + in the volume will be owned by FSGroup) 3. The permission + bits are OR''d with rw-rw---- If unset, the Kubelet + will not modify the ownership and permissions of any + volume.' + type: number + windowsOptions: + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + This field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + supplementalGroups: + description: A list of groups applied to the first process + run in each container, in addition to the container's + primary GID. If unspecified, no groups will be added + to any container. + type: array + items: + type: number + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in SecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence for that container. + type: number + runAsNonRoot: + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if + it does. If unset or false, no such validation will + be performed. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: boolean + sysctls: + description: Sysctls hold a list of namespaced sysctls + used for the pod. Pods with unsupported sysctls (by + the container runtime) might fail to launch. + type: array + items: + description: Sysctl defines a kernel parameter to + be set + type: object + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + priorityClassName: + description: If specified, indicates the pod's priority. + "system-node-critical" and "system-cluster-critical" are + two special keywords which indicate the highest priorities + with the former being the highest priority. Any other + name must be defined by creating a PriorityClass object + with that name. If not specified, the pod priority will + be default or zero if there is no default. + type: string + volumes: + description: Additional volumes to be created in the server + pod. + type: array + items: + description: Volume represents a named volume in a pod + that may be accessed by any container in the pod. + type: object + properties: + quobyte: + description: Represents a Quobyte mount that lasts + the lifetime of a pod. Quobyte volumes do not support + ownership management or SELinux relabeling. + type: object + properties: + volume: + description: Volume is a string that references + an already created Quobyte volume by name. + type: string + registry: + description: Registry represents a single or multiple + Quobyte Registry services specified as a string + as host:port pair (multiple entries are separated + with commas) which acts as the central registry + for volumes + type: string + readOnly: + description: ReadOnly here will force the Quobyte + volume to be mounted with read-only permissions. + Defaults to false. + type: boolean + user: + description: User to map volume access to Defaults + to serivceaccount user + type: string + tenant: + description: Tenant owning the given Quobyte volume + in the Backend Used with dynamically provisioned + Quobyte volumes, value is set by the plugin + type: string + group: + description: Group to map volume access to Default + is no group + type: string + required: + - registry + - volume + azureFile: + description: AzureFile represents an Azure File Service + mount on the host and bind mount to the pod. + type: object + properties: + secretName: + description: the name of secret that contains + Azure Storage Account Name and Key + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + shareName: + description: Share Name + type: string + required: + - secretName + - shareName + flexVolume: + description: FlexVolume represents a generic volume + resource that is provisioned/attached using an exec + based plugin. + type: object + properties: + driver: + description: Driver is the name of the driver + to use for this volume. + type: string + options: + description: 'Optional: Extra command options + if any.' + additionalProperties: + type: string + type: object + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' + type: boolean + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". The default + filesystem depends on FlexVolume script. + type: string + required: + - driver + secret: + description: Adapts a Secret into a volume. The contents + of the target Secret's Data field will be presented + in a volume as files using the keys in the Data + field as the file names. Secret volumes support + ownership management and SELinux relabeling. + type: object + properties: + secretName: + description: 'Name of the secret in the pod''s + namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 + and 0777. Defaults to 0644. Directories within + the path are not affected by this setting. This + might be in conflict with other options that + affect the file mode, like fsGroup, and the + result can be other mode bits set.' + type: number + optional: + description: Specify whether the Secret or its + keys must be defined + type: boolean + items: + description: If unspecified, each key-value pair + in the Data field of the referenced Secret will + be projected into the volume as a file whose + name is the key and content is the value. If + specified, the listed keys will be projected + into the specified paths, and unlisted keys + will not be present. If a key is specified which + is not present in the Secret, the volume setup + will error unless it is marked optional. Paths + must be relative and may not contain the '..' + path or start with '..'. + type: array + items: + description: Maps a string key to a path within + a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might be + in conflict with other options that affect + the file mode, like fsGroup, and the result + can be other mode bits set.' + type: number + path: + description: The relative path of the file + to map the key to. May not be an absolute + path. May not contain the path element + '..'. May not start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + projected: + description: Represents a projected volume source + type: object + properties: + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected + along with other supported volume types + type: object + properties: + downwardAPI: + description: Represents downward API info + for projecting into a projected volume. + Note that this is identical to a downwardAPI + volume source without the default mode. + type: object + properties: + items: + description: Items is a list of DownwardAPIVolume + file + type: array + items: + description: DownwardAPIVolumeFile + represents information to create + the file containing the pod field + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be + a value between 0 and 0777. + If not specified, the volume + defaultMode will be used. This + might be in conflict with other + options that affect the file + mode, like fsGroup, and the + result can be other mode bits + set.' + type: number + path: + description: 'Required: Path is the + relative path name of the file + to be created. Must not be absolute + or contain the ''..'' path. + Must be utf-8 encoded. The first + item of the relative path must + not start with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector + represents container resources + (cpu, memory) and their output + format + type: object + properties: + divisor: + description: 'Quantity is + a fixed-point representation + of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition + to String() and AsInt64() + accessors. The serialization + format is: ::= + (Note + that may be empty, + from the "" case in .) + ::= 0 + | 1 | ... | 9 ::= + | + ::= + | . | . + | . ::= + "+" | "-" ::= + | + ::= + | | + ::= Ki + | Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m + | "" | k | M | G | T | P + | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t + choose the capitalization.) + ::= "e" + | "E" No + matter which of the three + exponent forms is used, + no quantity may represent + a number greater than 2^63-1 + in magnitude, nor may it + have more than 3 decimal + places. Numbers larger or + more precise will be capped + or rounded up. (E.g.: 0.1m + will rounded up to 1m.) + This may be extended in + the future if we require + larger or smaller quantities. When + a Quantity is parsed from + a string, it will remember + the type of suffix it had, + and will use the same type + again when it is serialized. Before + serializing, Quantity will + be put in "canonical form". + This means that Exponent/suffix + will be adjusted up or down + (with a corresponding increase + or decrease in Mantissa) + such that: a. No precision + is lost b. No fractional + digits will be emitted c. + The exponent (or suffix) + is as large as possible. + The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER + be internally represented + by a floating point number. + That is the whole point + of this exercise. Non-canonical + values will still parse + as long as they are well + formed, but will be re-emitted + in their canonical form. + (So always use canonical + form, or don''t diff.) This + format is intended to make + it difficult to use these + numbers without writing + some sort of special handling + code in the hopes that that + will cause implementors + to also use a fixed point + implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource + to select' + type: string + containerName: + description: 'Container name: + required for volumes, optional + for env vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector + selects an APIVersioned field + of an object. + type: object + properties: + apiVersion: + description: Version of the + schema the FieldPath is + written in terms of, defaults + to "v1". + type: string + fieldPath: + description: Path of the field + to select in the specified + API version. + type: string + required: + - fieldPath + required: + - path + configMap: + description: Adapts a ConfigMap into a projected + volume. The contents of the target ConfigMap's + Data field will be presented in a projected + volume as files using the keys in the + Data field as the file names, unless the + items element is populated with specific + mappings of keys to paths. Note that this + is identical to a configmap volume source + without the default mode. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its keys must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + ConfigMap will be projected into the + volume as a file whose name is the + key and content is the value. If specified, + the listed keys will be projected + into the specified paths, and unlisted + keys will not be present. If a key + is specified which is not present + in the ConfigMap, the volume setup + will error unless it is marked optional. + Paths must be relative and may not + contain the '..' path or start with + '..'. + type: array + items: + description: Maps a string key to + a path within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be + a value between 0 and 0777. + If not specified, the volume + defaultMode will be used. This + might be in conflict with other + options that affect the file + mode, like fsGroup, and the + result can be other mode bits + set.' + type: number + path: + description: The relative path + of the file to map the key to. + May not be an absolute path. + May not contain the path element + '..'. May not start with the + string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + secret: + description: Adapts a secret into a projected + volume. The contents of the target Secret's + Data field will be presented in a projected + volume as files using the keys in the + Data field as the file names. Note that + this is identical to a secret volume source + without the default mode. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + Secret will be projected into the + volume as a file whose name is the + key and content is the value. If specified, + the listed keys will be projected + into the specified paths, and unlisted + keys will not be present. If a key + is specified which is not present + in the Secret, the volume setup will + error unless it is marked optional. + Paths must be relative and may not + contain the '..' path or start with + '..'. + type: array + items: + description: Maps a string key to + a path within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be + a value between 0 and 0777. + If not specified, the volume + defaultMode will be used. This + might be in conflict with other + options that affect the file + mode, like fsGroup, and the + result can be other mode bits + set.' + type: number + path: + description: The relative path + of the file to map the key to. + May not be an absolute path. + May not contain the path element + '..'. May not start with the + string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + serviceAccountToken: + description: ServiceAccountTokenProjection + represents a projected service account + token volume. This projection can be used + to insert a service account token into + the pods runtime filesystem for use against + APIs (Kubernetes API Server or otherwise). + type: object + properties: + path: + description: Path is the path relative + to the mount point of the file to + project the token into. + type: string + audience: + description: Audience is the intended + audience of the token. A recipient + of a token must identify itself with + an identifier specified in the audience + of the token, and otherwise should + reject the token. The audience defaults + to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the + requested duration of validity of + the service account token. As the + token approaches expiration, the kubelet + volume plugin will proactively rotate + the service account token. The kubelet + will start trying to rotate the token + if the token is older than 80 percent + of its time to live or if the token + is older than 24 hours.Defaults to + 1 hour and must be at least 10 minutes. + type: number + required: + - path + defaultMode: + description: Mode bits to use on created files + by default. Must be a value between 0 and 0777. + Directories within the path are not affected + by this setting. This might be in conflict with + other options that affect the file mode, like + fsGroup, and the result can be other mode bits + set. + type: number + required: + - sources + cephfs: + description: Represents a Ceph Filesystem mount that + lasts the lifetime of a pod Cephfs volumes do not + support ownership management or SELinux relabeling. + type: object + properties: + path: + description: 'Optional: Used as the mounted root, + rather than the full Ceph tree, default is /' + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + secretFile: + description: 'Optional: SecretFile is the path + to key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + user: + description: 'Optional: User is the rados user + name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + monitors: + description: 'Required: Monitors is a collection + of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: + type: string + required: + - monitors + scaleIO: + description: ScaleIOVolumeSource represents a persistent + ScaleIO volume + type: object + properties: + system: + description: The name of the storage system as + configured in ScaleIO. + type: string + protectionDomain: + description: The name of the ScaleIO Protection + Domain for the configured storage. + type: string + sslEnabled: + description: Flag to enable/disable SSL communication + with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for + a volume should be ThickProvisioned or ThinProvisioned. + Default is ThinProvisioned. + type: string + volumeName: + description: The name of a volume already created + in the ScaleIO system that is associated with + this volume source. + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Default is + "xfs". + type: string + storagePool: + description: The ScaleIO Storage Pool associated + with the protection domain. + type: string + gateway: + description: The host address of the ScaleIO API + Gateway. + type: string + required: + - gateway + - secretRef + - system + emptyDir: + description: Represents an empty directory for a pod. + Empty directory volumes support ownership management + and SELinux relabeling. + type: object + properties: + sizeLimit: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and + AsInt64() accessors. The serialization format + is: ::= (Note + that may be empty, from the "" case + in .) ::= 0 | 1 + | ... | 9 ::= | + ::= | . + | . | . ::= + "+" | "-" ::= | + ::= | + | ::= Ki | Mi + | Gi | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T + | P | E (Note that 1024 = 1Ki but 1000 = 1k; + I didn''t choose the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms is + used, no quantity may represent a number greater + than 2^63-1 in magnitude, nor may it have more + than 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be extended + in the future if we require larger or smaller + quantities. When a Quantity is parsed from + a string, it will remember the type of suffix + it had, and will use the same type again when + it is serialized. Before serializing, Quantity + will be put in "canonical form". This means + that Exponent/suffix will be adjusted up or + down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision is + lost b. No fractional digits will be emitted c. + The exponent (or suffix) is as large as possible. + The sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole + point of this exercise. Non-canonical values + will still parse as long as they are well formed, + but will be re-emitted in their canonical form. + (So always use canonical form, or don''t diff.) This + format is intended to make it difficult to use + these numbers without writing some sort of special + handling code in the hopes that that will cause + implementors to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + medium: + description: 'What type of storage medium should + back this directory. The default is "" which + means to use the node''s default medium. Must + be an empty string (default) or Memory. More + info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: string + glusterfs: + description: Represents a Glusterfs mount that lasts + the lifetime of a pod. Glusterfs volumes do not + support ownership management or SELinux relabeling. + type: object + properties: + path: + description: 'Path is the Glusterfs volume path. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + endpoints: + description: 'EndpointsName is the endpoint name + that details Glusterfs topology. More info: + https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs + volume to be mounted with read-only permissions. + Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + required: + - endpoints + - path + gcePersistentDisk: + description: Represents a Persistent Disk resource + in Google Compute Engine. A GCE PD must exist before + mounting to a container. The disk must also be in + the same GCE project and zone as the kubelet. A + GCE PD can only be mounted as read/write once or + read-only many times. GCE PDs support ownership + management and SELinux relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that + you want to mount. If omitted, the default is + to mount by volume name. Examples: For volume + /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda + is "0" (or you can leave the property empty). + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: number + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + pdName: + description: 'Unique name of the PD resource in + GCE. Used to identify the disk in GCE. More + info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + required: + - pdName + photonPersistentDisk: + description: Represents a Photon Controller persistent + disk resource. + type: object + properties: + pdID: + description: ID that identifies Photon Controller + persistent disk + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - pdID + azureDisk: + description: AzureDisk represents an Azure Data Disk + mount on the host and bind mount to the pod. + type: object + properties: + diskName: + description: The Name of the data disk in the + blob storage + type: string + kind: + description: 'Expected values Shared: multiple + blob disks per storage account Dedicated: single + blob disk per storage account Managed: azure + managed data disk (only in managed availability + set). defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + cachingMode: + description: 'Host Caching mode: None, Read Only, + Read Write.' + type: string + diskURI: + description: The URI the data disk in the blob + storage + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - diskName + - diskURI + cinder: + description: Represents a cinder volume resource in + Openstack. A Cinder volume must exist before mounting + to a container. The volume must also be in the same + region as the kubelet. Cinder volumes support ownership + management and SELinux relabeling. + type: object + properties: + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + volumeID: + description: 'volume id used to identify the volume + in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + fsType: + description: 'Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + required: + - volumeID + downwardAPI: + description: DownwardAPIVolumeSource represents a + volume containing downward API info. Downward API + volumes support ownership management and SELinux + relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 + and 0777. Defaults to 0644. Directories within + the path are not affected by this setting. This + might be in conflict with other options that + affect the file mode, like fsGroup, and the + result can be other mode bits set.' + type: number + items: + description: Items is a list of downward API volume + file + type: array + items: + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field + type: object + properties: + mode: + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might be + in conflict with other options that affect + the file mode, like fsGroup, and the result + can be other mode bits set.' + type: number + path: + description: 'Required: Path is the relative + path name of the file to be created. Must + not be absolute or contain the ''..'' + path. Must be utf-8 encoded. The first + item of the relative path must not start + with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and + their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= + (Note that + may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= + "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi + | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | + M | G | T | P | E (Note that 1024 + = 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent + forms is used, no quantity may represent + a number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This + may be extended in the future if we + require larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type + again when it is serialized. Before + serializing, Quantity will be put + in "canonical form". This means that + Exponent/suffix will be adjusted up + or down (with a corresponding increase + or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. + The sign will be omitted unless the + number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as + they are well formed, but will be + re-emitted in their canonical form. + (So always use canonical form, or + don''t diff.) This format is intended + to make it difficult to use these + numbers without writing some sort + of special handling code in the hopes + that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to + select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector selects + an APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - path + awsElasticBlockStore: + description: Represents a Persistent Disk resource + in AWS. An AWS EBS disk must exist before mounting + to a container. The disk must also be in the same + AWS zone as the kubelet. An AWS EBS disk can only + be mounted as read/write once. AWS EBS volumes support + ownership management and SELinux relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that + you want to mount. If omitted, the default is + to mount by volume name. Examples: For volume + /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda + is "0" (or you can leave the property empty).' + type: number + volumeID: + description: 'Unique ID of the persistent disk + resource in AWS (Amazon EBS volume). More info: + https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + readOnly: + description: 'Specify "true" to force and set + the ReadOnly property in VolumeMounts to "true". + If omitted, the default is "false". More info: + https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + required: + - volumeID + flocker: + description: Represents a Flocker volume mounted by + the Flocker agent. One and only one of datasetName + and datasetUUID should be set. Flocker volumes do + not support ownership management or SELinux relabeling. + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata + -> name on the dataset for Flocker should be + considered as deprecated + type: string + datasetUUID: + description: UUID of the dataset. This is unique + identifier of a Flocker dataset + type: string + iscsi: + description: Represents an ISCSI disk. ISCSI volumes + can only be mounted as read/write once. ISCSI volumes + support ownership management and SELinux relabeling. + type: object + properties: + chapAuthSession: + description: whether support iSCSI Session CHAP + authentication + type: boolean + iscsiInterface: + description: iSCSI Interface Name that uses an + iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: number + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP + authentication + type: boolean + iqn: + description: Target iSCSI Qualified Name. + type: string + portals: + description: iSCSI Target Portal List. The portal + is either an IP or ip_addr:port if the port + is other than default (typically TCP ports 860 + and 3260). + type: array + items: + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName + is specified with iscsiInterface simultaneously, + new iSCSI interface : will be created for the connection. + type: string + readOnly: + description: ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#iscsi' + type: string + targetPortal: + description: iSCSI Target Portal. The Portal is + either an IP or ip_addr:port if the port is + other than default (typically TCP ports 860 + and 3260). + type: string + required: + - iqn + - lun + - targetPortal + rbd: + description: Represents a Rados Block Device mount + that lasts the lifetime of a pod. RBD volumes support + ownership management and SELinux relabeling. + type: object + properties: + image: + description: 'The rados image name. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + pool: + description: 'The rados pool name. Default is + rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#rbd' + type: string + keyring: + description: 'Keyring is the path to key ring + for RBDUser. Default is /etc/ceph/keyring. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + user: + description: 'The rados user name. Default is + admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: + type: string + required: + - image + - monitors + configMap: + description: Adapts a ConfigMap into a volume. The + contents of the target ConfigMap's Data field will + be presented in a volume as files using the keys + in the Data field as the file names, unless the + items element is populated with specific mappings + of keys to paths. ConfigMap volumes support ownership + management and SELinux relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 + and 0777. Defaults to 0644. Directories within + the path are not affected by this setting. This + might be in conflict with other options that + affect the file mode, like fsGroup, and the + result can be other mode bits set.' + type: number + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap or + its keys must be defined + type: boolean + items: + description: If unspecified, each key-value pair + in the Data field of the referenced ConfigMap + will be projected into the volume as a file + whose name is the key and content is the value. + If specified, the listed keys will be projected + into the specified paths, and unlisted keys + will not be present. If a key is specified which + is not present in the ConfigMap, the volume + setup will error unless it is marked optional. + Paths must be relative and may not contain the + '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within + a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might be + in conflict with other options that affect + the file mode, like fsGroup, and the result + can be other mode bits set.' + type: number + path: + description: The relative path of the file + to map the key to. May not be an absolute + path. May not contain the path element + '..'. May not start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + storageos: + description: Represents a StorageOS persistent volume + resource. + type: object + properties: + volumeNamespace: + description: VolumeNamespace specifies the scope + of the volume within StorageOS. If no namespace + is specified then the Pod's namespace will be + used. This allows the Kubernetes name scoping + to be mirrored within StorageOS for tighter + integration. Set VolumeName to any name to override + the default behaviour. Set to "default" if you + are not using namespaces within StorageOS. Namespaces + that do not pre-exist within StorageOS will + be created. + type: string + volumeName: + description: VolumeName is the human-readable + name of the StorageOS volume. Volume names + are only unique within a namespace. + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + csi: + description: Represents a source location of a volume + to mount, managed by an external CSI driver + type: object + properties: + driver: + description: Driver is the name of the CSI driver + that handles this volume. Consult with your + admin for the correct name as registered in + the cluster. + type: string + nodePublishSecretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Specifies a read-only configuration + for the volume. Defaults to false (read/write). + type: boolean + fsType: + description: Filesystem type to mount. Ex. "ext4", + "xfs", "ntfs". If not provided, the empty value + is passed to the associated CSI driver which + will determine the default filesystem to apply. + type: string + volumeAttributes: + description: VolumeAttributes stores driver-specific + properties that are passed to the CSI driver. + Consult your driver's documentation for supported + values. + additionalProperties: + type: string + type: object + required: + - driver + name: + description: 'Volume''s name. Must be a DNS_LABEL + and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: Represents an NFS mount that lasts the + lifetime of a pod. NFS volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + path: + description: 'Path that is exported by the NFS + server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + server: + description: 'Server is the hostname or IP address + of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS + export to be mounted with read-only permissions. + Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + required: + - path + - server + persistentVolumeClaim: + description: PersistentVolumeClaimVolumeSource references + the user's PVC in the same namespace. This volume + finds the bound PV and mounts that volume for the + pod. A PersistentVolumeClaimVolumeSource is, essentially, + a wrapper around another type of volume that is + owned by someone else (the system). + type: object + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim + in the same namespace as the pod using this + volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in + VolumeMounts. Default false. + type: boolean + required: + - claimName + gitRepo: + description: 'Represents a volume that is populated + with the contents of a git repository. Git repo + volumes do not support ownership management. Git + repo volumes support SELinux relabeling. DEPRECATED: + GitRepo is deprecated. To provision a container + with a git repo, mount an EmptyDir into an InitContainer + that clones the repo using git, then mount the EmptyDir + into the Pod''s container.' + type: object + properties: + repository: + description: Repository URL + type: string + directory: + description: Target directory name. Must not contain + or start with '..'. If '.' is supplied, the + volume directory will be the git repository. Otherwise, + if specified, the volume will contain the git + repository in the subdirectory with the given + name. + type: string + revision: + description: Commit hash for the specified revision. + type: string + required: + - repository + portworxVolume: + description: PortworxVolumeSource represents a Portworx + volume resource. + type: object + properties: + volumeID: + description: VolumeID uniquely identifies a Portworx + volume + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: FSType represents the filesystem + type to mount Must be a filesystem type supported + by the host operating system. Ex. "ext4", "xfs". + Implicitly inferred to be "ext4" if unspecified. + type: string + required: + - volumeID + vsphereVolume: + description: Represents a vSphere volume resource. + type: object + properties: + storagePolicyName: + description: Storage Policy Based Management (SPBM) + profile name. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) + profile ID associated with the StoragePolicyName. + type: string + volumePath: + description: Path that identifies vSphere volume + vmdk + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - volumePath + fc: + description: Represents a Fibre Channel volume. Fibre + Channel volumes can only be mounted as read/write + once. Fibre Channel volumes support ownership management + and SELinux relabeling. + type: object + properties: + lun: + description: 'Optional: FC target lun number' + type: number + targetWWNs: + description: 'Optional: FC target worldwide names + (WWNs)' + type: array + items: + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' + type: boolean + wwids: + description: 'Optional: FC volume world wide identifiers + (wwids) Either wwids or combination of targetWWNs + and lun must be set, but not both simultaneously.' + type: array + items: + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + hostPath: + description: Represents a host path mapped into a + pod. Host path volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + path: + description: 'Path of the directory on the host. + If the path is a symlink, it will follow the + link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults + to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + required: + - path + required: + - name + resources: + description: Memory and CPU minimum requirements and limits + for the server. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is omitted + for a container, it defaults to Limits if that is + explicitly specified, otherwise to an implementation-defined + value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount of + compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + annotations: + description: The annotations to be attached to generated + resources. + additionalProperties: + type: string + type: object + env: + description: A list of environment variables to add to a + server. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. Must + be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are + expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source for + the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key of + a Secret. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" | + "-" ::= | + ::= | + | ::= Ki | + Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G + | T | P | E (Note that 1024 = 1Ki but + 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No matter which of + the three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be + extended in the future if we require larger + or smaller quantities. When a Quantity + is parsed from a string, it will remember + the type of suffix it had, and will use + the same type again when it is serialized. Before + serializing, Quantity will be put in "canonical + form". This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. The + sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as + "1536Mi" Note that the quantity will NEVER + be internally represented by a floating + point number. That is the whole point of + this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or + don''t diff.) This format is intended to + make it difficult to use these numbers without + writing some sort of special handling code + in the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required for + volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an APIVersioned + field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in + the specified API version. + type: string + required: + - fieldPath + required: + - name + restartPolicy: + description: 'Restart policy for all containers within the + pod. One of Always, OnFailure, Never. Default to Always. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + type: string + nodeSelector: + description: Selector which must match a node's labels for + the pod to be scheduled on that node. + additionalProperties: + type: string + type: object + volumeMounts: + description: Additional volume mounts for the server pod. + type: array + items: + description: VolumeMount describes a mounting of a Volume + within a container. + type: object + properties: + mountPath: + description: Path within the container at which the + volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and the + other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the + container's volume should be mounted. Defaults to + "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment variable + references $(VAR_NAME) are expanded using the container's + environment. Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field is + beta in 1.15. + type: string + required: + - mountPath + - name + labels: + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + additionalProperties: + type: string + type: object + runtimeClassName: + description: 'RuntimeClassName refers to a RuntimeClass + object in the node.k8s.io group, which should be used + to run this pod. If no RuntimeClass resource matches + the named class, the pod will not be run. If unset or + empty, the "legacy" RuntimeClass will be used, which is + an implicit class with an empty definition that uses the + default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future.' + type: string + tolerations: + description: If specified, the pod's tolerations. + type: array + items: + description: The pod this Toleration is attached to tolerates + any taint that matches the triple + using the matching operator . + type: object + properties: + effect: + description: Effect indicates the taint effect to + match. Empty means match all taint effects. When + specified, allowed values are NoSchedule, PreferNoSchedule + and NoExecute. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period + of time the toleration (which must be of effect + NoExecute, otherwise this field is ignored) tolerates + the taint. By default, it is not set, which means + tolerate the taint forever (do not evict). Zero + and negative values will be treated as 0 (evict + immediately) by the system. + type: number + value: + description: Value is the taint value the toleration + matches to. If the operator is Exists, the value + should be empty, otherwise just a regular string. + type: string + key: + description: Key is the taint key that the toleration + applies to. Empty means match all taint keys. If + the key is empty, operator must be Exists; this + combination means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship + to the value. Valid operators are Exists and Equal. + Defaults to Equal. Exists is equivalent to wildcard + for value, so that a pod can tolerate all taints + of a particular category. + type: string + readinessProbe: + description: Settings for the readiness probe associated + with a server. + type: object + properties: + periodSeconds: + description: The number of seconds between checks. + type: number + timeoutSeconds: + description: The number of seconds with no response + that indicates a failure. + type: number + initialDelaySeconds: + description: The number of seconds before the first + check is performed. + type: number + containers: + description: Additional containers to be included in the + server pod. + type: array + items: + description: A single application container that you want + to run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of + a raw block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of + the container that the device will be mapped + to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, + IfNotPresent. Defaults to Always if :latest tag + is specified, or IfNotPresent otherwise. Cannot + be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate + a buffer for stdin in the container runtime. If + this is not set, reads from stdin in the container + will always result in EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message + should be populated. File will use the contents + of terminationMessagePath to populate the container + status message on both success and failure. FallbackToLogsOnError + will use the last chunk of container log output + if the termination message file is empty and the + container exited with an error. The log output is + limited to 2048 bytes or 80 lines, whichever is + smaller. Defaults to File. Cannot be updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to + which the container''s termination message will + be written is mounted into the container''s filesystem. + Message written is intended to be brief final status, + such as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' + type: string + workingDir: + description: Container's working directory. If not + specified, the container runtime's default will + be used, which might be configured in the container + image. Cannot be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: + https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields + are present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take + precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. + Processes in privileged containers are essentially + equivalent to root on the host. Defaults to + false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of + the container process. Defaults to user specified + in image metadata if unspecified. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities + from running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to + be applied to the container + type: object + properties: + role: + description: Role is a SELinux role label + that applies to the container. + type: string + level: + description: Level is SELinux level label + that applies to the container. + type: string + type: + description: Type is a SELinux type label + that applies to the container. + type: string + user: + description: User is a SELinux user label + that applies to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain + Windows-specific options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the + GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential + spec named by the GMSACredentialSpecName + field. This field is alpha-level and is + only honored by servers that enable the + WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run + the entrypoint of the container process. + Defaults to the user specified in image + metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. This + field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the + name of the GMSA credential spec to use. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. + type: string + procMount: + description: procMount denotes the type of proc + mount to use for the containers. The default + is DefaultProcMount which uses the container + runtime defaults for readonly paths and masked + paths. This requires the ProcMountType feature + flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the + container process. AllowPrivilegeEscalation + is true always when the container is: 1) run + as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of + the container process. Uses runtime default + if unset. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: number + runAsNonRoot: + description: Indicates that the container must + run as a non-root user. If true, the Kubelet + will validate the image at runtime to ensure + that it does not run as UID 0 (root) and fail + to start the container if it does. If unset + or false, no such validation will be performed. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set + in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. + Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) + are expanded using the previous defined environment + variables in the container and any service + environment variables. If a variable cannot + be resolved, the reference in the input string + will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, + regardless of whether the variable exists + or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source + for the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a + key of a Secret. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and + their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= + (Note that + may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= + "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi + | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | + M | G | T | P | E (Note that 1024 + = 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent + forms is used, no quantity may represent + a number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This + may be extended in the future if we + require larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type + again when it is serialized. Before + serializing, Quantity will be put + in "canonical form". This means that + Exponent/suffix will be adjusted up + or down (with a corresponding increase + or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. + The sign will be omitted unless the + number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as + they are well formed, but will be + re-emitted in their canonical form. + (So always use canonical form, or + don''t diff.) This format is intended + to make it difficult to use these + numbers without writing some sort + of special handling code in the hopes + that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to + select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects + an APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional + information about the network connections a container + uses, but is primarily informational. Not specifying + a port here DOES NOT prevent that port from being + exposed. Any port which is listening on the default + "0.0.0.0" address inside a container will be accessible + from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network + port in a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, + TCP, or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external + port to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port + in a pod must have a unique name. Name for + the port that can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the + pod's IP address. This must be a valid port + number, 0 < x < 65536. + type: number + hostPort: + description: Number of port to expose on the + host. If specified, this must be a valid port + number, 0 < x < 65536. If HostNetwork is specified, + this must match ContainerPort. Most containers + do not need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within + a shell. The docker image''s ENTRYPOINT is used + if this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. + If a variable cannot be resolved, the reference + in the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be + updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's + filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of + a Volume within a container. + type: object + properties: + mountPath: + description: Path within the container at which + the volume should be mounted. Must not contain + ':'. + type: string + mountPropagation: + description: mountPropagation determines how + mounts are propagated from the host to container + and the other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults + to false. + type: boolean + subPath: + description: Path within the volume from which + the container's volume should be mounted. + Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume + from which the container's volume should be + mounted. Behaves similarly to SubPath but + environment variable references $(VAR_NAME) + are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field + is beta in 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the + management system should take in response to container + lifecycle events. For the PostStart and PreStop + lifecycle handlers, management of the container + blocks until the action is complete, unless the + container process fails, in which case the handler + is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a + DNS_LABEL. Each container in a pod must have a unique + name (DNS_LABEL). Cannot be updated. + type: string + tty: + description: Whether this container should allocate + a TTY for itself, also requires 'stdin' to be true. + Default is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should + close the stdin channel after it has been opened + by a single attach. When stdin is true the stdin + stream will remain open across multiple attach sessions. + If stdinOnce is set to true, stdin is opened on + container start, is empty until the first client + attaches to stdin, and then remains open and accepts + data until the client disconnects, at which time + stdin is closed and remains closed until the container + is restarted. If this flag is false, a container + processes that reads from stdin will never receive + an EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment + variables in the container. The keys defined within + a source must be a C_IDENTIFIER. All invalid keys + will be reported as an event when the container + is starting. When a key exists in multiple sources, + the value associated with the last source will take + precedence. Values defined by an Env with a duplicate + key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source + of a set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + must be defined + type: boolean + prefix: + description: An optional identifier to prepend + to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret + to populate the environment variables with. The + contents of the target Secret's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + must be defined + type: boolean + required: + - name + containerSecurityContext: + description: Container-level security attributes. Will override + any matching pod-level attributes. + type: object + properties: + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities from + running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to be applied + to the container + type: object + properties: + role: + description: Role is a SELinux role label that applies + to the container. + type: string + level: + description: Level is SELinux level label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + This field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + procMount: + description: procMount denotes the type of proc mount + to use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. This requires the ProcMountType + feature flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether + a process can gain more privileges than its parent + process. This bool directly controls if the no_new_privs + flag will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if + it does. If unset or false, no such validation will + be performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + schedulerName: + description: If specified, the pod will be dispatched by + specified scheduler. If not specified, the pod will be + dispatched by default scheduler. + type: string + initContainers: + description: Initialization containers to be included in + the server pod. + type: array + items: + description: A single application container that you want + to run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of + a raw block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of + the container that the device will be mapped + to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, + IfNotPresent. Defaults to Always if :latest tag + is specified, or IfNotPresent otherwise. Cannot + be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate + a buffer for stdin in the container runtime. If + this is not set, reads from stdin in the container + will always result in EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message + should be populated. File will use the contents + of terminationMessagePath to populate the container + status message on both success and failure. FallbackToLogsOnError + will use the last chunk of container log output + if the termination message file is empty and the + container exited with an error. The log output is + limited to 2048 bytes or 80 lines, whichever is + smaller. Defaults to File. Cannot be updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to + which the container''s termination message will + be written is mounted into the container''s filesystem. + Message written is intended to be brief final status, + such as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' + type: string + workingDir: + description: Container's working directory. If not + specified, the container runtime's default will + be used, which might be configured in the container + image. Cannot be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: + https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields + are present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take + precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. + Processes in privileged containers are essentially + equivalent to root on the host. Defaults to + false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of + the container process. Defaults to user specified + in image metadata if unspecified. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities + from running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to + be applied to the container + type: object + properties: + role: + description: Role is a SELinux role label + that applies to the container. + type: string + level: + description: Level is SELinux level label + that applies to the container. + type: string + type: + description: Type is a SELinux type label + that applies to the container. + type: string + user: + description: User is a SELinux user label + that applies to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain + Windows-specific options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the + GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential + spec named by the GMSACredentialSpecName + field. This field is alpha-level and is + only honored by servers that enable the + WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run + the entrypoint of the container process. + Defaults to the user specified in image + metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. This + field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the + name of the GMSA credential spec to use. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. + type: string + procMount: + description: procMount denotes the type of proc + mount to use for the containers. The default + is DefaultProcMount which uses the container + runtime defaults for readonly paths and masked + paths. This requires the ProcMountType feature + flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the + container process. AllowPrivilegeEscalation + is true always when the container is: 1) run + as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of + the container process. Uses runtime default + if unset. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: number + runAsNonRoot: + description: Indicates that the container must + run as a non-root user. If true, the Kubelet + will validate the image at runtime to ensure + that it does not run as UID 0 (root) and fail + to start the container if it does. If unset + or false, no such validation will be performed. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set + in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. + Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) + are expanded using the previous defined environment + variables in the container and any service + environment variables. If a variable cannot + be resolved, the reference in the input string + will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, + regardless of whether the variable exists + or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source + for the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a + key of a Secret. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and + their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= + (Note that + may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= + "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi + | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | + M | G | T | P | E (Note that 1024 + = 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent + forms is used, no quantity may represent + a number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This + may be extended in the future if we + require larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type + again when it is serialized. Before + serializing, Quantity will be put + in "canonical form". This means that + Exponent/suffix will be adjusted up + or down (with a corresponding increase + or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. + The sign will be omitted unless the + number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as + they are well formed, but will be + re-emitted in their canonical form. + (So always use canonical form, or + don''t diff.) This format is intended + to make it difficult to use these + numbers without writing some sort + of special handling code in the hopes + that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to + select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects + an APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional + information about the network connections a container + uses, but is primarily informational. Not specifying + a port here DOES NOT prevent that port from being + exposed. Any port which is listening on the default + "0.0.0.0" address inside a container will be accessible + from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network + port in a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, + TCP, or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external + port to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port + in a pod must have a unique name. Name for + the port that can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the + pod's IP address. This must be a valid port + number, 0 < x < 65536. + type: number + hostPort: + description: Number of port to expose on the + host. If specified, this must be a valid port + number, 0 < x < 65536. If HostNetwork is specified, + this must match ContainerPort. Most containers + do not need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within + a shell. The docker image''s ENTRYPOINT is used + if this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. + If a variable cannot be resolved, the reference + in the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be + updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's + filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of + a Volume within a container. + type: object + properties: + mountPath: + description: Path within the container at which + the volume should be mounted. Must not contain + ':'. + type: string + mountPropagation: + description: mountPropagation determines how + mounts are propagated from the host to container + and the other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults + to false. + type: boolean + subPath: + description: Path within the volume from which + the container's volume should be mounted. + Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume + from which the container's volume should be + mounted. Behaves similarly to SubPath but + environment variable references $(VAR_NAME) + are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field + is beta in 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the + management system should take in response to container + lifecycle events. For the PostStart and PreStop + lifecycle handlers, management of the container + blocks until the action is complete, unless the + container process fails, in which case the handler + is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a + DNS_LABEL. Each container in a pod must have a unique + name (DNS_LABEL). Cannot be updated. + type: string + tty: + description: Whether this container should allocate + a TTY for itself, also requires 'stdin' to be true. + Default is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should + close the stdin channel after it has been opened + by a single attach. When stdin is true the stdin + stream will remain open across multiple attach sessions. + If stdinOnce is set to true, stdin is opened on + container start, is empty until the first client + attaches to stdin, and then remains open and accepts + data until the client disconnects, at which time + stdin is closed and remains closed until the container + is restarted. If this flag is false, a container + processes that reads from stdin will never receive + an EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment + variables in the container. The keys defined within + a source must be a C_IDENTIFIER. All invalid keys + will be reported as an event when the container + is starting. When a key exists in multiple sources, + the value associated with the last source will take + precedence. Values defined by an Env with a duplicate + key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source + of a set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + must be defined + type: boolean + prefix: + description: An optional identifier to prepend + to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret + to populate the environment variables with. The + contents of the target Secret's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + must be defined + type: boolean + required: + - name + shutdown: + description: Configures how the operator should shutdown + the server instance. + type: object + properties: + ignoreSessions: + description: For graceful shutdown only, indicates to + ignore pending HTTP sessions during in-flight work + handling. Not required. Defaults to false. + type: boolean + shutdownType: + description: Tells the operator how to shutdown server + instances. Not required. Defaults to graceful shutdown. + type: string + enum: + - Graceful + - Forced + timeoutSeconds: + description: For graceful shutdown only, number of seconds + to wait before aborting in-flight work and shutting + down the server. Not required. Defaults to 30 seconds. + type: number + affinity: + description: If specified, the pod's scheduling constraints + type: object + properties: + nodeAffinity: + description: Node affinity is a group of node affinity + scheduling rules. + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + description: A node selector represents the union + of the results of one or more label queries over + a set of nodes; that is, it represents the OR + of the selectors represented by the node selector + terms. + type: object + properties: + nodeSelectorTerms: + description: Required. A list of node selector + terms. The terms are ORed. + type: array + items: + description: A null or empty node selector + term matches no objects. The requirements + of them are ANDed. The TopologySelectorTerm + type implements a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + required: + - nodeSelectorTerms + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. + The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node + that meets all of the scheduling requirements + (resource request, requiredDuringScheduling affinity + expressions, etc.), compute a sum by iterating + through the elements of this field and adding + "weight" to the sum if the node matches the corresponding + matchExpressions; the node(s) with the highest + sum are the most preferred. + type: array + items: + description: An empty preferred scheduling term + matches all objects with implicit weight 0 (i.e. + it's a no-op). A null preferred scheduling term + matches no objects (i.e. is also a no-op). + type: object + properties: + preference: + description: A null or empty node selector + term matches no objects. The requirements + of them are ANDed. The TopologySelectorTerm + type implements a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + weight: + description: Weight associated with matching + the corresponding nodeSelectorTerm, in the + range 1-100. + type: number + required: + - preference + - weight + podAffinity: + description: Pod affinity is a group of inter pod affinity + scheduling rules. + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified + by this field are not met at scheduling time, + the pod will not be scheduled onto the node. If + the affinity requirements specified by this field + cease to be met at some point during pod execution + (e.g. due to a pod label update), the system may + or may not try to eventually evict the pod from + its node. When there are multiple elements, the + lists of nodes corresponding to each podAffinityTerm + are intersected, i.e. all terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on which + a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty + label selector matches all objects. A null + label selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. + The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node + that meets all of the scheduling requirements + (resource request, requiredDuringScheduling affinity + expressions, etc.), compute a sum by iterating + through the elements of this field and adding + "weight" to the sum if the node has pods which + matches the corresponding podAffinityTerm; the + node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched + WeightedPodAffinityTerm fields are added per-node + to find the most preferred node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely + those matching the labelSelector relative + to the given namespace(s)) that this pod + should be co-located (affinity) or not co-located + (anti-affinity) with, where co-located is + defined as running on a node whose value + of the label with key matches + that of any node on which a pod of the set + of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label + query over a set of resources. The result + of matchLabels and matchExpressions + are ANDed. An empty label selector matches + all objects. A null label selector matches + no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a + list of label selector requirements. + The requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values + array must be non-empty. If + the operator is Exists or + DoesNotExist, the values array + must be empty. This array + is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a + set of values. Valid operators + are In, NotIn, Exists and + DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map + of {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose + value of the label with key topologyKey + matches that of any node on which any + of the selected pods is running. Empty + topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which + namespaces the labelSelector applies + to (matches against); null or empty + list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching + the corresponding podAffinityTerm, in the + range 1-100. + type: number + required: + - podAffinityTerm + - weight + podAntiAffinity: + description: Pod anti affinity is a group of inter pod + anti affinity scheduling rules. + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified + by this field are not met at scheduling time, + the pod will not be scheduled onto the node. If + the anti-affinity requirements specified by this + field cease to be met at some point during pod + execution (e.g. due to a pod label update), the + system may or may not try to eventually evict + the pod from its node. When there are multiple + elements, the lists of nodes corresponding to + each podAffinityTerm are intersected, i.e. all + terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on which + a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty + label selector matches all objects. A null + label selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the anti-affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. + The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node + that meets all of the scheduling requirements + (resource request, requiredDuringScheduling anti-affinity + expressions, etc.), compute a sum by iterating + through the elements of this field and adding + "weight" to the sum if the node has pods which + matches the corresponding podAffinityTerm; the + node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched + WeightedPodAffinityTerm fields are added per-node + to find the most preferred node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely + those matching the labelSelector relative + to the given namespace(s)) that this pod + should be co-located (affinity) or not co-located + (anti-affinity) with, where co-located is + defined as running on a node whose value + of the label with key matches + that of any node on which a pod of the set + of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label + query over a set of resources. The result + of matchLabels and matchExpressions + are ANDed. An empty label selector matches + all objects. A null label selector matches + no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a + list of label selector requirements. + The requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values + array must be non-empty. If + the operator is Exists or + DoesNotExist, the values array + must be empty. This array + is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a + set of values. Valid operators + are In, NotIn, Exists and + DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map + of {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose + value of the label with key topologyKey + matches that of any node on which any + of the selected pods is running. Empty + topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which + namespaces the labelSelector applies + to (matches against); null or empty + list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching + the corresponding podAffinityTerm, in the + range 1-100. + type: number + required: + - podAffinityTerm + - weight + serverStartPolicy: + description: The strategy for deciding whether to start a server. + Legal values are ALWAYS, NEVER, or IF_NEEDED. + type: string + enum: + - ALWAYS + - NEVER + - IF_NEEDED + restartVersion: + description: If present, every time this value is updated the + operator will restart the required servers. + type: string + required: + - serverName + clusters: + type: array + description: Configuration for the clusters. + items: + description: An element representing a cluster in the domain configuration. + type: object + properties: + serverStartState: + description: The state in which the server is to be started. + Use ADMIN if server should start in the admin state. Defaults + to RUNNING. + type: string + enum: + - RUNNING + - ADMIN + serverService: + description: Customization affecting ClusterIP Kubernetes services + for WebLogic Server instances. + type: object + properties: + precreateService: + description: If true, operator will create server services + even for server instances without running pods. + type: boolean + annotations: + description: The annotations to be attached to generated + resources. + additionalProperties: + type: string + type: object + labels: + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + additionalProperties: + type: string + type: object + maxUnavailable: + description: The maximum number of cluster members that can + be temporarily unavailable. Defaults to 1. + type: number + minimum: 1.0 + replicas: + description: The number of cluster members to run. + type: number + minimum: 0.0 + clusterName: + description: The name of this cluster. Required + type: string + serverPod: + description: Configuration affecting server pods. + type: object + properties: + nodeName: + description: NodeName is a request to schedule this pod + onto a specific node. If it is non-empty, the scheduler + simply schedules this pod onto that node, assuming that + it fits resource requirements. + type: string + livenessProbe: + description: Settings for the liveness probe associated + with a server. + type: object + properties: + periodSeconds: + description: The number of seconds between checks. + type: number + timeoutSeconds: + description: The number of seconds with no response + that indicates a failure. + type: number + initialDelaySeconds: + description: The number of seconds before the first + check is performed. + type: number + readinessGates: + description: 'If specified, all readiness gates will be + evaluated for pod readiness. A pod is ready when all its + containers are ready AND all conditions specified in the + readiness gates have status equal to "True" More info: + https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + type: array + items: + description: PodReadinessGate contains the reference to + a pod condition + type: object + properties: + conditionType: + description: ConditionType refers to a condition in + the pod's condition list with matching type. + type: string + required: + - conditionType + serviceAccountName: + description: Name of the ServiceAccount to be used to run + this pod. If it is not set, default ServiceAccount will + be used. The ServiceAccount has to exist at the time the + pod is created. + type: string + podSecurityContext: + description: Pod-level security attributes. + type: object + properties: + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence + for that container. + type: number + seLinuxOptions: + description: SELinuxOptions are the labels to be applied + to the container + type: object + properties: + role: + description: Role is a SELinux role label that applies + to the container. + type: string + level: + description: Level is SELinux level label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + fsGroup: + description: 'A special supplemental group that applies + to all containers in a pod. Some volume types allow + the Kubelet to change the ownership of that volume + to be owned by the pod: 1. The owning GID will be + the FSGroup 2. The setgid bit is set (new files created + in the volume will be owned by FSGroup) 3. The permission + bits are OR''d with rw-rw---- If unset, the Kubelet + will not modify the ownership and permissions of any + volume.' + type: number + windowsOptions: + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + This field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + supplementalGroups: + description: A list of groups applied to the first process + run in each container, in addition to the container's + primary GID. If unspecified, no groups will be added + to any container. + type: array + items: + type: number + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in SecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence for that container. + type: number + runAsNonRoot: + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if + it does. If unset or false, no such validation will + be performed. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: boolean + sysctls: + description: Sysctls hold a list of namespaced sysctls + used for the pod. Pods with unsupported sysctls (by + the container runtime) might fail to launch. + type: array + items: + description: Sysctl defines a kernel parameter to + be set + type: object + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + priorityClassName: + description: If specified, indicates the pod's priority. + "system-node-critical" and "system-cluster-critical" are + two special keywords which indicate the highest priorities + with the former being the highest priority. Any other + name must be defined by creating a PriorityClass object + with that name. If not specified, the pod priority will + be default or zero if there is no default. + type: string + volumes: + description: Additional volumes to be created in the server + pod. + type: array + items: + description: Volume represents a named volume in a pod + that may be accessed by any container in the pod. + type: object + properties: + quobyte: + description: Represents a Quobyte mount that lasts + the lifetime of a pod. Quobyte volumes do not support + ownership management or SELinux relabeling. + type: object + properties: + volume: + description: Volume is a string that references + an already created Quobyte volume by name. + type: string + registry: + description: Registry represents a single or multiple + Quobyte Registry services specified as a string + as host:port pair (multiple entries are separated + with commas) which acts as the central registry + for volumes + type: string + readOnly: + description: ReadOnly here will force the Quobyte + volume to be mounted with read-only permissions. + Defaults to false. + type: boolean + user: + description: User to map volume access to Defaults + to serivceaccount user + type: string + tenant: + description: Tenant owning the given Quobyte volume + in the Backend Used with dynamically provisioned + Quobyte volumes, value is set by the plugin + type: string + group: + description: Group to map volume access to Default + is no group + type: string + required: + - registry + - volume + azureFile: + description: AzureFile represents an Azure File Service + mount on the host and bind mount to the pod. + type: object + properties: + secretName: + description: the name of secret that contains + Azure Storage Account Name and Key + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + shareName: + description: Share Name + type: string + required: + - secretName + - shareName + flexVolume: + description: FlexVolume represents a generic volume + resource that is provisioned/attached using an exec + based plugin. + type: object + properties: + driver: + description: Driver is the name of the driver + to use for this volume. + type: string + options: + description: 'Optional: Extra command options + if any.' + additionalProperties: + type: string + type: object + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' + type: boolean + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". The default + filesystem depends on FlexVolume script. + type: string + required: + - driver + secret: + description: Adapts a Secret into a volume. The contents + of the target Secret's Data field will be presented + in a volume as files using the keys in the Data + field as the file names. Secret volumes support + ownership management and SELinux relabeling. + type: object + properties: + secretName: + description: 'Name of the secret in the pod''s + namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 + and 0777. Defaults to 0644. Directories within + the path are not affected by this setting. This + might be in conflict with other options that + affect the file mode, like fsGroup, and the + result can be other mode bits set.' + type: number + optional: + description: Specify whether the Secret or its + keys must be defined + type: boolean + items: + description: If unspecified, each key-value pair + in the Data field of the referenced Secret will + be projected into the volume as a file whose + name is the key and content is the value. If + specified, the listed keys will be projected + into the specified paths, and unlisted keys + will not be present. If a key is specified which + is not present in the Secret, the volume setup + will error unless it is marked optional. Paths + must be relative and may not contain the '..' + path or start with '..'. + type: array + items: + description: Maps a string key to a path within + a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might be + in conflict with other options that affect + the file mode, like fsGroup, and the result + can be other mode bits set.' + type: number + path: + description: The relative path of the file + to map the key to. May not be an absolute + path. May not contain the path element + '..'. May not start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + projected: + description: Represents a projected volume source + type: object + properties: + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected + along with other supported volume types + type: object + properties: + downwardAPI: + description: Represents downward API info + for projecting into a projected volume. + Note that this is identical to a downwardAPI + volume source without the default mode. + type: object + properties: + items: + description: Items is a list of DownwardAPIVolume + file + type: array + items: + description: DownwardAPIVolumeFile + represents information to create + the file containing the pod field + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be + a value between 0 and 0777. + If not specified, the volume + defaultMode will be used. This + might be in conflict with other + options that affect the file + mode, like fsGroup, and the + result can be other mode bits + set.' + type: number + path: + description: 'Required: Path is the + relative path name of the file + to be created. Must not be absolute + or contain the ''..'' path. + Must be utf-8 encoded. The first + item of the relative path must + not start with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector + represents container resources + (cpu, memory) and their output + format + type: object + properties: + divisor: + description: 'Quantity is + a fixed-point representation + of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition + to String() and AsInt64() + accessors. The serialization + format is: ::= + (Note + that may be empty, + from the "" case in .) + ::= 0 + | 1 | ... | 9 ::= + | + ::= + | . | . + | . ::= + "+" | "-" ::= + | + ::= + | | + ::= Ki + | Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m + | "" | k | M | G | T | P + | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t + choose the capitalization.) + ::= "e" + | "E" No + matter which of the three + exponent forms is used, + no quantity may represent + a number greater than 2^63-1 + in magnitude, nor may it + have more than 3 decimal + places. Numbers larger or + more precise will be capped + or rounded up. (E.g.: 0.1m + will rounded up to 1m.) + This may be extended in + the future if we require + larger or smaller quantities. When + a Quantity is parsed from + a string, it will remember + the type of suffix it had, + and will use the same type + again when it is serialized. Before + serializing, Quantity will + be put in "canonical form". + This means that Exponent/suffix + will be adjusted up or down + (with a corresponding increase + or decrease in Mantissa) + such that: a. No precision + is lost b. No fractional + digits will be emitted c. + The exponent (or suffix) + is as large as possible. + The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER + be internally represented + by a floating point number. + That is the whole point + of this exercise. Non-canonical + values will still parse + as long as they are well + formed, but will be re-emitted + in their canonical form. + (So always use canonical + form, or don''t diff.) This + format is intended to make + it difficult to use these + numbers without writing + some sort of special handling + code in the hopes that that + will cause implementors + to also use a fixed point + implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource + to select' + type: string + containerName: + description: 'Container name: + required for volumes, optional + for env vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector + selects an APIVersioned field + of an object. + type: object + properties: + apiVersion: + description: Version of the + schema the FieldPath is + written in terms of, defaults + to "v1". + type: string + fieldPath: + description: Path of the field + to select in the specified + API version. + type: string + required: + - fieldPath + required: + - path + configMap: + description: Adapts a ConfigMap into a projected + volume. The contents of the target ConfigMap's + Data field will be presented in a projected + volume as files using the keys in the + Data field as the file names, unless the + items element is populated with specific + mappings of keys to paths. Note that this + is identical to a configmap volume source + without the default mode. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its keys must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + ConfigMap will be projected into the + volume as a file whose name is the + key and content is the value. If specified, + the listed keys will be projected + into the specified paths, and unlisted + keys will not be present. If a key + is specified which is not present + in the ConfigMap, the volume setup + will error unless it is marked optional. + Paths must be relative and may not + contain the '..' path or start with + '..'. + type: array + items: + description: Maps a string key to + a path within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be + a value between 0 and 0777. + If not specified, the volume + defaultMode will be used. This + might be in conflict with other + options that affect the file + mode, like fsGroup, and the + result can be other mode bits + set.' + type: number + path: + description: The relative path + of the file to map the key to. + May not be an absolute path. + May not contain the path element + '..'. May not start with the + string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + secret: + description: Adapts a secret into a projected + volume. The contents of the target Secret's + Data field will be presented in a projected + volume as files using the keys in the + Data field as the file names. Note that + this is identical to a secret volume source + without the default mode. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + Secret will be projected into the + volume as a file whose name is the + key and content is the value. If specified, + the listed keys will be projected + into the specified paths, and unlisted + keys will not be present. If a key + is specified which is not present + in the Secret, the volume setup will + error unless it is marked optional. + Paths must be relative and may not + contain the '..' path or start with + '..'. + type: array + items: + description: Maps a string key to + a path within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be + a value between 0 and 0777. + If not specified, the volume + defaultMode will be used. This + might be in conflict with other + options that affect the file + mode, like fsGroup, and the + result can be other mode bits + set.' + type: number + path: + description: The relative path + of the file to map the key to. + May not be an absolute path. + May not contain the path element + '..'. May not start with the + string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + serviceAccountToken: + description: ServiceAccountTokenProjection + represents a projected service account + token volume. This projection can be used + to insert a service account token into + the pods runtime filesystem for use against + APIs (Kubernetes API Server or otherwise). + type: object + properties: + path: + description: Path is the path relative + to the mount point of the file to + project the token into. + type: string + audience: + description: Audience is the intended + audience of the token. A recipient + of a token must identify itself with + an identifier specified in the audience + of the token, and otherwise should + reject the token. The audience defaults + to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the + requested duration of validity of + the service account token. As the + token approaches expiration, the kubelet + volume plugin will proactively rotate + the service account token. The kubelet + will start trying to rotate the token + if the token is older than 80 percent + of its time to live or if the token + is older than 24 hours.Defaults to + 1 hour and must be at least 10 minutes. + type: number + required: + - path + defaultMode: + description: Mode bits to use on created files + by default. Must be a value between 0 and 0777. + Directories within the path are not affected + by this setting. This might be in conflict with + other options that affect the file mode, like + fsGroup, and the result can be other mode bits + set. + type: number + required: + - sources + cephfs: + description: Represents a Ceph Filesystem mount that + lasts the lifetime of a pod Cephfs volumes do not + support ownership management or SELinux relabeling. + type: object + properties: + path: + description: 'Optional: Used as the mounted root, + rather than the full Ceph tree, default is /' + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + secretFile: + description: 'Optional: SecretFile is the path + to key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + user: + description: 'Optional: User is the rados user + name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + monitors: + description: 'Required: Monitors is a collection + of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: + type: string + required: + - monitors + scaleIO: + description: ScaleIOVolumeSource represents a persistent + ScaleIO volume + type: object + properties: + system: + description: The name of the storage system as + configured in ScaleIO. + type: string + protectionDomain: + description: The name of the ScaleIO Protection + Domain for the configured storage. + type: string + sslEnabled: + description: Flag to enable/disable SSL communication + with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for + a volume should be ThickProvisioned or ThinProvisioned. + Default is ThinProvisioned. + type: string + volumeName: + description: The name of a volume already created + in the ScaleIO system that is associated with + this volume source. + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Default is + "xfs". + type: string + storagePool: + description: The ScaleIO Storage Pool associated + with the protection domain. + type: string + gateway: + description: The host address of the ScaleIO API + Gateway. + type: string + required: + - gateway + - secretRef + - system + emptyDir: + description: Represents an empty directory for a pod. + Empty directory volumes support ownership management + and SELinux relabeling. + type: object + properties: + sizeLimit: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and + AsInt64() accessors. The serialization format + is: ::= (Note + that may be empty, from the "" case + in .) ::= 0 | 1 + | ... | 9 ::= | + ::= | . + | . | . ::= + "+" | "-" ::= | + ::= | + | ::= Ki | Mi + | Gi | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T + | P | E (Note that 1024 = 1Ki but 1000 = 1k; + I didn''t choose the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms is + used, no quantity may represent a number greater + than 2^63-1 in magnitude, nor may it have more + than 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be extended + in the future if we require larger or smaller + quantities. When a Quantity is parsed from + a string, it will remember the type of suffix + it had, and will use the same type again when + it is serialized. Before serializing, Quantity + will be put in "canonical form". This means + that Exponent/suffix will be adjusted up or + down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision is + lost b. No fractional digits will be emitted c. + The exponent (or suffix) is as large as possible. + The sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole + point of this exercise. Non-canonical values + will still parse as long as they are well formed, + but will be re-emitted in their canonical form. + (So always use canonical form, or don''t diff.) This + format is intended to make it difficult to use + these numbers without writing some sort of special + handling code in the hopes that that will cause + implementors to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + medium: + description: 'What type of storage medium should + back this directory. The default is "" which + means to use the node''s default medium. Must + be an empty string (default) or Memory. More + info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: string + glusterfs: + description: Represents a Glusterfs mount that lasts + the lifetime of a pod. Glusterfs volumes do not + support ownership management or SELinux relabeling. + type: object + properties: + path: + description: 'Path is the Glusterfs volume path. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + endpoints: + description: 'EndpointsName is the endpoint name + that details Glusterfs topology. More info: + https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs + volume to be mounted with read-only permissions. + Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + required: + - endpoints + - path + gcePersistentDisk: + description: Represents a Persistent Disk resource + in Google Compute Engine. A GCE PD must exist before + mounting to a container. The disk must also be in + the same GCE project and zone as the kubelet. A + GCE PD can only be mounted as read/write once or + read-only many times. GCE PDs support ownership + management and SELinux relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that + you want to mount. If omitted, the default is + to mount by volume name. Examples: For volume + /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda + is "0" (or you can leave the property empty). + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: number + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + pdName: + description: 'Unique name of the PD resource in + GCE. Used to identify the disk in GCE. More + info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + required: + - pdName + photonPersistentDisk: + description: Represents a Photon Controller persistent + disk resource. + type: object + properties: + pdID: + description: ID that identifies Photon Controller + persistent disk + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - pdID + azureDisk: + description: AzureDisk represents an Azure Data Disk + mount on the host and bind mount to the pod. + type: object + properties: + diskName: + description: The Name of the data disk in the + blob storage + type: string + kind: + description: 'Expected values Shared: multiple + blob disks per storage account Dedicated: single + blob disk per storage account Managed: azure + managed data disk (only in managed availability + set). defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + cachingMode: + description: 'Host Caching mode: None, Read Only, + Read Write.' + type: string + diskURI: + description: The URI the data disk in the blob + storage + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - diskName + - diskURI + cinder: + description: Represents a cinder volume resource in + Openstack. A Cinder volume must exist before mounting + to a container. The volume must also be in the same + region as the kubelet. Cinder volumes support ownership + management and SELinux relabeling. + type: object + properties: + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + volumeID: + description: 'volume id used to identify the volume + in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + fsType: + description: 'Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + required: + - volumeID + downwardAPI: + description: DownwardAPIVolumeSource represents a + volume containing downward API info. Downward API + volumes support ownership management and SELinux + relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 + and 0777. Defaults to 0644. Directories within + the path are not affected by this setting. This + might be in conflict with other options that + affect the file mode, like fsGroup, and the + result can be other mode bits set.' + type: number + items: + description: Items is a list of downward API volume + file + type: array + items: + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field + type: object + properties: + mode: + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might be + in conflict with other options that affect + the file mode, like fsGroup, and the result + can be other mode bits set.' + type: number + path: + description: 'Required: Path is the relative + path name of the file to be created. Must + not be absolute or contain the ''..'' + path. Must be utf-8 encoded. The first + item of the relative path must not start + with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and + their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= + (Note that + may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= + "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi + | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | + M | G | T | P | E (Note that 1024 + = 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent + forms is used, no quantity may represent + a number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This + may be extended in the future if we + require larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type + again when it is serialized. Before + serializing, Quantity will be put + in "canonical form". This means that + Exponent/suffix will be adjusted up + or down (with a corresponding increase + or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. + The sign will be omitted unless the + number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as + they are well formed, but will be + re-emitted in their canonical form. + (So always use canonical form, or + don''t diff.) This format is intended + to make it difficult to use these + numbers without writing some sort + of special handling code in the hopes + that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to + select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector selects + an APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - path + awsElasticBlockStore: + description: Represents a Persistent Disk resource + in AWS. An AWS EBS disk must exist before mounting + to a container. The disk must also be in the same + AWS zone as the kubelet. An AWS EBS disk can only + be mounted as read/write once. AWS EBS volumes support + ownership management and SELinux relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that + you want to mount. If omitted, the default is + to mount by volume name. Examples: For volume + /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda + is "0" (or you can leave the property empty).' + type: number + volumeID: + description: 'Unique ID of the persistent disk + resource in AWS (Amazon EBS volume). More info: + https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + readOnly: + description: 'Specify "true" to force and set + the ReadOnly property in VolumeMounts to "true". + If omitted, the default is "false". More info: + https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + required: + - volumeID + flocker: + description: Represents a Flocker volume mounted by + the Flocker agent. One and only one of datasetName + and datasetUUID should be set. Flocker volumes do + not support ownership management or SELinux relabeling. + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata + -> name on the dataset for Flocker should be + considered as deprecated + type: string + datasetUUID: + description: UUID of the dataset. This is unique + identifier of a Flocker dataset + type: string + iscsi: + description: Represents an ISCSI disk. ISCSI volumes + can only be mounted as read/write once. ISCSI volumes + support ownership management and SELinux relabeling. + type: object + properties: + chapAuthSession: + description: whether support iSCSI Session CHAP + authentication + type: boolean + iscsiInterface: + description: iSCSI Interface Name that uses an + iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: number + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP + authentication + type: boolean + iqn: + description: Target iSCSI Qualified Name. + type: string + portals: + description: iSCSI Target Portal List. The portal + is either an IP or ip_addr:port if the port + is other than default (typically TCP ports 860 + and 3260). + type: array + items: + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName + is specified with iscsiInterface simultaneously, + new iSCSI interface : will be created for the connection. + type: string + readOnly: + description: ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#iscsi' + type: string + targetPortal: + description: iSCSI Target Portal. The Portal is + either an IP or ip_addr:port if the port is + other than default (typically TCP ports 860 + and 3260). + type: string + required: + - iqn + - lun + - targetPortal + rbd: + description: Represents a Rados Block Device mount + that lasts the lifetime of a pod. RBD volumes support + ownership management and SELinux relabeling. + type: object + properties: + image: + description: 'The rados image name. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + pool: + description: 'The rados pool name. Default is + rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#rbd' + type: string + keyring: + description: 'Keyring is the path to key ring + for RBDUser. Default is /etc/ceph/keyring. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + user: + description: 'The rados user name. Default is + admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: + type: string + required: + - image + - monitors + configMap: + description: Adapts a ConfigMap into a volume. The + contents of the target ConfigMap's Data field will + be presented in a volume as files using the keys + in the Data field as the file names, unless the + items element is populated with specific mappings + of keys to paths. ConfigMap volumes support ownership + management and SELinux relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 + and 0777. Defaults to 0644. Directories within + the path are not affected by this setting. This + might be in conflict with other options that + affect the file mode, like fsGroup, and the + result can be other mode bits set.' + type: number + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap or + its keys must be defined + type: boolean + items: + description: If unspecified, each key-value pair + in the Data field of the referenced ConfigMap + will be projected into the volume as a file + whose name is the key and content is the value. + If specified, the listed keys will be projected + into the specified paths, and unlisted keys + will not be present. If a key is specified which + is not present in the ConfigMap, the volume + setup will error unless it is marked optional. + Paths must be relative and may not contain the + '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within + a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might be + in conflict with other options that affect + the file mode, like fsGroup, and the result + can be other mode bits set.' + type: number + path: + description: The relative path of the file + to map the key to. May not be an absolute + path. May not contain the path element + '..'. May not start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + storageos: + description: Represents a StorageOS persistent volume + resource. + type: object + properties: + volumeNamespace: + description: VolumeNamespace specifies the scope + of the volume within StorageOS. If no namespace + is specified then the Pod's namespace will be + used. This allows the Kubernetes name scoping + to be mirrored within StorageOS for tighter + integration. Set VolumeName to any name to override + the default behaviour. Set to "default" if you + are not using namespaces within StorageOS. Namespaces + that do not pre-exist within StorageOS will + be created. + type: string + volumeName: + description: VolumeName is the human-readable + name of the StorageOS volume. Volume names + are only unique within a namespace. + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + csi: + description: Represents a source location of a volume + to mount, managed by an external CSI driver + type: object + properties: + driver: + description: Driver is the name of the CSI driver + that handles this volume. Consult with your + admin for the correct name as registered in + the cluster. + type: string + nodePublishSecretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Specifies a read-only configuration + for the volume. Defaults to false (read/write). + type: boolean + fsType: + description: Filesystem type to mount. Ex. "ext4", + "xfs", "ntfs". If not provided, the empty value + is passed to the associated CSI driver which + will determine the default filesystem to apply. + type: string + volumeAttributes: + description: VolumeAttributes stores driver-specific + properties that are passed to the CSI driver. + Consult your driver's documentation for supported + values. + additionalProperties: + type: string + type: object + required: + - driver + name: + description: 'Volume''s name. Must be a DNS_LABEL + and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: Represents an NFS mount that lasts the + lifetime of a pod. NFS volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + path: + description: 'Path that is exported by the NFS + server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + server: + description: 'Server is the hostname or IP address + of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS + export to be mounted with read-only permissions. + Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + required: + - path + - server + persistentVolumeClaim: + description: PersistentVolumeClaimVolumeSource references + the user's PVC in the same namespace. This volume + finds the bound PV and mounts that volume for the + pod. A PersistentVolumeClaimVolumeSource is, essentially, + a wrapper around another type of volume that is + owned by someone else (the system). + type: object + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim + in the same namespace as the pod using this + volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in + VolumeMounts. Default false. + type: boolean + required: + - claimName + gitRepo: + description: 'Represents a volume that is populated + with the contents of a git repository. Git repo + volumes do not support ownership management. Git + repo volumes support SELinux relabeling. DEPRECATED: + GitRepo is deprecated. To provision a container + with a git repo, mount an EmptyDir into an InitContainer + that clones the repo using git, then mount the EmptyDir + into the Pod''s container.' + type: object + properties: + repository: + description: Repository URL + type: string + directory: + description: Target directory name. Must not contain + or start with '..'. If '.' is supplied, the + volume directory will be the git repository. Otherwise, + if specified, the volume will contain the git + repository in the subdirectory with the given + name. + type: string + revision: + description: Commit hash for the specified revision. + type: string + required: + - repository + portworxVolume: + description: PortworxVolumeSource represents a Portworx + volume resource. + type: object + properties: + volumeID: + description: VolumeID uniquely identifies a Portworx + volume + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: FSType represents the filesystem + type to mount Must be a filesystem type supported + by the host operating system. Ex. "ext4", "xfs". + Implicitly inferred to be "ext4" if unspecified. + type: string + required: + - volumeID + vsphereVolume: + description: Represents a vSphere volume resource. + type: object + properties: + storagePolicyName: + description: Storage Policy Based Management (SPBM) + profile name. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) + profile ID associated with the StoragePolicyName. + type: string + volumePath: + description: Path that identifies vSphere volume + vmdk + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - volumePath + fc: + description: Represents a Fibre Channel volume. Fibre + Channel volumes can only be mounted as read/write + once. Fibre Channel volumes support ownership management + and SELinux relabeling. + type: object + properties: + lun: + description: 'Optional: FC target lun number' + type: number + targetWWNs: + description: 'Optional: FC target worldwide names + (WWNs)' + type: array + items: + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' + type: boolean + wwids: + description: 'Optional: FC volume world wide identifiers + (wwids) Either wwids or combination of targetWWNs + and lun must be set, but not both simultaneously.' + type: array + items: + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + hostPath: + description: Represents a host path mapped into a + pod. Host path volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + path: + description: 'Path of the directory on the host. + If the path is a symlink, it will follow the + link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults + to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + required: + - path + required: + - name + resources: + description: Memory and CPU minimum requirements and limits + for the server. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is omitted + for a container, it defaults to Limits if that is + explicitly specified, otherwise to an implementation-defined + value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount of + compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + annotations: + description: The annotations to be attached to generated + resources. + additionalProperties: + type: string + type: object + env: + description: A list of environment variables to add to a + server. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. Must + be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are + expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source for + the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key of + a Secret. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" | + "-" ::= | + ::= | + | ::= Ki | + Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G + | T | P | E (Note that 1024 = 1Ki but + 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No matter which of + the three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be + extended in the future if we require larger + or smaller quantities. When a Quantity + is parsed from a string, it will remember + the type of suffix it had, and will use + the same type again when it is serialized. Before + serializing, Quantity will be put in "canonical + form". This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. The + sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as + "1536Mi" Note that the quantity will NEVER + be internally represented by a floating + point number. That is the whole point of + this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or + don''t diff.) This format is intended to + make it difficult to use these numbers without + writing some sort of special handling code + in the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required for + volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an APIVersioned + field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in + the specified API version. + type: string + required: + - fieldPath + required: + - name + restartPolicy: + description: 'Restart policy for all containers within the + pod. One of Always, OnFailure, Never. Default to Always. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + type: string + nodeSelector: + description: Selector which must match a node's labels for + the pod to be scheduled on that node. + additionalProperties: + type: string + type: object + volumeMounts: + description: Additional volume mounts for the server pod. + type: array + items: + description: VolumeMount describes a mounting of a Volume + within a container. + type: object + properties: + mountPath: + description: Path within the container at which the + volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and the + other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the + container's volume should be mounted. Defaults to + "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment variable + references $(VAR_NAME) are expanded using the container's + environment. Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field is + beta in 1.15. + type: string + required: + - mountPath + - name + labels: + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + additionalProperties: + type: string + type: object + runtimeClassName: + description: 'RuntimeClassName refers to a RuntimeClass + object in the node.k8s.io group, which should be used + to run this pod. If no RuntimeClass resource matches + the named class, the pod will not be run. If unset or + empty, the "legacy" RuntimeClass will be used, which is + an implicit class with an empty definition that uses the + default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future.' + type: string + tolerations: + description: If specified, the pod's tolerations. + type: array + items: + description: The pod this Toleration is attached to tolerates + any taint that matches the triple + using the matching operator . + type: object + properties: + effect: + description: Effect indicates the taint effect to + match. Empty means match all taint effects. When + specified, allowed values are NoSchedule, PreferNoSchedule + and NoExecute. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period + of time the toleration (which must be of effect + NoExecute, otherwise this field is ignored) tolerates + the taint. By default, it is not set, which means + tolerate the taint forever (do not evict). Zero + and negative values will be treated as 0 (evict + immediately) by the system. + type: number + value: + description: Value is the taint value the toleration + matches to. If the operator is Exists, the value + should be empty, otherwise just a regular string. + type: string + key: + description: Key is the taint key that the toleration + applies to. Empty means match all taint keys. If + the key is empty, operator must be Exists; this + combination means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship + to the value. Valid operators are Exists and Equal. + Defaults to Equal. Exists is equivalent to wildcard + for value, so that a pod can tolerate all taints + of a particular category. + type: string + readinessProbe: + description: Settings for the readiness probe associated + with a server. + type: object + properties: + periodSeconds: + description: The number of seconds between checks. + type: number + timeoutSeconds: + description: The number of seconds with no response + that indicates a failure. + type: number + initialDelaySeconds: + description: The number of seconds before the first + check is performed. + type: number + containers: + description: Additional containers to be included in the + server pod. + type: array + items: + description: A single application container that you want + to run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of + a raw block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of + the container that the device will be mapped + to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, + IfNotPresent. Defaults to Always if :latest tag + is specified, or IfNotPresent otherwise. Cannot + be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate + a buffer for stdin in the container runtime. If + this is not set, reads from stdin in the container + will always result in EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message + should be populated. File will use the contents + of terminationMessagePath to populate the container + status message on both success and failure. FallbackToLogsOnError + will use the last chunk of container log output + if the termination message file is empty and the + container exited with an error. The log output is + limited to 2048 bytes or 80 lines, whichever is + smaller. Defaults to File. Cannot be updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to + which the container''s termination message will + be written is mounted into the container''s filesystem. + Message written is intended to be brief final status, + such as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' + type: string + workingDir: + description: Container's working directory. If not + specified, the container runtime's default will + be used, which might be configured in the container + image. Cannot be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: + https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields + are present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take + precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. + Processes in privileged containers are essentially + equivalent to root on the host. Defaults to + false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of + the container process. Defaults to user specified + in image metadata if unspecified. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities + from running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to + be applied to the container + type: object + properties: + role: + description: Role is a SELinux role label + that applies to the container. + type: string + level: + description: Level is SELinux level label + that applies to the container. + type: string + type: + description: Type is a SELinux type label + that applies to the container. + type: string + user: + description: User is a SELinux user label + that applies to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain + Windows-specific options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the + GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential + spec named by the GMSACredentialSpecName + field. This field is alpha-level and is + only honored by servers that enable the + WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run + the entrypoint of the container process. + Defaults to the user specified in image + metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. This + field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the + name of the GMSA credential spec to use. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. + type: string + procMount: + description: procMount denotes the type of proc + mount to use for the containers. The default + is DefaultProcMount which uses the container + runtime defaults for readonly paths and masked + paths. This requires the ProcMountType feature + flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the + container process. AllowPrivilegeEscalation + is true always when the container is: 1) run + as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of + the container process. Uses runtime default + if unset. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: number + runAsNonRoot: + description: Indicates that the container must + run as a non-root user. If true, the Kubelet + will validate the image at runtime to ensure + that it does not run as UID 0 (root) and fail + to start the container if it does. If unset + or false, no such validation will be performed. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set + in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. + Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) + are expanded using the previous defined environment + variables in the container and any service + environment variables. If a variable cannot + be resolved, the reference in the input string + will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, + regardless of whether the variable exists + or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source + for the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a + key of a Secret. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and + their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= + (Note that + may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= + "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi + | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | + M | G | T | P | E (Note that 1024 + = 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent + forms is used, no quantity may represent + a number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This + may be extended in the future if we + require larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type + again when it is serialized. Before + serializing, Quantity will be put + in "canonical form". This means that + Exponent/suffix will be adjusted up + or down (with a corresponding increase + or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. + The sign will be omitted unless the + number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as + they are well formed, but will be + re-emitted in their canonical form. + (So always use canonical form, or + don''t diff.) This format is intended + to make it difficult to use these + numbers without writing some sort + of special handling code in the hopes + that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to + select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects + an APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional + information about the network connections a container + uses, but is primarily informational. Not specifying + a port here DOES NOT prevent that port from being + exposed. Any port which is listening on the default + "0.0.0.0" address inside a container will be accessible + from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network + port in a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, + TCP, or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external + port to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port + in a pod must have a unique name. Name for + the port that can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the + pod's IP address. This must be a valid port + number, 0 < x < 65536. + type: number + hostPort: + description: Number of port to expose on the + host. If specified, this must be a valid port + number, 0 < x < 65536. If HostNetwork is specified, + this must match ContainerPort. Most containers + do not need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within + a shell. The docker image''s ENTRYPOINT is used + if this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. + If a variable cannot be resolved, the reference + in the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be + updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's + filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of + a Volume within a container. + type: object + properties: + mountPath: + description: Path within the container at which + the volume should be mounted. Must not contain + ':'. + type: string + mountPropagation: + description: mountPropagation determines how + mounts are propagated from the host to container + and the other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults + to false. + type: boolean + subPath: + description: Path within the volume from which + the container's volume should be mounted. + Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume + from which the container's volume should be + mounted. Behaves similarly to SubPath but + environment variable references $(VAR_NAME) + are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field + is beta in 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the + management system should take in response to container + lifecycle events. For the PostStart and PreStop + lifecycle handlers, management of the container + blocks until the action is complete, unless the + container process fails, in which case the handler + is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a + DNS_LABEL. Each container in a pod must have a unique + name (DNS_LABEL). Cannot be updated. + type: string + tty: + description: Whether this container should allocate + a TTY for itself, also requires 'stdin' to be true. + Default is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should + close the stdin channel after it has been opened + by a single attach. When stdin is true the stdin + stream will remain open across multiple attach sessions. + If stdinOnce is set to true, stdin is opened on + container start, is empty until the first client + attaches to stdin, and then remains open and accepts + data until the client disconnects, at which time + stdin is closed and remains closed until the container + is restarted. If this flag is false, a container + processes that reads from stdin will never receive + an EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment + variables in the container. The keys defined within + a source must be a C_IDENTIFIER. All invalid keys + will be reported as an event when the container + is starting. When a key exists in multiple sources, + the value associated with the last source will take + precedence. Values defined by an Env with a duplicate + key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source + of a set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + must be defined + type: boolean + prefix: + description: An optional identifier to prepend + to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret + to populate the environment variables with. The + contents of the target Secret's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + must be defined + type: boolean + required: + - name + containerSecurityContext: + description: Container-level security attributes. Will override + any matching pod-level attributes. + type: object + properties: + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities from + running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to be applied + to the container + type: object + properties: + role: + description: Role is a SELinux role label that applies + to the container. + type: string + level: + description: Level is SELinux level label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + This field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + procMount: + description: procMount denotes the type of proc mount + to use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. This requires the ProcMountType + feature flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether + a process can gain more privileges than its parent + process. This bool directly controls if the no_new_privs + flag will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if + it does. If unset or false, no such validation will + be performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + schedulerName: + description: If specified, the pod will be dispatched by + specified scheduler. If not specified, the pod will be + dispatched by default scheduler. + type: string + initContainers: + description: Initialization containers to be included in + the server pod. + type: array + items: + description: A single application container that you want + to run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of + a raw block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of + the container that the device will be mapped + to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, + IfNotPresent. Defaults to Always if :latest tag + is specified, or IfNotPresent otherwise. Cannot + be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate + a buffer for stdin in the container runtime. If + this is not set, reads from stdin in the container + will always result in EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message + should be populated. File will use the contents + of terminationMessagePath to populate the container + status message on both success and failure. FallbackToLogsOnError + will use the last chunk of container log output + if the termination message file is empty and the + container exited with an error. The log output is + limited to 2048 bytes or 80 lines, whichever is + smaller. Defaults to File. Cannot be updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to + which the container''s termination message will + be written is mounted into the container''s filesystem. + Message written is intended to be brief final status, + such as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' + type: string + workingDir: + description: Container's working directory. If not + specified, the container runtime's default will + be used, which might be configured in the container + image. Cannot be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: + https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields + are present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take + precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. + Processes in privileged containers are essentially + equivalent to root on the host. Defaults to + false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of + the container process. Defaults to user specified + in image metadata if unspecified. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities + from running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to + be applied to the container + type: object + properties: + role: + description: Role is a SELinux role label + that applies to the container. + type: string + level: + description: Level is SELinux level label + that applies to the container. + type: string + type: + description: Type is a SELinux type label + that applies to the container. + type: string + user: + description: User is a SELinux user label + that applies to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain + Windows-specific options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the + GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential + spec named by the GMSACredentialSpecName + field. This field is alpha-level and is + only honored by servers that enable the + WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run + the entrypoint of the container process. + Defaults to the user specified in image + metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. This + field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the + name of the GMSA credential spec to use. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. + type: string + procMount: + description: procMount denotes the type of proc + mount to use for the containers. The default + is DefaultProcMount which uses the container + runtime defaults for readonly paths and masked + paths. This requires the ProcMountType feature + flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the + container process. AllowPrivilegeEscalation + is true always when the container is: 1) run + as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of + the container process. Uses runtime default + if unset. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: number + runAsNonRoot: + description: Indicates that the container must + run as a non-root user. If true, the Kubelet + will validate the image at runtime to ensure + that it does not run as UID 0 (root) and fail + to start the container if it does. If unset + or false, no such validation will be performed. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set + in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. + Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) + are expanded using the previous defined environment + variables in the container and any service + environment variables. If a variable cannot + be resolved, the reference in the input string + will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, + regardless of whether the variable exists + or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source + for the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a + key of a Secret. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and + their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= + (Note that + may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= + "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi + | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | + M | G | T | P | E (Note that 1024 + = 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent + forms is used, no quantity may represent + a number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This + may be extended in the future if we + require larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type + again when it is serialized. Before + serializing, Quantity will be put + in "canonical form". This means that + Exponent/suffix will be adjusted up + or down (with a corresponding increase + or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. + The sign will be omitted unless the + number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as + they are well formed, but will be + re-emitted in their canonical form. + (So always use canonical form, or + don''t diff.) This format is intended + to make it difficult to use these + numbers without writing some sort + of special handling code in the hopes + that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to + select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects + an APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional + information about the network connections a container + uses, but is primarily informational. Not specifying + a port here DOES NOT prevent that port from being + exposed. Any port which is listening on the default + "0.0.0.0" address inside a container will be accessible + from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network + port in a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, + TCP, or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external + port to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port + in a pod must have a unique name. Name for + the port that can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the + pod's IP address. This must be a valid port + number, 0 < x < 65536. + type: number + hostPort: + description: Number of port to expose on the + host. If specified, this must be a valid port + number, 0 < x < 65536. If HostNetwork is specified, + this must match ContainerPort. Most containers + do not need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within + a shell. The docker image''s ENTRYPOINT is used + if this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. + If a variable cannot be resolved, the reference + in the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be + updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's + filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of + a Volume within a container. + type: object + properties: + mountPath: + description: Path within the container at which + the volume should be mounted. Must not contain + ':'. + type: string + mountPropagation: + description: mountPropagation determines how + mounts are propagated from the host to container + and the other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults + to false. + type: boolean + subPath: + description: Path within the volume from which + the container's volume should be mounted. + Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume + from which the container's volume should be + mounted. Behaves similarly to SubPath but + environment variable references $(VAR_NAME) + are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field + is beta in 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the + management system should take in response to container + lifecycle events. For the PostStart and PreStop + lifecycle handlers, management of the container + blocks until the action is complete, unless the + container process fails, in which case the handler + is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a + DNS_LABEL. Each container in a pod must have a unique + name (DNS_LABEL). Cannot be updated. + type: string + tty: + description: Whether this container should allocate + a TTY for itself, also requires 'stdin' to be true. + Default is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should + close the stdin channel after it has been opened + by a single attach. When stdin is true the stdin + stream will remain open across multiple attach sessions. + If stdinOnce is set to true, stdin is opened on + container start, is empty until the first client + attaches to stdin, and then remains open and accepts + data until the client disconnects, at which time + stdin is closed and remains closed until the container + is restarted. If this flag is false, a container + processes that reads from stdin will never receive + an EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment + variables in the container. The keys defined within + a source must be a C_IDENTIFIER. All invalid keys + will be reported as an event when the container + is starting. When a key exists in multiple sources, + the value associated with the last source will take + precedence. Values defined by an Env with a duplicate + key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source + of a set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + must be defined + type: boolean + prefix: + description: An optional identifier to prepend + to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret + to populate the environment variables with. The + contents of the target Secret's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + must be defined + type: boolean + required: + - name + shutdown: + description: Configures how the operator should shutdown + the server instance. + type: object + properties: + ignoreSessions: + description: For graceful shutdown only, indicates to + ignore pending HTTP sessions during in-flight work + handling. Not required. Defaults to false. + type: boolean + shutdownType: + description: Tells the operator how to shutdown server + instances. Not required. Defaults to graceful shutdown. + type: string + enum: + - Graceful + - Forced + timeoutSeconds: + description: For graceful shutdown only, number of seconds + to wait before aborting in-flight work and shutting + down the server. Not required. Defaults to 30 seconds. + type: number + affinity: + description: If specified, the pod's scheduling constraints + type: object + properties: + nodeAffinity: + description: Node affinity is a group of node affinity + scheduling rules. + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + description: A node selector represents the union + of the results of one or more label queries over + a set of nodes; that is, it represents the OR + of the selectors represented by the node selector + terms. + type: object + properties: + nodeSelectorTerms: + description: Required. A list of node selector + terms. The terms are ORed. + type: array + items: + description: A null or empty node selector + term matches no objects. The requirements + of them are ANDed. The TopologySelectorTerm + type implements a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + required: + - nodeSelectorTerms + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. + The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node + that meets all of the scheduling requirements + (resource request, requiredDuringScheduling affinity + expressions, etc.), compute a sum by iterating + through the elements of this field and adding + "weight" to the sum if the node matches the corresponding + matchExpressions; the node(s) with the highest + sum are the most preferred. + type: array + items: + description: An empty preferred scheduling term + matches all objects with implicit weight 0 (i.e. + it's a no-op). A null preferred scheduling term + matches no objects (i.e. is also a no-op). + type: object + properties: + preference: + description: A null or empty node selector + term matches no objects. The requirements + of them are ANDed. The TopologySelectorTerm + type implements a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + weight: + description: Weight associated with matching + the corresponding nodeSelectorTerm, in the + range 1-100. + type: number + required: + - preference + - weight + podAffinity: + description: Pod affinity is a group of inter pod affinity + scheduling rules. + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified + by this field are not met at scheduling time, + the pod will not be scheduled onto the node. If + the affinity requirements specified by this field + cease to be met at some point during pod execution + (e.g. due to a pod label update), the system may + or may not try to eventually evict the pod from + its node. When there are multiple elements, the + lists of nodes corresponding to each podAffinityTerm + are intersected, i.e. all terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on which + a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty + label selector matches all objects. A null + label selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. + The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node + that meets all of the scheduling requirements + (resource request, requiredDuringScheduling affinity + expressions, etc.), compute a sum by iterating + through the elements of this field and adding + "weight" to the sum if the node has pods which + matches the corresponding podAffinityTerm; the + node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched + WeightedPodAffinityTerm fields are added per-node + to find the most preferred node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely + those matching the labelSelector relative + to the given namespace(s)) that this pod + should be co-located (affinity) or not co-located + (anti-affinity) with, where co-located is + defined as running on a node whose value + of the label with key matches + that of any node on which a pod of the set + of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label + query over a set of resources. The result + of matchLabels and matchExpressions + are ANDed. An empty label selector matches + all objects. A null label selector matches + no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a + list of label selector requirements. + The requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values + array must be non-empty. If + the operator is Exists or + DoesNotExist, the values array + must be empty. This array + is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a + set of values. Valid operators + are In, NotIn, Exists and + DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map + of {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose + value of the label with key topologyKey + matches that of any node on which any + of the selected pods is running. Empty + topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which + namespaces the labelSelector applies + to (matches against); null or empty + list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching + the corresponding podAffinityTerm, in the + range 1-100. + type: number + required: + - podAffinityTerm + - weight + podAntiAffinity: + description: Pod anti affinity is a group of inter pod + anti affinity scheduling rules. + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified + by this field are not met at scheduling time, + the pod will not be scheduled onto the node. If + the anti-affinity requirements specified by this + field cease to be met at some point during pod + execution (e.g. due to a pod label update), the + system may or may not try to eventually evict + the pod from its node. When there are multiple + elements, the lists of nodes corresponding to + each podAffinityTerm are intersected, i.e. all + terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on which + a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty + label selector matches all objects. A null + label selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the anti-affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. + The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node + that meets all of the scheduling requirements + (resource request, requiredDuringScheduling anti-affinity + expressions, etc.), compute a sum by iterating + through the elements of this field and adding + "weight" to the sum if the node has pods which + matches the corresponding podAffinityTerm; the + node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched + WeightedPodAffinityTerm fields are added per-node + to find the most preferred node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely + those matching the labelSelector relative + to the given namespace(s)) that this pod + should be co-located (affinity) or not co-located + (anti-affinity) with, where co-located is + defined as running on a node whose value + of the label with key matches + that of any node on which a pod of the set + of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label + query over a set of resources. The result + of matchLabels and matchExpressions + are ANDed. An empty label selector matches + all objects. A null label selector matches + no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a + list of label selector requirements. + The requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values + array must be non-empty. If + the operator is Exists or + DoesNotExist, the values array + must be empty. This array + is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a + set of values. Valid operators + are In, NotIn, Exists and + DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map + of {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose + value of the label with key topologyKey + matches that of any node on which any + of the selected pods is running. Empty + topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which + namespaces the labelSelector applies + to (matches against); null or empty + list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching + the corresponding podAffinityTerm, in the + range 1-100. + type: number + required: + - podAffinityTerm + - weight + clusterService: + description: Customization affecting ClusterIP Kubernetes services + for the WebLogic cluster. + type: object + properties: + annotations: + description: The annotations to be attached to generated + resources. + additionalProperties: + type: string + type: object + labels: + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + additionalProperties: + type: string + type: object + serverStartPolicy: + description: The strategy for deciding whether to start a server. + Legal values are NEVER, or IF_NEEDED. + type: string + enum: + - NEVER + - IF_NEEDED + restartVersion: + description: If present, every time this value is updated the + operator will restart the required servers. + type: string + required: + - clusterName + status: + type: object + description: DomainStatus represents information about the status of a + domain. Status may trail the actual state of a system. + properties: + reason: + type: string + description: A brief CamelCase message indicating details about why + the domain is in this state. + servers: + type: array + description: Status of WebLogic Servers in this domain. + items: + type: object + properties: + nodeName: + description: Name of node that is hosting the Pod containing + this WebLogic Server. + type: string + desiredState: + description: Desired state of this WebLogic Server. Values are + RUNNING, ADMIN, or SHUTDOWN. + type: string + clusterName: + description: WebLogic cluster name, if the server is part of + a cluster. + type: string + serverName: + description: WebLogic Server name. Required. + type: string + health: + description: Current status and health of a specific WebLogic + Server. + type: object + properties: + overallHealth: + description: Server health of this WebLogic Server. If the + value is "Not available", the operator has failed to read + the health. If the value is "Not available (possibly overloaded)", + the operator has failed to read the health of the server + possibly due to the server is in overloaded state. + type: string + activationTime: + format: date-time + description: RFC 3339 date and time at which the server + started. + type: string + subsystems: + description: Status of unhealthy subsystems, if any. + type: array + items: + type: object + properties: + symptoms: + description: Symptoms provided by the reporting subsystem. + type: array + items: + type: string + health: + description: Server health of this WebLogic Server. + Required. + type: string + subsystemName: + description: Name of subsystem providing symptom information. + Required. + type: string + state: + description: Current state of this WebLogic Server. Required. + type: string + replicas: + type: number + description: The number of running Managed Servers in the WebLogic + cluster if there is only one cluster in the domain and where the + cluster does not explicitly configure its replicas in a cluster + specification. + minimum: 0.0 + startTime: + type: string + description: RFC 3339 date and time at which the operator started + the domain. This will be when the operator begins processing and + will precede when the various servers or clusters are available. + format: date-time + conditions: + type: array + description: Current service state of domain. + items: + type: object + properties: + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + type: + description: The type of the condition. Valid types are Progressing, + Available, and Failed. Required. + type: string + enum: + - Progressing + - Available + - Failed + lastTransitionTime: + format: date-time + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + lastProbeTime: + format: date-time + description: Last time we probed the condition. + type: string + status: + description: Status is the status of the condition. Can be True, + False, Unknown. Required. + type: string + message: + type: string + description: A human readable message indicating details about why + the domain is in this condition. + clusters: + type: array + description: Status of WebLogic clusters in this domain. + items: + type: object + properties: + minimumReplicas: + description: The minimum number of cluster members. + type: number + minimum: 0.0 + maximumReplicas: + description: The maximum number of cluster members. Required. + type: number + minimum: 0.0 + replicas: + description: The number of intended cluster members. Required. + type: number + minimum: 0.0 + clusterName: + description: WebLogic cluster name. Required. + type: string + readyReplicas: + description: The number of ready cluster members. Required. + type: number + minimum: 0.0 + replicasGoal: + description: The requested number of cluster members from the + domain spec. Cluster members will be started by the operator + if this value is larger than zero. + type: number + minimum: 0.0 + served: true + storage: true + subresources: + scale: + specReplicasPath: .spec.replicas + statusReplicasPath: .status.replicas + status: {} + - name: v6 + schema: + openAPIV3Schema: + type: object + properties: + spec: + type: object + description: DomainSpec is a description of a domain. + properties: + serverStartState: + type: string + description: The state in which the server is to be started. Use ADMIN + if server should start in the admin state. Defaults to RUNNING. + enum: + - RUNNING + - ADMIN + image: + type: string + description: The WebLogic Docker image; required when domainHomeInImage + is true; otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4. + imagePullPolicy: + type: string + description: The image pull policy for the WebLogic Docker image. + Legal values are Always, Never and IfNotPresent. Defaults to Always + if image ends in :latest, IfNotPresent otherwise. + enum: + - Always + - Never + - IfNotPresent + replicas: + type: number + description: The number of managed servers to run in any cluster that + does not specify a replica count. + minimum: 0.0 + configOverrideSecrets: + type: array + description: A list of names of the secrets for optional WebLogic + configuration overrides. + items: + type: string + imagePullSecrets: + type: array + description: A list of image pull secrets for the WebLogic Docker + image. + items: + description: LocalObjectReference contains enough information to + let you locate the referenced object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + domainHomeInImage: + type: boolean + description: True indicates that the domain home file system is contained + in the Docker image specified by the image field. False indicates + that the domain home file system is located on a persistent volume. + domainUID: + type: string + description: Domain unique identifier. Must be unique across the Kubernetes + cluster. Not required. Defaults to the value of metadata.name. + pattern: ^[a-z0-9-.]{1,253}$ + experimental: + type: object + description: Experimental feature configurations. + properties: + istio: + type: object + description: Istio service mesh integration configuration. + properties: + readinessPort: + type: number + description: The WebLogic readiness port for Istio. Defaults + to 8888. Not required. + enabled: + type: boolean + description: True, if this domain is deployed under an Istio + service mesh. Defaults to true when the 'istio' element + is included. Not required. + serverStartPolicy: + type: string + description: The strategy for deciding whether to start a server. + Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED. + enum: + - NEVER + - IF_NEEDED + - ADMIN_ONLY + restartVersion: + type: string + description: If present, every time this value is updated the operator + will restart the required servers. + dataHome: + type: string + description: 'An optional, in-pod location for data storage of default + and custom file stores. If dataHome is not specified or its value + is either not set or empty (e.g. dataHome: "") then the data storage + directories are determined from the WebLogic domain home configuration.' + configOverrides: + type: string + description: The name of the config map for optional WebLogic configuration + overrides. + serverService: + type: object + description: Customization affecting ClusterIP Kubernetes services + for WebLogic Server instances. + properties: + precreateService: + type: boolean + description: If true, operator will create server services even + for server instances without running pods. + annotations: + type: object + additionalProperties: + type: string + description: The annotations to be attached to generated resources. + labels: + type: object + additionalProperties: + type: string + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + domainHome: + type: string + description: The folder for the WebLogic Domain. Not required. Defaults + to /shared/domains/domains/domainUID if domainHomeInImage is false. + Defaults to /u01/oracle/user_projects/domains/ if domainHomeInImage + is true. + logHomeEnabled: + type: boolean + description: 'Specified whether the log home folder is enabled. Not + required. Defaults to true if domainHomeInImage is false. Defaults + to false if domainHomeInImage is true. ' + webLogicCredentialsSecret: + type: object + description: The name of a pre-created Kubernetes secret, in the domain's + namespace, that holds the username and password needed to boot WebLogic + Server under the 'username' and 'password' fields. + properties: + name: + type: string + description: Name is unique within a namespace to reference a + secret resource. + namespace: + type: string + description: Namespace defines the space within which the secret + name must be unique. + adminServer: + type: object + description: Configuration for the Administration Server. + properties: + serverStartState: + type: string + description: The state in which the server is to be started. Use + ADMIN if server should start in the admin state. Defaults to + RUNNING. + enum: + - RUNNING + - ADMIN + serverService: + type: object + description: Customization affecting ClusterIP Kubernetes services + for WebLogic Server instances. + properties: + precreateService: + type: boolean + description: If true, operator will create server services + even for server instances without running pods. + annotations: + type: object + additionalProperties: + type: string + description: The annotations to be attached to generated resources. + labels: + type: object + additionalProperties: + type: string + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + serverPod: + type: object + description: Configuration affecting server pods. + properties: + nodeName: + type: string + description: NodeName is a request to schedule this pod onto + a specific node. If it is non-empty, the scheduler simply + schedules this pod onto that node, assuming that it fits + resource requirements. + livenessProbe: + type: object + description: Settings for the liveness probe associated with + a server. + properties: + periodSeconds: + type: number + description: The number of seconds between checks. + timeoutSeconds: + type: number + description: The number of seconds with no response that + indicates a failure. + initialDelaySeconds: + type: number + description: The number of seconds before the first check + is performed. + readinessGates: + type: array + description: 'If specified, all readiness gates will be evaluated + for pod readiness. A pod is ready when all its containers + are ready AND all conditions specified in the readiness + gates have status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + items: + description: PodReadinessGate contains the reference to + a pod condition + type: object + properties: + conditionType: + description: ConditionType refers to a condition in + the pod's condition list with matching type. + type: string + required: + - conditionType + serviceAccountName: + type: string + description: Name of the ServiceAccount to be used to run + this pod. If it is not set, default ServiceAccount will + be used. The ServiceAccount has to exist at the time the + pod is created. + podSecurityContext: + type: object + description: Pod-level security attributes. + properties: + runAsUser: + type: number + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence + for that container. + seLinuxOptions: + type: object + description: SELinuxOptions are the labels to be applied + to the container + properties: + role: + type: string + description: Role is a SELinux role label that applies + to the container. + level: + type: string + description: Level is SELinux level label that applies + to the container. + type: + type: string + description: Type is a SELinux type label that applies + to the container. + user: + type: string + description: User is a SELinux user label that applies + to the container. + fsGroup: + type: number + description: 'A special supplemental group that applies + to all containers in a pod. Some volume types allow + the Kubelet to change the ownership of that volume to + be owned by the pod: 1. The owning GID will be the + FSGroup 2. The setgid bit is set (new files created + in the volume will be owned by FSGroup) 3. The permission + bits are OR''d with rw-rw---- If unset, the Kubelet + will not modify the ownership and permissions of any + volume.' + windowsOptions: + type: object + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + properties: + gmsaCredentialSpec: + type: string + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + runAsUserName: + type: string + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and + it is only honored by servers that enable the WindowsRunAsUserName + feature flag. + gmsaCredentialSpecName: + type: string + description: GMSACredentialSpecName is the name of + the GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. + supplementalGroups: + type: array + description: A list of groups applied to the first process + run in each container, in addition to the container's + primary GID. If unspecified, no groups will be added + to any container. + items: + type: number + runAsGroup: + type: number + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in SecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence for that container. + runAsNonRoot: + type: boolean + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if it + does. If unset or false, no such validation will be + performed. May also be set in SecurityContext. If set + in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. + sysctls: + type: array + description: Sysctls hold a list of namespaced sysctls + used for the pod. Pods with unsupported sysctls (by + the container runtime) might fail to launch. + items: + description: Sysctl defines a kernel parameter to be + set + type: object + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + priorityClassName: + type: string + description: If specified, indicates the pod's priority. "system-node-critical" + and "system-cluster-critical" are two special keywords which + indicate the highest priorities with the former being the + highest priority. Any other name must be defined by creating + a PriorityClass object with that name. If not specified, + the pod priority will be default or zero if there is no + default. + volumes: + type: array + description: Additional volumes to be created in the server + pod. + items: + description: Volume represents a named volume in a pod that + may be accessed by any container in the pod. + type: object + properties: + quobyte: + description: Represents a Quobyte mount that lasts the + lifetime of a pod. Quobyte volumes do not support + ownership management or SELinux relabeling. + type: object + properties: + volume: + description: Volume is a string that references + an already created Quobyte volume by name. + type: string + registry: + description: Registry represents a single or multiple + Quobyte Registry services specified as a string + as host:port pair (multiple entries are separated + with commas) which acts as the central registry + for volumes + type: string + readOnly: + description: ReadOnly here will force the Quobyte + volume to be mounted with read-only permissions. + Defaults to false. + type: boolean + user: + description: User to map volume access to Defaults + to serivceaccount user + type: string + tenant: + description: Tenant owning the given Quobyte volume + in the Backend Used with dynamically provisioned + Quobyte volumes, value is set by the plugin + type: string + group: + description: Group to map volume access to Default + is no group + type: string + required: + - registry + - volume + azureFile: + description: AzureFile represents an Azure File Service + mount on the host and bind mount to the pod. + type: object + properties: + secretName: + description: the name of secret that contains Azure + Storage Account Name and Key + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + shareName: + description: Share Name + type: string + required: + - secretName + - shareName + flexVolume: + description: FlexVolume represents a generic volume + resource that is provisioned/attached using an exec + based plugin. + type: object + properties: + driver: + description: Driver is the name of the driver to + use for this volume. + type: string + options: + description: 'Optional: Extra command options if + any.' + additionalProperties: + type: string + type: object + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' + type: boolean + fsType: + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". The default + filesystem depends on FlexVolume script. + type: string + required: + - driver + secret: + description: Adapts a Secret into a volume. The contents + of the target Secret's Data field will be presented + in a volume as files using the keys in the Data field + as the file names. Secret volumes support ownership + management and SELinux relabeling. + type: object + properties: + secretName: + description: 'Name of the secret in the pod''s namespace + to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the + path are not affected by this setting. This might + be in conflict with other options that affect + the file mode, like fsGroup, and the result can + be other mode bits set.' + type: number + optional: + description: Specify whether the Secret or its keys + must be defined + type: boolean + items: + description: If unspecified, each key-value pair + in the Data field of the referenced Secret will + be projected into the volume as a file whose name + is the key and content is the value. If specified, + the listed keys will be projected into the specified + paths, and unlisted keys will not be present. + If a key is specified which is not present in + the Secret, the volume setup will error unless + it is marked optional. Paths must be relative + and may not contain the '..' path or start with + '..'. + type: array + items: + description: Maps a string key to a path within + a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use on + this file, must be a value between 0 and + 0777. If not specified, the volume defaultMode + will be used. This might be in conflict + with other options that affect the file + mode, like fsGroup, and the result can be + other mode bits set.' + type: number + path: + description: The relative path of the file + to map the key to. May not be an absolute + path. May not contain the path element '..'. + May not start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + projected: + description: Represents a projected volume source + type: object + properties: + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected + along with other supported volume types + type: object + properties: + downwardAPI: + description: Represents downward API info + for projecting into a projected volume. + Note that this is identical to a downwardAPI + volume source without the default mode. + type: object + properties: + items: + description: Items is a list of DownwardAPIVolume + file + type: array + items: + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be a + value between 0 and 0777. If not + specified, the volume defaultMode + will be used. This might be in + conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode + bits set.' + type: number + path: + description: 'Required: Path is the + relative path name of the file + to be created. Must not be absolute + or contain the ''..'' path. Must + be utf-8 encoded. The first item + of the relative path must not + start with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector + represents container resources + (cpu, memory) and their output + format + type: object + properties: + divisor: + description: 'Quantity is a + fixed-point representation + of a number. It provides convenient + marshaling/unmarshaling in + JSON and YAML, in addition + to String() and AsInt64() + accessors. The serialization + format is: ::= + (Note + that may be empty, + from the "" case in .) + ::= 0 | + 1 | ... | 9 ::= + | + ::= + | . | . + | . ::= + "+" | "-" ::= + | + ::= + | | + ::= Ki | + Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | + "" | k | M | G | T | P | E (Note + that 1024 = 1Ki but 1000 = + 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No + matter which of the three + exponent forms is used, no + quantity may represent a number + greater than 2^63-1 in magnitude, + nor may it have more than + 3 decimal places. Numbers + larger or more precise will + be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) + This may be extended in the + future if we require larger + or smaller quantities. When + a Quantity is parsed from + a string, it will remember + the type of suffix it had, + and will use the same type + again when it is serialized. Before + serializing, Quantity will + be put in "canonical form". + This means that Exponent/suffix + will be adjusted up or down + (with a corresponding increase + or decrease in Mantissa) such + that: a. No precision is + lost b. No fractional digits + will be emitted c. The exponent + (or suffix) is as large as + possible. The sign will be + omitted unless the number + is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER + be internally represented + by a floating point number. + That is the whole point of + this exercise. Non-canonical + values will still parse as + long as they are well formed, + but will be re-emitted in + their canonical form. (So + always use canonical form, + or don''t diff.) This format + is intended to make it difficult + to use these numbers without + writing some sort of special + handling code in the hopes + that that will cause implementors + to also use a fixed point + implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource + to select' + type: string + containerName: + description: 'Container name: + required for volumes, optional + for env vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector + selects an APIVersioned field + of an object. + type: object + properties: + apiVersion: + description: Version of the + schema the FieldPath is written + in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field + to select in the specified + API version. + type: string + required: + - fieldPath + required: + - path + configMap: + description: Adapts a ConfigMap into a projected + volume. The contents of the target ConfigMap's + Data field will be presented in a projected + volume as files using the keys in the Data + field as the file names, unless the items + element is populated with specific mappings + of keys to paths. Note that this is identical + to a configmap volume source without the + default mode. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its keys must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + ConfigMap will be projected into the + volume as a file whose name is the key + and content is the value. If specified, + the listed keys will be projected into + the specified paths, and unlisted keys + will not be present. If a key is specified + which is not present in the ConfigMap, + the volume setup will error unless it + is marked optional. Paths must be relative + and may not contain the '..' path or + start with '..'. + type: array + items: + description: Maps a string key to a + path within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be a + value between 0 and 0777. If not + specified, the volume defaultMode + will be used. This might be in + conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode + bits set.' + type: number + path: + description: The relative path of + the file to map the key to. May + not be an absolute path. May not + contain the path element '..'. + May not start with the string + '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + secret: + description: Adapts a secret into a projected + volume. The contents of the target Secret's + Data field will be presented in a projected + volume as files using the keys in the Data + field as the file names. Note that this + is identical to a secret volume source without + the default mode. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + Secret will be projected into the volume + as a file whose name is the key and + content is the value. If specified, + the listed keys will be projected into + the specified paths, and unlisted keys + will not be present. If a key is specified + which is not present in the Secret, + the volume setup will error unless it + is marked optional. Paths must be relative + and may not contain the '..' path or + start with '..'. + type: array + items: + description: Maps a string key to a + path within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be a + value between 0 and 0777. If not + specified, the volume defaultMode + will be used. This might be in + conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode + bits set.' + type: number + path: + description: The relative path of + the file to map the key to. May + not be an absolute path. May not + contain the path element '..'. + May not start with the string + '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + serviceAccountToken: + description: ServiceAccountTokenProjection + represents a projected service account token + volume. This projection can be used to insert + a service account token into the pods runtime + filesystem for use against APIs (Kubernetes + API Server or otherwise). + type: object + properties: + path: + description: Path is the path relative + to the mount point of the file to project + the token into. + type: string + audience: + description: Audience is the intended + audience of the token. A recipient of + a token must identify itself with an + identifier specified in the audience + of the token, and otherwise should reject + the token. The audience defaults to + the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the + requested duration of validity of the + service account token. As the token + approaches expiration, the kubelet volume + plugin will proactively rotate the service + account token. The kubelet will start + trying to rotate the token if the token + is older than 80 percent of its time + to live or if the token is older than + 24 hours.Defaults to 1 hour and must + be at least 10 minutes. + type: number + required: + - path + defaultMode: + description: Mode bits to use on created files by + default. Must be a value between 0 and 0777. Directories + within the path are not affected by this setting. + This might be in conflict with other options that + affect the file mode, like fsGroup, and the result + can be other mode bits set. + type: number + required: + - sources + cephfs: + description: Represents a Ceph Filesystem mount that + lasts the lifetime of a pod Cephfs volumes do not + support ownership management or SELinux relabeling. + type: object + properties: + path: + description: 'Optional: Used as the mounted root, + rather than the full Ceph tree, default is /' + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + secretFile: + description: 'Optional: SecretFile is the path to + key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + user: + description: 'Optional: User is the rados user name, + default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + monitors: + description: 'Required: Monitors is a collection + of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: + type: string + required: + - monitors + scaleIO: + description: ScaleIOVolumeSource represents a persistent + ScaleIO volume + type: object + properties: + system: + description: The name of the storage system as configured + in ScaleIO. + type: string + protectionDomain: + description: The name of the ScaleIO Protection + Domain for the configured storage. + type: string + sslEnabled: + description: Flag to enable/disable SSL communication + with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for a + volume should be ThickProvisioned or ThinProvisioned. + Default is ThinProvisioned. + type: string + volumeName: + description: The name of a volume already created + in the ScaleIO system that is associated with + this volume source. + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Default is + "xfs". + type: string + storagePool: + description: The ScaleIO Storage Pool associated + with the protection domain. + type: string + gateway: + description: The host address of the ScaleIO API + Gateway. + type: string + required: + - gateway + - secretRef + - system + emptyDir: + description: Represents an empty directory for a pod. + Empty directory volumes support ownership management + and SELinux relabeling. + type: object + properties: + sizeLimit: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and + AsInt64() accessors. The serialization format + is: ::= (Note + that may be empty, from the "" case in + .) ::= 0 | 1 | ... + | 9 ::= | + ::= | . + | . | . ::= + "+" | "-" ::= | + ::= | + | ::= Ki | Mi | + Gi | Ti | Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T | + P | E (Note that 1024 = 1Ki but 1000 = 1k; I + didn''t choose the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms is used, + no quantity may represent a number greater than + 2^63-1 in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more precise + will be capped or rounded up. (E.g.: 0.1m will + rounded up to 1m.) This may be extended in the + future if we require larger or smaller quantities. When + a Quantity is parsed from a string, it will remember + the type of suffix it had, and will use the same + type again when it is serialized. Before serializing, + Quantity will be put in "canonical form". This + means that Exponent/suffix will be adjusted up + or down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision is lost b. + No fractional digits will be emitted c. The + exponent (or suffix) is as large as possible. + The sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole + point of this exercise. Non-canonical values + will still parse as long as they are well formed, + but will be re-emitted in their canonical form. + (So always use canonical form, or don''t diff.) This + format is intended to make it difficult to use + these numbers without writing some sort of special + handling code in the hopes that that will cause + implementors to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + medium: + description: 'What type of storage medium should + back this directory. The default is "" which means + to use the node''s default medium. Must be an + empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: string + glusterfs: + description: Represents a Glusterfs mount that lasts + the lifetime of a pod. Glusterfs volumes do not support + ownership management or SELinux relabeling. + type: object + properties: + path: + description: 'Path is the Glusterfs volume path. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + endpoints: + description: 'EndpointsName is the endpoint name + that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs + volume to be mounted with read-only permissions. + Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + required: + - endpoints + - path + gcePersistentDisk: + description: Represents a Persistent Disk resource in + Google Compute Engine. A GCE PD must exist before + mounting to a container. The disk must also be in + the same GCE project and zone as the kubelet. A GCE + PD can only be mounted as read/write once or read-only + many times. GCE PDs support ownership management and + SELinux relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that you + want to mount. If omitted, the default is to mount + by volume name. Examples: For volume /dev/sda1, + you specify the partition as "1". Similarly, the + volume partition for /dev/sda is "0" (or you can + leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: number + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. More + info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + pdName: + description: 'Unique name of the PD resource in + GCE. Used to identify the disk in GCE. More info: + https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + required: + - pdName + photonPersistentDisk: + description: Represents a Photon Controller persistent + disk resource. + type: object + properties: + pdID: + description: ID that identifies Photon Controller + persistent disk + type: string + fsType: + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - pdID + azureDisk: + description: AzureDisk represents an Azure Data Disk + mount on the host and bind mount to the pod. + type: object + properties: + diskName: + description: The Name of the data disk in the blob + storage + type: string + kind: + description: 'Expected values Shared: multiple blob + disks per storage account Dedicated: single blob + disk per storage account Managed: azure managed + data disk (only in managed availability set). + defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + cachingMode: + description: 'Host Caching mode: None, Read Only, + Read Write.' + type: string + diskURI: + description: The URI the data disk in the blob storage + type: string + fsType: + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - diskName + - diskURI + cinder: + description: Represents a cinder volume resource in + Openstack. A Cinder volume must exist before mounting + to a container. The volume must also be in the same + region as the kubelet. Cinder volumes support ownership + management and SELinux relabeling. + type: object + properties: + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + volumeID: + description: 'volume id used to identify the volume + in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + fsType: + description: 'Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + required: + - volumeID + downwardAPI: + description: DownwardAPIVolumeSource represents a volume + containing downward API info. Downward API volumes + support ownership management and SELinux relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the + path are not affected by this setting. This might + be in conflict with other options that affect + the file mode, like fsGroup, and the result can + be other mode bits set.' + type: number + items: + description: Items is a list of downward API volume + file + type: array + items: + description: DownwardAPIVolumeFile represents + information to create the file containing the + pod field + type: object + properties: + mode: + description: 'Optional: mode bits to use on + this file, must be a value between 0 and + 0777. If not specified, the volume defaultMode + will be used. This might be in conflict + with other options that affect the file + mode, like fsGroup, and the result can be + other mode bits set.' + type: number + path: + description: 'Required: Path is the relative + path name of the file to be created. Must + not be absolute or contain the ''..'' path. + Must be utf-8 encoded. The first item of + the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the + "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | + Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M + | G | T | P | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms + is used, no quantity may represent a + number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may + be extended in the future if we require + larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type again + when it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. + No fractional digits will be emitted c. + The exponent (or suffix) is as large + as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always + use canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing + some sort of special handling code in + the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector selects an + APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, defaults + to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - path + awsElasticBlockStore: + description: Represents a Persistent Disk resource in + AWS. An AWS EBS disk must exist before mounting to + a container. The disk must also be in the same AWS + zone as the kubelet. An AWS EBS disk can only be mounted + as read/write once. AWS EBS volumes support ownership + management and SELinux relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that you + want to mount. If omitted, the default is to mount + by volume name. Examples: For volume /dev/sda1, + you specify the partition as "1". Similarly, the + volume partition for /dev/sda is "0" (or you can + leave the property empty).' + type: number + volumeID: + description: 'Unique ID of the persistent disk resource + in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + readOnly: + description: 'Specify "true" to force and set the + ReadOnly property in VolumeMounts to "true". If + omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + required: + - volumeID + flocker: + description: Represents a Flocker volume mounted by + the Flocker agent. One and only one of datasetName + and datasetUUID should be set. Flocker volumes do + not support ownership management or SELinux relabeling. + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata + -> name on the dataset for Flocker should be considered + as deprecated + type: string + datasetUUID: + description: UUID of the dataset. This is unique + identifier of a Flocker dataset + type: string + iscsi: + description: Represents an ISCSI disk. ISCSI volumes + can only be mounted as read/write once. ISCSI volumes + support ownership management and SELinux relabeling. + type: object + properties: + chapAuthSession: + description: whether support iSCSI Session CHAP + authentication + type: boolean + iscsiInterface: + description: iSCSI Interface Name that uses an iSCSI + transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: number + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP + authentication + type: boolean + iqn: + description: Target iSCSI Qualified Name. + type: string + portals: + description: iSCSI Target Portal List. The portal + is either an IP or ip_addr:port if the port is + other than default (typically TCP ports 860 and + 3260). + type: array + items: + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName + is specified with iscsiInterface simultaneously, + new iSCSI interface : + will be created for the connection. + type: string + readOnly: + description: ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' + type: string + targetPortal: + description: iSCSI Target Portal. The Portal is + either an IP or ip_addr:port if the port is other + than default (typically TCP ports 860 and 3260). + type: string + required: + - iqn + - lun + - targetPortal + rbd: + description: Represents a Rados Block Device mount that + lasts the lifetime of a pod. RBD volumes support ownership + management and SELinux relabeling. + type: object + properties: + image: + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + pool: + description: 'The rados pool name. Default is rbd. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' + type: string + keyring: + description: 'Keyring is the path to key ring for + RBDUser. Default is /etc/ceph/keyring. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + user: + description: 'The rados user name. Default is admin. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: + type: string + required: + - image + - monitors + configMap: + description: Adapts a ConfigMap into a volume. The + contents of the target ConfigMap's Data field will + be presented in a volume as files using the keys in + the Data field as the file names, unless the items + element is populated with specific mappings of keys + to paths. ConfigMap volumes support ownership management + and SELinux relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the + path are not affected by this setting. This might + be in conflict with other options that affect + the file mode, like fsGroup, and the result can + be other mode bits set.' + type: number + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap or its + keys must be defined + type: boolean + items: + description: If unspecified, each key-value pair + in the Data field of the referenced ConfigMap + will be projected into the volume as a file whose + name is the key and content is the value. If specified, + the listed keys will be projected into the specified + paths, and unlisted keys will not be present. + If a key is specified which is not present in + the ConfigMap, the volume setup will error unless + it is marked optional. Paths must be relative + and may not contain the '..' path or start with + '..'. + type: array + items: + description: Maps a string key to a path within + a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use on + this file, must be a value between 0 and + 0777. If not specified, the volume defaultMode + will be used. This might be in conflict + with other options that affect the file + mode, like fsGroup, and the result can be + other mode bits set.' + type: number + path: + description: The relative path of the file + to map the key to. May not be an absolute + path. May not contain the path element '..'. + May not start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + storageos: + description: Represents a StorageOS persistent volume + resource. + type: object + properties: + volumeNamespace: + description: VolumeNamespace specifies the scope + of the volume within StorageOS. If no namespace + is specified then the Pod's namespace will be + used. This allows the Kubernetes name scoping + to be mirrored within StorageOS for tighter integration. + Set VolumeName to any name to override the default + behaviour. Set to "default" if you are not using + namespaces within StorageOS. Namespaces that do + not pre-exist within StorageOS will be created. + type: string + volumeName: + description: VolumeName is the human-readable name + of the StorageOS volume. Volume names are only + unique within a namespace. + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + csi: + description: Represents a source location of a volume + to mount, managed by an external CSI driver + type: object + properties: + driver: + description: Driver is the name of the CSI driver + that handles this volume. Consult with your admin + for the correct name as registered in the cluster. + type: string + nodePublishSecretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced object + inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Specifies a read-only configuration + for the volume. Defaults to false (read/write). + type: boolean + fsType: + description: Filesystem type to mount. Ex. "ext4", + "xfs", "ntfs". If not provided, the empty value + is passed to the associated CSI driver which will + determine the default filesystem to apply. + type: string + volumeAttributes: + description: VolumeAttributes stores driver-specific + properties that are passed to the CSI driver. + Consult your driver's documentation for supported + values. + additionalProperties: + type: string + type: object + required: + - driver + name: + description: 'Volume''s name. Must be a DNS_LABEL and + unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: Represents an NFS mount that lasts the + lifetime of a pod. NFS volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + path: + description: 'Path that is exported by the NFS server. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + server: + description: 'Server is the hostname or IP address + of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS export + to be mounted with read-only permissions. Defaults + to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + required: + - path + - server + persistentVolumeClaim: + description: PersistentVolumeClaimVolumeSource references + the user's PVC in the same namespace. This volume + finds the bound PV and mounts that volume for the + pod. A PersistentVolumeClaimVolumeSource is, essentially, + a wrapper around another type of volume that is owned + by someone else (the system). + type: object + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim + in the same namespace as the pod using this volume. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in + VolumeMounts. Default false. + type: boolean + required: + - claimName + gitRepo: + description: 'Represents a volume that is populated + with the contents of a git repository. Git repo volumes + do not support ownership management. Git repo volumes + support SELinux relabeling. DEPRECATED: GitRepo is + deprecated. To provision a container with a git repo, + mount an EmptyDir into an InitContainer that clones + the repo using git, then mount the EmptyDir into the + Pod''s container.' + type: object + properties: + repository: + description: Repository URL + type: string + directory: + description: Target directory name. Must not contain + or start with '..'. If '.' is supplied, the volume + directory will be the git repository. Otherwise, + if specified, the volume will contain the git + repository in the subdirectory with the given + name. + type: string + revision: + description: Commit hash for the specified revision. + type: string + required: + - repository + portworxVolume: + description: PortworxVolumeSource represents a Portworx + volume resource. + type: object + properties: + volumeID: + description: VolumeID uniquely identifies a Portworx + volume + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: FSType represents the filesystem type + to mount Must be a filesystem type supported by + the host operating system. Ex. "ext4", "xfs". + Implicitly inferred to be "ext4" if unspecified. + type: string + required: + - volumeID + vsphereVolume: + description: Represents a vSphere volume resource. + type: object + properties: + storagePolicyName: + description: Storage Policy Based Management (SPBM) + profile name. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) + profile ID associated with the StoragePolicyName. + type: string + volumePath: + description: Path that identifies vSphere volume + vmdk + type: string + fsType: + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - volumePath + fc: + description: Represents a Fibre Channel volume. Fibre + Channel volumes can only be mounted as read/write + once. Fibre Channel volumes support ownership management + and SELinux relabeling. + type: object + properties: + lun: + description: 'Optional: FC target lun number' + type: number + targetWWNs: + description: 'Optional: FC target worldwide names + (WWNs)' + type: array + items: + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' + type: boolean + wwids: + description: 'Optional: FC volume world wide identifiers + (wwids) Either wwids or combination of targetWWNs + and lun must be set, but not both simultaneously.' + type: array + items: + type: string + fsType: + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + hostPath: + description: Represents a host path mapped into a pod. + Host path volumes do not support ownership management + or SELinux relabeling. + type: object + properties: + path: + description: 'Path of the directory on the host. + If the path is a symlink, it will follow the link + to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults + to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + required: + - path + required: + - name + resources: + type: object + description: Memory and CPU minimum requirements and limits + for the server. + properties: + requests: + type: object + additionalProperties: + type: string + description: 'Requests describes the minimum amount of + compute resources required. If Requests is omitted for + a container, it defaults to Limits if that is explicitly + specified, otherwise to an implementation-defined value. + More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + limits: + type: object + additionalProperties: + type: string + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + annotations: + type: object + additionalProperties: + type: string + description: The annotations to be attached to generated resources. + env: + type: array + description: A list of environment variables to add to a server. + items: + description: EnvVar represents an environment variable present + in a Container. + type: object + properties: + name: + description: Name of the environment variable. Must + be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded + using the previous defined environment variables in + the container and any service environment variables. + If a variable cannot be resolved, the reference in + the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Defaults to + "".' + type: string + valueFrom: + description: EnvVarSource represents a source for the + value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key of + a Secret. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents container + resources (cpu, memory) and their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" case + in .) ::= 0 | + 1 | ... | 9 ::= + | ::= + | . | . | . + ::= "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | Ti | + Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | + T | P | E (Note that 1024 = 1Ki but 1000 + = 1k; I didn''t choose the capitalization.) + ::= "e" | + "E" No matter which of the + three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than 3 + decimal places. Numbers larger or more precise + will be capped or rounded up. (E.g.: 0.1m + will rounded up to 1m.) This may be extended + in the future if we require larger or smaller + quantities. When a Quantity is parsed from + a string, it will remember the type of suffix + it had, and will use the same type again when + it is serialized. Before serializing, Quantity + will be put in "canonical form". This means + that Exponent/suffix will be adjusted up or + down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision + is lost b. No fractional digits will be + emitted c. The exponent (or suffix) is as + large as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi will + be serialized as "1536Mi" Note that the quantity + will NEVER be internally represented by a + floating point number. That is the whole point + of this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or don''t + diff.) This format is intended to make it + difficult to use these numbers without writing + some sort of special handling code in the + hopes that that will cause implementors to + also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap or + its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an APIVersioned + field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in + the specified API version. + type: string + required: + - fieldPath + required: + - name + restartPolicy: + type: string + description: 'Restart policy for all containers within the + pod. One of Always, OnFailure, Never. Default to Always. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + nodeSelector: + type: object + additionalProperties: + type: string + description: Selector which must match a node's labels for + the pod to be scheduled on that node. + volumeMounts: + type: array + description: Additional volume mounts for the server pod. + items: + description: VolumeMount describes a mounting of a Volume + within a container. + type: object + properties: + mountPath: + description: Path within the container at which the + volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and the + other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise + (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's + volume should be mounted. Defaults to "" (volume's + root). + type: string + subPathExpr: + description: Expanded path within the volume from which + the container's volume should be mounted. Behaves + similarly to SubPath but environment variable references + $(VAR_NAME) are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in 1.15. + type: string + required: + - mountPath + - name + labels: + type: object + additionalProperties: + type: string + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + runtimeClassName: + type: string + description: 'RuntimeClassName refers to a RuntimeClass object + in the node.k8s.io group, which should be used to run this + pod. If no RuntimeClass resource matches the named class, + the pod will not be run. If unset or empty, the "legacy" + RuntimeClass will be used, which is an implicit class with + an empty definition that uses the default runtime handler. + More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future.' + tolerations: + type: array + description: If specified, the pod's tolerations. + items: + description: The pod this Toleration is attached to tolerates + any taint that matches the triple using + the matching operator . + type: object + properties: + effect: + description: Effect indicates the taint effect to match. + Empty means match all taint effects. When specified, + allowed values are NoSchedule, PreferNoSchedule and + NoExecute. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period + of time the toleration (which must be of effect NoExecute, + otherwise this field is ignored) tolerates the taint. + By default, it is not set, which means tolerate the + taint forever (do not evict). Zero and negative values + will be treated as 0 (evict immediately) by the system. + type: number + value: + description: Value is the taint value the toleration + matches to. If the operator is Exists, the value should + be empty, otherwise just a regular string. + type: string + key: + description: Key is the taint key that the toleration + applies to. Empty means match all taint keys. If the + key is empty, operator must be Exists; this combination + means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship + to the value. Valid operators are Exists and Equal. + Defaults to Equal. Exists is equivalent to wildcard + for value, so that a pod can tolerate all taints of + a particular category. + type: string + readinessProbe: + type: object + description: Settings for the readiness probe associated with + a server. + properties: + periodSeconds: + type: number + description: The number of seconds between checks. + timeoutSeconds: + type: number + description: The number of seconds with no response that + indicates a failure. + initialDelaySeconds: + type: number + description: The number of seconds before the first check + is performed. + containers: + type: array + description: Additional containers to be included in the server + pod. + items: + description: A single application container that you want + to run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of a + raw block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of + the container that the device will be mapped + to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, + IfNotPresent. Defaults to Always if :latest tag is + specified, or IfNotPresent otherwise. Cannot be updated. + More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate + a buffer for stdin in the container runtime. If this + is not set, reads from stdin in the container will + always result in EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message should + be populated. File will use the contents of terminationMessagePath + to populate the container status message on both success + and failure. FallbackToLogsOnError will use the last + chunk of container log output if the termination message + file is empty and the container exited with an error. + The log output is limited to 2048 bytes or 80 lines, + whichever is smaller. Defaults to File. Cannot be + updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to which + the container''s termination message will be written + is mounted into the container''s filesystem. Message + written is intended to be brief final status, such + as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' + type: string + workingDir: + description: Container's working directory. If not specified, + the container runtime's default will be used, which + might be configured in the container image. Cannot + be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields are + present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the + container process. Defaults to user specified + in image metadata if unspecified. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in + SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities + from running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to be + applied to the container + type: object + properties: + role: + description: Role is a SELinux role label that + applies to the container. + type: string + level: + description: Level is SELinux level label that + applies to the container. + type: string + type: + description: Type is a SELinux type label that + applies to the container. + type: string + user: + description: User is a SELinux user label that + applies to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain + Windows-specific options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the + GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential + spec named by the GMSACredentialSpecName field. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. + type: string + runAsUserName: + description: The UserName in Windows to run + the entrypoint of the container process. Defaults + to the user specified in image metadata if + unspecified. May also be set in PodSecurityContext. + If set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. This field is alpha-level and + it is only honored by servers that enable + the WindowsRunAsUserName feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + procMount: + description: procMount denotes the type of proc + mount to use for the containers. The default is + DefaultProcMount which uses the container runtime + defaults for readonly paths and masked paths. + This requires the ProcMountType feature flag to + be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the container + process. AllowPrivilegeEscalation is true always + when the container is: 1) run as Privileged 2) + has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the + container process. Uses runtime default if unset. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run + as a non-root user. If true, the Kubelet will + validate the image at runtime to ensure that it + does not run as UID 0 (root) and fail to start + the container if it does. If unset or false, no + such validation will be performed. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in + SecurityContext takes precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set in + the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. + Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) + are expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, + the reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a + double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether + the variable exists or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source + for the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key + of a Secret. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the + "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | + Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M + | G | T | P | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms + is used, no quantity may represent a + number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may + be extended in the future if we require + larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type again + when it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. + No fractional digits will be emitted c. + The exponent (or suffix) is as large + as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always + use canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing + some sort of special handling code in + the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an + APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, defaults + to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional information + about the network connections a container uses, but + is primarily informational. Not specifying a port + here DOES NOT prevent that port from being exposed. + Any port which is listening on the default "0.0.0.0" + address inside a container will be accessible from + the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network port + in a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, TCP, + or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external + port to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port in + a pod must have a unique name. Name for the + port that can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the pod's + IP address. This must be a valid port number, + 0 < x < 65536. + type: number + hostPort: + description: Number of port to expose on the host. + If specified, this must be a valid port number, + 0 < x < 65536. If HostNetwork is specified, + this must match ContainerPort. Most containers + do not need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within + a shell. The docker image''s ENTRYPOINT is used if + this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. If + a variable cannot be resolved, the reference in the + input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be updated. + More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's + filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a + Volume within a container. + type: object + properties: + mountPath: + description: Path within the container at which + the volume should be mounted. Must not contain + ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and + the other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults to + false. + type: boolean + subPath: + description: Path within the volume from which + the container's volume should be mounted. Defaults + to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment + variable references $(VAR_NAME) are expanded + using the container's environment. Defaults + to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in + 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. The + $(VAR_NAME) syntax can be escaped with a double $$, + ie: $$(VAR_NAME). Escaped references will never be + expanded, regardless of whether the variable exists + or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the management + system should take in response to container lifecycle + events. For the PostStart and PreStop lifecycle handlers, + management of the container blocks until the action + is complete, unless the container process fails, in + which case the handler is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a DNS_LABEL. + Each container in a pod must have a unique name (DNS_LABEL). + Cannot be updated. + type: string + tty: + description: Whether this container should allocate + a TTY for itself, also requires 'stdin' to be true. + Default is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should close + the stdin channel after it has been opened by a single + attach. When stdin is true the stdin stream will remain + open across multiple attach sessions. If stdinOnce + is set to true, stdin is opened on container start, + is empty until the first client attaches to stdin, + and then remains open and accepts data until the client + disconnects, at which time stdin is closed and remains + closed until the container is restarted. If this flag + is false, a container processes that reads from stdin + will never receive an EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment + variables in the container. The keys defined within + a source must be a C_IDENTIFIER. All invalid keys + will be reported as an event when the container is + starting. When a key exists in multiple sources, the + value associated with the last source will take precedence. + Values defined by an Env with a duplicate key will + take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of + a set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + must be defined + type: boolean + prefix: + description: An optional identifier to prepend + to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret + to populate the environment variables with. The + contents of the target Secret's Data field will + represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret must + be defined + type: boolean + required: + - name + containerSecurityContext: + type: object + description: Container-level security attributes. Will override + any matching pod-level attributes. + properties: + privileged: + type: boolean + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + runAsUser: + type: number + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + capabilities: + type: object + description: Adds and removes POSIX capabilities from + running containers. + properties: + add: + type: array + description: Added capabilities + items: + type: string + drop: + type: array + description: Removed capabilities + items: + type: string + seLinuxOptions: + type: object + description: SELinuxOptions are the labels to be applied + to the container + properties: + role: + type: string + description: Role is a SELinux role label that applies + to the container. + level: + type: string + description: Level is SELinux level label that applies + to the container. + type: + type: string + description: Type is a SELinux type label that applies + to the container. + user: + type: string + description: User is a SELinux user label that applies + to the container. + windowsOptions: + type: object + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + properties: + gmsaCredentialSpec: + type: string + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + runAsUserName: + type: string + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and + it is only honored by servers that enable the WindowsRunAsUserName + feature flag. + gmsaCredentialSpecName: + type: string + description: GMSACredentialSpecName is the name of + the GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. + procMount: + type: string + description: procMount denotes the type of proc mount + to use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. This requires the ProcMountType + feature flag to be enabled. + allowPrivilegeEscalation: + type: boolean + description: 'AllowPrivilegeEscalation controls whether + a process can gain more privileges than its parent process. + This bool directly controls if the no_new_privs flag + will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' + runAsGroup: + type: number + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + runAsNonRoot: + type: boolean + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if it + does. If unset or false, no such validation will be + performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + readOnlyRootFilesystem: + type: boolean + description: Whether this container has a read-only root + filesystem. Default is false. + schedulerName: + type: string + description: If specified, the pod will be dispatched by specified + scheduler. If not specified, the pod will be dispatched + by default scheduler. + initContainers: + type: array + description: Initialization containers to be included in the + server pod. + items: + description: A single application container that you want + to run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of a + raw block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of + the container that the device will be mapped + to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, + IfNotPresent. Defaults to Always if :latest tag is + specified, or IfNotPresent otherwise. Cannot be updated. + More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate + a buffer for stdin in the container runtime. If this + is not set, reads from stdin in the container will + always result in EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message should + be populated. File will use the contents of terminationMessagePath + to populate the container status message on both success + and failure. FallbackToLogsOnError will use the last + chunk of container log output if the termination message + file is empty and the container exited with an error. + The log output is limited to 2048 bytes or 80 lines, + whichever is smaller. Defaults to File. Cannot be + updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to which + the container''s termination message will be written + is mounted into the container''s filesystem. Message + written is intended to be brief final status, such + as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' + type: string + workingDir: + description: Container's working directory. If not specified, + the container runtime's default will be used, which + might be configured in the container image. Cannot + be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields are + present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the + container process. Defaults to user specified + in image metadata if unspecified. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in + SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities + from running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to be + applied to the container + type: object + properties: + role: + description: Role is a SELinux role label that + applies to the container. + type: string + level: + description: Level is SELinux level label that + applies to the container. + type: string + type: + description: Type is a SELinux type label that + applies to the container. + type: string + user: + description: User is a SELinux user label that + applies to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain + Windows-specific options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the + GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential + spec named by the GMSACredentialSpecName field. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. + type: string + runAsUserName: + description: The UserName in Windows to run + the entrypoint of the container process. Defaults + to the user specified in image metadata if + unspecified. May also be set in PodSecurityContext. + If set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. This field is alpha-level and + it is only honored by servers that enable + the WindowsRunAsUserName feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + procMount: + description: procMount denotes the type of proc + mount to use for the containers. The default is + DefaultProcMount which uses the container runtime + defaults for readonly paths and masked paths. + This requires the ProcMountType feature flag to + be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the container + process. AllowPrivilegeEscalation is true always + when the container is: 1) run as Privileged 2) + has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the + container process. Uses runtime default if unset. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run + as a non-root user. If true, the Kubelet will + validate the image at runtime to ensure that it + does not run as UID 0 (root) and fail to start + the container if it does. If unset or false, no + such validation will be performed. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in + SecurityContext takes precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set in + the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. + Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) + are expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, + the reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a + double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether + the variable exists or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source + for the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key + of a Secret. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the + "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | + Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M + | G | T | P | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms + is used, no quantity may represent a + number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may + be extended in the future if we require + larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type again + when it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. + No fractional digits will be emitted c. + The exponent (or suffix) is as large + as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always + use canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing + some sort of special handling code in + the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an + APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, defaults + to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional information + about the network connections a container uses, but + is primarily informational. Not specifying a port + here DOES NOT prevent that port from being exposed. + Any port which is listening on the default "0.0.0.0" + address inside a container will be accessible from + the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network port + in a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, TCP, + or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external + port to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port in + a pod must have a unique name. Name for the + port that can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the pod's + IP address. This must be a valid port number, + 0 < x < 65536. + type: number + hostPort: + description: Number of port to expose on the host. + If specified, this must be a valid port number, + 0 < x < 65536. If HostNetwork is specified, + this must match ContainerPort. Most containers + do not need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within + a shell. The docker image''s ENTRYPOINT is used if + this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. If + a variable cannot be resolved, the reference in the + input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be updated. + More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's + filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a + Volume within a container. + type: object + properties: + mountPath: + description: Path within the container at which + the volume should be mounted. Must not contain + ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and + the other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults to + false. + type: boolean + subPath: + description: Path within the volume from which + the container's volume should be mounted. Defaults + to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment + variable references $(VAR_NAME) are expanded + using the container's environment. Defaults + to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in + 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. The + $(VAR_NAME) syntax can be escaped with a double $$, + ie: $$(VAR_NAME). Escaped references will never be + expanded, regardless of whether the variable exists + or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the management + system should take in response to container lifecycle + events. For the PostStart and PreStop lifecycle handlers, + management of the container blocks until the action + is complete, unless the container process fails, in + which case the handler is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a DNS_LABEL. + Each container in a pod must have a unique name (DNS_LABEL). + Cannot be updated. + type: string + tty: + description: Whether this container should allocate + a TTY for itself, also requires 'stdin' to be true. + Default is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should close + the stdin channel after it has been opened by a single + attach. When stdin is true the stdin stream will remain + open across multiple attach sessions. If stdinOnce + is set to true, stdin is opened on container start, + is empty until the first client attaches to stdin, + and then remains open and accepts data until the client + disconnects, at which time stdin is closed and remains + closed until the container is restarted. If this flag + is false, a container processes that reads from stdin + will never receive an EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment + variables in the container. The keys defined within + a source must be a C_IDENTIFIER. All invalid keys + will be reported as an event when the container is + starting. When a key exists in multiple sources, the + value associated with the last source will take precedence. + Values defined by an Env with a duplicate key will + take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of + a set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + must be defined + type: boolean + prefix: + description: An optional identifier to prepend + to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret + to populate the environment variables with. The + contents of the target Secret's Data field will + represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret must + be defined + type: boolean + required: + - name + shutdown: + type: object + description: Configures how the operator should shutdown the + server instance. + properties: + ignoreSessions: + type: boolean + description: For graceful shutdown only, indicates to + ignore pending HTTP sessions during in-flight work handling. + Not required. Defaults to false. + shutdownType: + type: string + description: Tells the operator how to shutdown server + instances. Not required. Defaults to graceful shutdown. + enum: + - Graceful + - Forced + timeoutSeconds: + type: number + description: For graceful shutdown only, number of seconds + to wait before aborting in-flight work and shutting + down the server. Not required. Defaults to 30 seconds. + affinity: + type: object + description: If specified, the pod's scheduling constraints + properties: + nodeAffinity: + type: object + description: Node affinity is a group of node affinity + scheduling rules. + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: object + description: A node selector represents the union + of the results of one or more label queries over + a set of nodes; that is, it represents the OR of + the selectors represented by the node selector terms. + properties: + nodeSelectorTerms: + type: array + description: Required. A list of node selector + terms. The terms are ORed. + items: + description: A null or empty node selector term + matches no objects. The requirements of them + are ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + required: + - nodeSelectorTerms + preferredDuringSchedulingIgnoredDuringExecution: + type: array + description: The scheduler will prefer to schedule + pods to nodes that satisfy the affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. The + node that is most preferred is the one with the + greatest sum of weights, i.e. for each node that + meets all of the scheduling requirements (resource + request, requiredDuringScheduling affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if + the node matches the corresponding matchExpressions; + the node(s) with the highest sum are the most preferred. + items: + description: An empty preferred scheduling term + matches all objects with implicit weight 0 (i.e. + it's a no-op). A null preferred scheduling term + matches no objects (i.e. is also a no-op). + type: object + properties: + preference: + description: A null or empty node selector term + matches no objects. The requirements of them + are ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + weight: + description: Weight associated with matching + the corresponding nodeSelectorTerm, in the + range 1-100. + type: number + required: + - preference + - weight + podAffinity: + type: object + description: Pod affinity is a group of inter pod affinity + scheduling rules. + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + description: If the affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the + affinity requirements specified by this field cease + to be met at some point during pod execution (e.g. + due to a pod label update), the system may or may + not try to eventually evict the pod from its node. + When there are multiple elements, the lists of nodes + corresponding to each podAffinityTerm are intersected, + i.e. all terms must be satisfied. + items: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node + whose value of the label with key + matches that of any node on which a pod of the + set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label + selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The requirements + are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the + pods matching the labelSelector in the specified + namespaces, where co-located is defined as + running on a node whose value of the label + with key topologyKey matches that of any node + on which any of the selected pods is running. + Empty topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + description: The scheduler will prefer to schedule + pods to nodes that satisfy the affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. The + node that is most preferred is the one with the + greatest sum of weights, i.e. for each node that + meets all of the scheduling requirements (resource + request, requiredDuringScheduling affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if + the node has pods which matches the corresponding + podAffinityTerm; the node(s) with the highest sum + are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely those + matching the labelSelector relative to the + given namespace(s)) that this pod should be + co-located (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on + which a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label + query over a set of resources. The result + of matchLabels and matchExpressions are + ANDed. An empty label selector matches + all objects. A null label selector matches + no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. + type: array + items: + type: string + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of + {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose + value of the label with key topologyKey + matches that of any node on which any + of the selected pods is running. Empty + topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which + namespaces the labelSelector applies to + (matches against); null or empty list + means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching + the corresponding podAffinityTerm, in the + range 1-100. + type: number + required: + - podAffinityTerm + - weight + podAntiAffinity: + type: object + description: Pod anti affinity is a group of inter pod + anti affinity scheduling rules. + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + description: If the anti-affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the + anti-affinity requirements specified by this field + cease to be met at some point during pod execution + (e.g. due to a pod label update), the system may + or may not try to eventually evict the pod from + its node. When there are multiple elements, the + lists of nodes corresponding to each podAffinityTerm + are intersected, i.e. all terms must be satisfied. + items: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node + whose value of the label with key + matches that of any node on which a pod of the + set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label + selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The requirements + are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the + pods matching the labelSelector in the specified + namespaces, where co-located is defined as + running on a node whose value of the label + with key topologyKey matches that of any node + on which any of the selected pods is running. + Empty topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + description: The scheduler will prefer to schedule + pods to nodes that satisfy the anti-affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. The + node that is most preferred is the one with the + greatest sum of weights, i.e. for each node that + meets all of the scheduling requirements (resource + request, requiredDuringScheduling anti-affinity + expressions, etc.), compute a sum by iterating through + the elements of this field and adding "weight" to + the sum if the node has pods which matches the corresponding + podAffinityTerm; the node(s) with the highest sum + are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely those + matching the labelSelector relative to the + given namespace(s)) that this pod should be + co-located (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on + which a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label + query over a set of resources. The result + of matchLabels and matchExpressions are + ANDed. An empty label selector matches + all objects. A null label selector matches + no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. + type: array + items: + type: string + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of + {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose + value of the label with key topologyKey + matches that of any node on which any + of the selected pods is running. Empty + topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which + namespaces the labelSelector applies to + (matches against); null or empty list + means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching + the corresponding podAffinityTerm, in the + range 1-100. + type: number + required: + - podAffinityTerm + - weight + serverStartPolicy: + type: string + description: The strategy for deciding whether to start a server. + Legal values are ALWAYS, NEVER, or IF_NEEDED. + enum: + - ALWAYS + - NEVER + - IF_NEEDED + adminService: + type: object + description: Configures which of the Administration Server's WebLogic + admin channels should be exposed outside the Kubernetes cluster + via a node port service. + properties: + channels: + type: array + description: Specifies which of the Administration Server's + WebLogic channels should be exposed outside the Kubernetes + cluster via a node port service, along with the node port + for each channel. If not specified, the Administration Server's + node port service will not be created. + items: + description: Describes a single channel used by the Administration + Server. + type: object + properties: + channelName: + description: "Name of channel.\n'default' refers to\ + \ the Administration Server's default channel (configured\ + \ via the ServerMBean's ListenPort) \n'default-secure'\ + \ refers to the Administration Server's default secure\ + \ channel (configured via the ServerMBean's SSLMBean's\ + \ ListenPort) \n'default-admin' refers to the Administration\ + \ Server's default administrative channel (configured\ + \ via the DomainMBean's AdministrationPort) \nOtherwise,\ + \ the name is the name of one of the Administration\ + \ Server's network access points (configured via the\ + \ ServerMBean's NetworkAccessMBeans)." + type: string + nodePort: + description: Specifies the port number used to access + the WebLogic channel outside of the Kubernetes cluster. + If not specified, defaults to the port defined by + the WebLogic channel. + type: number + required: + - channelName + annotations: + type: object + additionalProperties: + type: string + description: Annotations to associate with the external channel + service. + labels: + type: object + additionalProperties: + type: string + description: Labels to associate with the external channel + service. + restartVersion: + type: string + description: If present, every time this value is updated the + operator will restart the required servers. + serverPod: + type: object + description: Configuration affecting server pods. + properties: + nodeName: + type: string + description: NodeName is a request to schedule this pod onto a + specific node. If it is non-empty, the scheduler simply schedules + this pod onto that node, assuming that it fits resource requirements. + livenessProbe: + type: object + description: Settings for the liveness probe associated with a + server. + properties: + periodSeconds: + type: number + description: The number of seconds between checks. + timeoutSeconds: + type: number + description: The number of seconds with no response that indicates + a failure. + initialDelaySeconds: + type: number + description: The number of seconds before the first check + is performed. + readinessGates: + type: array + description: 'If specified, all readiness gates will be evaluated + for pod readiness. A pod is ready when all its containers are + ready AND all conditions specified in the readiness gates have + status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + items: + description: PodReadinessGate contains the reference to a pod + condition + type: object + properties: + conditionType: + description: ConditionType refers to a condition in the + pod's condition list with matching type. + type: string + required: + - conditionType + serviceAccountName: + type: string + description: Name of the ServiceAccount to be used to run this + pod. If it is not set, default ServiceAccount will be used. + The ServiceAccount has to exist at the time the pod is created. + podSecurityContext: + type: object + description: Pod-level security attributes. + properties: + runAsUser: + type: number + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata if + unspecified. May also be set in SecurityContext. If set + in both SecurityContext and PodSecurityContext, the value + specified in SecurityContext takes precedence for that container. + seLinuxOptions: + type: object + description: SELinuxOptions are the labels to be applied to + the container + properties: + role: + type: string + description: Role is a SELinux role label that applies + to the container. + level: + type: string + description: Level is SELinux level label that applies + to the container. + type: + type: string + description: Type is a SELinux type label that applies + to the container. + user: + type: string + description: User is a SELinux user label that applies + to the container. + fsGroup: + type: number + description: 'A special supplemental group that applies to + all containers in a pod. Some volume types allow the Kubelet + to change the ownership of that volume to be owned by the + pod: 1. The owning GID will be the FSGroup 2. The setgid + bit is set (new files created in the volume will be owned + by FSGroup) 3. The permission bits are OR''d with rw-rw---- If + unset, the Kubelet will not modify the ownership and permissions + of any volume.' + windowsOptions: + type: object + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + properties: + gmsaCredentialSpec: + type: string + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named + by the GMSACredentialSpecName field. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. + runAsUserName: + type: string + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set in + PodSecurityContext. If set in both SecurityContext and + PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and it is + only honored by servers that enable the WindowsRunAsUserName + feature flag. + gmsaCredentialSpecName: + type: string + description: GMSACredentialSpecName is the name of the + GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. + supplementalGroups: + type: array + description: A list of groups applied to the first process + run in each container, in addition to the container's primary + GID. If unspecified, no groups will be added to any container. + items: + type: number + runAsGroup: + type: number + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be set + in SecurityContext. If set in both SecurityContext and + PodSecurityContext, the value specified in SecurityContext + takes precedence for that container. + runAsNonRoot: + type: boolean + description: Indicates that the container must run as a non-root + user. If true, the Kubelet will validate the image at runtime + to ensure that it does not run as UID 0 (root) and fail + to start the container if it does. If unset or false, no + such validation will be performed. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. + sysctls: + type: array + description: Sysctls hold a list of namespaced sysctls used + for the pod. Pods with unsupported sysctls (by the container + runtime) might fail to launch. + items: + description: Sysctl defines a kernel parameter to be set + type: object + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + priorityClassName: + type: string + description: If specified, indicates the pod's priority. "system-node-critical" + and "system-cluster-critical" are two special keywords which + indicate the highest priorities with the former being the highest + priority. Any other name must be defined by creating a PriorityClass + object with that name. If not specified, the pod priority will + be default or zero if there is no default. + volumes: + type: array + description: Additional volumes to be created in the server pod. + items: + description: Volume represents a named volume in a pod that + may be accessed by any container in the pod. + type: object + properties: + quobyte: + description: Represents a Quobyte mount that lasts the lifetime + of a pod. Quobyte volumes do not support ownership management + or SELinux relabeling. + type: object + properties: + volume: + description: Volume is a string that references an already + created Quobyte volume by name. + type: string + registry: + description: Registry represents a single or multiple + Quobyte Registry services specified as a string as + host:port pair (multiple entries are separated with + commas) which acts as the central registry for volumes + type: string + readOnly: + description: ReadOnly here will force the Quobyte volume + to be mounted with read-only permissions. Defaults + to false. + type: boolean + user: + description: User to map volume access to Defaults to + serivceaccount user + type: string + tenant: + description: Tenant owning the given Quobyte volume + in the Backend Used with dynamically provisioned Quobyte + volumes, value is set by the plugin + type: string + group: + description: Group to map volume access to Default is + no group + type: string + required: + - registry + - volume + azureFile: + description: AzureFile represents an Azure File Service + mount on the host and bind mount to the pod. + type: object + properties: + secretName: + description: the name of secret that contains Azure + Storage Account Name and Key + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + shareName: + description: Share Name + type: string + required: + - secretName + - shareName + flexVolume: + description: FlexVolume represents a generic volume resource + that is provisioned/attached using an exec based plugin. + type: object + properties: + driver: + description: Driver is the name of the driver to use + for this volume. + type: string + options: + description: 'Optional: Extra command options if any.' + additionalProperties: + type: string + type: object + secretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + fsType: + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. "ext4", + "xfs", "ntfs". The default filesystem depends on FlexVolume + script. + type: string + required: + - driver + secret: + description: Adapts a Secret into a volume. The contents + of the target Secret's Data field will be presented in + a volume as files using the keys in the Data field as + the file names. Secret volumes support ownership management + and SELinux relabeling. + type: object + properties: + secretName: + description: 'Name of the secret in the pod''s namespace + to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 and 0777. + Defaults to 0644. Directories within the path are + not affected by this setting. This might be in conflict + with other options that affect the file mode, like + fsGroup, and the result can be other mode bits set.' + type: number + optional: + description: Specify whether the Secret or its keys + must be defined + type: boolean + items: + description: If unspecified, each key-value pair in + the Data field of the referenced Secret will be projected + into the volume as a file whose name is the key and + content is the value. If specified, the listed keys + will be projected into the specified paths, and unlisted + keys will not be present. If a key is specified which + is not present in the Secret, the volume setup will + error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start + with '..'. + type: array + items: + description: Maps a string key to a path within a + volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use on this + file, must be a value between 0 and 0777. If + not specified, the volume defaultMode will be + used. This might be in conflict with other options + that affect the file mode, like fsGroup, and + the result can be other mode bits set.' + type: number + path: + description: The relative path of the file to + map the key to. May not be an absolute path. + May not contain the path element '..'. May not + start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + projected: + description: Represents a projected volume source + type: object + properties: + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected along + with other supported volume types + type: object + properties: + downwardAPI: + description: Represents downward API info for + projecting into a projected volume. Note that + this is identical to a downwardAPI volume source + without the default mode. + type: object + properties: + items: + description: Items is a list of DownwardAPIVolume + file + type: array + items: + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field + type: object + properties: + mode: + description: 'Optional: mode bits to + use on this file, must be a value + between 0 and 0777. If not specified, + the volume defaultMode will be used. + This might be in conflict with other + options that affect the file mode, + like fsGroup, and the result can be + other mode bits set.' + type: number + path: + description: 'Required: Path is the + relative path name of the file to + be created. Must not be absolute or + contain the ''..'' path. Must be utf-8 + encoded. The first item of the relative + path must not start with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) + and their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It + provides convenient marshaling/unmarshaling + in JSON and YAML, in addition + to String() and AsInt64() accessors. The + serialization format is: ::= + (Note + that may be empty, from + the "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | + . | . ::= + "+" | "-" ::= + | ::= + | + | ::= + Ki | Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | + k | M | G | T | P | E (Note + that 1024 = 1Ki but 1000 = 1k; + I didn''t choose the capitalization.) + ::= "e" + | "E" No matter + which of the three exponent forms + is used, no quantity may represent + a number greater than 2^63-1 in + magnitude, nor may it have more + than 3 decimal places. Numbers + larger or more precise will be + capped or rounded up. (E.g.: 0.1m + will rounded up to 1m.) This may + be extended in the future if we + require larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same + type again when it is serialized. Before + serializing, Quantity will be + put in "canonical form". This + means that Exponent/suffix will + be adjusted up or down (with a + corresponding increase or decrease + in Mantissa) such that: a. No + precision is lost b. No fractional + digits will be emitted c. The + exponent (or suffix) is as large + as possible. The sign will be + omitted unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be + internally represented by a floating + point number. That is the whole + point of this exercise. Non-canonical + values will still parse as long + as they are well formed, but will + be re-emitted in their canonical + form. (So always use canonical + form, or don''t diff.) This format + is intended to make it difficult + to use these numbers without writing + some sort of special handling + code in the hopes that that will + cause implementors to also use + a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource + to select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env + vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector selects + an APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema + the FieldPath is written in terms + of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to + select in the specified API version. + type: string + required: + - fieldPath + required: + - path + configMap: + description: Adapts a ConfigMap into a projected + volume. The contents of the target ConfigMap's + Data field will be presented in a projected + volume as files using the keys in the Data field + as the file names, unless the items element + is populated with specific mappings of keys + to paths. Note that this is identical to a configmap + volume source without the default mode. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its keys must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + ConfigMap will be projected into the volume + as a file whose name is the key and content + is the value. If specified, the listed keys + will be projected into the specified paths, + and unlisted keys will not be present. If + a key is specified which is not present + in the ConfigMap, the volume setup will + error unless it is marked optional. Paths + must be relative and may not contain the + '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path + within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to + use on this file, must be a value + between 0 and 0777. If not specified, + the volume defaultMode will be used. + This might be in conflict with other + options that affect the file mode, + like fsGroup, and the result can be + other mode bits set.' + type: number + path: + description: The relative path of the + file to map the key to. May not be + an absolute path. May not contain + the path element '..'. May not start + with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + secret: + description: Adapts a secret into a projected + volume. The contents of the target Secret's + Data field will be presented in a projected + volume as files using the keys in the Data field + as the file names. Note that this is identical + to a secret volume source without the default + mode. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + Secret will be projected into the volume + as a file whose name is the key and content + is the value. If specified, the listed keys + will be projected into the specified paths, + and unlisted keys will not be present. If + a key is specified which is not present + in the Secret, the volume setup will error + unless it is marked optional. Paths must + be relative and may not contain the '..' + path or start with '..'. + type: array + items: + description: Maps a string key to a path + within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to + use on this file, must be a value + between 0 and 0777. If not specified, + the volume defaultMode will be used. + This might be in conflict with other + options that affect the file mode, + like fsGroup, and the result can be + other mode bits set.' + type: number + path: + description: The relative path of the + file to map the key to. May not be + an absolute path. May not contain + the path element '..'. May not start + with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + serviceAccountToken: + description: ServiceAccountTokenProjection represents + a projected service account token volume. This + projection can be used to insert a service account + token into the pods runtime filesystem for use + against APIs (Kubernetes API Server or otherwise). + type: object + properties: + path: + description: Path is the path relative to + the mount point of the file to project the + token into. + type: string + audience: + description: Audience is the intended audience + of the token. A recipient of a token must + identify itself with an identifier specified + in the audience of the token, and otherwise + should reject the token. The audience defaults + to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the requested + duration of validity of the service account + token. As the token approaches expiration, + the kubelet volume plugin will proactively + rotate the service account token. The kubelet + will start trying to rotate the token if + the token is older than 80 percent of its + time to live or if the token is older than + 24 hours.Defaults to 1 hour and must be + at least 10 minutes. + type: number + required: + - path + defaultMode: + description: Mode bits to use on created files by default. + Must be a value between 0 and 0777. Directories within + the path are not affected by this setting. This might + be in conflict with other options that affect the + file mode, like fsGroup, and the result can be other + mode bits set. + type: number + required: + - sources + cephfs: + description: Represents a Ceph Filesystem mount that lasts + the lifetime of a pod Cephfs volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + path: + description: 'Optional: Used as the mounted root, rather + than the full Ceph tree, default is /' + type: string + secretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + secretFile: + description: 'Optional: SecretFile is the path to key + ring for User, default is /etc/ceph/user.secret More + info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + user: + description: 'Optional: User is the rados user name, + default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + monitors: + description: 'Required: Monitors is a collection of + Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: + type: string + required: + - monitors + scaleIO: + description: ScaleIOVolumeSource represents a persistent + ScaleIO volume + type: object + properties: + system: + description: The name of the storage system as configured + in ScaleIO. + type: string + protectionDomain: + description: The name of the ScaleIO Protection Domain + for the configured storage. + type: string + sslEnabled: + description: Flag to enable/disable SSL communication + with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for a volume + should be ThickProvisioned or ThinProvisioned. Default + is ThinProvisioned. + type: string + volumeName: + description: The name of a volume already created in + the ScaleIO system that is associated with this volume + source. + type: string + secretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. "ext4", + "xfs", "ntfs". Default is "xfs". + type: string + storagePool: + description: The ScaleIO Storage Pool associated with + the protection domain. + type: string + gateway: + description: The host address of the ScaleIO API Gateway. + type: string + required: + - gateway + - secretRef + - system + emptyDir: + description: Represents an empty directory for a pod. Empty + directory volumes support ownership management and SELinux + relabeling. + type: object + properties: + sizeLimit: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and AsInt64() + accessors. The serialization format is: ::= + (Note that may be + empty, from the "" case in .) ::= + 0 | 1 | ... | 9 ::= | + ::= | . + | . | . ::= "+" + | "-" ::= | + ::= | + | ::= Ki | Mi | Gi | + Ti | Pi | Ei (International System of units; See: + http://physics.nist.gov/cuu/Units/binary.html) ::= + m | "" | k | M | G | T | P | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms is used, + no quantity may represent a number greater than 2^63-1 + in magnitude, nor may it have more than 3 decimal + places. Numbers larger or more precise will be capped + or rounded up. (E.g.: 0.1m will rounded up to 1m.) + This may be extended in the future if we require larger + or smaller quantities. When a Quantity is parsed + from a string, it will remember the type of suffix + it had, and will use the same type again when it is + serialized. Before serializing, Quantity will be + put in "canonical form". This means that Exponent/suffix + will be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such that: a. + No precision is lost b. No fractional digits will + be emitted c. The exponent (or suffix) is as large + as possible. The sign will be omitted unless the number + is negative. Examples: 1.5 will be serialized as + "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole point + of this exercise. Non-canonical values will still + parse as long as they are well formed, but will be + re-emitted in their canonical form. (So always use + canonical form, or don''t diff.) This format is intended + to make it difficult to use these numbers without + writing some sort of special handling code in the + hopes that that will cause implementors to also use + a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + medium: + description: 'What type of storage medium should back + this directory. The default is "" which means to use + the node''s default medium. Must be an empty string + (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: string + glusterfs: + description: Represents a Glusterfs mount that lasts the + lifetime of a pod. Glusterfs volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + path: + description: 'Path is the Glusterfs volume path. More + info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + endpoints: + description: 'EndpointsName is the endpoint name that + details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs + volume to be mounted with read-only permissions. Defaults + to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + required: + - endpoints + - path + gcePersistentDisk: + description: Represents a Persistent Disk resource in Google + Compute Engine. A GCE PD must exist before mounting to + a container. The disk must also be in the same GCE project + and zone as the kubelet. A GCE PD can only be mounted + as read/write once or read-only many times. GCE PDs support + ownership management and SELinux relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that you want + to mount. If omitted, the default is to mount by volume + name. Examples: For volume /dev/sda1, you specify + the partition as "1". Similarly, the volume partition + for /dev/sda is "0" (or you can leave the property + empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: number + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. More info: + https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + pdName: + description: 'Unique name of the PD resource in GCE. + Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + fsType: + description: 'Filesystem type of the volume that you + want to mount. Tip: Ensure that the filesystem type + is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + required: + - pdName + photonPersistentDisk: + description: Represents a Photon Controller persistent disk + resource. + type: object + properties: + pdID: + description: ID that identifies Photon Controller persistent + disk + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. "ext4", + "xfs", "ntfs". Implicitly inferred to be "ext4" if + unspecified. + type: string + required: + - pdID + azureDisk: + description: AzureDisk represents an Azure Data Disk mount + on the host and bind mount to the pod. + type: object + properties: + diskName: + description: The Name of the data disk in the blob storage + type: string + kind: + description: 'Expected values Shared: multiple blob + disks per storage account Dedicated: single blob + disk per storage account Managed: azure managed data + disk (only in managed availability set). defaults + to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + cachingMode: + description: 'Host Caching mode: None, Read Only, Read + Write.' + type: string + diskURI: + description: The URI the data disk in the blob storage + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. "ext4", + "xfs", "ntfs". Implicitly inferred to be "ext4" if + unspecified. + type: string + required: + - diskName + - diskURI + cinder: + description: Represents a cinder volume resource in Openstack. + A Cinder volume must exist before mounting to a container. + The volume must also be in the same region as the kubelet. + Cinder volumes support ownership management and SELinux + relabeling. + type: object + properties: + secretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + volumeID: + description: 'volume id used to identify the volume + in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + fsType: + description: 'Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + required: + - volumeID + downwardAPI: + description: DownwardAPIVolumeSource represents a volume + containing downward API info. Downward API volumes support + ownership management and SELinux relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 and 0777. + Defaults to 0644. Directories within the path are + not affected by this setting. This might be in conflict + with other options that affect the file mode, like + fsGroup, and the result can be other mode bits set.' + type: number + items: + description: Items is a list of downward API volume + file + type: array + items: + description: DownwardAPIVolumeFile represents information + to create the file containing the pod field + type: object + properties: + mode: + description: 'Optional: mode bits to use on this + file, must be a value between 0 and 0777. If + not specified, the volume defaultMode will be + used. This might be in conflict with other options + that affect the file mode, like fsGroup, and + the result can be other mode bits set.' + type: number + path: + description: 'Required: Path is the relative + path name of the file to be created. Must not + be absolute or contain the ''..'' path. Must + be utf-8 encoded. The first item of the relative + path must not start with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" | + "-" ::= | + ::= | + | ::= Ki | + Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G + | T | P | E (Note that 1024 = 1Ki but + 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No matter which of + the three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be + extended in the future if we require larger + or smaller quantities. When a Quantity + is parsed from a string, it will remember + the type of suffix it had, and will use + the same type again when it is serialized. Before + serializing, Quantity will be put in "canonical + form". This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. The + sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as + "1536Mi" Note that the quantity will NEVER + be internally represented by a floating + point number. That is the whole point of + this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or + don''t diff.) This format is intended to + make it difficult to use these numbers without + writing some sort of special handling code + in the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required for + volumes, optional for env vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector selects an APIVersioned + field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in + the specified API version. + type: string + required: + - fieldPath + required: + - path + awsElasticBlockStore: + description: Represents a Persistent Disk resource in AWS. An + AWS EBS disk must exist before mounting to a container. + The disk must also be in the same AWS zone as the kubelet. + An AWS EBS disk can only be mounted as read/write once. + AWS EBS volumes support ownership management and SELinux + relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that you want + to mount. If omitted, the default is to mount by volume + name. Examples: For volume /dev/sda1, you specify + the partition as "1". Similarly, the volume partition + for /dev/sda is "0" (or you can leave the property + empty).' + type: number + volumeID: + description: 'Unique ID of the persistent disk resource + in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + readOnly: + description: 'Specify "true" to force and set the ReadOnly + property in VolumeMounts to "true". If omitted, the + default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + fsType: + description: 'Filesystem type of the volume that you + want to mount. Tip: Ensure that the filesystem type + is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + required: + - volumeID + flocker: + description: Represents a Flocker volume mounted by the + Flocker agent. One and only one of datasetName and datasetUUID + should be set. Flocker volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata + -> name on the dataset for Flocker should be considered + as deprecated + type: string + datasetUUID: + description: UUID of the dataset. This is unique identifier + of a Flocker dataset + type: string + iscsi: + description: Represents an ISCSI disk. ISCSI volumes can + only be mounted as read/write once. ISCSI volumes support + ownership management and SELinux relabeling. + type: object + properties: + chapAuthSession: + description: whether support iSCSI Session CHAP authentication + type: boolean + iscsiInterface: + description: iSCSI Interface Name that uses an iSCSI + transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: number + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP authentication + type: boolean + iqn: + description: Target iSCSI Qualified Name. + type: string + portals: + description: iSCSI Target Portal List. The portal is + either an IP or ip_addr:port if the port is other + than default (typically TCP ports 860 and 3260). + type: array + items: + type: string + secretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName + is specified with iscsiInterface simultaneously, new + iSCSI interface : will + be created for the connection. + type: string + readOnly: + description: ReadOnly here will force the ReadOnly setting + in VolumeMounts. Defaults to false. + type: boolean + fsType: + description: 'Filesystem type of the volume that you + want to mount. Tip: Ensure that the filesystem type + is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' + type: string + targetPortal: + description: iSCSI Target Portal. The Portal is either + an IP or ip_addr:port if the port is other than default + (typically TCP ports 860 and 3260). + type: string + required: + - iqn + - lun + - targetPortal + rbd: + description: Represents a Rados Block Device mount that + lasts the lifetime of a pod. RBD volumes support ownership + management and SELinux relabeling. + type: object + properties: + image: + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + pool: + description: 'The rados pool name. Default is rbd. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + secretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + fsType: + description: 'Filesystem type of the volume that you + want to mount. Tip: Ensure that the filesystem type + is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' + type: string + keyring: + description: 'Keyring is the path to key ring for RBDUser. + Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + user: + description: 'The rados user name. Default is admin. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: + type: string + required: + - image + - monitors + configMap: + description: Adapts a ConfigMap into a volume. The contents + of the target ConfigMap's Data field will be presented + in a volume as files using the keys in the Data field + as the file names, unless the items element is populated + with specific mappings of keys to paths. ConfigMap volumes + support ownership management and SELinux relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 and 0777. + Defaults to 0644. Directories within the path are + not affected by this setting. This might be in conflict + with other options that affect the file mode, like + fsGroup, and the result can be other mode bits set.' + type: number + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap or its keys + must be defined + type: boolean + items: + description: If unspecified, each key-value pair in + the Data field of the referenced ConfigMap will be + projected into the volume as a file whose name is + the key and content is the value. If specified, the + listed keys will be projected into the specified paths, + and unlisted keys will not be present. If a key is + specified which is not present in the ConfigMap, the + volume setup will error unless it is marked optional. + Paths must be relative and may not contain the '..' + path or start with '..'. + type: array + items: + description: Maps a string key to a path within a + volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use on this + file, must be a value between 0 and 0777. If + not specified, the volume defaultMode will be + used. This might be in conflict with other options + that affect the file mode, like fsGroup, and + the result can be other mode bits set.' + type: number + path: + description: The relative path of the file to + map the key to. May not be an absolute path. + May not contain the path element '..'. May not + start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + storageos: + description: Represents a StorageOS persistent volume resource. + type: object + properties: + volumeNamespace: + description: VolumeNamespace specifies the scope of + the volume within StorageOS. If no namespace is specified + then the Pod's namespace will be used. This allows + the Kubernetes name scoping to be mirrored within + StorageOS for tighter integration. Set VolumeName + to any name to override the default behaviour. Set + to "default" if you are not using namespaces within + StorageOS. Namespaces that do not pre-exist within + StorageOS will be created. + type: string + volumeName: + description: VolumeName is the human-readable name of + the StorageOS volume. Volume names are only unique + within a namespace. + type: string + secretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. "ext4", + "xfs", "ntfs". Implicitly inferred to be "ext4" if + unspecified. + type: string + csi: + description: Represents a source location of a volume to + mount, managed by an external CSI driver + type: object + properties: + driver: + description: Driver is the name of the CSI driver that + handles this volume. Consult with your admin for the + correct name as registered in the cluster. + type: string + nodePublishSecretRef: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Specifies a read-only configuration for + the volume. Defaults to false (read/write). + type: boolean + fsType: + description: Filesystem type to mount. Ex. "ext4", "xfs", + "ntfs". If not provided, the empty value is passed + to the associated CSI driver which will determine + the default filesystem to apply. + type: string + volumeAttributes: + description: VolumeAttributes stores driver-specific + properties that are passed to the CSI driver. Consult + your driver's documentation for supported values. + additionalProperties: + type: string + type: object + required: + - driver + name: + description: 'Volume''s name. Must be a DNS_LABEL and unique + within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: Represents an NFS mount that lasts the lifetime + of a pod. NFS volumes do not support ownership management + or SELinux relabeling. + type: object + properties: + path: + description: 'Path that is exported by the NFS server. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + server: + description: 'Server is the hostname or IP address of + the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS export + to be mounted with read-only permissions. Defaults + to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + required: + - path + - server + persistentVolumeClaim: + description: PersistentVolumeClaimVolumeSource references + the user's PVC in the same namespace. This volume finds + the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource + is, essentially, a wrapper around another type of volume + that is owned by someone else (the system). + type: object + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim + in the same namespace as the pod using this volume. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in VolumeMounts. + Default false. + type: boolean + required: + - claimName + gitRepo: + description: 'Represents a volume that is populated with + the contents of a git repository. Git repo volumes do + not support ownership management. Git repo volumes support + SELinux relabeling. DEPRECATED: GitRepo is deprecated. + To provision a container with a git repo, mount an EmptyDir + into an InitContainer that clones the repo using git, + then mount the EmptyDir into the Pod''s container.' + type: object + properties: + repository: + description: Repository URL + type: string + directory: + description: Target directory name. Must not contain + or start with '..'. If '.' is supplied, the volume + directory will be the git repository. Otherwise, + if specified, the volume will contain the git repository + in the subdirectory with the given name. + type: string + revision: + description: Commit hash for the specified revision. + type: string + required: + - repository + portworxVolume: + description: PortworxVolumeSource represents a Portworx + volume resource. + type: object + properties: + volumeID: + description: VolumeID uniquely identifies a Portworx + volume + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: FSType represents the filesystem type to + mount Must be a filesystem type supported by the host + operating system. Ex. "ext4", "xfs". Implicitly inferred + to be "ext4" if unspecified. + type: string + required: + - volumeID + vsphereVolume: + description: Represents a vSphere volume resource. + type: object + properties: + storagePolicyName: + description: Storage Policy Based Management (SPBM) + profile name. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) + profile ID associated with the StoragePolicyName. + type: string + volumePath: + description: Path that identifies vSphere volume vmdk + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. "ext4", + "xfs", "ntfs". Implicitly inferred to be "ext4" if + unspecified. + type: string + required: + - volumePath + fc: + description: Represents a Fibre Channel volume. Fibre Channel + volumes can only be mounted as read/write once. Fibre + Channel volumes support ownership management and SELinux + relabeling. + type: object + properties: + lun: + description: 'Optional: FC target lun number' + type: number + targetWWNs: + description: 'Optional: FC target worldwide names (WWNs)' + type: array + items: + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + wwids: + description: 'Optional: FC volume world wide identifiers + (wwids) Either wwids or combination of targetWWNs + and lun must be set, but not both simultaneously.' + type: array + items: + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. "ext4", + "xfs", "ntfs". Implicitly inferred to be "ext4" if + unspecified. + type: string + hostPath: + description: Represents a host path mapped into a pod. Host + path volumes do not support ownership management or SELinux + relabeling. + type: object + properties: + path: + description: 'Path of the directory on the host. If + the path is a symlink, it will follow the link to + the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults to "" + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + required: + - path + required: + - name + resources: + type: object + description: Memory and CPU minimum requirements and limits for + the server. + properties: + requests: + type: object + additionalProperties: + type: string + description: 'Requests describes the minimum amount of compute + resources required. If Requests is omitted for a container, + it defaults to Limits if that is explicitly specified, otherwise + to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + limits: + type: object + additionalProperties: + type: string + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + annotations: + type: object + additionalProperties: + type: string + description: The annotations to be attached to generated resources. + env: + type: array + description: A list of environment variables to add to a server. + items: + description: EnvVar represents an environment variable present + in a Container. + type: object + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded + using the previous defined environment variables in the + container and any service environment variables. If a + variable cannot be resolved, the reference in the input + string will be unchanged. The $(VAR_NAME) syntax can be + escaped with a double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether the variable + exists or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source for the value + of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key of a Secret. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents container + resources (cpu, memory) and their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and + AsInt64() accessors. The serialization format + is: ::= (Note + that may be empty, from the "" case in + .) ::= 0 | 1 | ... + | 9 ::= | + ::= | . + | . | . ::= + "+" | "-" ::= | + ::= | + | ::= Ki | Mi | + Gi | Ti | Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T | + P | E (Note that 1024 = 1Ki but 1000 = 1k; I + didn''t choose the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms is used, + no quantity may represent a number greater than + 2^63-1 in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more precise + will be capped or rounded up. (E.g.: 0.1m will + rounded up to 1m.) This may be extended in the + future if we require larger or smaller quantities. When + a Quantity is parsed from a string, it will remember + the type of suffix it had, and will use the same + type again when it is serialized. Before serializing, + Quantity will be put in "canonical form". This + means that Exponent/suffix will be adjusted up + or down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision is lost b. + No fractional digits will be emitted c. The + exponent (or suffix) is as large as possible. + The sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole + point of this exercise. Non-canonical values + will still parse as long as they are well formed, + but will be re-emitted in their canonical form. + (So always use canonical form, or don''t diff.) This + format is intended to make it difficult to use + these numbers without writing some sort of special + handling code in the hopes that that will cause + implementors to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an APIVersioned + field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + required: + - name + restartPolicy: + type: string + description: 'Restart policy for all containers within the pod. + One of Always, OnFailure, Never. Default to Always. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + nodeSelector: + type: object + additionalProperties: + type: string + description: Selector which must match a node's labels for the + pod to be scheduled on that node. + volumeMounts: + type: array + description: Additional volume mounts for the server pod. + items: + description: VolumeMount describes a mounting of a Volume within + a container. + type: object + properties: + mountPath: + description: Path within the container at which the volume + should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are + propagated from the host to container and the other way + around. When not set, MountPropagationNone is used. This + field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise + (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's + volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which + the container's volume should be mounted. Behaves similarly + to SubPath but environment variable references $(VAR_NAME) + are expanded using the container's environment. Defaults + to "" (volume's root). SubPathExpr and SubPath are mutually + exclusive. This field is beta in 1.15. + type: string + required: + - mountPath + - name + labels: + type: object + additionalProperties: + type: string + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + runtimeClassName: + type: string + description: 'RuntimeClassName refers to a RuntimeClass object + in the node.k8s.io group, which should be used to run this pod. If + no RuntimeClass resource matches the named class, the pod will + not be run. If unset or empty, the "legacy" RuntimeClass will + be used, which is an implicit class with an empty definition + that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future.' + tolerations: + type: array + description: If specified, the pod's tolerations. + items: + description: The pod this Toleration is attached to tolerates + any taint that matches the triple using + the matching operator . + type: object + properties: + effect: + description: Effect indicates the taint effect to match. + Empty means match all taint effects. When specified, allowed + values are NoSchedule, PreferNoSchedule and NoExecute. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of + time the toleration (which must be of effect NoExecute, + otherwise this field is ignored) tolerates the taint. + By default, it is not set, which means tolerate the taint + forever (do not evict). Zero and negative values will + be treated as 0 (evict immediately) by the system. + type: number + value: + description: Value is the taint value the toleration matches + to. If the operator is Exists, the value should be empty, + otherwise just a regular string. + type: string + key: + description: Key is the taint key that the toleration applies + to. Empty means match all taint keys. If the key is empty, + operator must be Exists; this combination means to match + all values and all keys. + type: string + operator: + description: Operator represents a key's relationship to + the value. Valid operators are Exists and Equal. Defaults + to Equal. Exists is equivalent to wildcard for value, + so that a pod can tolerate all taints of a particular + category. + type: string + readinessProbe: + type: object + description: Settings for the readiness probe associated with + a server. + properties: + periodSeconds: + type: number + description: The number of seconds between checks. + timeoutSeconds: + type: number + description: The number of seconds with no response that indicates + a failure. + initialDelaySeconds: + type: number + description: The number of seconds before the first check + is performed. + containers: + type: array + description: Additional containers to be included in the server + pod. + items: + description: A single application container that you want to + run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of a raw + block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of the + container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config management + to default or override container images in workload controllers + like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. + Defaults to Always if :latest tag is specified, or IfNotPresent + otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive or + ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action based + on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum + value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. The command is simply exec'd, it is + not run inside a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you need + to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is + unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate a buffer + for stdin in the container runtime. If this is not set, + reads from stdin in the container will always result in + EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message should + be populated. File will use the contents of terminationMessagePath + to populate the container status message on both success + and failure. FallbackToLogsOnError will use the last chunk + of container log output if the termination message file + is empty and the container exited with an error. The log + output is limited to 2048 bytes or 80 lines, whichever + is smaller. Defaults to File. Cannot be updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to which + the container''s termination message will be written is + mounted into the container''s filesystem. Message written + is intended to be brief final status, such as an assertion + failure message. Will be truncated by the node if greater + than 4096 bytes. The total message length across all containers + will be limited to 12kb. Defaults to /dev/termination-log. + Cannot be updated.' + type: string + workingDir: + description: Container's working directory. If not specified, + the container runtime's default will be used, which might + be configured in the container image. Cannot be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is omitted + for a container, it defaults to Limits if that is + explicitly specified, otherwise to an implementation-defined + value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount of + compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields are present + in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities from + running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to be applied + to the container + type: object + properties: + role: + description: Role is a SELinux role label that applies + to the container. + type: string + level: + description: Level is SELinux level label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + This field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + procMount: + description: procMount denotes the type of proc mount + to use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. This requires the ProcMountType + feature flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether + a process can gain more privileges than its parent + process. This bool directly controls if the no_new_privs + flag will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if + it does. If unset or false, no such validation will + be performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive or + ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action based + on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum + value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. The command is simply exec'd, it is + not run inside a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you need + to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is + unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set in the + container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. Must + be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are + expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source for + the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key of + a Secret. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" | + "-" ::= | + ::= | + | ::= Ki | + Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G + | T | P | E (Note that 1024 = 1Ki but + 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No matter which of + the three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be + extended in the future if we require larger + or smaller quantities. When a Quantity + is parsed from a string, it will remember + the type of suffix it had, and will use + the same type again when it is serialized. Before + serializing, Quantity will be put in "canonical + form". This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. The + sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as + "1536Mi" Note that the quantity will NEVER + be internally represented by a floating + point number. That is the whole point of + this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or + don''t diff.) This format is intended to + make it difficult to use these numbers without + writing some sort of special handling code + in the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required for + volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an APIVersioned + field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in + the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional information + about the network connections a container uses, but is + primarily informational. Not specifying a port here DOES + NOT prevent that port from being exposed. Any port which + is listening on the default "0.0.0.0" address inside a + container will be accessible from the network. Cannot + be updated. + type: array + items: + description: ContainerPort represents a network port in + a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, TCP, + or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external port + to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port in a + pod must have a unique name. Name for the port that + can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the pod's + IP address. This must be a valid port number, 0 + < x < 65536. + type: number + hostPort: + description: Number of port to expose on the host. + If specified, this must be a valid port number, + 0 < x < 65536. If HostNetwork is specified, this + must match ContainerPort. Most containers do not + need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within a shell. + The docker image''s ENTRYPOINT is used if this is not + provided. Variable references $(VAR_NAME) are expanded + using the container''s environment. If a variable cannot + be resolved, the reference in the input string will be + unchanged. The $(VAR_NAME) syntax can be escaped with + a double $$, ie: $$(VAR_NAME). Escaped references will + never be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. + Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume + within a container. + type: object + properties: + mountPath: + description: Path within the container at which the + volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and the + other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the + container's volume should be mounted. Defaults to + "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment variable + references $(VAR_NAME) are expanded using the container's + environment. Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field is + beta in 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker image''s + CMD is used if this is not provided. Variable references + $(VAR_NAME) are expanded using the container''s environment. + If a variable cannot be resolved, the reference in the + input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). Escaped + references will never be expanded, regardless of whether + the variable exists or not. Cannot be updated. More info: + https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the management + system should take in response to container lifecycle + events. For the PostStart and PreStop lifecycle handlers, + management of the container blocks until the action is + complete, unless the container process fails, in which + case the handler is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a DNS_LABEL. + Each container in a pod must have a unique name (DNS_LABEL). + Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY + for itself, also requires 'stdin' to be true. Default + is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive or + ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action based + on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum + value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. The command is simply exec'd, it is + not run inside a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you need + to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is + unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should close + the stdin channel after it has been opened by a single + attach. When stdin is true the stdin stream will remain + open across multiple attach sessions. If stdinOnce is + set to true, stdin is opened on container start, is empty + until the first client attaches to stdin, and then remains + open and accepts data until the client disconnects, at + which time stdin is closed and remains closed until the + container is restarted. If this flag is false, a container + processes that reads from stdin will never receive an + EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment variables + in the container. The keys defined within a source must + be a C_IDENTIFIER. All invalid keys will be reported as + an event when the container is starting. When a key exists + in multiple sources, the value associated with the last + source will take precedence. Values defined by an Env + with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a + set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field will + represent the key-value pairs as environment variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap must + be defined + type: boolean + prefix: + description: An optional identifier to prepend to + each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret to populate + the environment variables with. The contents of + the target Secret's Data field will represent the + key-value pairs as environment variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret must be + defined + type: boolean + required: + - name + containerSecurityContext: + type: object + description: Container-level security attributes. Will override + any matching pod-level attributes. + properties: + privileged: + type: boolean + description: Run container in privileged mode. Processes in + privileged containers are essentially equivalent to root + on the host. Defaults to false. + runAsUser: + type: number + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata if + unspecified. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. + capabilities: + type: object + description: Adds and removes POSIX capabilities from running + containers. + properties: + add: + type: array + description: Added capabilities + items: + type: string + drop: + type: array + description: Removed capabilities + items: + type: string + seLinuxOptions: + type: object + description: SELinuxOptions are the labels to be applied to + the container + properties: + role: + type: string + description: Role is a SELinux role label that applies + to the container. + level: + type: string + description: Level is SELinux level label that applies + to the container. + type: + type: string + description: Type is a SELinux type label that applies + to the container. + user: + type: string + description: User is a SELinux user label that applies + to the container. + windowsOptions: + type: object + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + properties: + gmsaCredentialSpec: + type: string + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named + by the GMSACredentialSpecName field. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. + runAsUserName: + type: string + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set in + PodSecurityContext. If set in both SecurityContext and + PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and it is + only honored by servers that enable the WindowsRunAsUserName + feature flag. + gmsaCredentialSpecName: + type: string + description: GMSACredentialSpecName is the name of the + GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. + procMount: + type: string + description: procMount denotes the type of proc mount to use + for the containers. The default is DefaultProcMount which + uses the container runtime defaults for readonly paths and + masked paths. This requires the ProcMountType feature flag + to be enabled. + allowPrivilegeEscalation: + type: boolean + description: 'AllowPrivilegeEscalation controls whether a + process can gain more privileges than its parent process. + This bool directly controls if the no_new_privs flag will + be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' + runAsGroup: + type: number + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be set + in PodSecurityContext. If set in both SecurityContext and + PodSecurityContext, the value specified in SecurityContext + takes precedence. + runAsNonRoot: + type: boolean + description: Indicates that the container must run as a non-root + user. If true, the Kubelet will validate the image at runtime + to ensure that it does not run as UID 0 (root) and fail + to start the container if it does. If unset or false, no + such validation will be performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. + readOnlyRootFilesystem: + type: boolean + description: Whether this container has a read-only root filesystem. + Default is false. + schedulerName: + type: string + description: If specified, the pod will be dispatched by specified + scheduler. If not specified, the pod will be dispatched by default + scheduler. + initContainers: + type: array + description: Initialization containers to be included in the server + pod. + items: + description: A single application container that you want to + run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of a raw + block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of the + container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config management + to default or override container images in workload controllers + like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. + Defaults to Always if :latest tag is specified, or IfNotPresent + otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive or + ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action based + on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum + value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. The command is simply exec'd, it is + not run inside a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you need + to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is + unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate a buffer + for stdin in the container runtime. If this is not set, + reads from stdin in the container will always result in + EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message should + be populated. File will use the contents of terminationMessagePath + to populate the container status message on both success + and failure. FallbackToLogsOnError will use the last chunk + of container log output if the termination message file + is empty and the container exited with an error. The log + output is limited to 2048 bytes or 80 lines, whichever + is smaller. Defaults to File. Cannot be updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to which + the container''s termination message will be written is + mounted into the container''s filesystem. Message written + is intended to be brief final status, such as an assertion + failure message. Will be truncated by the node if greater + than 4096 bytes. The total message length across all containers + will be limited to 12kb. Defaults to /dev/termination-log. + Cannot be updated.' + type: string + workingDir: + description: Container's working directory. If not specified, + the container runtime's default will be used, which might + be configured in the container image. Cannot be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is omitted + for a container, it defaults to Limits if that is + explicitly specified, otherwise to an implementation-defined + value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount of + compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields are present + in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities from + running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to be applied + to the container + type: object + properties: + role: + description: Role is a SELinux role label that applies + to the container. + type: string + level: + description: Level is SELinux level label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + This field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + procMount: + description: procMount denotes the type of proc mount + to use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. This requires the ProcMountType + feature flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether + a process can gain more privileges than its parent + process. This bool directly controls if the no_new_privs + flag will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if + it does. If unset or false, no such validation will + be performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive or + ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action based + on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum + value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. The command is simply exec'd, it is + not run inside a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you need + to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is + unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set in the + container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. Must + be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are + expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source for + the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key of + a Secret. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" | + "-" ::= | + ::= | + | ::= Ki | + Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G + | T | P | E (Note that 1024 = 1Ki but + 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No matter which of + the three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be + extended in the future if we require larger + or smaller quantities. When a Quantity + is parsed from a string, it will remember + the type of suffix it had, and will use + the same type again when it is serialized. Before + serializing, Quantity will be put in "canonical + form". This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. The + sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as + "1536Mi" Note that the quantity will NEVER + be internally represented by a floating + point number. That is the whole point of + this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or + don''t diff.) This format is intended to + make it difficult to use these numbers without + writing some sort of special handling code + in the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required for + volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an APIVersioned + field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in + the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional information + about the network connections a container uses, but is + primarily informational. Not specifying a port here DOES + NOT prevent that port from being exposed. Any port which + is listening on the default "0.0.0.0" address inside a + container will be accessible from the network. Cannot + be updated. + type: array + items: + description: ContainerPort represents a network port in + a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, TCP, + or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external port + to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port in a + pod must have a unique name. Name for the port that + can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the pod's + IP address. This must be a valid port number, 0 + < x < 65536. + type: number + hostPort: + description: Number of port to expose on the host. + If specified, this must be a valid port number, + 0 < x < 65536. If HostNetwork is specified, this + must match ContainerPort. Most containers do not + need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within a shell. + The docker image''s ENTRYPOINT is used if this is not + provided. Variable references $(VAR_NAME) are expanded + using the container''s environment. If a variable cannot + be resolved, the reference in the input string will be + unchanged. The $(VAR_NAME) syntax can be escaped with + a double $$, ie: $$(VAR_NAME). Escaped references will + never be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. + Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume + within a container. + type: object + properties: + mountPath: + description: Path within the container at which the + volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and the + other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the + container's volume should be mounted. Defaults to + "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment variable + references $(VAR_NAME) are expanded using the container's + environment. Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field is + beta in 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker image''s + CMD is used if this is not provided. Variable references + $(VAR_NAME) are expanded using the container''s environment. + If a variable cannot be resolved, the reference in the + input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). Escaped + references will never be expanded, regardless of whether + the variable exists or not. Cannot be updated. More info: + https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the management + system should take in response to container lifecycle + events. For the PostStart and PreStop lifecycle handlers, + management of the container blocks until the action is + complete, unless the container process fails, in which + case the handler is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action that + should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to + the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a DNS_LABEL. + Each container in a pod must have a unique name (DNS_LABEL). + Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY + for itself, also requires 'stdin' to be true. Default + is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be performed + against a container to determine whether it is alive or + ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action based + on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum + value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. The command is simply exec'd, it is + not run inside a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you need + to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is + unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action based + on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or YAML + marshalling and unmarshalling, it produces or + consumes the inner type. This allows you to have, + for example, a JSON field that can accept a name + or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should close + the stdin channel after it has been opened by a single + attach. When stdin is true the stdin stream will remain + open across multiple attach sessions. If stdinOnce is + set to true, stdin is opened on container start, is empty + until the first client attaches to stdin, and then remains + open and accepts data until the client disconnects, at + which time stdin is closed and remains closed until the + container is restarted. If this flag is false, a container + processes that reads from stdin will never receive an + EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment variables + in the container. The keys defined within a source must + be a C_IDENTIFIER. All invalid keys will be reported as + an event when the container is starting. When a key exists + in multiple sources, the value associated with the last + source will take precedence. Values defined by an Env + with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a + set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field will + represent the key-value pairs as environment variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap must + be defined + type: boolean + prefix: + description: An optional identifier to prepend to + each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret to populate + the environment variables with. The contents of + the target Secret's Data field will represent the + key-value pairs as environment variables. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret must be + defined + type: boolean + required: + - name + shutdown: + type: object + description: Configures how the operator should shutdown the server + instance. + properties: + ignoreSessions: + type: boolean + description: For graceful shutdown only, indicates to ignore + pending HTTP sessions during in-flight work handling. Not + required. Defaults to false. + shutdownType: + type: string + description: Tells the operator how to shutdown server instances. + Not required. Defaults to graceful shutdown. + enum: + - Graceful + - Forced + timeoutSeconds: + type: number + description: For graceful shutdown only, number of seconds + to wait before aborting in-flight work and shutting down + the server. Not required. Defaults to 30 seconds. + affinity: + type: object + description: If specified, the pod's scheduling constraints + properties: + nodeAffinity: + type: object + description: Node affinity is a group of node affinity scheduling + rules. + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: object + description: A node selector represents the union of the + results of one or more label queries over a set of nodes; + that is, it represents the OR of the selectors represented + by the node selector terms. + properties: + nodeSelectorTerms: + type: array + description: Required. A list of node selector terms. + The terms are ORed. + items: + description: A null or empty node selector term + matches no objects. The requirements of them are + ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement is + a selector that contains values, a key, + and an operator that relates the key and + values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If the + operator is Exists or DoesNotExist, + the values array must be empty. If the + operator is Gt or Lt, the values array + must have a single element, which will + be interpreted as an integer. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement is + a selector that contains values, a key, + and an operator that relates the key and + values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If the + operator is Exists or DoesNotExist, + the values array must be empty. If the + operator is Gt or Lt, the values array + must have a single element, which will + be interpreted as an integer. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + required: + - nodeSelectorTerms + preferredDuringSchedulingIgnoredDuringExecution: + type: array + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node matches the corresponding matchExpressions; + the node(s) with the highest sum are the most preferred. + items: + description: An empty preferred scheduling term matches + all objects with implicit weight 0 (i.e. it's a no-op). + A null preferred scheduling term matches no objects + (i.e. is also a no-op). + type: object + properties: + preference: + description: A null or empty node selector term + matches no objects. The requirements of them are + ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement is + a selector that contains values, a key, + and an operator that relates the key and + values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If the + operator is Exists or DoesNotExist, + the values array must be empty. If the + operator is Gt or Lt, the values array + must have a single element, which will + be interpreted as an integer. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement is + a selector that contains values, a key, + and an operator that relates the key and + values. + type: object + properties: + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If the + operator is Exists or DoesNotExist, + the values array must be empty. If the + operator is Gt or Lt, the values array + must have a single element, which will + be interpreted as an integer. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + required: + - key + - operator + weight: + description: Weight associated with matching the + corresponding nodeSelectorTerm, in the range 1-100. + type: number + required: + - preference + - weight + podAffinity: + type: object + description: Pod affinity is a group of inter pod affinity + scheduling rules. + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + description: If the affinity requirements specified by + this field are not met at scheduling time, the pod will + not be scheduled onto the node. If the affinity requirements + specified by this field cease to be met at some point + during pod execution (e.g. due to a pod label update), + the system may or may not try to eventually evict the + pod from its node. When there are multiple elements, + the lists of nodes corresponding to each podAffinityTerm + are intersected, i.e. all terms must be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or not + co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any node + on which a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query over + a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label selector + matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + type: object + properties: + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only "value". + The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified namespaces, + where co-located is defined as running on a node + whose value of the label with key topologyKey + matches that of any node on which any of the selected + pods is running. Empty topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node has pods which matches the corresponding + podAffinityTerm; the node(s) with the highest sum are + the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node + whose value of the label with key + matches that of any node on which a pod of the + set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label + selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The requirements + are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the + pods matching the labelSelector in the specified + namespaces, where co-located is defined as + running on a node whose value of the label + with key topologyKey matches that of any node + on which any of the selected pods is running. + Empty topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching the + corresponding podAffinityTerm, in the range 1-100. + type: number + required: + - podAffinityTerm + - weight + podAntiAffinity: + type: object + description: Pod anti affinity is a group of inter pod anti + affinity scheduling rules. + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + description: If the anti-affinity requirements specified + by this field are not met at scheduling time, the pod + will not be scheduled onto the node. If the anti-affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a pod + label update), the system may or may not try to eventually + evict the pod from its node. When there are multiple + elements, the lists of nodes corresponding to each podAffinityTerm + are intersected, i.e. all terms must be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or not + co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any node + on which a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query over + a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label selector + matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + type: object + properties: + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only "value". + The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified namespaces, + where co-located is defined as running on a node + whose value of the label with key topologyKey + matches that of any node on which any of the selected + pods is running. Empty topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + description: The scheduler will prefer to schedule pods + to nodes that satisfy the anti-affinity expressions + specified by this field, but it may choose a node that + violates one or more of the expressions. The node that + is most preferred is the one with the greatest sum of + weights, i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + anti-affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node has pods which matches the corresponding + podAffinityTerm; the node(s) with the highest sum are + the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node + whose value of the label with key + matches that of any node on which a pod of the + set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label + selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The requirements + are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. This array + is replaced during a strategic merge + patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the + pods matching the labelSelector in the specified + namespaces, where co-located is defined as + running on a node whose value of the label + with key topologyKey matches that of any node + on which any of the selected pods is running. + Empty topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching the + corresponding podAffinityTerm, in the range 1-100. + type: number + required: + - podAffinityTerm + - weight + logHome: + type: string + description: The in-pod name of the directory in which to store the + domain, Node Manager, server logs, and server *.out files + includeServerOutInPodLog: + type: boolean + description: If true (the default), then the server .out file will + be included in the pod's stdout. + managedServers: + type: array + description: Configuration for individual Managed Servers. + items: + description: ManagedServer represents the operator configuration + for a single Managed Server. + type: object + properties: + serverStartState: + description: The state in which the server is to be started. + Use ADMIN if server should start in the admin state. Defaults + to RUNNING. + type: string + enum: + - RUNNING + - ADMIN + serverService: + description: Customization affecting ClusterIP Kubernetes services + for WebLogic Server instances. + type: object + properties: + precreateService: + description: If true, operator will create server services + even for server instances without running pods. + type: boolean + annotations: + description: The annotations to be attached to generated + resources. + additionalProperties: + type: string + type: object + labels: + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + additionalProperties: + type: string + type: object + serverName: + description: The name of the Managed Server. Required. + type: string + serverPod: + description: Configuration affecting server pods. + type: object + properties: + nodeName: + description: NodeName is a request to schedule this pod + onto a specific node. If it is non-empty, the scheduler + simply schedules this pod onto that node, assuming that + it fits resource requirements. + type: string + livenessProbe: + description: Settings for the liveness probe associated + with a server. + type: object + properties: + periodSeconds: + description: The number of seconds between checks. + type: number + timeoutSeconds: + description: The number of seconds with no response + that indicates a failure. + type: number + initialDelaySeconds: + description: The number of seconds before the first + check is performed. + type: number + readinessGates: + description: 'If specified, all readiness gates will be + evaluated for pod readiness. A pod is ready when all its + containers are ready AND all conditions specified in the + readiness gates have status equal to "True" More info: + https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + type: array + items: + description: PodReadinessGate contains the reference to + a pod condition + type: object + properties: + conditionType: + description: ConditionType refers to a condition in + the pod's condition list with matching type. + type: string + required: + - conditionType + serviceAccountName: + description: Name of the ServiceAccount to be used to run + this pod. If it is not set, default ServiceAccount will + be used. The ServiceAccount has to exist at the time the + pod is created. + type: string + podSecurityContext: + description: Pod-level security attributes. + type: object + properties: + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence + for that container. + type: number + seLinuxOptions: + description: SELinuxOptions are the labels to be applied + to the container + type: object + properties: + role: + description: Role is a SELinux role label that applies + to the container. + type: string + level: + description: Level is SELinux level label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + fsGroup: + description: 'A special supplemental group that applies + to all containers in a pod. Some volume types allow + the Kubelet to change the ownership of that volume + to be owned by the pod: 1. The owning GID will be + the FSGroup 2. The setgid bit is set (new files created + in the volume will be owned by FSGroup) 3. The permission + bits are OR''d with rw-rw---- If unset, the Kubelet + will not modify the ownership and permissions of any + volume.' + type: number + windowsOptions: + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + This field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + supplementalGroups: + description: A list of groups applied to the first process + run in each container, in addition to the container's + primary GID. If unspecified, no groups will be added + to any container. + type: array + items: + type: number + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in SecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence for that container. + type: number + runAsNonRoot: + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if + it does. If unset or false, no such validation will + be performed. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: boolean + sysctls: + description: Sysctls hold a list of namespaced sysctls + used for the pod. Pods with unsupported sysctls (by + the container runtime) might fail to launch. + type: array + items: + description: Sysctl defines a kernel parameter to + be set + type: object + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + priorityClassName: + description: If specified, indicates the pod's priority. + "system-node-critical" and "system-cluster-critical" are + two special keywords which indicate the highest priorities + with the former being the highest priority. Any other + name must be defined by creating a PriorityClass object + with that name. If not specified, the pod priority will + be default or zero if there is no default. + type: string + volumes: + description: Additional volumes to be created in the server + pod. + type: array + items: + description: Volume represents a named volume in a pod + that may be accessed by any container in the pod. + type: object + properties: + quobyte: + description: Represents a Quobyte mount that lasts + the lifetime of a pod. Quobyte volumes do not support + ownership management or SELinux relabeling. + type: object + properties: + volume: + description: Volume is a string that references + an already created Quobyte volume by name. + type: string + registry: + description: Registry represents a single or multiple + Quobyte Registry services specified as a string + as host:port pair (multiple entries are separated + with commas) which acts as the central registry + for volumes + type: string + readOnly: + description: ReadOnly here will force the Quobyte + volume to be mounted with read-only permissions. + Defaults to false. + type: boolean + user: + description: User to map volume access to Defaults + to serivceaccount user + type: string + tenant: + description: Tenant owning the given Quobyte volume + in the Backend Used with dynamically provisioned + Quobyte volumes, value is set by the plugin + type: string + group: + description: Group to map volume access to Default + is no group + type: string + required: + - registry + - volume + azureFile: + description: AzureFile represents an Azure File Service + mount on the host and bind mount to the pod. + type: object + properties: + secretName: + description: the name of secret that contains + Azure Storage Account Name and Key + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + shareName: + description: Share Name + type: string + required: + - secretName + - shareName + flexVolume: + description: FlexVolume represents a generic volume + resource that is provisioned/attached using an exec + based plugin. + type: object + properties: + driver: + description: Driver is the name of the driver + to use for this volume. + type: string + options: + description: 'Optional: Extra command options + if any.' + additionalProperties: + type: string + type: object + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' + type: boolean + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". The default + filesystem depends on FlexVolume script. + type: string + required: + - driver + secret: + description: Adapts a Secret into a volume. The contents + of the target Secret's Data field will be presented + in a volume as files using the keys in the Data + field as the file names. Secret volumes support + ownership management and SELinux relabeling. + type: object + properties: + secretName: + description: 'Name of the secret in the pod''s + namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 + and 0777. Defaults to 0644. Directories within + the path are not affected by this setting. This + might be in conflict with other options that + affect the file mode, like fsGroup, and the + result can be other mode bits set.' + type: number + optional: + description: Specify whether the Secret or its + keys must be defined + type: boolean + items: + description: If unspecified, each key-value pair + in the Data field of the referenced Secret will + be projected into the volume as a file whose + name is the key and content is the value. If + specified, the listed keys will be projected + into the specified paths, and unlisted keys + will not be present. If a key is specified which + is not present in the Secret, the volume setup + will error unless it is marked optional. Paths + must be relative and may not contain the '..' + path or start with '..'. + type: array + items: + description: Maps a string key to a path within + a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might be + in conflict with other options that affect + the file mode, like fsGroup, and the result + can be other mode bits set.' + type: number + path: + description: The relative path of the file + to map the key to. May not be an absolute + path. May not contain the path element + '..'. May not start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + projected: + description: Represents a projected volume source + type: object + properties: + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected + along with other supported volume types + type: object + properties: + downwardAPI: + description: Represents downward API info + for projecting into a projected volume. + Note that this is identical to a downwardAPI + volume source without the default mode. + type: object + properties: + items: + description: Items is a list of DownwardAPIVolume + file + type: array + items: + description: DownwardAPIVolumeFile + represents information to create + the file containing the pod field + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be + a value between 0 and 0777. + If not specified, the volume + defaultMode will be used. This + might be in conflict with other + options that affect the file + mode, like fsGroup, and the + result can be other mode bits + set.' + type: number + path: + description: 'Required: Path is the + relative path name of the file + to be created. Must not be absolute + or contain the ''..'' path. + Must be utf-8 encoded. The first + item of the relative path must + not start with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector + represents container resources + (cpu, memory) and their output + format + type: object + properties: + divisor: + description: 'Quantity is + a fixed-point representation + of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition + to String() and AsInt64() + accessors. The serialization + format is: ::= + (Note + that may be empty, + from the "" case in .) + ::= 0 + | 1 | ... | 9 ::= + | + ::= + | . | . + | . ::= + "+" | "-" ::= + | + ::= + | | + ::= Ki + | Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m + | "" | k | M | G | T | P + | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t + choose the capitalization.) + ::= "e" + | "E" No + matter which of the three + exponent forms is used, + no quantity may represent + a number greater than 2^63-1 + in magnitude, nor may it + have more than 3 decimal + places. Numbers larger or + more precise will be capped + or rounded up. (E.g.: 0.1m + will rounded up to 1m.) + This may be extended in + the future if we require + larger or smaller quantities. When + a Quantity is parsed from + a string, it will remember + the type of suffix it had, + and will use the same type + again when it is serialized. Before + serializing, Quantity will + be put in "canonical form". + This means that Exponent/suffix + will be adjusted up or down + (with a corresponding increase + or decrease in Mantissa) + such that: a. No precision + is lost b. No fractional + digits will be emitted c. + The exponent (or suffix) + is as large as possible. + The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER + be internally represented + by a floating point number. + That is the whole point + of this exercise. Non-canonical + values will still parse + as long as they are well + formed, but will be re-emitted + in their canonical form. + (So always use canonical + form, or don''t diff.) This + format is intended to make + it difficult to use these + numbers without writing + some sort of special handling + code in the hopes that that + will cause implementors + to also use a fixed point + implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource + to select' + type: string + containerName: + description: 'Container name: + required for volumes, optional + for env vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector + selects an APIVersioned field + of an object. + type: object + properties: + apiVersion: + description: Version of the + schema the FieldPath is + written in terms of, defaults + to "v1". + type: string + fieldPath: + description: Path of the field + to select in the specified + API version. + type: string + required: + - fieldPath + required: + - path + configMap: + description: Adapts a ConfigMap into a projected + volume. The contents of the target ConfigMap's + Data field will be presented in a projected + volume as files using the keys in the + Data field as the file names, unless the + items element is populated with specific + mappings of keys to paths. Note that this + is identical to a configmap volume source + without the default mode. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its keys must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + ConfigMap will be projected into the + volume as a file whose name is the + key and content is the value. If specified, + the listed keys will be projected + into the specified paths, and unlisted + keys will not be present. If a key + is specified which is not present + in the ConfigMap, the volume setup + will error unless it is marked optional. + Paths must be relative and may not + contain the '..' path or start with + '..'. + type: array + items: + description: Maps a string key to + a path within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be + a value between 0 and 0777. + If not specified, the volume + defaultMode will be used. This + might be in conflict with other + options that affect the file + mode, like fsGroup, and the + result can be other mode bits + set.' + type: number + path: + description: The relative path + of the file to map the key to. + May not be an absolute path. + May not contain the path element + '..'. May not start with the + string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + secret: + description: Adapts a secret into a projected + volume. The contents of the target Secret's + Data field will be presented in a projected + volume as files using the keys in the + Data field as the file names. Note that + this is identical to a secret volume source + without the default mode. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + Secret will be projected into the + volume as a file whose name is the + key and content is the value. If specified, + the listed keys will be projected + into the specified paths, and unlisted + keys will not be present. If a key + is specified which is not present + in the Secret, the volume setup will + error unless it is marked optional. + Paths must be relative and may not + contain the '..' path or start with + '..'. + type: array + items: + description: Maps a string key to + a path within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be + a value between 0 and 0777. + If not specified, the volume + defaultMode will be used. This + might be in conflict with other + options that affect the file + mode, like fsGroup, and the + result can be other mode bits + set.' + type: number + path: + description: The relative path + of the file to map the key to. + May not be an absolute path. + May not contain the path element + '..'. May not start with the + string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + serviceAccountToken: + description: ServiceAccountTokenProjection + represents a projected service account + token volume. This projection can be used + to insert a service account token into + the pods runtime filesystem for use against + APIs (Kubernetes API Server or otherwise). + type: object + properties: + path: + description: Path is the path relative + to the mount point of the file to + project the token into. + type: string + audience: + description: Audience is the intended + audience of the token. A recipient + of a token must identify itself with + an identifier specified in the audience + of the token, and otherwise should + reject the token. The audience defaults + to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the + requested duration of validity of + the service account token. As the + token approaches expiration, the kubelet + volume plugin will proactively rotate + the service account token. The kubelet + will start trying to rotate the token + if the token is older than 80 percent + of its time to live or if the token + is older than 24 hours.Defaults to + 1 hour and must be at least 10 minutes. + type: number + required: + - path + defaultMode: + description: Mode bits to use on created files + by default. Must be a value between 0 and 0777. + Directories within the path are not affected + by this setting. This might be in conflict with + other options that affect the file mode, like + fsGroup, and the result can be other mode bits + set. + type: number + required: + - sources + cephfs: + description: Represents a Ceph Filesystem mount that + lasts the lifetime of a pod Cephfs volumes do not + support ownership management or SELinux relabeling. + type: object + properties: + path: + description: 'Optional: Used as the mounted root, + rather than the full Ceph tree, default is /' + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + secretFile: + description: 'Optional: SecretFile is the path + to key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + user: + description: 'Optional: User is the rados user + name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + monitors: + description: 'Required: Monitors is a collection + of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: + type: string + required: + - monitors + scaleIO: + description: ScaleIOVolumeSource represents a persistent + ScaleIO volume + type: object + properties: + system: + description: The name of the storage system as + configured in ScaleIO. + type: string + protectionDomain: + description: The name of the ScaleIO Protection + Domain for the configured storage. + type: string + sslEnabled: + description: Flag to enable/disable SSL communication + with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for + a volume should be ThickProvisioned or ThinProvisioned. + Default is ThinProvisioned. + type: string + volumeName: + description: The name of a volume already created + in the ScaleIO system that is associated with + this volume source. + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Default is + "xfs". + type: string + storagePool: + description: The ScaleIO Storage Pool associated + with the protection domain. + type: string + gateway: + description: The host address of the ScaleIO API + Gateway. + type: string + required: + - gateway + - secretRef + - system + emptyDir: + description: Represents an empty directory for a pod. + Empty directory volumes support ownership management + and SELinux relabeling. + type: object + properties: + sizeLimit: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and + AsInt64() accessors. The serialization format + is: ::= (Note + that may be empty, from the "" case + in .) ::= 0 | 1 + | ... | 9 ::= | + ::= | . + | . | . ::= + "+" | "-" ::= | + ::= | + | ::= Ki | Mi + | Gi | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T + | P | E (Note that 1024 = 1Ki but 1000 = 1k; + I didn''t choose the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms is + used, no quantity may represent a number greater + than 2^63-1 in magnitude, nor may it have more + than 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be extended + in the future if we require larger or smaller + quantities. When a Quantity is parsed from + a string, it will remember the type of suffix + it had, and will use the same type again when + it is serialized. Before serializing, Quantity + will be put in "canonical form". This means + that Exponent/suffix will be adjusted up or + down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision is + lost b. No fractional digits will be emitted c. + The exponent (or suffix) is as large as possible. + The sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole + point of this exercise. Non-canonical values + will still parse as long as they are well formed, + but will be re-emitted in their canonical form. + (So always use canonical form, or don''t diff.) This + format is intended to make it difficult to use + these numbers without writing some sort of special + handling code in the hopes that that will cause + implementors to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + medium: + description: 'What type of storage medium should + back this directory. The default is "" which + means to use the node''s default medium. Must + be an empty string (default) or Memory. More + info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: string + glusterfs: + description: Represents a Glusterfs mount that lasts + the lifetime of a pod. Glusterfs volumes do not + support ownership management or SELinux relabeling. + type: object + properties: + path: + description: 'Path is the Glusterfs volume path. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + endpoints: + description: 'EndpointsName is the endpoint name + that details Glusterfs topology. More info: + https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs + volume to be mounted with read-only permissions. + Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + required: + - endpoints + - path + gcePersistentDisk: + description: Represents a Persistent Disk resource + in Google Compute Engine. A GCE PD must exist before + mounting to a container. The disk must also be in + the same GCE project and zone as the kubelet. A + GCE PD can only be mounted as read/write once or + read-only many times. GCE PDs support ownership + management and SELinux relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that + you want to mount. If omitted, the default is + to mount by volume name. Examples: For volume + /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda + is "0" (or you can leave the property empty). + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: number + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + pdName: + description: 'Unique name of the PD resource in + GCE. Used to identify the disk in GCE. More + info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + required: + - pdName + photonPersistentDisk: + description: Represents a Photon Controller persistent + disk resource. + type: object + properties: + pdID: + description: ID that identifies Photon Controller + persistent disk + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - pdID + azureDisk: + description: AzureDisk represents an Azure Data Disk + mount on the host and bind mount to the pod. + type: object + properties: + diskName: + description: The Name of the data disk in the + blob storage + type: string + kind: + description: 'Expected values Shared: multiple + blob disks per storage account Dedicated: single + blob disk per storage account Managed: azure + managed data disk (only in managed availability + set). defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + cachingMode: + description: 'Host Caching mode: None, Read Only, + Read Write.' + type: string + diskURI: + description: The URI the data disk in the blob + storage + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - diskName + - diskURI + cinder: + description: Represents a cinder volume resource in + Openstack. A Cinder volume must exist before mounting + to a container. The volume must also be in the same + region as the kubelet. Cinder volumes support ownership + management and SELinux relabeling. + type: object + properties: + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + volumeID: + description: 'volume id used to identify the volume + in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + fsType: + description: 'Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + required: + - volumeID + downwardAPI: + description: DownwardAPIVolumeSource represents a + volume containing downward API info. Downward API + volumes support ownership management and SELinux + relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 + and 0777. Defaults to 0644. Directories within + the path are not affected by this setting. This + might be in conflict with other options that + affect the file mode, like fsGroup, and the + result can be other mode bits set.' + type: number + items: + description: Items is a list of downward API volume + file + type: array + items: + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field + type: object + properties: + mode: + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might be + in conflict with other options that affect + the file mode, like fsGroup, and the result + can be other mode bits set.' + type: number + path: + description: 'Required: Path is the relative + path name of the file to be created. Must + not be absolute or contain the ''..'' + path. Must be utf-8 encoded. The first + item of the relative path must not start + with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and + their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= + (Note that + may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= + "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi + | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | + M | G | T | P | E (Note that 1024 + = 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent + forms is used, no quantity may represent + a number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This + may be extended in the future if we + require larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type + again when it is serialized. Before + serializing, Quantity will be put + in "canonical form". This means that + Exponent/suffix will be adjusted up + or down (with a corresponding increase + or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. + The sign will be omitted unless the + number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as + they are well formed, but will be + re-emitted in their canonical form. + (So always use canonical form, or + don''t diff.) This format is intended + to make it difficult to use these + numbers without writing some sort + of special handling code in the hopes + that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to + select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector selects + an APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - path + awsElasticBlockStore: + description: Represents a Persistent Disk resource + in AWS. An AWS EBS disk must exist before mounting + to a container. The disk must also be in the same + AWS zone as the kubelet. An AWS EBS disk can only + be mounted as read/write once. AWS EBS volumes support + ownership management and SELinux relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that + you want to mount. If omitted, the default is + to mount by volume name. Examples: For volume + /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda + is "0" (or you can leave the property empty).' + type: number + volumeID: + description: 'Unique ID of the persistent disk + resource in AWS (Amazon EBS volume). More info: + https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + readOnly: + description: 'Specify "true" to force and set + the ReadOnly property in VolumeMounts to "true". + If omitted, the default is "false". More info: + https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + required: + - volumeID + flocker: + description: Represents a Flocker volume mounted by + the Flocker agent. One and only one of datasetName + and datasetUUID should be set. Flocker volumes do + not support ownership management or SELinux relabeling. + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata + -> name on the dataset for Flocker should be + considered as deprecated + type: string + datasetUUID: + description: UUID of the dataset. This is unique + identifier of a Flocker dataset + type: string + iscsi: + description: Represents an ISCSI disk. ISCSI volumes + can only be mounted as read/write once. ISCSI volumes + support ownership management and SELinux relabeling. + type: object + properties: + chapAuthSession: + description: whether support iSCSI Session CHAP + authentication + type: boolean + iscsiInterface: + description: iSCSI Interface Name that uses an + iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: number + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP + authentication + type: boolean + iqn: + description: Target iSCSI Qualified Name. + type: string + portals: + description: iSCSI Target Portal List. The portal + is either an IP or ip_addr:port if the port + is other than default (typically TCP ports 860 + and 3260). + type: array + items: + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName + is specified with iscsiInterface simultaneously, + new iSCSI interface : will be created for the connection. + type: string + readOnly: + description: ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#iscsi' + type: string + targetPortal: + description: iSCSI Target Portal. The Portal is + either an IP or ip_addr:port if the port is + other than default (typically TCP ports 860 + and 3260). + type: string + required: + - iqn + - lun + - targetPortal + rbd: + description: Represents a Rados Block Device mount + that lasts the lifetime of a pod. RBD volumes support + ownership management and SELinux relabeling. + type: object + properties: + image: + description: 'The rados image name. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + pool: + description: 'The rados pool name. Default is + rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#rbd' + type: string + keyring: + description: 'Keyring is the path to key ring + for RBDUser. Default is /etc/ceph/keyring. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + user: + description: 'The rados user name. Default is + admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: + type: string + required: + - image + - monitors + configMap: + description: Adapts a ConfigMap into a volume. The + contents of the target ConfigMap's Data field will + be presented in a volume as files using the keys + in the Data field as the file names, unless the + items element is populated with specific mappings + of keys to paths. ConfigMap volumes support ownership + management and SELinux relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 + and 0777. Defaults to 0644. Directories within + the path are not affected by this setting. This + might be in conflict with other options that + affect the file mode, like fsGroup, and the + result can be other mode bits set.' + type: number + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap or + its keys must be defined + type: boolean + items: + description: If unspecified, each key-value pair + in the Data field of the referenced ConfigMap + will be projected into the volume as a file + whose name is the key and content is the value. + If specified, the listed keys will be projected + into the specified paths, and unlisted keys + will not be present. If a key is specified which + is not present in the ConfigMap, the volume + setup will error unless it is marked optional. + Paths must be relative and may not contain the + '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within + a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might be + in conflict with other options that affect + the file mode, like fsGroup, and the result + can be other mode bits set.' + type: number + path: + description: The relative path of the file + to map the key to. May not be an absolute + path. May not contain the path element + '..'. May not start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + storageos: + description: Represents a StorageOS persistent volume + resource. + type: object + properties: + volumeNamespace: + description: VolumeNamespace specifies the scope + of the volume within StorageOS. If no namespace + is specified then the Pod's namespace will be + used. This allows the Kubernetes name scoping + to be mirrored within StorageOS for tighter + integration. Set VolumeName to any name to override + the default behaviour. Set to "default" if you + are not using namespaces within StorageOS. Namespaces + that do not pre-exist within StorageOS will + be created. + type: string + volumeName: + description: VolumeName is the human-readable + name of the StorageOS volume. Volume names + are only unique within a namespace. + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + csi: + description: Represents a source location of a volume + to mount, managed by an external CSI driver + type: object + properties: + driver: + description: Driver is the name of the CSI driver + that handles this volume. Consult with your + admin for the correct name as registered in + the cluster. + type: string + nodePublishSecretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Specifies a read-only configuration + for the volume. Defaults to false (read/write). + type: boolean + fsType: + description: Filesystem type to mount. Ex. "ext4", + "xfs", "ntfs". If not provided, the empty value + is passed to the associated CSI driver which + will determine the default filesystem to apply. + type: string + volumeAttributes: + description: VolumeAttributes stores driver-specific + properties that are passed to the CSI driver. + Consult your driver's documentation for supported + values. + additionalProperties: + type: string + type: object + required: + - driver + name: + description: 'Volume''s name. Must be a DNS_LABEL + and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: Represents an NFS mount that lasts the + lifetime of a pod. NFS volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + path: + description: 'Path that is exported by the NFS + server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + server: + description: 'Server is the hostname or IP address + of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS + export to be mounted with read-only permissions. + Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + required: + - path + - server + persistentVolumeClaim: + description: PersistentVolumeClaimVolumeSource references + the user's PVC in the same namespace. This volume + finds the bound PV and mounts that volume for the + pod. A PersistentVolumeClaimVolumeSource is, essentially, + a wrapper around another type of volume that is + owned by someone else (the system). + type: object + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim + in the same namespace as the pod using this + volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in + VolumeMounts. Default false. + type: boolean + required: + - claimName + gitRepo: + description: 'Represents a volume that is populated + with the contents of a git repository. Git repo + volumes do not support ownership management. Git + repo volumes support SELinux relabeling. DEPRECATED: + GitRepo is deprecated. To provision a container + with a git repo, mount an EmptyDir into an InitContainer + that clones the repo using git, then mount the EmptyDir + into the Pod''s container.' + type: object + properties: + repository: + description: Repository URL + type: string + directory: + description: Target directory name. Must not contain + or start with '..'. If '.' is supplied, the + volume directory will be the git repository. Otherwise, + if specified, the volume will contain the git + repository in the subdirectory with the given + name. + type: string + revision: + description: Commit hash for the specified revision. + type: string + required: + - repository + portworxVolume: + description: PortworxVolumeSource represents a Portworx + volume resource. + type: object + properties: + volumeID: + description: VolumeID uniquely identifies a Portworx + volume + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: FSType represents the filesystem + type to mount Must be a filesystem type supported + by the host operating system. Ex. "ext4", "xfs". + Implicitly inferred to be "ext4" if unspecified. + type: string + required: + - volumeID + vsphereVolume: + description: Represents a vSphere volume resource. + type: object + properties: + storagePolicyName: + description: Storage Policy Based Management (SPBM) + profile name. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) + profile ID associated with the StoragePolicyName. + type: string + volumePath: + description: Path that identifies vSphere volume + vmdk + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - volumePath + fc: + description: Represents a Fibre Channel volume. Fibre + Channel volumes can only be mounted as read/write + once. Fibre Channel volumes support ownership management + and SELinux relabeling. + type: object + properties: + lun: + description: 'Optional: FC target lun number' + type: number + targetWWNs: + description: 'Optional: FC target worldwide names + (WWNs)' + type: array + items: + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' + type: boolean + wwids: + description: 'Optional: FC volume world wide identifiers + (wwids) Either wwids or combination of targetWWNs + and lun must be set, but not both simultaneously.' + type: array + items: + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + hostPath: + description: Represents a host path mapped into a + pod. Host path volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + path: + description: 'Path of the directory on the host. + If the path is a symlink, it will follow the + link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults + to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + required: + - path + required: + - name + resources: + description: Memory and CPU minimum requirements and limits + for the server. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is omitted + for a container, it defaults to Limits if that is + explicitly specified, otherwise to an implementation-defined + value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount of + compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + annotations: + description: The annotations to be attached to generated + resources. + additionalProperties: + type: string + type: object + env: + description: A list of environment variables to add to a + server. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. Must + be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are + expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source for + the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key of + a Secret. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" | + "-" ::= | + ::= | + | ::= Ki | + Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G + | T | P | E (Note that 1024 = 1Ki but + 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No matter which of + the three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be + extended in the future if we require larger + or smaller quantities. When a Quantity + is parsed from a string, it will remember + the type of suffix it had, and will use + the same type again when it is serialized. Before + serializing, Quantity will be put in "canonical + form". This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. The + sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as + "1536Mi" Note that the quantity will NEVER + be internally represented by a floating + point number. That is the whole point of + this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or + don''t diff.) This format is intended to + make it difficult to use these numbers without + writing some sort of special handling code + in the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required for + volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an APIVersioned + field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in + the specified API version. + type: string + required: + - fieldPath + required: + - name + restartPolicy: + description: 'Restart policy for all containers within the + pod. One of Always, OnFailure, Never. Default to Always. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + type: string + nodeSelector: + description: Selector which must match a node's labels for + the pod to be scheduled on that node. + additionalProperties: + type: string + type: object + volumeMounts: + description: Additional volume mounts for the server pod. + type: array + items: + description: VolumeMount describes a mounting of a Volume + within a container. + type: object + properties: + mountPath: + description: Path within the container at which the + volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and the + other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the + container's volume should be mounted. Defaults to + "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment variable + references $(VAR_NAME) are expanded using the container's + environment. Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field is + beta in 1.15. + type: string + required: + - mountPath + - name + labels: + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + additionalProperties: + type: string + type: object + runtimeClassName: + description: 'RuntimeClassName refers to a RuntimeClass + object in the node.k8s.io group, which should be used + to run this pod. If no RuntimeClass resource matches + the named class, the pod will not be run. If unset or + empty, the "legacy" RuntimeClass will be used, which is + an implicit class with an empty definition that uses the + default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future.' + type: string + tolerations: + description: If specified, the pod's tolerations. + type: array + items: + description: The pod this Toleration is attached to tolerates + any taint that matches the triple + using the matching operator . + type: object + properties: + effect: + description: Effect indicates the taint effect to + match. Empty means match all taint effects. When + specified, allowed values are NoSchedule, PreferNoSchedule + and NoExecute. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period + of time the toleration (which must be of effect + NoExecute, otherwise this field is ignored) tolerates + the taint. By default, it is not set, which means + tolerate the taint forever (do not evict). Zero + and negative values will be treated as 0 (evict + immediately) by the system. + type: number + value: + description: Value is the taint value the toleration + matches to. If the operator is Exists, the value + should be empty, otherwise just a regular string. + type: string + key: + description: Key is the taint key that the toleration + applies to. Empty means match all taint keys. If + the key is empty, operator must be Exists; this + combination means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship + to the value. Valid operators are Exists and Equal. + Defaults to Equal. Exists is equivalent to wildcard + for value, so that a pod can tolerate all taints + of a particular category. + type: string + readinessProbe: + description: Settings for the readiness probe associated + with a server. + type: object + properties: + periodSeconds: + description: The number of seconds between checks. + type: number + timeoutSeconds: + description: The number of seconds with no response + that indicates a failure. + type: number + initialDelaySeconds: + description: The number of seconds before the first + check is performed. + type: number + containers: + description: Additional containers to be included in the + server pod. + type: array + items: + description: A single application container that you want + to run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of + a raw block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of + the container that the device will be mapped + to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, + IfNotPresent. Defaults to Always if :latest tag + is specified, or IfNotPresent otherwise. Cannot + be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate + a buffer for stdin in the container runtime. If + this is not set, reads from stdin in the container + will always result in EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message + should be populated. File will use the contents + of terminationMessagePath to populate the container + status message on both success and failure. FallbackToLogsOnError + will use the last chunk of container log output + if the termination message file is empty and the + container exited with an error. The log output is + limited to 2048 bytes or 80 lines, whichever is + smaller. Defaults to File. Cannot be updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to + which the container''s termination message will + be written is mounted into the container''s filesystem. + Message written is intended to be brief final status, + such as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' + type: string + workingDir: + description: Container's working directory. If not + specified, the container runtime's default will + be used, which might be configured in the container + image. Cannot be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: + https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields + are present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take + precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. + Processes in privileged containers are essentially + equivalent to root on the host. Defaults to + false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of + the container process. Defaults to user specified + in image metadata if unspecified. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities + from running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to + be applied to the container + type: object + properties: + role: + description: Role is a SELinux role label + that applies to the container. + type: string + level: + description: Level is SELinux level label + that applies to the container. + type: string + type: + description: Type is a SELinux type label + that applies to the container. + type: string + user: + description: User is a SELinux user label + that applies to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain + Windows-specific options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the + GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential + spec named by the GMSACredentialSpecName + field. This field is alpha-level and is + only honored by servers that enable the + WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run + the entrypoint of the container process. + Defaults to the user specified in image + metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. This + field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the + name of the GMSA credential spec to use. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. + type: string + procMount: + description: procMount denotes the type of proc + mount to use for the containers. The default + is DefaultProcMount which uses the container + runtime defaults for readonly paths and masked + paths. This requires the ProcMountType feature + flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the + container process. AllowPrivilegeEscalation + is true always when the container is: 1) run + as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of + the container process. Uses runtime default + if unset. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: number + runAsNonRoot: + description: Indicates that the container must + run as a non-root user. If true, the Kubelet + will validate the image at runtime to ensure + that it does not run as UID 0 (root) and fail + to start the container if it does. If unset + or false, no such validation will be performed. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set + in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. + Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) + are expanded using the previous defined environment + variables in the container and any service + environment variables. If a variable cannot + be resolved, the reference in the input string + will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, + regardless of whether the variable exists + or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source + for the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a + key of a Secret. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and + their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= + (Note that + may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= + "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi + | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | + M | G | T | P | E (Note that 1024 + = 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent + forms is used, no quantity may represent + a number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This + may be extended in the future if we + require larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type + again when it is serialized. Before + serializing, Quantity will be put + in "canonical form". This means that + Exponent/suffix will be adjusted up + or down (with a corresponding increase + or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. + The sign will be omitted unless the + number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as + they are well formed, but will be + re-emitted in their canonical form. + (So always use canonical form, or + don''t diff.) This format is intended + to make it difficult to use these + numbers without writing some sort + of special handling code in the hopes + that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to + select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects + an APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional + information about the network connections a container + uses, but is primarily informational. Not specifying + a port here DOES NOT prevent that port from being + exposed. Any port which is listening on the default + "0.0.0.0" address inside a container will be accessible + from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network + port in a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, + TCP, or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external + port to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port + in a pod must have a unique name. Name for + the port that can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the + pod's IP address. This must be a valid port + number, 0 < x < 65536. + type: number + hostPort: + description: Number of port to expose on the + host. If specified, this must be a valid port + number, 0 < x < 65536. If HostNetwork is specified, + this must match ContainerPort. Most containers + do not need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within + a shell. The docker image''s ENTRYPOINT is used + if this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. + If a variable cannot be resolved, the reference + in the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be + updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's + filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of + a Volume within a container. + type: object + properties: + mountPath: + description: Path within the container at which + the volume should be mounted. Must not contain + ':'. + type: string + mountPropagation: + description: mountPropagation determines how + mounts are propagated from the host to container + and the other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults + to false. + type: boolean + subPath: + description: Path within the volume from which + the container's volume should be mounted. + Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume + from which the container's volume should be + mounted. Behaves similarly to SubPath but + environment variable references $(VAR_NAME) + are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field + is beta in 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the + management system should take in response to container + lifecycle events. For the PostStart and PreStop + lifecycle handlers, management of the container + blocks until the action is complete, unless the + container process fails, in which case the handler + is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a + DNS_LABEL. Each container in a pod must have a unique + name (DNS_LABEL). Cannot be updated. + type: string + tty: + description: Whether this container should allocate + a TTY for itself, also requires 'stdin' to be true. + Default is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should + close the stdin channel after it has been opened + by a single attach. When stdin is true the stdin + stream will remain open across multiple attach sessions. + If stdinOnce is set to true, stdin is opened on + container start, is empty until the first client + attaches to stdin, and then remains open and accepts + data until the client disconnects, at which time + stdin is closed and remains closed until the container + is restarted. If this flag is false, a container + processes that reads from stdin will never receive + an EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment + variables in the container. The keys defined within + a source must be a C_IDENTIFIER. All invalid keys + will be reported as an event when the container + is starting. When a key exists in multiple sources, + the value associated with the last source will take + precedence. Values defined by an Env with a duplicate + key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source + of a set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + must be defined + type: boolean + prefix: + description: An optional identifier to prepend + to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret + to populate the environment variables with. The + contents of the target Secret's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + must be defined + type: boolean + required: + - name + containerSecurityContext: + description: Container-level security attributes. Will override + any matching pod-level attributes. + type: object + properties: + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities from + running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to be applied + to the container + type: object + properties: + role: + description: Role is a SELinux role label that applies + to the container. + type: string + level: + description: Level is SELinux level label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + This field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + procMount: + description: procMount denotes the type of proc mount + to use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. This requires the ProcMountType + feature flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether + a process can gain more privileges than its parent + process. This bool directly controls if the no_new_privs + flag will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if + it does. If unset or false, no such validation will + be performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + schedulerName: + description: If specified, the pod will be dispatched by + specified scheduler. If not specified, the pod will be + dispatched by default scheduler. + type: string + initContainers: + description: Initialization containers to be included in + the server pod. + type: array + items: + description: A single application container that you want + to run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of + a raw block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of + the container that the device will be mapped + to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, + IfNotPresent. Defaults to Always if :latest tag + is specified, or IfNotPresent otherwise. Cannot + be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate + a buffer for stdin in the container runtime. If + this is not set, reads from stdin in the container + will always result in EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message + should be populated. File will use the contents + of terminationMessagePath to populate the container + status message on both success and failure. FallbackToLogsOnError + will use the last chunk of container log output + if the termination message file is empty and the + container exited with an error. The log output is + limited to 2048 bytes or 80 lines, whichever is + smaller. Defaults to File. Cannot be updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to + which the container''s termination message will + be written is mounted into the container''s filesystem. + Message written is intended to be brief final status, + such as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' + type: string + workingDir: + description: Container's working directory. If not + specified, the container runtime's default will + be used, which might be configured in the container + image. Cannot be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: + https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields + are present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take + precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. + Processes in privileged containers are essentially + equivalent to root on the host. Defaults to + false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of + the container process. Defaults to user specified + in image metadata if unspecified. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities + from running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to + be applied to the container + type: object + properties: + role: + description: Role is a SELinux role label + that applies to the container. + type: string + level: + description: Level is SELinux level label + that applies to the container. + type: string + type: + description: Type is a SELinux type label + that applies to the container. + type: string + user: + description: User is a SELinux user label + that applies to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain + Windows-specific options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the + GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential + spec named by the GMSACredentialSpecName + field. This field is alpha-level and is + only honored by servers that enable the + WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run + the entrypoint of the container process. + Defaults to the user specified in image + metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. This + field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the + name of the GMSA credential spec to use. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. + type: string + procMount: + description: procMount denotes the type of proc + mount to use for the containers. The default + is DefaultProcMount which uses the container + runtime defaults for readonly paths and masked + paths. This requires the ProcMountType feature + flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the + container process. AllowPrivilegeEscalation + is true always when the container is: 1) run + as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of + the container process. Uses runtime default + if unset. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: number + runAsNonRoot: + description: Indicates that the container must + run as a non-root user. If true, the Kubelet + will validate the image at runtime to ensure + that it does not run as UID 0 (root) and fail + to start the container if it does. If unset + or false, no such validation will be performed. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set + in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. + Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) + are expanded using the previous defined environment + variables in the container and any service + environment variables. If a variable cannot + be resolved, the reference in the input string + will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, + regardless of whether the variable exists + or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source + for the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a + key of a Secret. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and + their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= + (Note that + may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= + "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi + | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | + M | G | T | P | E (Note that 1024 + = 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent + forms is used, no quantity may represent + a number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This + may be extended in the future if we + require larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type + again when it is serialized. Before + serializing, Quantity will be put + in "canonical form". This means that + Exponent/suffix will be adjusted up + or down (with a corresponding increase + or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. + The sign will be omitted unless the + number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as + they are well formed, but will be + re-emitted in their canonical form. + (So always use canonical form, or + don''t diff.) This format is intended + to make it difficult to use these + numbers without writing some sort + of special handling code in the hopes + that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to + select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects + an APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional + information about the network connections a container + uses, but is primarily informational. Not specifying + a port here DOES NOT prevent that port from being + exposed. Any port which is listening on the default + "0.0.0.0" address inside a container will be accessible + from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network + port in a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, + TCP, or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external + port to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port + in a pod must have a unique name. Name for + the port that can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the + pod's IP address. This must be a valid port + number, 0 < x < 65536. + type: number + hostPort: + description: Number of port to expose on the + host. If specified, this must be a valid port + number, 0 < x < 65536. If HostNetwork is specified, + this must match ContainerPort. Most containers + do not need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within + a shell. The docker image''s ENTRYPOINT is used + if this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. + If a variable cannot be resolved, the reference + in the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be + updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's + filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of + a Volume within a container. + type: object + properties: + mountPath: + description: Path within the container at which + the volume should be mounted. Must not contain + ':'. + type: string + mountPropagation: + description: mountPropagation determines how + mounts are propagated from the host to container + and the other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults + to false. + type: boolean + subPath: + description: Path within the volume from which + the container's volume should be mounted. + Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume + from which the container's volume should be + mounted. Behaves similarly to SubPath but + environment variable references $(VAR_NAME) + are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field + is beta in 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the + management system should take in response to container + lifecycle events. For the PostStart and PreStop + lifecycle handlers, management of the container + blocks until the action is complete, unless the + container process fails, in which case the handler + is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a + DNS_LABEL. Each container in a pod must have a unique + name (DNS_LABEL). Cannot be updated. + type: string + tty: + description: Whether this container should allocate + a TTY for itself, also requires 'stdin' to be true. + Default is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should + close the stdin channel after it has been opened + by a single attach. When stdin is true the stdin + stream will remain open across multiple attach sessions. + If stdinOnce is set to true, stdin is opened on + container start, is empty until the first client + attaches to stdin, and then remains open and accepts + data until the client disconnects, at which time + stdin is closed and remains closed until the container + is restarted. If this flag is false, a container + processes that reads from stdin will never receive + an EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment + variables in the container. The keys defined within + a source must be a C_IDENTIFIER. All invalid keys + will be reported as an event when the container + is starting. When a key exists in multiple sources, + the value associated with the last source will take + precedence. Values defined by an Env with a duplicate + key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source + of a set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + must be defined + type: boolean + prefix: + description: An optional identifier to prepend + to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret + to populate the environment variables with. The + contents of the target Secret's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + must be defined + type: boolean + required: + - name + shutdown: + description: Configures how the operator should shutdown + the server instance. + type: object + properties: + ignoreSessions: + description: For graceful shutdown only, indicates to + ignore pending HTTP sessions during in-flight work + handling. Not required. Defaults to false. + type: boolean + shutdownType: + description: Tells the operator how to shutdown server + instances. Not required. Defaults to graceful shutdown. + type: string + enum: + - Graceful + - Forced + timeoutSeconds: + description: For graceful shutdown only, number of seconds + to wait before aborting in-flight work and shutting + down the server. Not required. Defaults to 30 seconds. + type: number + affinity: + description: If specified, the pod's scheduling constraints + type: object + properties: + nodeAffinity: + description: Node affinity is a group of node affinity + scheduling rules. + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + description: A node selector represents the union + of the results of one or more label queries over + a set of nodes; that is, it represents the OR + of the selectors represented by the node selector + terms. + type: object + properties: + nodeSelectorTerms: + description: Required. A list of node selector + terms. The terms are ORed. + type: array + items: + description: A null or empty node selector + term matches no objects. The requirements + of them are ANDed. The TopologySelectorTerm + type implements a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + required: + - nodeSelectorTerms + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. + The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node + that meets all of the scheduling requirements + (resource request, requiredDuringScheduling affinity + expressions, etc.), compute a sum by iterating + through the elements of this field and adding + "weight" to the sum if the node matches the corresponding + matchExpressions; the node(s) with the highest + sum are the most preferred. + type: array + items: + description: An empty preferred scheduling term + matches all objects with implicit weight 0 (i.e. + it's a no-op). A null preferred scheduling term + matches no objects (i.e. is also a no-op). + type: object + properties: + preference: + description: A null or empty node selector + term matches no objects. The requirements + of them are ANDed. The TopologySelectorTerm + type implements a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + weight: + description: Weight associated with matching + the corresponding nodeSelectorTerm, in the + range 1-100. + type: number + required: + - preference + - weight + podAffinity: + description: Pod affinity is a group of inter pod affinity + scheduling rules. + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified + by this field are not met at scheduling time, + the pod will not be scheduled onto the node. If + the affinity requirements specified by this field + cease to be met at some point during pod execution + (e.g. due to a pod label update), the system may + or may not try to eventually evict the pod from + its node. When there are multiple elements, the + lists of nodes corresponding to each podAffinityTerm + are intersected, i.e. all terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on which + a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty + label selector matches all objects. A null + label selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. + The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node + that meets all of the scheduling requirements + (resource request, requiredDuringScheduling affinity + expressions, etc.), compute a sum by iterating + through the elements of this field and adding + "weight" to the sum if the node has pods which + matches the corresponding podAffinityTerm; the + node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched + WeightedPodAffinityTerm fields are added per-node + to find the most preferred node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely + those matching the labelSelector relative + to the given namespace(s)) that this pod + should be co-located (affinity) or not co-located + (anti-affinity) with, where co-located is + defined as running on a node whose value + of the label with key matches + that of any node on which a pod of the set + of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label + query over a set of resources. The result + of matchLabels and matchExpressions + are ANDed. An empty label selector matches + all objects. A null label selector matches + no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a + list of label selector requirements. + The requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values + array must be non-empty. If + the operator is Exists or + DoesNotExist, the values array + must be empty. This array + is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a + set of values. Valid operators + are In, NotIn, Exists and + DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map + of {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose + value of the label with key topologyKey + matches that of any node on which any + of the selected pods is running. Empty + topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which + namespaces the labelSelector applies + to (matches against); null or empty + list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching + the corresponding podAffinityTerm, in the + range 1-100. + type: number + required: + - podAffinityTerm + - weight + podAntiAffinity: + description: Pod anti affinity is a group of inter pod + anti affinity scheduling rules. + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified + by this field are not met at scheduling time, + the pod will not be scheduled onto the node. If + the anti-affinity requirements specified by this + field cease to be met at some point during pod + execution (e.g. due to a pod label update), the + system may or may not try to eventually evict + the pod from its node. When there are multiple + elements, the lists of nodes corresponding to + each podAffinityTerm are intersected, i.e. all + terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on which + a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty + label selector matches all objects. A null + label selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the anti-affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. + The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node + that meets all of the scheduling requirements + (resource request, requiredDuringScheduling anti-affinity + expressions, etc.), compute a sum by iterating + through the elements of this field and adding + "weight" to the sum if the node has pods which + matches the corresponding podAffinityTerm; the + node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched + WeightedPodAffinityTerm fields are added per-node + to find the most preferred node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely + those matching the labelSelector relative + to the given namespace(s)) that this pod + should be co-located (affinity) or not co-located + (anti-affinity) with, where co-located is + defined as running on a node whose value + of the label with key matches + that of any node on which a pod of the set + of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label + query over a set of resources. The result + of matchLabels and matchExpressions + are ANDed. An empty label selector matches + all objects. A null label selector matches + no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a + list of label selector requirements. + The requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values + array must be non-empty. If + the operator is Exists or + DoesNotExist, the values array + must be empty. This array + is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a + set of values. Valid operators + are In, NotIn, Exists and + DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map + of {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose + value of the label with key topologyKey + matches that of any node on which any + of the selected pods is running. Empty + topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which + namespaces the labelSelector applies + to (matches against); null or empty + list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching + the corresponding podAffinityTerm, in the + range 1-100. + type: number + required: + - podAffinityTerm + - weight + serverStartPolicy: + description: The strategy for deciding whether to start a server. + Legal values are ALWAYS, NEVER, or IF_NEEDED. + type: string + enum: + - ALWAYS + - NEVER + - IF_NEEDED + restartVersion: + description: If present, every time this value is updated the + operator will restart the required servers. + type: string + required: + - serverName + clusters: + type: array + description: Configuration for the clusters. + items: + description: An element representing a cluster in the domain configuration. + type: object + properties: + serverStartState: + description: The state in which the server is to be started. + Use ADMIN if server should start in the admin state. Defaults + to RUNNING. + type: string + enum: + - RUNNING + - ADMIN + serverService: + description: Customization affecting ClusterIP Kubernetes services + for WebLogic Server instances. + type: object + properties: + precreateService: + description: If true, operator will create server services + even for server instances without running pods. + type: boolean + annotations: + description: The annotations to be attached to generated + resources. + additionalProperties: + type: string + type: object + labels: + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + additionalProperties: + type: string + type: object + maxUnavailable: + description: The maximum number of cluster members that can + be temporarily unavailable. Defaults to 1. + type: number + minimum: 1.0 + replicas: + description: The number of cluster members to run. + type: number + minimum: 0.0 + clusterName: + description: The name of this cluster. Required + type: string + serverPod: + description: Configuration affecting server pods. + type: object + properties: + nodeName: + description: NodeName is a request to schedule this pod + onto a specific node. If it is non-empty, the scheduler + simply schedules this pod onto that node, assuming that + it fits resource requirements. + type: string + livenessProbe: + description: Settings for the liveness probe associated + with a server. + type: object + properties: + periodSeconds: + description: The number of seconds between checks. + type: number + timeoutSeconds: + description: The number of seconds with no response + that indicates a failure. + type: number + initialDelaySeconds: + description: The number of seconds before the first + check is performed. + type: number + readinessGates: + description: 'If specified, all readiness gates will be + evaluated for pod readiness. A pod is ready when all its + containers are ready AND all conditions specified in the + readiness gates have status equal to "True" More info: + https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + type: array + items: + description: PodReadinessGate contains the reference to + a pod condition + type: object + properties: + conditionType: + description: ConditionType refers to a condition in + the pod's condition list with matching type. + type: string + required: + - conditionType + serviceAccountName: + description: Name of the ServiceAccount to be used to run + this pod. If it is not set, default ServiceAccount will + be used. The ServiceAccount has to exist at the time the + pod is created. + type: string + podSecurityContext: + description: Pod-level security attributes. + type: object + properties: + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence + for that container. + type: number + seLinuxOptions: + description: SELinuxOptions are the labels to be applied + to the container + type: object + properties: + role: + description: Role is a SELinux role label that applies + to the container. + type: string + level: + description: Level is SELinux level label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + fsGroup: + description: 'A special supplemental group that applies + to all containers in a pod. Some volume types allow + the Kubelet to change the ownership of that volume + to be owned by the pod: 1. The owning GID will be + the FSGroup 2. The setgid bit is set (new files created + in the volume will be owned by FSGroup) 3. The permission + bits are OR''d with rw-rw---- If unset, the Kubelet + will not modify the ownership and permissions of any + volume.' + type: number + windowsOptions: + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + This field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + supplementalGroups: + description: A list of groups applied to the first process + run in each container, in addition to the container's + primary GID. If unspecified, no groups will be added + to any container. + type: array + items: + type: number + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in SecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence for that container. + type: number + runAsNonRoot: + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if + it does. If unset or false, no such validation will + be performed. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: boolean + sysctls: + description: Sysctls hold a list of namespaced sysctls + used for the pod. Pods with unsupported sysctls (by + the container runtime) might fail to launch. + type: array + items: + description: Sysctl defines a kernel parameter to + be set + type: object + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + priorityClassName: + description: If specified, indicates the pod's priority. + "system-node-critical" and "system-cluster-critical" are + two special keywords which indicate the highest priorities + with the former being the highest priority. Any other + name must be defined by creating a PriorityClass object + with that name. If not specified, the pod priority will + be default or zero if there is no default. + type: string + volumes: + description: Additional volumes to be created in the server + pod. + type: array + items: + description: Volume represents a named volume in a pod + that may be accessed by any container in the pod. + type: object + properties: + quobyte: + description: Represents a Quobyte mount that lasts + the lifetime of a pod. Quobyte volumes do not support + ownership management or SELinux relabeling. + type: object + properties: + volume: + description: Volume is a string that references + an already created Quobyte volume by name. + type: string + registry: + description: Registry represents a single or multiple + Quobyte Registry services specified as a string + as host:port pair (multiple entries are separated + with commas) which acts as the central registry + for volumes + type: string + readOnly: + description: ReadOnly here will force the Quobyte + volume to be mounted with read-only permissions. + Defaults to false. + type: boolean + user: + description: User to map volume access to Defaults + to serivceaccount user + type: string + tenant: + description: Tenant owning the given Quobyte volume + in the Backend Used with dynamically provisioned + Quobyte volumes, value is set by the plugin + type: string + group: + description: Group to map volume access to Default + is no group + type: string + required: + - registry + - volume + azureFile: + description: AzureFile represents an Azure File Service + mount on the host and bind mount to the pod. + type: object + properties: + secretName: + description: the name of secret that contains + Azure Storage Account Name and Key + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + shareName: + description: Share Name + type: string + required: + - secretName + - shareName + flexVolume: + description: FlexVolume represents a generic volume + resource that is provisioned/attached using an exec + based plugin. + type: object + properties: + driver: + description: Driver is the name of the driver + to use for this volume. + type: string + options: + description: 'Optional: Extra command options + if any.' + additionalProperties: + type: string + type: object + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' + type: boolean + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". The default + filesystem depends on FlexVolume script. + type: string + required: + - driver + secret: + description: Adapts a Secret into a volume. The contents + of the target Secret's Data field will be presented + in a volume as files using the keys in the Data + field as the file names. Secret volumes support + ownership management and SELinux relabeling. + type: object + properties: + secretName: + description: 'Name of the secret in the pod''s + namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 + and 0777. Defaults to 0644. Directories within + the path are not affected by this setting. This + might be in conflict with other options that + affect the file mode, like fsGroup, and the + result can be other mode bits set.' + type: number + optional: + description: Specify whether the Secret or its + keys must be defined + type: boolean + items: + description: If unspecified, each key-value pair + in the Data field of the referenced Secret will + be projected into the volume as a file whose + name is the key and content is the value. If + specified, the listed keys will be projected + into the specified paths, and unlisted keys + will not be present. If a key is specified which + is not present in the Secret, the volume setup + will error unless it is marked optional. Paths + must be relative and may not contain the '..' + path or start with '..'. + type: array + items: + description: Maps a string key to a path within + a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might be + in conflict with other options that affect + the file mode, like fsGroup, and the result + can be other mode bits set.' + type: number + path: + description: The relative path of the file + to map the key to. May not be an absolute + path. May not contain the path element + '..'. May not start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + projected: + description: Represents a projected volume source + type: object + properties: + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected + along with other supported volume types + type: object + properties: + downwardAPI: + description: Represents downward API info + for projecting into a projected volume. + Note that this is identical to a downwardAPI + volume source without the default mode. + type: object + properties: + items: + description: Items is a list of DownwardAPIVolume + file + type: array + items: + description: DownwardAPIVolumeFile + represents information to create + the file containing the pod field + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be + a value between 0 and 0777. + If not specified, the volume + defaultMode will be used. This + might be in conflict with other + options that affect the file + mode, like fsGroup, and the + result can be other mode bits + set.' + type: number + path: + description: 'Required: Path is the + relative path name of the file + to be created. Must not be absolute + or contain the ''..'' path. + Must be utf-8 encoded. The first + item of the relative path must + not start with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector + represents container resources + (cpu, memory) and their output + format + type: object + properties: + divisor: + description: 'Quantity is + a fixed-point representation + of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition + to String() and AsInt64() + accessors. The serialization + format is: ::= + (Note + that may be empty, + from the "" case in .) + ::= 0 + | 1 | ... | 9 ::= + | + ::= + | . | . + | . ::= + "+" | "-" ::= + | + ::= + | | + ::= Ki + | Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m + | "" | k | M | G | T | P + | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t + choose the capitalization.) + ::= "e" + | "E" No + matter which of the three + exponent forms is used, + no quantity may represent + a number greater than 2^63-1 + in magnitude, nor may it + have more than 3 decimal + places. Numbers larger or + more precise will be capped + or rounded up. (E.g.: 0.1m + will rounded up to 1m.) + This may be extended in + the future if we require + larger or smaller quantities. When + a Quantity is parsed from + a string, it will remember + the type of suffix it had, + and will use the same type + again when it is serialized. Before + serializing, Quantity will + be put in "canonical form". + This means that Exponent/suffix + will be adjusted up or down + (with a corresponding increase + or decrease in Mantissa) + such that: a. No precision + is lost b. No fractional + digits will be emitted c. + The exponent (or suffix) + is as large as possible. + The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER + be internally represented + by a floating point number. + That is the whole point + of this exercise. Non-canonical + values will still parse + as long as they are well + formed, but will be re-emitted + in their canonical form. + (So always use canonical + form, or don''t diff.) This + format is intended to make + it difficult to use these + numbers without writing + some sort of special handling + code in the hopes that that + will cause implementors + to also use a fixed point + implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource + to select' + type: string + containerName: + description: 'Container name: + required for volumes, optional + for env vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector + selects an APIVersioned field + of an object. + type: object + properties: + apiVersion: + description: Version of the + schema the FieldPath is + written in terms of, defaults + to "v1". + type: string + fieldPath: + description: Path of the field + to select in the specified + API version. + type: string + required: + - fieldPath + required: + - path + configMap: + description: Adapts a ConfigMap into a projected + volume. The contents of the target ConfigMap's + Data field will be presented in a projected + volume as files using the keys in the + Data field as the file names, unless the + items element is populated with specific + mappings of keys to paths. Note that this + is identical to a configmap volume source + without the default mode. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its keys must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + ConfigMap will be projected into the + volume as a file whose name is the + key and content is the value. If specified, + the listed keys will be projected + into the specified paths, and unlisted + keys will not be present. If a key + is specified which is not present + in the ConfigMap, the volume setup + will error unless it is marked optional. + Paths must be relative and may not + contain the '..' path or start with + '..'. + type: array + items: + description: Maps a string key to + a path within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be + a value between 0 and 0777. + If not specified, the volume + defaultMode will be used. This + might be in conflict with other + options that affect the file + mode, like fsGroup, and the + result can be other mode bits + set.' + type: number + path: + description: The relative path + of the file to map the key to. + May not be an absolute path. + May not contain the path element + '..'. May not start with the + string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + secret: + description: Adapts a secret into a projected + volume. The contents of the target Secret's + Data field will be presented in a projected + volume as files using the keys in the + Data field as the file names. Note that + this is identical to a secret volume source + without the default mode. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + items: + description: If unspecified, each key-value + pair in the Data field of the referenced + Secret will be projected into the + volume as a file whose name is the + key and content is the value. If specified, + the listed keys will be projected + into the specified paths, and unlisted + keys will not be present. If a key + is specified which is not present + in the Secret, the volume setup will + error unless it is marked optional. + Paths must be relative and may not + contain the '..' path or start with + '..'. + type: array + items: + description: Maps a string key to + a path within a volume. + type: object + properties: + mode: + description: 'Optional: mode bits + to use on this file, must be + a value between 0 and 0777. + If not specified, the volume + defaultMode will be used. This + might be in conflict with other + options that affect the file + mode, like fsGroup, and the + result can be other mode bits + set.' + type: number + path: + description: The relative path + of the file to map the key to. + May not be an absolute path. + May not contain the path element + '..'. May not start with the + string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + serviceAccountToken: + description: ServiceAccountTokenProjection + represents a projected service account + token volume. This projection can be used + to insert a service account token into + the pods runtime filesystem for use against + APIs (Kubernetes API Server or otherwise). + type: object + properties: + path: + description: Path is the path relative + to the mount point of the file to + project the token into. + type: string + audience: + description: Audience is the intended + audience of the token. A recipient + of a token must identify itself with + an identifier specified in the audience + of the token, and otherwise should + reject the token. The audience defaults + to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the + requested duration of validity of + the service account token. As the + token approaches expiration, the kubelet + volume plugin will proactively rotate + the service account token. The kubelet + will start trying to rotate the token + if the token is older than 80 percent + of its time to live or if the token + is older than 24 hours.Defaults to + 1 hour and must be at least 10 minutes. + type: number + required: + - path + defaultMode: + description: Mode bits to use on created files + by default. Must be a value between 0 and 0777. + Directories within the path are not affected + by this setting. This might be in conflict with + other options that affect the file mode, like + fsGroup, and the result can be other mode bits + set. + type: number + required: + - sources + cephfs: + description: Represents a Ceph Filesystem mount that + lasts the lifetime of a pod Cephfs volumes do not + support ownership management or SELinux relabeling. + type: object + properties: + path: + description: 'Optional: Used as the mounted root, + rather than the full Ceph tree, default is /' + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + secretFile: + description: 'Optional: SecretFile is the path + to key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + user: + description: 'Optional: User is the rados user + name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + monitors: + description: 'Required: Monitors is a collection + of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: + type: string + required: + - monitors + scaleIO: + description: ScaleIOVolumeSource represents a persistent + ScaleIO volume + type: object + properties: + system: + description: The name of the storage system as + configured in ScaleIO. + type: string + protectionDomain: + description: The name of the ScaleIO Protection + Domain for the configured storage. + type: string + sslEnabled: + description: Flag to enable/disable SSL communication + with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for + a volume should be ThickProvisioned or ThinProvisioned. + Default is ThinProvisioned. + type: string + volumeName: + description: The name of a volume already created + in the ScaleIO system that is associated with + this volume source. + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Default is + "xfs". + type: string + storagePool: + description: The ScaleIO Storage Pool associated + with the protection domain. + type: string + gateway: + description: The host address of the ScaleIO API + Gateway. + type: string + required: + - gateway + - secretRef + - system + emptyDir: + description: Represents an empty directory for a pod. + Empty directory volumes support ownership management + and SELinux relabeling. + type: object + properties: + sizeLimit: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and + AsInt64() accessors. The serialization format + is: ::= (Note + that may be empty, from the "" case + in .) ::= 0 | 1 + | ... | 9 ::= | + ::= | . + | . | . ::= + "+" | "-" ::= | + ::= | + | ::= Ki | Mi + | Gi | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T + | P | E (Note that 1024 = 1Ki but 1000 = 1k; + I didn''t choose the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms is + used, no quantity may represent a number greater + than 2^63-1 in magnitude, nor may it have more + than 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be extended + in the future if we require larger or smaller + quantities. When a Quantity is parsed from + a string, it will remember the type of suffix + it had, and will use the same type again when + it is serialized. Before serializing, Quantity + will be put in "canonical form". This means + that Exponent/suffix will be adjusted up or + down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision is + lost b. No fractional digits will be emitted c. + The exponent (or suffix) is as large as possible. + The sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole + point of this exercise. Non-canonical values + will still parse as long as they are well formed, + but will be re-emitted in their canonical form. + (So always use canonical form, or don''t diff.) This + format is intended to make it difficult to use + these numbers without writing some sort of special + handling code in the hopes that that will cause + implementors to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + medium: + description: 'What type of storage medium should + back this directory. The default is "" which + means to use the node''s default medium. Must + be an empty string (default) or Memory. More + info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: string + glusterfs: + description: Represents a Glusterfs mount that lasts + the lifetime of a pod. Glusterfs volumes do not + support ownership management or SELinux relabeling. + type: object + properties: + path: + description: 'Path is the Glusterfs volume path. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + endpoints: + description: 'EndpointsName is the endpoint name + that details Glusterfs topology. More info: + https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs + volume to be mounted with read-only permissions. + Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + required: + - endpoints + - path + gcePersistentDisk: + description: Represents a Persistent Disk resource + in Google Compute Engine. A GCE PD must exist before + mounting to a container. The disk must also be in + the same GCE project and zone as the kubelet. A + GCE PD can only be mounted as read/write once or + read-only many times. GCE PDs support ownership + management and SELinux relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that + you want to mount. If omitted, the default is + to mount by volume name. Examples: For volume + /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda + is "0" (or you can leave the property empty). + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: number + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + pdName: + description: 'Unique name of the PD resource in + GCE. Used to identify the disk in GCE. More + info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + required: + - pdName + photonPersistentDisk: + description: Represents a Photon Controller persistent + disk resource. + type: object + properties: + pdID: + description: ID that identifies Photon Controller + persistent disk + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - pdID + azureDisk: + description: AzureDisk represents an Azure Data Disk + mount on the host and bind mount to the pod. + type: object + properties: + diskName: + description: The Name of the data disk in the + blob storage + type: string + kind: + description: 'Expected values Shared: multiple + blob disks per storage account Dedicated: single + blob disk per storage account Managed: azure + managed data disk (only in managed availability + set). defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + cachingMode: + description: 'Host Caching mode: None, Read Only, + Read Write.' + type: string + diskURI: + description: The URI the data disk in the blob + storage + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - diskName + - diskURI + cinder: + description: Represents a cinder volume resource in + Openstack. A Cinder volume must exist before mounting + to a container. The volume must also be in the same + region as the kubelet. Cinder volumes support ownership + management and SELinux relabeling. + type: object + properties: + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + volumeID: + description: 'volume id used to identify the volume + in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + fsType: + description: 'Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + required: + - volumeID + downwardAPI: + description: DownwardAPIVolumeSource represents a + volume containing downward API info. Downward API + volumes support ownership management and SELinux + relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 + and 0777. Defaults to 0644. Directories within + the path are not affected by this setting. This + might be in conflict with other options that + affect the file mode, like fsGroup, and the + result can be other mode bits set.' + type: number + items: + description: Items is a list of downward API volume + file + type: array + items: + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field + type: object + properties: + mode: + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might be + in conflict with other options that affect + the file mode, like fsGroup, and the result + can be other mode bits set.' + type: number + path: + description: 'Required: Path is the relative + path name of the file to be created. Must + not be absolute or contain the ''..'' + path. Must be utf-8 encoded. The first + item of the relative path must not start + with ''..''' + type: string + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and + their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= + (Note that + may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= + "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi + | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | + M | G | T | P | E (Note that 1024 + = 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent + forms is used, no quantity may represent + a number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This + may be extended in the future if we + require larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type + again when it is serialized. Before + serializing, Quantity will be put + in "canonical form". This means that + Exponent/suffix will be adjusted up + or down (with a corresponding increase + or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. + The sign will be omitted unless the + number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as + they are well formed, but will be + re-emitted in their canonical form. + (So always use canonical form, or + don''t diff.) This format is intended + to make it difficult to use these + numbers without writing some sort + of special handling code in the hopes + that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to + select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + fieldRef: + description: ObjectFieldSelector selects + an APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - path + awsElasticBlockStore: + description: Represents a Persistent Disk resource + in AWS. An AWS EBS disk must exist before mounting + to a container. The disk must also be in the same + AWS zone as the kubelet. An AWS EBS disk can only + be mounted as read/write once. AWS EBS volumes support + ownership management and SELinux relabeling. + type: object + properties: + partition: + description: 'The partition in the volume that + you want to mount. If omitted, the default is + to mount by volume name. Examples: For volume + /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda + is "0" (or you can leave the property empty).' + type: number + volumeID: + description: 'Unique ID of the persistent disk + resource in AWS (Amazon EBS volume). More info: + https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + readOnly: + description: 'Specify "true" to force and set + the ReadOnly property in VolumeMounts to "true". + If omitted, the default is "false". More info: + https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + required: + - volumeID + flocker: + description: Represents a Flocker volume mounted by + the Flocker agent. One and only one of datasetName + and datasetUUID should be set. Flocker volumes do + not support ownership management or SELinux relabeling. + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata + -> name on the dataset for Flocker should be + considered as deprecated + type: string + datasetUUID: + description: UUID of the dataset. This is unique + identifier of a Flocker dataset + type: string + iscsi: + description: Represents an ISCSI disk. ISCSI volumes + can only be mounted as read/write once. ISCSI volumes + support ownership management and SELinux relabeling. + type: object + properties: + chapAuthSession: + description: whether support iSCSI Session CHAP + authentication + type: boolean + iscsiInterface: + description: iSCSI Interface Name that uses an + iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: number + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP + authentication + type: boolean + iqn: + description: Target iSCSI Qualified Name. + type: string + portals: + description: iSCSI Target Portal List. The portal + is either an IP or ip_addr:port if the port + is other than default (typically TCP ports 860 + and 3260). + type: array + items: + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName + is specified with iscsiInterface simultaneously, + new iSCSI interface : will be created for the connection. + type: string + readOnly: + description: ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#iscsi' + type: string + targetPortal: + description: iSCSI Target Portal. The Portal is + either an IP or ip_addr:port if the port is + other than default (typically TCP ports 860 + and 3260). + type: string + required: + - iqn + - lun + - targetPortal + rbd: + description: Represents a Rados Block Device mount + that lasts the lifetime of a pod. RBD volumes support + ownership management and SELinux relabeling. + type: object + properties: + image: + description: 'The rados image name. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + pool: + description: 'The rados pool name. Default is + rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly + setting in VolumeMounts. Defaults to false. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + fsType: + description: 'Filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://kubernetes.io/docs/concepts/storage/volumes#rbd' + type: string + keyring: + description: 'Keyring is the path to key ring + for RBDUser. Default is /etc/ceph/keyring. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + user: + description: 'The rados user name. Default is + admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: + type: string + required: + - image + - monitors + configMap: + description: Adapts a ConfigMap into a volume. The + contents of the target ConfigMap's Data field will + be presented in a volume as files using the keys + in the Data field as the file names, unless the + items element is populated with specific mappings + of keys to paths. ConfigMap volumes support ownership + management and SELinux relabeling. + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created + files by default. Must be a value between 0 + and 0777. Defaults to 0644. Directories within + the path are not affected by this setting. This + might be in conflict with other options that + affect the file mode, like fsGroup, and the + result can be other mode bits set.' + type: number + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap or + its keys must be defined + type: boolean + items: + description: If unspecified, each key-value pair + in the Data field of the referenced ConfigMap + will be projected into the volume as a file + whose name is the key and content is the value. + If specified, the listed keys will be projected + into the specified paths, and unlisted keys + will not be present. If a key is specified which + is not present in the ConfigMap, the volume + setup will error unless it is marked optional. + Paths must be relative and may not contain the + '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within + a volume. + type: object + properties: + mode: + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might be + in conflict with other options that affect + the file mode, like fsGroup, and the result + can be other mode bits set.' + type: number + path: + description: The relative path of the file + to map the key to. May not be an absolute + path. May not contain the path element + '..'. May not start with the string '..'. + type: string + key: + description: The key to project. + type: string + required: + - key + - path + storageos: + description: Represents a StorageOS persistent volume + resource. + type: object + properties: + volumeNamespace: + description: VolumeNamespace specifies the scope + of the volume within StorageOS. If no namespace + is specified then the Pod's namespace will be + used. This allows the Kubernetes name scoping + to be mirrored within StorageOS for tighter + integration. Set VolumeName to any name to override + the default behaviour. Set to "default" if you + are not using namespaces within StorageOS. Namespaces + that do not pre-exist within StorageOS will + be created. + type: string + volumeName: + description: VolumeName is the human-readable + name of the StorageOS volume. Volume names + are only unique within a namespace. + type: string + secretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + csi: + description: Represents a source location of a volume + to mount, managed by an external CSI driver + type: object + properties: + driver: + description: Driver is the name of the CSI driver + that handles this volume. Consult with your + admin for the correct name as registered in + the cluster. + type: string + nodePublishSecretRef: + description: LocalObjectReference contains enough + information to let you locate the referenced + object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + readOnly: + description: Specifies a read-only configuration + for the volume. Defaults to false (read/write). + type: boolean + fsType: + description: Filesystem type to mount. Ex. "ext4", + "xfs", "ntfs". If not provided, the empty value + is passed to the associated CSI driver which + will determine the default filesystem to apply. + type: string + volumeAttributes: + description: VolumeAttributes stores driver-specific + properties that are passed to the CSI driver. + Consult your driver's documentation for supported + values. + additionalProperties: + type: string + type: object + required: + - driver + name: + description: 'Volume''s name. Must be a DNS_LABEL + and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: Represents an NFS mount that lasts the + lifetime of a pod. NFS volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + path: + description: 'Path that is exported by the NFS + server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + server: + description: 'Server is the hostname or IP address + of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS + export to be mounted with read-only permissions. + Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + required: + - path + - server + persistentVolumeClaim: + description: PersistentVolumeClaimVolumeSource references + the user's PVC in the same namespace. This volume + finds the bound PV and mounts that volume for the + pod. A PersistentVolumeClaimVolumeSource is, essentially, + a wrapper around another type of volume that is + owned by someone else (the system). + type: object + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim + in the same namespace as the pod using this + volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in + VolumeMounts. Default false. + type: boolean + required: + - claimName + gitRepo: + description: 'Represents a volume that is populated + with the contents of a git repository. Git repo + volumes do not support ownership management. Git + repo volumes support SELinux relabeling. DEPRECATED: + GitRepo is deprecated. To provision a container + with a git repo, mount an EmptyDir into an InitContainer + that clones the repo using git, then mount the EmptyDir + into the Pod''s container.' + type: object + properties: + repository: + description: Repository URL + type: string + directory: + description: Target directory name. Must not contain + or start with '..'. If '.' is supplied, the + volume directory will be the git repository. Otherwise, + if specified, the volume will contain the git + repository in the subdirectory with the given + name. + type: string + revision: + description: Commit hash for the specified revision. + type: string + required: + - repository + portworxVolume: + description: PortworxVolumeSource represents a Portworx + volume resource. + type: object + properties: + volumeID: + description: VolumeID uniquely identifies a Portworx + volume + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + fsType: + description: FSType represents the filesystem + type to mount Must be a filesystem type supported + by the host operating system. Ex. "ext4", "xfs". + Implicitly inferred to be "ext4" if unspecified. + type: string + required: + - volumeID + vsphereVolume: + description: Represents a vSphere volume resource. + type: object + properties: + storagePolicyName: + description: Storage Policy Based Management (SPBM) + profile name. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) + profile ID associated with the StoragePolicyName. + type: string + volumePath: + description: Path that identifies vSphere volume + vmdk + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + required: + - volumePath + fc: + description: Represents a Fibre Channel volume. Fibre + Channel volumes can only be mounted as read/write + once. Fibre Channel volumes support ownership management + and SELinux relabeling. + type: object + properties: + lun: + description: 'Optional: FC target lun number' + type: number + targetWWNs: + description: 'Optional: FC target worldwide names + (WWNs)' + type: array + items: + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' + type: boolean + wwids: + description: 'Optional: FC volume world wide identifiers + (wwids) Either wwids or combination of targetWWNs + and lun must be set, but not both simultaneously.' + type: array + items: + type: string + fsType: + description: Filesystem type to mount. Must be + a filesystem type supported by the host operating + system. Ex. "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. + type: string + hostPath: + description: Represents a host path mapped into a + pod. Host path volumes do not support ownership + management or SELinux relabeling. + type: object + properties: + path: + description: 'Path of the directory on the host. + If the path is a symlink, it will follow the + link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults + to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + required: + - path + required: + - name + resources: + description: Memory and CPU minimum requirements and limits + for the server. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is omitted + for a container, it defaults to Limits if that is + explicitly specified, otherwise to an implementation-defined + value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount of + compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + annotations: + description: The annotations to be attached to generated + resources. + additionalProperties: + type: string + type: object + env: + description: A list of environment variables to add to a + server. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. Must + be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are + expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source for + the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a key of + a Secret. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and their + output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point representation + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" | + "-" ::= | + ::= | + | ::= Ki | + Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G + | T | P | E (Note that 1024 = 1Ki but + 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No matter which of + the three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be + extended in the future if we require larger + or smaller quantities. When a Quantity + is parsed from a string, it will remember + the type of suffix it had, and will use + the same type again when it is serialized. Before + serializing, Quantity will be put in "canonical + form". This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. The + sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as + "1536Mi" Note that the quantity will NEVER + be internally represented by a floating + point number. That is the whole point of + this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or + don''t diff.) This format is intended to + make it difficult to use these numbers without + writing some sort of special handling code + in the hopes that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to select' + type: string + containerName: + description: 'Container name: required for + volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects an APIVersioned + field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in + the specified API version. + type: string + required: + - fieldPath + required: + - name + restartPolicy: + description: 'Restart policy for all containers within the + pod. One of Always, OnFailure, Never. Default to Always. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + type: string + nodeSelector: + description: Selector which must match a node's labels for + the pod to be scheduled on that node. + additionalProperties: + type: string + type: object + volumeMounts: + description: Additional volume mounts for the server pod. + type: array + items: + description: VolumeMount describes a mounting of a Volume + within a container. + type: object + properties: + mountPath: + description: Path within the container at which the + volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and the + other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the + container's volume should be mounted. Defaults to + "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment variable + references $(VAR_NAME) are expanded using the container's + environment. Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field is + beta in 1.15. + type: string + required: + - mountPath + - name + labels: + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + additionalProperties: + type: string + type: object + runtimeClassName: + description: 'RuntimeClassName refers to a RuntimeClass + object in the node.k8s.io group, which should be used + to run this pod. If no RuntimeClass resource matches + the named class, the pod will not be run. If unset or + empty, the "legacy" RuntimeClass will be used, which is + an implicit class with an empty definition that uses the + default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future.' + type: string + tolerations: + description: If specified, the pod's tolerations. + type: array + items: + description: The pod this Toleration is attached to tolerates + any taint that matches the triple + using the matching operator . + type: object + properties: + effect: + description: Effect indicates the taint effect to + match. Empty means match all taint effects. When + specified, allowed values are NoSchedule, PreferNoSchedule + and NoExecute. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period + of time the toleration (which must be of effect + NoExecute, otherwise this field is ignored) tolerates + the taint. By default, it is not set, which means + tolerate the taint forever (do not evict). Zero + and negative values will be treated as 0 (evict + immediately) by the system. + type: number + value: + description: Value is the taint value the toleration + matches to. If the operator is Exists, the value + should be empty, otherwise just a regular string. + type: string + key: + description: Key is the taint key that the toleration + applies to. Empty means match all taint keys. If + the key is empty, operator must be Exists; this + combination means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship + to the value. Valid operators are Exists and Equal. + Defaults to Equal. Exists is equivalent to wildcard + for value, so that a pod can tolerate all taints + of a particular category. + type: string + readinessProbe: + description: Settings for the readiness probe associated + with a server. + type: object + properties: + periodSeconds: + description: The number of seconds between checks. + type: number + timeoutSeconds: + description: The number of seconds with no response + that indicates a failure. + type: number + initialDelaySeconds: + description: The number of seconds before the first + check is performed. + type: number + containers: + description: Additional containers to be included in the + server pod. + type: array + items: + description: A single application container that you want + to run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of + a raw block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of + the container that the device will be mapped + to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, + IfNotPresent. Defaults to Always if :latest tag + is specified, or IfNotPresent otherwise. Cannot + be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate + a buffer for stdin in the container runtime. If + this is not set, reads from stdin in the container + will always result in EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message + should be populated. File will use the contents + of terminationMessagePath to populate the container + status message on both success and failure. FallbackToLogsOnError + will use the last chunk of container log output + if the termination message file is empty and the + container exited with an error. The log output is + limited to 2048 bytes or 80 lines, whichever is + smaller. Defaults to File. Cannot be updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to + which the container''s termination message will + be written is mounted into the container''s filesystem. + Message written is intended to be brief final status, + such as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' + type: string + workingDir: + description: Container's working directory. If not + specified, the container runtime's default will + be used, which might be configured in the container + image. Cannot be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: + https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields + are present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take + precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. + Processes in privileged containers are essentially + equivalent to root on the host. Defaults to + false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of + the container process. Defaults to user specified + in image metadata if unspecified. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities + from running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to + be applied to the container + type: object + properties: + role: + description: Role is a SELinux role label + that applies to the container. + type: string + level: + description: Level is SELinux level label + that applies to the container. + type: string + type: + description: Type is a SELinux type label + that applies to the container. + type: string + user: + description: User is a SELinux user label + that applies to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain + Windows-specific options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the + GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential + spec named by the GMSACredentialSpecName + field. This field is alpha-level and is + only honored by servers that enable the + WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run + the entrypoint of the container process. + Defaults to the user specified in image + metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. This + field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the + name of the GMSA credential spec to use. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. + type: string + procMount: + description: procMount denotes the type of proc + mount to use for the containers. The default + is DefaultProcMount which uses the container + runtime defaults for readonly paths and masked + paths. This requires the ProcMountType feature + flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the + container process. AllowPrivilegeEscalation + is true always when the container is: 1) run + as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of + the container process. Uses runtime default + if unset. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: number + runAsNonRoot: + description: Indicates that the container must + run as a non-root user. If true, the Kubelet + will validate the image at runtime to ensure + that it does not run as UID 0 (root) and fail + to start the container if it does. If unset + or false, no such validation will be performed. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set + in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. + Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) + are expanded using the previous defined environment + variables in the container and any service + environment variables. If a variable cannot + be resolved, the reference in the input string + will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, + regardless of whether the variable exists + or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source + for the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a + key of a Secret. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and + their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= + (Note that + may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= + "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi + | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | + M | G | T | P | E (Note that 1024 + = 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent + forms is used, no quantity may represent + a number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This + may be extended in the future if we + require larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type + again when it is serialized. Before + serializing, Quantity will be put + in "canonical form". This means that + Exponent/suffix will be adjusted up + or down (with a corresponding increase + or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. + The sign will be omitted unless the + number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as + they are well formed, but will be + re-emitted in their canonical form. + (So always use canonical form, or + don''t diff.) This format is intended + to make it difficult to use these + numbers without writing some sort + of special handling code in the hopes + that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to + select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects + an APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional + information about the network connections a container + uses, but is primarily informational. Not specifying + a port here DOES NOT prevent that port from being + exposed. Any port which is listening on the default + "0.0.0.0" address inside a container will be accessible + from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network + port in a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, + TCP, or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external + port to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port + in a pod must have a unique name. Name for + the port that can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the + pod's IP address. This must be a valid port + number, 0 < x < 65536. + type: number + hostPort: + description: Number of port to expose on the + host. If specified, this must be a valid port + number, 0 < x < 65536. If HostNetwork is specified, + this must match ContainerPort. Most containers + do not need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within + a shell. The docker image''s ENTRYPOINT is used + if this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. + If a variable cannot be resolved, the reference + in the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be + updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's + filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of + a Volume within a container. + type: object + properties: + mountPath: + description: Path within the container at which + the volume should be mounted. Must not contain + ':'. + type: string + mountPropagation: + description: mountPropagation determines how + mounts are propagated from the host to container + and the other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults + to false. + type: boolean + subPath: + description: Path within the volume from which + the container's volume should be mounted. + Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume + from which the container's volume should be + mounted. Behaves similarly to SubPath but + environment variable references $(VAR_NAME) + are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field + is beta in 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the + management system should take in response to container + lifecycle events. For the PostStart and PreStop + lifecycle handlers, management of the container + blocks until the action is complete, unless the + container process fails, in which case the handler + is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a + DNS_LABEL. Each container in a pod must have a unique + name (DNS_LABEL). Cannot be updated. + type: string + tty: + description: Whether this container should allocate + a TTY for itself, also requires 'stdin' to be true. + Default is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should + close the stdin channel after it has been opened + by a single attach. When stdin is true the stdin + stream will remain open across multiple attach sessions. + If stdinOnce is set to true, stdin is opened on + container start, is empty until the first client + attaches to stdin, and then remains open and accepts + data until the client disconnects, at which time + stdin is closed and remains closed until the container + is restarted. If this flag is false, a container + processes that reads from stdin will never receive + an EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment + variables in the container. The keys defined within + a source must be a C_IDENTIFIER. All invalid keys + will be reported as an event when the container + is starting. When a key exists in multiple sources, + the value associated with the last source will take + precedence. Values defined by an Env with a duplicate + key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source + of a set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + must be defined + type: boolean + prefix: + description: An optional identifier to prepend + to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret + to populate the environment variables with. The + contents of the target Secret's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + must be defined + type: boolean + required: + - name + containerSecurityContext: + description: Container-level security attributes. Will override + any matching pod-level attributes. + type: object + properties: + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities from + running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to be applied + to the container + type: object + properties: + role: + description: Role is a SELinux role label that applies + to the container. + type: string + level: + description: Level is SELinux level label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain Windows-specific + options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec + named by the GMSACredentialSpecName field. This + field is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + This field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + procMount: + description: procMount denotes the type of proc mount + to use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. This requires the ProcMountType + feature flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether + a process can gain more privileges than its parent + process. This bool directly controls if the no_new_privs + flag will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run as + a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not run + as UID 0 (root) and fail to start the container if + it does. If unset or false, no such validation will + be performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + schedulerName: + description: If specified, the pod will be dispatched by + specified scheduler. If not specified, the pod will be + dispatched by default scheduler. + type: string + initContainers: + description: Initialization containers to be included in + the server pod. + type: array + items: + description: A single application container that you want + to run within a pod. + type: object + properties: + volumeDevices: + description: volumeDevices is the list of block devices + to be used by the container. This is a beta feature. + type: array + items: + description: volumeDevice describes a mapping of + a raw block device within a container. + type: object + properties: + devicePath: + description: devicePath is the path inside of + the container that the device will be mapped + to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, + IfNotPresent. Defaults to Always if :latest tag + is specified, or IfNotPresent otherwise. Cannot + be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + livenessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdin: + description: Whether this container should allocate + a buffer for stdin in the container runtime. If + this is not set, reads from stdin in the container + will always result in EOF. Default is false. + type: boolean + terminationMessagePolicy: + description: Indicate how the termination message + should be populated. File will use the contents + of terminationMessagePath to populate the container + status message on both success and failure. FallbackToLogsOnError + will use the last chunk of container log output + if the termination message file is empty and the + container exited with an error. The log output is + limited to 2048 bytes or 80 lines, whichever is + smaller. Defaults to File. Cannot be updated. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to + which the container''s termination message will + be written is mounted into the container''s filesystem. + Message written is intended to be brief final status, + such as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' + type: string + workingDir: + description: Container's working directory. If not + specified, the container runtime's default will + be used, which might be configured in the container + image. Cannot be updated. + type: string + resources: + description: ResourceRequirements describes the compute + resource requirements. + type: object + properties: + requests: + description: 'Requests describes the minimum amount + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: + https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + limits: + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + additionalProperties: + type: string + type: object + securityContext: + description: SecurityContext holds security configuration + that will be applied to a container. Some fields + are present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take + precedence. + type: object + properties: + privileged: + description: Run container in privileged mode. + Processes in privileged containers are essentially + equivalent to root on the host. Defaults to + false. + type: boolean + runAsUser: + description: The UID to run the entrypoint of + the container process. Defaults to user specified + in image metadata if unspecified. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. + type: number + capabilities: + description: Adds and removes POSIX capabilities + from running containers. + type: object + properties: + add: + description: Added capabilities + type: array + items: + type: string + drop: + description: Removed capabilities + type: array + items: + type: string + seLinuxOptions: + description: SELinuxOptions are the labels to + be applied to the container + type: object + properties: + role: + description: Role is a SELinux role label + that applies to the container. + type: string + level: + description: Level is SELinux level label + that applies to the container. + type: string + type: + description: Type is a SELinux type label + that applies to the container. + type: string + user: + description: User is a SELinux user label + that applies to the container. + type: string + windowsOptions: + description: WindowsSecurityContextOptions contain + Windows-specific options and credentials. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the + GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential + spec named by the GMSACredentialSpecName + field. This field is alpha-level and is + only honored by servers that enable the + WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run + the entrypoint of the container process. + Defaults to the user specified in image + metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified + in SecurityContext takes precedence. This + field is alpha-level and it is only honored + by servers that enable the WindowsRunAsUserName + feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the + name of the GMSA credential spec to use. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. + type: string + procMount: + description: procMount denotes the type of proc + mount to use for the containers. The default + is DefaultProcMount which uses the container + runtime defaults for readonly paths and masked + paths. This requires the ProcMountType feature + flag to be enabled. + type: string + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the + container process. AllowPrivilegeEscalation + is true always when the container is: 1) run + as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + runAsGroup: + description: The GID to run the entrypoint of + the container process. Uses runtime default + if unset. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: number + runAsNonRoot: + description: Indicates that the container must + run as a non-root user. If true, the Kubelet + will validate the image at runtime to ensure + that it does not run as UID 0 (root) and fail + to start the container if it does. If unset + or false, no such validation will be performed. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. + type: boolean + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + startupProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + env: + description: List of environment variables to set + in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable + present in a Container. + type: object + properties: + name: + description: Name of the environment variable. + Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) + are expanded using the previous defined environment + variables in the container and any service + environment variables. If a variable cannot + be resolved, the reference in the input string + will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, + regardless of whether the variable exists + or not. Defaults to "".' + type: string + valueFrom: + description: EnvVarSource represents a source + for the value of an EnvVar. + type: object + properties: + secretKeyRef: + description: SecretKeySelector selects a + key of a Secret. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + required: + - key + resourceFieldRef: + description: ResourceFieldSelector represents + container resources (cpu, memory) and + their output format + type: object + properties: + divisor: + description: 'Quantity is a fixed-point + representation of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= + (Note that + may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= + "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi + | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | + M | G | T | P | E (Note that 1024 + = 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent + forms is used, no quantity may represent + a number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This + may be extended in the future if we + require larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type + again when it is serialized. Before + serializing, Quantity will be put + in "canonical form". This means that + Exponent/suffix will be adjusted up + or down (with a corresponding increase + or decrease in Mantissa) such that: a. + No precision is lost b. No fractional + digits will be emitted c. The exponent + (or suffix) is as large as possible. + The sign will be omitted unless the + number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as + they are well formed, but will be + re-emitted in their canonical form. + (So always use canonical form, or + don''t diff.) This format is intended + to make it difficult to use these + numbers without writing some sort + of special handling code in the hopes + that that will cause implementors + to also use a fixed point implementation.' + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + description: 'Required: resource to + select' + type: string + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + required: + - resource + configMapKeyRef: + description: Selects a key from a ConfigMap. + type: object + properties: + name: + description: 'Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + key: + description: The key to select. + type: string + required: + - key + fieldRef: + description: ObjectFieldSelector selects + an APIVersioned field of an object. + type: object + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + required: + - name + ports: + description: List of ports to expose from the container. + Exposing a port here gives the system additional + information about the network connections a container + uses, but is primarily informational. Not specifying + a port here DOES NOT prevent that port from being + exposed. Any port which is listening on the default + "0.0.0.0" address inside a container will be accessible + from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network + port in a single container. + type: object + properties: + protocol: + description: Protocol for port. Must be UDP, + TCP, or SCTP. Defaults to "TCP". + type: string + hostIP: + description: What host IP to bind the external + port to. + type: string + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port + in a pod must have a unique name. Name for + the port that can be referred to by services. + type: string + containerPort: + description: Number of port to expose on the + pod's IP address. This must be a valid port + number, 0 < x < 65536. + type: number + hostPort: + description: Number of port to expose on the + host. If specified, this must be a valid port + number, 0 < x < 65536. If HostNetwork is specified, + this must match ContainerPort. Most containers + do not need this. + type: number + required: + - containerPort + command: + description: 'Entrypoint array. Not executed within + a shell. The docker image''s ENTRYPOINT is used + if this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. + If a variable cannot be resolved, the reference + in the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be + updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + volumeMounts: + description: Pod volumes to mount into the container's + filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of + a Volume within a container. + type: object + properties: + mountPath: + description: Path within the container at which + the volume should be mounted. Must not contain + ':'. + type: string + mountPropagation: + description: mountPropagation determines how + mounts are propagated from the host to container + and the other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write + otherwise (false or unspecified). Defaults + to false. + type: boolean + subPath: + description: Path within the volume from which + the container's volume should be mounted. + Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume + from which the container's volume should be + mounted. Behaves similarly to SubPath but + environment variable references $(VAR_NAME) + are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr + and SubPath are mutually exclusive. This field + is beta in 1.15. + type: string + required: + - mountPath + - name + args: + description: 'Arguments to the entrypoint. The docker + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + lifecycle: + description: Lifecycle describes actions that the + management system should take in response to container + lifecycle events. For the PostStart and PreStop + lifecycle handlers, management of the container + blocks until the action is complete, unless the + container process fails, in which case the handler + is aborted. + type: object + properties: + postStart: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + preStop: + description: Handler defines a specific action + that should be taken + type: object + properties: + tcpSocket: + description: TCPSocketAction describes an + action based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + exec: + description: ExecAction describes a "run in + container" action. + type: object + properties: + command: + description: Command is the command line + to execute inside the container, the + working directory for the command is + root ('/') in the container's filesystem. + The command is simply exec'd, it is + not run inside a shell, so traditional + shell instructions ('|', etc) won't + work. To use a shell, you need to explicitly + call out to that shell. Exit status + of 0 is treated as live/healthy and + non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP + server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that + can hold an int32 or a string. When + used in JSON or YAML marshalling and + unmarshalling, it produces or consumes + the inner type. This allows you to + have, for example, a JSON field that + can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, + defaults to the pod IP. You probably + want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in + the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a + custom header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + name: + description: Name of the container specified as a + DNS_LABEL. Each container in a pod must have a unique + name (DNS_LABEL). Cannot be updated. + type: string + tty: + description: Whether this container should allocate + a TTY for itself, also requires 'stdin' to be true. + Default is false. + type: boolean + readinessProbe: + description: Probe describes a health check to be + performed against a container to determine whether + it is alive or ready to receive traffic. + type: object + properties: + failureThreshold: + description: Minimum consecutive failures for + the probe to be considered failed after having + succeeded. Defaults to 3. Minimum value is 1. + type: number + periodSeconds: + description: How often (in seconds) to perform + the probe. Default to 10 seconds. Minimum value + is 1. + type: number + tcpSocket: + description: TCPSocketAction describes an action + based on opening a socket + type: object + properties: + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: 'Optional: Host name to connect + to, defaults to the pod IP.' + type: string + required: + - port + timeoutSeconds: + description: 'Number of seconds after which the + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + successThreshold: + description: Minimum consecutive successes for + the probe to be considered successful after + having failed. Defaults to 1. Must be 1 for + liveness and startup. Minimum value is 1. + type: number + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: number + exec: + description: ExecAction describes a "run in container" + action. + type: object + properties: + command: + description: Command is the command line to + execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGetAction describes an action + based on HTTP Get requests. + type: object + properties: + path: + description: Path to access on the HTTP server. + type: string + scheme: + description: Scheme to use for connecting + to the host. Defaults to HTTP. + type: string + port: + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the + request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom + header to be used in HTTP probes + type: object + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + required: + - port + stdinOnce: + description: Whether the container runtime should + close the stdin channel after it has been opened + by a single attach. When stdin is true the stdin + stream will remain open across multiple attach sessions. + If stdinOnce is set to true, stdin is opened on + container start, is empty until the first client + attaches to stdin, and then remains open and accepts + data until the client disconnects, at which time + stdin is closed and remains closed until the container + is restarted. If this flag is false, a container + processes that reads from stdin will never receive + an EOF. Default is false + type: boolean + envFrom: + description: List of sources to populate environment + variables in the container. The keys defined within + a source must be a C_IDENTIFIER. All invalid keys + will be reported as an event when the container + is starting. When a key exists in multiple sources, + the value associated with the last source will take + precedence. Values defined by an Env with a duplicate + key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source + of a set of ConfigMaps + type: object + properties: + configMapRef: + description: ConfigMapEnvSource selects a ConfigMap + to populate the environment variables with. The + contents of the target ConfigMap's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the ConfigMap + must be defined + type: boolean + prefix: + description: An optional identifier to prepend + to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: SecretEnvSource selects a Secret + to populate the environment variables with. The + contents of the target Secret's Data field + will represent the key-value pairs as environment + variables. + type: object + properties: + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + optional: + description: Specify whether the Secret + must be defined + type: boolean + required: + - name + shutdown: + description: Configures how the operator should shutdown + the server instance. + type: object + properties: + ignoreSessions: + description: For graceful shutdown only, indicates to + ignore pending HTTP sessions during in-flight work + handling. Not required. Defaults to false. + type: boolean + shutdownType: + description: Tells the operator how to shutdown server + instances. Not required. Defaults to graceful shutdown. + type: string + enum: + - Graceful + - Forced + timeoutSeconds: + description: For graceful shutdown only, number of seconds + to wait before aborting in-flight work and shutting + down the server. Not required. Defaults to 30 seconds. + type: number + affinity: + description: If specified, the pod's scheduling constraints + type: object + properties: + nodeAffinity: + description: Node affinity is a group of node affinity + scheduling rules. + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + description: A node selector represents the union + of the results of one or more label queries over + a set of nodes; that is, it represents the OR + of the selectors represented by the node selector + terms. + type: object + properties: + nodeSelectorTerms: + description: Required. A list of node selector + terms. The terms are ORed. + type: array + items: + description: A null or empty node selector + term matches no objects. The requirements + of them are ANDed. The TopologySelectorTerm + type implements a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + required: + - nodeSelectorTerms + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. + The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node + that meets all of the scheduling requirements + (resource request, requiredDuringScheduling affinity + expressions, etc.), compute a sum by iterating + through the elements of this field and adding + "weight" to the sum if the node matches the corresponding + matchExpressions; the node(s) with the highest + sum are the most preferred. + type: array + items: + description: An empty preferred scheduling term + matches all objects with implicit weight 0 (i.e. + it's a no-op). A null preferred scheduling term + matches no objects (i.e. is also a no-op). + type: object + properties: + preference: + description: A null or empty node selector + term matches no objects. The requirements + of them are ANDed. The TopologySelectorTerm + type implements a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + matchFields: + description: A list of node selector requirements + by node's fields. + type: array + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. If + the operator is Gt or Lt, the + values array must have a single + element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. + type: array + items: + type: string + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + required: + - key + - operator + weight: + description: Weight associated with matching + the corresponding nodeSelectorTerm, in the + range 1-100. + type: number + required: + - preference + - weight + podAffinity: + description: Pod affinity is a group of inter pod affinity + scheduling rules. + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified + by this field are not met at scheduling time, + the pod will not be scheduled onto the node. If + the affinity requirements specified by this field + cease to be met at some point during pod execution + (e.g. due to a pod label update), the system may + or may not try to eventually evict the pod from + its node. When there are multiple elements, the + lists of nodes corresponding to each podAffinityTerm + are intersected, i.e. all terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on which + a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty + label selector matches all objects. A null + label selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. + The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node + that meets all of the scheduling requirements + (resource request, requiredDuringScheduling affinity + expressions, etc.), compute a sum by iterating + through the elements of this field and adding + "weight" to the sum if the node has pods which + matches the corresponding podAffinityTerm; the + node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched + WeightedPodAffinityTerm fields are added per-node + to find the most preferred node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely + those matching the labelSelector relative + to the given namespace(s)) that this pod + should be co-located (affinity) or not co-located + (anti-affinity) with, where co-located is + defined as running on a node whose value + of the label with key matches + that of any node on which a pod of the set + of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label + query over a set of resources. The result + of matchLabels and matchExpressions + are ANDed. An empty label selector matches + all objects. A null label selector matches + no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a + list of label selector requirements. + The requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values + array must be non-empty. If + the operator is Exists or + DoesNotExist, the values array + must be empty. This array + is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a + set of values. Valid operators + are In, NotIn, Exists and + DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map + of {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose + value of the label with key topologyKey + matches that of any node on which any + of the selected pods is running. Empty + topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which + namespaces the labelSelector applies + to (matches against); null or empty + list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching + the corresponding podAffinityTerm, in the + range 1-100. + type: number + required: + - podAffinityTerm + - weight + podAntiAffinity: + description: Pod anti affinity is a group of inter pod + anti affinity scheduling rules. + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified + by this field are not met at scheduling time, + the pod will not be scheduled onto the node. If + the anti-affinity requirements specified by this + field cease to be met at some point during pod + execution (e.g. due to a pod label update), the + system may or may not try to eventually evict + the pod from its node. When there are multiple + elements, the lists of nodes corresponding to + each podAffinityTerm are intersected, i.e. all + terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on which + a pod of the set of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty + label selector matches all objects. A null + label selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the anti-affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. + The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node + that meets all of the scheduling requirements + (resource request, requiredDuringScheduling anti-affinity + expressions, etc.), compute a sum by iterating + through the elements of this field and adding + "weight" to the sum if the node has pods which + matches the corresponding podAffinityTerm; the + node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched + WeightedPodAffinityTerm fields are added per-node + to find the most preferred node(s) + type: object + properties: + podAffinityTerm: + description: Defines a set of pods (namely + those matching the labelSelector relative + to the given namespace(s)) that this pod + should be co-located (affinity) or not co-located + (anti-affinity) with, where co-located is + defined as running on a node whose value + of the label with key matches + that of any node on which a pod of the set + of pods is running + type: object + properties: + labelSelector: + description: A label selector is a label + query over a set of resources. The result + of matchLabels and matchExpressions + are ANDed. An empty label selector matches + all objects. A null label selector matches + no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a + list of label selector requirements. + The requirements are ANDed. + type: array + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + type: object + properties: + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values + array must be non-empty. If + the operator is Exists or + DoesNotExist, the values array + must be empty. This array + is replaced during a strategic + merge patch. + type: array + items: + type: string + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a + set of values. Valid operators + are In, NotIn, Exists and + DoesNotExist. + type: string + required: + - key + - operator + matchLabels: + description: matchLabels is a map + of {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + additionalProperties: + type: string + type: object + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose + value of the label with key topologyKey + matches that of any node on which any + of the selected pods is running. Empty + topologyKey is not allowed. + type: string + namespaces: + description: namespaces specifies which + namespaces the labelSelector applies + to (matches against); null or empty + list means "this pod's namespace" + type: array + items: + type: string + required: + - topologyKey + weight: + description: weight associated with matching + the corresponding podAffinityTerm, in the + range 1-100. + type: number + required: + - podAffinityTerm + - weight + clusterService: + description: Customization affecting ClusterIP Kubernetes services + for the WebLogic cluster. + type: object + properties: + annotations: + description: The annotations to be attached to generated + resources. + additionalProperties: + type: string + type: object + labels: + description: The labels to be attached to generated resources. + The label names must not start with 'weblogic.'. + additionalProperties: + type: string + type: object + serverStartPolicy: + description: The strategy for deciding whether to start a server. + Legal values are NEVER, or IF_NEEDED. + type: string + enum: + - NEVER + - IF_NEEDED + restartVersion: + description: If present, every time this value is updated the + operator will restart the required servers. + type: string + required: + - clusterName + status: + type: object + description: DomainStatus represents information about the status of a + domain. Status may trail the actual state of a system. + properties: + reason: + type: string + description: A brief CamelCase message indicating details about why + the domain is in this state. + servers: + type: array + description: Status of WebLogic Servers in this domain. + items: + type: object + properties: + nodeName: + description: Name of node that is hosting the Pod containing + this WebLogic Server. + type: string + desiredState: + description: Desired state of this WebLogic Server. Values are + RUNNING, ADMIN, or SHUTDOWN. + type: string + clusterName: + description: WebLogic cluster name, if the server is part of + a cluster. + type: string + serverName: + description: WebLogic Server name. Required. + type: string + health: + description: Current status and health of a specific WebLogic + Server. + type: object + properties: + overallHealth: + description: Server health of this WebLogic Server. If the + value is "Not available", the operator has failed to read + the health. If the value is "Not available (possibly overloaded)", + the operator has failed to read the health of the server + possibly due to the server is in overloaded state. + type: string + activationTime: + format: date-time + description: RFC 3339 date and time at which the server + started. + type: string + subsystems: + description: Status of unhealthy subsystems, if any. + type: array + items: + type: object + properties: + symptoms: + description: Symptoms provided by the reporting subsystem. + type: array + items: + type: string + health: + description: Server health of this WebLogic Server. + Required. + type: string + subsystemName: + description: Name of subsystem providing symptom information. + Required. + type: string + state: + description: Current state of this WebLogic Server. Required. + type: string + replicas: + type: number + description: The number of running Managed Servers in the WebLogic + cluster if there is only one cluster in the domain and where the + cluster does not explicitly configure its replicas in a cluster + specification. + minimum: 0.0 + startTime: + type: string + description: RFC 3339 date and time at which the operator started + the domain. This will be when the operator begins processing and + will precede when the various servers or clusters are available. + format: date-time + conditions: + type: array + description: Current service state of domain. + items: + type: object + properties: + reason: + description: Unique, one-word, CamelCase reason for the condition's + last transition. + type: string + type: + description: The type of the condition. Valid types are Progressing, + Available, and Failed. Required. + type: string + enum: + - Progressing + - Available + - Failed + lastTransitionTime: + format: date-time + description: Last time the condition transitioned from one status + to another. + type: string + message: + description: Human-readable message indicating details about + last transition. + type: string + lastProbeTime: + format: date-time + description: Last time we probed the condition. + type: string + status: + description: Status is the status of the condition. Can be True, + False, Unknown. Required. + type: string + message: + type: string + description: A human readable message indicating details about why + the domain is in this condition. + clusters: + type: array + description: Status of WebLogic clusters in this domain. + items: + type: object + properties: + minimumReplicas: + description: The minimum number of cluster members. + type: number + minimum: 0.0 + maximumReplicas: + description: The maximum number of cluster members. Required. + type: number + minimum: 0.0 + replicas: + description: The number of intended cluster members. Required. + type: number + minimum: 0.0 + clusterName: + description: WebLogic cluster name. Required. + type: string + readyReplicas: + description: The number of ready cluster members. Required. + type: number + minimum: 0.0 + replicasGoal: + description: The requested number of cluster members from the + domain spec. Cluster members will be started by the operator + if this value is larger than zero. + type: number + minimum: 0.0 + served: true + storage: false + subresources: + scale: + specReplicasPath: .spec.replicas + statusReplicasPath: .status.replicas + status: {} \ No newline at end of file diff --git a/kubernetes/crd/domain-v1beta1-crd.yaml b/kubernetes/crd/domain-v1beta1-crd.yaml index 513120ece32..5da1ecbd83e 100644 --- a/kubernetes/crd/domain-v1beta1-crd.yaml +++ b/kubernetes/crd/domain-v1beta1-crd.yaml @@ -19,195 +19,241 @@ spec: scale: specReplicasPath: .spec.replicas statusReplicasPath: .status.replicas + status: {} validation: openAPIV3Schema: type: object properties: spec: type: object - description: DomainSpec is a description of a domain. + description: The specification of the operation of the WebLogic domain. + Required. properties: - serverStartState: - type: string - description: The state in which the server is to be started. Use ADMIN - if server should start in the admin state. Defaults to RUNNING. - enum: - - RUNNING - - ADMIN - image: - type: string - description: The WebLogic Docker image; required when domainHomeInImage - is true; otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4. - imagePullPolicy: - type: string - description: The image pull policy for the WebLogic Docker image. Legal - values are Always, Never and IfNotPresent. Defaults to Always if image - ends in :latest, IfNotPresent otherwise. - enum: - - Always - - Never - - IfNotPresent configuration: type: object - description: Properties affecting the WebLogic domain configuration. + description: Models and overrides affecting the WebLogic domain configuration. properties: + overrideDistributionStrategy: + type: string + description: Determines how updated configuration overrides are + distributed to already running WebLogic Server instances following + introspection when the `domainHomeSourceType` is PersistentVolume + or Image. Configuration overrides are generated during introspection + from Secrets, the `overrideConfigMap` field, and WebLogic domain + topology. Legal values are DYNAMIC, which means that the operator + will distribute updated configuration overrides dynamically to + running servers, and ON_RESTART, which means that servers will + use updated configuration overrides only after the server's next + restart. The selection of ON_RESTART will not cause servers to + restart when there are updated configuration overrides available. + See also `domains.spec.introspectVersion`. Defaults to DYNAMIC. + enum: + - DYNAMIC + - ON_RESTART + opss: + type: object + description: Settings for OPSS security. + properties: + walletFileSecret: + type: string + description: Name of a Secret containing the OPSS key wallet + file, which must be in a field named `walletFile`. Use this + to allow a JRF domain to reuse its entries in the RCU database. + This allows you to specify a wallet file that was obtained + from the domain home after the domain was booted for the first + time. + walletPasswordSecret: + type: string + description: Name of a Secret containing the OPSS key passphrase, + which must be in a field named `walletPassword`. Used to encrypt + and decrypt the wallet that is used for accessing the domain's + entries in its RCU database. + model: + type: object + description: Model in image model files and properties. + properties: + runtimeEncryptionSecret: + type: string + description: Runtime encryption secret. Required when `domainHomeSourceType` + is set to FromModel. + domainType: + type: string + description: 'WebLogic Deploy Tooling domain type. Legal values: + WLS, RestrictedJRF, JRF. Defaults to WLS.' + enum: + - WLS + - RestrictedJRF + - JRF + configMap: + type: string + description: Name of a ConfigMap containing the WebLogic Deploy + Tooling model. + secrets: + type: array + description: A list of names of the Secrets for WebLogic configuration + overrides or model. If this field is specified, then the value + of `spec.configOverrideSecrets` is ignored. + items: + type: string istio: type: object description: The Istio service mesh integration settings. properties: readinessPort: type: number - description: The WebLogic readiness port for Istio. Defaults - to 8888. Not required. + description: The operator will create a WebLogic network access + point with this port that will then be exposed from the container + running the WebLogic Server instance. The readiness probe + will use this network access point to verify that the server + instance is ready for application traffic. Defaults to 8888. enabled: type: boolean description: True, if this domain is deployed under an Istio - service mesh. Defaults to true when the 'istio' element is - included. Not required. - replicas: - type: number - description: The number of managed servers to run in any cluster that - does not specify a replica count. - minimum: 0.0 + service mesh. Defaults to true when the `istio` field is specified. + overridesConfigMap: + type: string + description: The name of the ConfigMap for WebLogic configuration + overrides. If this field is specified, then the value of `spec.configOverrides` + is ignored. + introspectorJobActiveDeadlineSeconds: + type: number + description: The introspector job timeout value in seconds. If this + field is specified, then the operator's ConfigMap `data.introspectorJobActiveDeadlineSeconds` + value is ignored. Defaults to 120 seconds. configOverrideSecrets: type: array - description: A list of names of the secrets for optional WebLogic configuration - overrides. + description: Deprecated. Use `configuration.secrets` instead. Ignored + if `configuration.secrets` is specified. A list of names of the Secrets + for optional WebLogic configuration overrides. items: type: string imagePullSecrets: type: array - description: A list of image pull secrets for the WebLogic Docker image. + description: A list of image pull Secrets for the WebLogic container + image. items: - description: LocalObjectReference contains enough information to let - you locate the referenced object inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string - domainHomeInImage: - type: boolean - description: True indicates that the domain home file system is contained - in the Docker image specified by the image field. False indicates - that the domain home file system is located on a persistent volume. domainUID: type: string - description: Domain unique identifier. Must be unique across the Kubernetes - cluster. Not required. Defaults to the value of metadata.name. + description: Domain unique identifier. It is recommended that this value + be unique to assist in future work to identify related domains in + active-passive scenarios across data centers; however, it is only + required that this value be unique within the namespace, similarly + to the names of Kubernetes resources. This value is distinct and need + not match the domain name from the WebLogic domain configuration. + Defaults to the value of `metadata.name`. pattern: ^[a-z0-9-.]{1,253}$ - serverStartPolicy: - type: string - description: The strategy for deciding whether to start a server. Legal - values are ADMIN_ONLY, NEVER, or IF_NEEDED. - enum: - - NEVER - - IF_NEEDED - - ADMIN_ONLY - restartVersion: - type: string - description: If present, every time this value is updated the operator - will restart the required servers. - dataHome: - type: string - description: 'An optional, in-pod location for data storage of default - and custom file stores. If dataHome is not specified or its value - is either not set or empty (e.g. dataHome: "") then the data storage - directories are determined from the WebLogic domain home configuration.' - configOverrides: - type: string - description: The name of the config map for optional WebLogic configuration - overrides. serverService: type: object - description: Customization affecting ClusterIP Kubernetes services for - WebLogic Server instances. + description: Customization affecting the generation of Kubernetes Services + for WebLogic Server instances. properties: precreateService: type: boolean - description: If true, operator will create server services even - for server instances without running pods. + description: If true, the operator will create Services even for + Managed Server instances without running Pods. annotations: type: object additionalProperties: type: string - description: The annotations to be attached to generated resources. + description: The annotations to be added to generated resources. labels: type: object additionalProperties: type: string - description: The labels to be attached to generated resources. The - label names must not start with 'weblogic.'. + description: The labels to be added to generated resources. The + label names must not start with "weblogic.". domainHome: type: string - description: The folder for the WebLogic Domain. Not required. Defaults - to /shared/domains/domains/domainUID if domainHomeInImage is false. - Defaults to /u01/oracle/user_projects/domains/ if domainHomeInImage - is true. - logHomeEnabled: + description: The directory containing the WebLogic domain configuration + inside the container. Defaults to /shared/domains/domains/ + if `domainHomeSourceType` is PersistentVolume. Defaults to /u01/oracle/user_projects/domains/ + if `domainHomeSourceType` is Image. Defaults to /u01/domains/ + if `domainHomeSourceType` is FromModel. + domainHomeSourceType: + type: string + description: 'Domain home file system source type: Legal values: Image, + PersistentVolume, FromModel. Image indicates that the domain home + file system is present in the container image specified by the `image` + field. PersistentVolume indicates that the domain home file system + is located on a persistent volume. FromModel indicates that the domain + home file system will be created and managed by the operator based + on a WDT domain model. If this field is specified, it overrides the + value of `domainHomeInImage`. If both fields are unspecified, then + `domainHomeSourceType` defaults to Image.' + enum: + - Image + - PersistentVolume + - FromModel + httpAccessLogInLogHome: type: boolean - description: 'Specified whether the log home folder is enabled. Not - required. Defaults to true if domainHomeInImage is false. Defaults - to false if domainHomeInImage is true. ' + description: Specifies whether the server HTTP access log files will + be written to the same directory specified in `logHome`. Otherwise, + server HTTP access log files will be written to the directory configured + in the WebLogic domain configuration. Defaults to true. webLogicCredentialsSecret: type: object - description: The name of a pre-created Kubernetes secret, in the domain's - namespace, that holds the username and password needed to boot WebLogic - Server under the 'username' and 'password' fields. + description: Reference to a Kubernetes Secret that contains the user + name and password needed to boot a WebLogic Server under the `username` + and `password` fields. properties: name: type: string - description: Name is unique within a namespace to reference a secret - resource. namespace: type: string - description: Namespace defines the space within which the secret - name must be unique. adminServer: type: object - description: Configuration for the Administration Server. + description: Lifecycle options for the Administration Server, including + Java options, environment variables, additional Pod content, and which + channels or network access points should be exposed using a NodePort + Service. properties: serverStartState: type: string - description: The state in which the server is to be started. Use - ADMIN if server should start in the admin state. Defaults to RUNNING. + description: The WebLogic runtime state in which the server is to + be started. Use ADMIN if the server should start in the admin + state. Defaults to RUNNING. enum: - RUNNING - ADMIN serverService: type: object - description: Customization affecting ClusterIP Kubernetes services - for WebLogic Server instances. + description: Customization affecting the generation of Kubernetes + Services for WebLogic Server instances. properties: precreateService: type: boolean - description: If true, operator will create server services even - for server instances without running pods. + description: If true, the operator will create Services even + for Managed Server instances without running Pods. annotations: type: object additionalProperties: type: string - description: The annotations to be attached to generated resources. + description: The annotations to be added to generated resources. labels: type: object additionalProperties: type: string - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. + description: The labels to be added to generated resources. + The label names must not start with "weblogic.". serverPod: type: object - description: Configuration affecting server pods. + description: Customization affecting the generation of Pods for + WebLogic Server instances. properties: nodeName: type: string - description: NodeName is a request to schedule this pod onto - a specific node. If it is non-empty, the scheduler simply - schedules this pod onto that node, assuming that it fits resource - requirements. + description: NodeName is a request to schedule this Pod onto + a specific Node. If it is non-empty, the scheduler simply + schedules this pod onto that node, assuming that it fits the + resource requirements. See `kubectl explain pods.spec.nodeName`. livenessProbe: type: object description: Settings for the liveness probe associated with - a server. + a WebLogic Server instance. properties: periodSeconds: type: number @@ -223,438 +269,184 @@ spec: readinessGates: type: array description: 'If specified, all readiness gates will be evaluated - for pod readiness. A pod is ready when all its containers + for Pod readiness. A Pod is ready when all its containers are ready AND all conditions specified in the readiness gates - have status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + have a status equal to "True". More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md.' items: - description: PodReadinessGate contains the reference to a - pod condition type: object properties: conditionType: - description: ConditionType refers to a condition in the - pod's condition list with matching type. type: string required: - conditionType serviceAccountName: type: string description: Name of the ServiceAccount to be used to run this - pod. If it is not set, default ServiceAccount will be used. - The ServiceAccount has to exist at the time the pod is created. + Pod. If it is not set, default ServiceAccount will be used. + The ServiceAccount has to exist at the time the Pod is created. + See `kubectl explain pods.spec.serviceAccountName`. podSecurityContext: type: object - description: Pod-level security attributes. + description: Pod-level security attributes. See `kubectl explain + pods.spec.securityContext`. properties: runAsUser: type: number - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence for - that container. seLinuxOptions: type: object - description: SELinuxOptions are the labels to be applied - to the container properties: role: type: string - description: Role is a SELinux role label that applies - to the container. level: type: string - description: Level is SELinux level label that applies - to the container. type: type: string - description: Type is a SELinux type label that applies - to the container. user: type: string - description: User is a SELinux user label that applies - to the container. fsGroup: type: number - description: 'A special supplemental group that applies - to all containers in a pod. Some volume types allow the - Kubelet to change the ownership of that volume to be owned - by the pod: 1. The owning GID will be the FSGroup 2. - The setgid bit is set (new files created in the volume - will be owned by FSGroup) 3. The permission bits are OR''d - with rw-rw---- If unset, the Kubelet will not modify - the ownership and permissions of any volume.' windowsOptions: type: object - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. properties: gmsaCredentialSpec: type: string - description: GMSACredentialSpec is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec named - by the GMSACredentialSpecName field. This field is - alpha-level and is only honored by servers that enable - the WindowsGMSA feature flag. runAsUserName: type: string - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and it - is only honored by servers that enable the WindowsRunAsUserName - feature flag. gmsaCredentialSpecName: type: string - description: GMSACredentialSpecName is the name of the - GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. supplementalGroups: type: array - description: A list of groups applied to the first process - run in each container, in addition to the container's - primary GID. If unspecified, no groups will be added - to any container. items: type: number runAsGroup: type: number - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be set - in SecurityContext. If set in both SecurityContext and - PodSecurityContext, the value specified in SecurityContext - takes precedence for that container. runAsNonRoot: type: boolean - description: Indicates that the container must run as a - non-root user. If true, the Kubelet will validate the - image at runtime to ensure that it does not run as UID - 0 (root) and fail to start the container if it does. If - unset or false, no such validation will be performed. - May also be set in SecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. sysctls: type: array - description: Sysctls hold a list of namespaced sysctls used - for the pod. Pods with unsupported sysctls (by the container - runtime) might fail to launch. items: - description: Sysctl defines a kernel parameter to be set type: object properties: name: - description: Name of a property to set type: string value: - description: Value of a property to set type: string required: - name - value priorityClassName: type: string - description: If specified, indicates the pod's priority. "system-node-critical" + description: If specified, indicates the Pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the - pod priority will be default or zero if there is no default. + pod priority will be the default or zero, if there is no default. + See `kubectl explain pods.spec.priorityClassName`. volumes: type: array description: Additional volumes to be created in the server - pod. + Pod. See `kubectl explain pods.spec.volumes`. items: - description: Volume represents a named volume in a pod that - may be accessed by any container in the pod. type: object properties: quobyte: - description: Represents a Quobyte mount that lasts the - lifetime of a pod. Quobyte volumes do not support ownership - management or SELinux relabeling. type: object properties: volume: - description: Volume is a string that references an - already created Quobyte volume by name. type: string registry: - description: Registry represents a single or multiple - Quobyte Registry services specified as a string - as host:port pair (multiple entries are separated - with commas) which acts as the central registry - for volumes type: string readOnly: - description: ReadOnly here will force the Quobyte - volume to be mounted with read-only permissions. - Defaults to false. type: boolean user: - description: User to map volume access to Defaults - to serivceaccount user type: string tenant: - description: Tenant owning the given Quobyte volume - in the Backend Used with dynamically provisioned - Quobyte volumes, value is set by the plugin type: string group: - description: Group to map volume access to Default - is no group type: string required: - registry - volume azureFile: - description: AzureFile represents an Azure File Service - mount on the host and bind mount to the pod. type: object properties: secretName: - description: the name of secret that contains Azure - Storage Account Name and Key type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean shareName: - description: Share Name type: string required: - secretName - shareName flexVolume: - description: FlexVolume represents a generic volume resource - that is provisioned/attached using an exec based plugin. type: object properties: driver: - description: Driver is the name of the driver to use - for this volume. type: string options: - description: 'Optional: Extra command options if any.' additionalProperties: type: string type: object secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in - VolumeMounts.' type: boolean fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. - "ext4", "xfs", "ntfs". The default filesystem depends - on FlexVolume script. type: string required: - driver secret: - description: Adapts a Secret into a volume. The contents - of the target Secret's Data field will be presented - in a volume as files using the keys in the Data field - as the file names. Secret volumes support ownership - management and SELinux relabeling. type: object properties: secretName: - description: 'Name of the secret in the pod''s namespace - to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' type: string defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the path - are not affected by this setting. This might be - in conflict with other options that affect the file - mode, like fsGroup, and the result can be other - mode bits set.' type: number optional: - description: Specify whether the Secret or its keys - must be defined type: boolean items: - description: If unspecified, each key-value pair in - the Data field of the referenced Secret will be - projected into the volume as a file whose name is - the key and content is the value. If specified, - the listed keys will be projected into the specified - paths, and unlisted keys will not be present. If - a key is specified which is not present in the Secret, - the volume setup will error unless it is marked - optional. Paths must be relative and may not contain - the '..' path or start with '..'. type: array items: - description: Maps a string key to a path within - a volume. type: object properties: mode: - description: 'Optional: mode bits to use on - this file, must be a value between 0 and 0777. - If not specified, the volume defaultMode will - be used. This might be in conflict with other - options that affect the file mode, like fsGroup, - and the result can be other mode bits set.' type: number path: - description: The relative path of the file to - map the key to. May not be an absolute path. - May not contain the path element '..'. May - not start with the string '..'. type: string key: - description: The key to project. type: string required: - key - path projected: - description: Represents a projected volume source type: object properties: sources: - description: list of volume projections type: array items: - description: Projection that may be projected along - with other supported volume types type: object properties: downwardAPI: - description: Represents downward API info for - projecting into a projected volume. Note that - this is identical to a downwardAPI volume - source without the default mode. type: object properties: items: - description: Items is a list of DownwardAPIVolume - file type: array items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field type: object properties: mode: - description: 'Optional: mode bits - to use on this file, must be a value - between 0 and 0777. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can - be other mode bits set.' type: number path: - description: 'Required: Path is the - relative path name of the file to - be created. Must not be absolute - or contain the ''..'' path. Must - be utf-8 encoded. The first item - of the relative path must not start - with ''..''' type: string resourceFieldRef: - description: ResourceFieldSelector - represents container resources (cpu, - memory) and their output format type: object properties: divisor: - description: 'Quantity is a fixed-point - representation of a number. - It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition - to String() and AsInt64() accessors. The - serialization format is: ::= - (Note - that may be empty, - from the "" case in .) - ::= 0 | 1 - | ... | 9 ::= - | ::= - | . - | . | . ::= - "+" | "-" ::= - | ::= - | - | ::= - Ki | Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" - | k | M | G | T | P | E (Note - that 1024 = 1Ki but 1000 = 1k; - I didn''t choose the capitalization.) - ::= "e" - | "E" No matter - which of the three exponent - forms is used, no quantity may - represent a number greater than - 2^63-1 in magnitude, nor may - it have more than 3 decimal - places. Numbers larger or more - precise will be capped or rounded - up. (E.g.: 0.1m will rounded - up to 1m.) This may be extended - in the future if we require - larger or smaller quantities. When - a Quantity is parsed from a - string, it will remember the - type of suffix it had, and will - use the same type again when - it is serialized. Before serializing, - Quantity will be put in "canonical - form". This means that Exponent/suffix - will be adjusted up or down - (with a corresponding increase - or decrease in Mantissa) such - that: a. No precision is lost b. - No fractional digits will be - emitted c. The exponent (or - suffix) is as large as possible. - The sign will be omitted unless - the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER - be internally represented by - a floating point number. That - is the whole point of this exercise. Non-canonical - values will still parse as long - as they are well formed, but - will be re-emitted in their - canonical form. (So always use - canonical form, or don''t diff.) This - format is intended to make it - difficult to use these numbers - without writing some sort of - special handling code in the - hopes that that will cause implementors - to also use a fixed point implementation.' type: object properties: number: @@ -666,355 +458,135 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource - to select' type: string containerName: - description: 'Container name: - required for volumes, optional - for env vars' type: string required: - resource fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema - the FieldPath is written in - terms of, defaults to "v1". type: string fieldPath: - description: Path of the field - to select in the specified API - version. type: string required: - fieldPath required: - path configMap: - description: Adapts a ConfigMap into a projected - volume. The contents of the target ConfigMap's - Data field will be presented in a projected - volume as files using the keys in the Data - field as the file names, unless the items - element is populated with specific mappings - of keys to paths. Note that this is identical - to a configmap volume source without the default - mode. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its keys must be defined type: boolean items: - description: If unspecified, each key-value - pair in the Data field of the referenced - ConfigMap will be projected into the volume - as a file whose name is the key and content - is the value. If specified, the listed - keys will be projected into the specified - paths, and unlisted keys will not be present. - If a key is specified which is not present - in the ConfigMap, the volume setup will - error unless it is marked optional. Paths - must be relative and may not contain the - '..' path or start with '..'. type: array items: - description: Maps a string key to a path - within a volume. type: object properties: mode: - description: 'Optional: mode bits - to use on this file, must be a value - between 0 and 0777. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can - be other mode bits set.' type: number path: - description: The relative path of - the file to map the key to. May - not be an absolute path. May not - contain the path element '..'. May - not start with the string '..'. type: string key: - description: The key to project. type: string required: - key - path secret: - description: Adapts a secret into a projected - volume. The contents of the target Secret's - Data field will be presented in a projected - volume as files using the keys in the Data - field as the file names. Note that this is - identical to a secret volume source without - the default mode. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - or its key must be defined type: boolean items: - description: If unspecified, each key-value - pair in the Data field of the referenced - Secret will be projected into the volume - as a file whose name is the key and content - is the value. If specified, the listed - keys will be projected into the specified - paths, and unlisted keys will not be present. - If a key is specified which is not present - in the Secret, the volume setup will error - unless it is marked optional. Paths must - be relative and may not contain the '..' - path or start with '..'. type: array items: - description: Maps a string key to a path - within a volume. type: object properties: mode: - description: 'Optional: mode bits - to use on this file, must be a value - between 0 and 0777. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can - be other mode bits set.' type: number path: - description: The relative path of - the file to map the key to. May - not be an absolute path. May not - contain the path element '..'. May - not start with the string '..'. type: string key: - description: The key to project. type: string required: - key - path serviceAccountToken: - description: ServiceAccountTokenProjection represents - a projected service account token volume. - This projection can be used to insert a service - account token into the pods runtime filesystem - for use against APIs (Kubernetes API Server - or otherwise). type: object properties: path: - description: Path is the path relative to - the mount point of the file to project - the token into. type: string audience: - description: Audience is the intended audience - of the token. A recipient of a token must - identify itself with an identifier specified - in the audience of the token, and otherwise - should reject the token. The audience - defaults to the identifier of the apiserver. type: string expirationSeconds: - description: ExpirationSeconds is the requested - duration of validity of the service account - token. As the token approaches expiration, - the kubelet volume plugin will proactively - rotate the service account token. The - kubelet will start trying to rotate the - token if the token is older than 80 percent - of its time to live or if the token is - older than 24 hours.Defaults to 1 hour - and must be at least 10 minutes. type: number required: - path defaultMode: - description: Mode bits to use on created files by - default. Must be a value between 0 and 0777. Directories - within the path are not affected by this setting. - This might be in conflict with other options that - affect the file mode, like fsGroup, and the result - can be other mode bits set. type: number required: - sources cephfs: - description: Represents a Ceph Filesystem mount that lasts - the lifetime of a pod Cephfs volumes do not support - ownership management or SELinux relabeling. type: object properties: path: - description: 'Optional: Used as the mounted root, - rather than the full Ceph tree, default is /' type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string secretFile: - description: 'Optional: SecretFile is the path to - key ring for User, default is /etc/ceph/user.secret - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in - VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: boolean user: - description: 'Optional: User is the rados user name, - default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string monitors: - description: 'Required: Monitors is a collection of - Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: array items: type: string required: - monitors scaleIO: - description: ScaleIOVolumeSource represents a persistent - ScaleIO volume type: object properties: system: - description: The name of the storage system as configured - in ScaleIO. type: string protectionDomain: - description: The name of the ScaleIO Protection Domain - for the configured storage. type: string sslEnabled: - description: Flag to enable/disable SSL communication - with Gateway, default false type: boolean storageMode: - description: Indicates whether the storage for a volume - should be ThickProvisioned or ThinProvisioned. Default - is ThinProvisioned. type: string volumeName: - description: The name of a volume already created - in the ScaleIO system that is associated with this - volume source. type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. - "ext4", "xfs", "ntfs". Default is "xfs". type: string storagePool: - description: The ScaleIO Storage Pool associated with - the protection domain. type: string gateway: - description: The host address of the ScaleIO API Gateway. type: string required: - gateway - secretRef - system emptyDir: - description: Represents an empty directory for a pod. - Empty directory volumes support ownership management - and SELinux relabeling. type: object properties: sizeLimit: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and AsInt64() - accessors. The serialization format is: ::= - (Note that may - be empty, from the "" case in .) ::= - 0 | 1 | ... | 9 ::= | - ::= | - . | . | . ::= - "+" | "-" ::= | - ::= | - | ::= Ki | Mi | Gi - | Ti | Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T | P - | E (Note that 1024 = 1Ki but 1000 = 1k; I didn''t - choose the capitalization.) ::= - "e" | "E" No matter - which of the three exponent forms is used, no quantity - may represent a number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal places. Numbers - larger or more precise will be capped or rounded - up. (E.g.: 0.1m will rounded up to 1m.) This may - be extended in the future if we require larger or - smaller quantities. When a Quantity is parsed from - a string, it will remember the type of suffix it - had, and will use the same type again when it is - serialized. Before serializing, Quantity will be - put in "canonical form". This means that Exponent/suffix - will be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such that: a. - No precision is lost b. No fractional digits will - be emitted c. The exponent (or suffix) is as large - as possible. The sign will be omitted unless the - number is negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole point - of this exercise. Non-canonical values will still - parse as long as they are well formed, but will - be re-emitted in their canonical form. (So always - use canonical form, or don''t diff.) This format - is intended to make it difficult to use these numbers - without writing some sort of special handling code - in the hopes that that will cause implementors to - also use a fixed point implementation.' type: object properties: number: @@ -1026,260 +598,93 @@ spec: - DECIMAL_SI - BINARY_SI medium: - description: 'What type of storage medium should back - this directory. The default is "" which means to - use the node''s default medium. Must be an empty - string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' type: string glusterfs: - description: Represents a Glusterfs mount that lasts the - lifetime of a pod. Glusterfs volumes do not support - ownership management or SELinux relabeling. type: object properties: path: - description: 'Path is the Glusterfs volume path. More - info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string endpoints: - description: 'EndpointsName is the endpoint name that - details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string readOnly: - description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. - Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: boolean required: - endpoints - path gcePersistentDisk: - description: Represents a Persistent Disk resource in - Google Compute Engine. A GCE PD must exist before mounting - to a container. The disk must also be in the same GCE - project and zone as the kubelet. A GCE PD can only be - mounted as read/write once or read-only many times. - GCE PDs support ownership management and SELinux relabeling. type: object properties: partition: - description: 'The partition in the volume that you - want to mount. If omitted, the default is to mount - by volume name. Examples: For volume /dev/sda1, - you specify the partition as "1". Similarly, the - volume partition for /dev/sda is "0" (or you can - leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: number readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More - info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: boolean pdName: - description: 'Unique name of the PD resource in GCE. - Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be - "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string required: - pdName photonPersistentDisk: - description: Represents a Photon Controller persistent - disk resource. type: object properties: pdID: - description: ID that identifies Photon Controller - persistent disk type: string fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. - "ext4", "xfs", "ntfs". Implicitly inferred to be - "ext4" if unspecified. type: string required: - pdID azureDisk: - description: AzureDisk represents an Azure Data Disk mount - on the host and bind mount to the pod. type: object properties: diskName: - description: The Name of the data disk in the blob - storage type: string kind: - description: 'Expected values Shared: multiple blob - disks per storage account Dedicated: single blob - disk per storage account Managed: azure managed - data disk (only in managed availability set). defaults - to shared' type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean cachingMode: - description: 'Host Caching mode: None, Read Only, - Read Write.' type: string diskURI: - description: The URI the data disk in the blob storage type: string fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. - "ext4", "xfs", "ntfs". Implicitly inferred to be - "ext4" if unspecified. type: string required: - diskName - diskURI cinder: - description: Represents a cinder volume resource in Openstack. - A Cinder volume must exist before mounting to a container. - The volume must also be in the same region as the kubelet. - Cinder volumes support ownership management and SELinux - relabeling. type: object properties: secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string volumeID: - description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in - VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: boolean fsType: - description: 'Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://examples.k8s.io/mysql-cinder-pd/README.md' type: string required: - volumeID downwardAPI: - description: DownwardAPIVolumeSource represents a volume - containing downward API info. Downward API volumes support - ownership management and SELinux relabeling. type: object properties: defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the path - are not affected by this setting. This might be - in conflict with other options that affect the file - mode, like fsGroup, and the result can be other - mode bits set.' type: number items: - description: Items is a list of downward API volume - file type: array items: - description: DownwardAPIVolumeFile represents information - to create the file containing the pod field type: object properties: mode: - description: 'Optional: mode bits to use on - this file, must be a value between 0 and 0777. - If not specified, the volume defaultMode will - be used. This might be in conflict with other - options that affect the file mode, like fsGroup, - and the result can be other mode bits set.' type: number path: - description: 'Required: Path is the relative - path name of the file to be created. Must - not be absolute or contain the ''..'' path. - Must be utf-8 encoded. The first item of the - relative path must not start with ''..''' type: string resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format type: object properties: divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= | - ::= - | | ::= - Ki | Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | - G | T | P | E (Note that 1024 = 1Ki - but 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No matter which - of the three exponent forms is used, no - quantity may represent a number greater - than 2^63-1 in magnitude, nor may it have - more than 3 decimal places. Numbers larger - or more precise will be capped or rounded - up. (E.g.: 0.1m will rounded up to 1m.) - This may be extended in the future if - we require larger or smaller quantities. When - a Quantity is parsed from a string, it - will remember the type of suffix it had, - and will use the same type again when - it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will be - adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. No - fractional digits will be emitted c. - The exponent (or suffix) is as large as - possible. The sign will be omitted unless - the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note that - the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always use - canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing some - sort of special handling code in the hopes - that that will cause implementors to also - use a fixed point implementation.' type: object properties: number: @@ -1291,195 +696,97 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to select' type: string containerName: - description: 'Container name: required for - volumes, optional for env vars' type: string required: - resource fieldRef: - description: ObjectFieldSelector selects an - APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". type: string fieldPath: - description: Path of the field to select - in the specified API version. type: string required: - fieldPath required: - path awsElasticBlockStore: - description: Represents a Persistent Disk resource in - AWS. An AWS EBS disk must exist before mounting to - a container. The disk must also be in the same AWS zone - as the kubelet. An AWS EBS disk can only be mounted - as read/write once. AWS EBS volumes support ownership - management and SELinux relabeling. type: object properties: partition: - description: 'The partition in the volume that you - want to mount. If omitted, the default is to mount - by volume name. Examples: For volume /dev/sda1, - you specify the partition as "1". Similarly, the - volume partition for /dev/sda is "0" (or you can - leave the property empty).' type: number volumeID: - description: 'Unique ID of the persistent disk resource - in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string readOnly: - description: 'Specify "true" to force and set the - ReadOnly property in VolumeMounts to "true". If - omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: boolean fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be - "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string required: - volumeID flocker: - description: Represents a Flocker volume mounted by the - Flocker agent. One and only one of datasetName and datasetUUID - should be set. Flocker volumes do not support ownership - management or SELinux relabeling. type: object properties: datasetName: - description: Name of the dataset stored as metadata - -> name on the dataset for Flocker should be considered - as deprecated type: string datasetUUID: - description: UUID of the dataset. This is unique identifier - of a Flocker dataset type: string iscsi: - description: Represents an ISCSI disk. ISCSI volumes can - only be mounted as read/write once. ISCSI volumes support - ownership management and SELinux relabeling. type: object properties: chapAuthSession: - description: whether support iSCSI Session CHAP authentication type: boolean iscsiInterface: - description: iSCSI Interface Name that uses an iSCSI - transport. Defaults to 'default' (tcp). type: string lun: - description: iSCSI Target Lun number. type: number chapAuthDiscovery: - description: whether support iSCSI Discovery CHAP - authentication type: boolean iqn: - description: Target iSCSI Qualified Name. type: string portals: - description: iSCSI Target Portal List. The portal - is either an IP or ip_addr:port if the port is other - than default (typically TCP ports 860 and 3260). type: array items: type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string initiatorName: - description: Custom iSCSI Initiator Name. If initiatorName - is specified with iscsiInterface simultaneously, - new iSCSI interface : - will be created for the connection. type: string readOnly: - description: ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. type: boolean fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be - "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' type: string targetPortal: - description: iSCSI Target Portal. The Portal is either - an IP or ip_addr:port if the port is other than - default (typically TCP ports 860 and 3260). type: string required: - iqn - lun - targetPortal rbd: - description: Represents a Rados Block Device mount that - lasts the lifetime of a pod. RBD volumes support ownership - management and SELinux relabeling. type: object properties: image: - description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string pool: - description: 'The rados pool name. Default is rbd. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: boolean fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be - "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' type: string keyring: - description: 'Keyring is the path to key ring for - RBDUser. Default is /etc/ceph/keyring. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string user: - description: 'The rados user name. Default is admin. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string monitors: - description: 'A collection of Ceph monitors. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: array items: type: string @@ -1487,309 +794,145 @@ spec: - image - monitors configMap: - description: Adapts a ConfigMap into a volume. The contents - of the target ConfigMap's Data field will be presented - in a volume as files using the keys in the Data field - as the file names, unless the items element is populated - with specific mappings of keys to paths. ConfigMap volumes - support ownership management and SELinux relabeling. type: object properties: defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the path - are not affected by this setting. This might be - in conflict with other options that affect the file - mode, like fsGroup, and the result can be other - mode bits set.' type: number name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap or its - keys must be defined type: boolean items: - description: If unspecified, each key-value pair in - the Data field of the referenced ConfigMap will - be projected into the volume as a file whose name - is the key and content is the value. If specified, - the listed keys will be projected into the specified - paths, and unlisted keys will not be present. If - a key is specified which is not present in the ConfigMap, - the volume setup will error unless it is marked - optional. Paths must be relative and may not contain - the '..' path or start with '..'. type: array items: - description: Maps a string key to a path within - a volume. type: object properties: mode: - description: 'Optional: mode bits to use on - this file, must be a value between 0 and 0777. - If not specified, the volume defaultMode will - be used. This might be in conflict with other - options that affect the file mode, like fsGroup, - and the result can be other mode bits set.' type: number path: - description: The relative path of the file to - map the key to. May not be an absolute path. - May not contain the path element '..'. May - not start with the string '..'. type: string key: - description: The key to project. type: string required: - key - path storageos: - description: Represents a StorageOS persistent volume - resource. type: object properties: volumeNamespace: - description: VolumeNamespace specifies the scope of - the volume within StorageOS. If no namespace is - specified then the Pod's namespace will be used. This - allows the Kubernetes name scoping to be mirrored - within StorageOS for tighter integration. Set VolumeName - to any name to override the default behaviour. Set - to "default" if you are not using namespaces within - StorageOS. Namespaces that do not pre-exist within - StorageOS will be created. type: string volumeName: - description: VolumeName is the human-readable name - of the StorageOS volume. Volume names are only - unique within a namespace. type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. - "ext4", "xfs", "ntfs". Implicitly inferred to be - "ext4" if unspecified. type: string csi: - description: Represents a source location of a volume - to mount, managed by an external CSI driver type: object properties: driver: - description: Driver is the name of the CSI driver - that handles this volume. Consult with your admin - for the correct name as registered in the cluster. type: string nodePublishSecretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: Specifies a read-only configuration for - the volume. Defaults to false (read/write). type: boolean fsType: - description: Filesystem type to mount. Ex. "ext4", - "xfs", "ntfs". If not provided, the empty value - is passed to the associated CSI driver which will - determine the default filesystem to apply. type: string volumeAttributes: - description: VolumeAttributes stores driver-specific - properties that are passed to the CSI driver. Consult - your driver's documentation for supported values. additionalProperties: type: string type: object required: - driver name: - description: 'Volume''s name. Must be a DNS_LABEL and - unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string nfs: - description: Represents an NFS mount that lasts the lifetime - of a pod. NFS volumes do not support ownership management - or SELinux relabeling. type: object properties: path: - description: 'Path that is exported by the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string server: - description: 'Server is the hostname or IP address - of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string readOnly: - description: 'ReadOnly here will force the NFS export - to be mounted with read-only permissions. Defaults - to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: boolean required: - path - server persistentVolumeClaim: - description: PersistentVolumeClaimVolumeSource references - the user's PVC in the same namespace. This volume finds - the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource - is, essentially, a wrapper around another type of volume - that is owned by someone else (the system). type: object properties: claimName: - description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' type: string readOnly: - description: Will force the ReadOnly setting in VolumeMounts. - Default false. type: boolean required: - claimName gitRepo: - description: 'Represents a volume that is populated with - the contents of a git repository. Git repo volumes do - not support ownership management. Git repo volumes support - SELinux relabeling. DEPRECATED: GitRepo is deprecated. - To provision a container with a git repo, mount an EmptyDir - into an InitContainer that clones the repo using git, - then mount the EmptyDir into the Pod''s container.' type: object properties: repository: - description: Repository URL type: string directory: - description: Target directory name. Must not contain - or start with '..'. If '.' is supplied, the volume - directory will be the git repository. Otherwise, - if specified, the volume will contain the git repository - in the subdirectory with the given name. type: string revision: - description: Commit hash for the specified revision. type: string required: - repository portworxVolume: - description: PortworxVolumeSource represents a Portworx - volume resource. type: object properties: volumeID: - description: VolumeID uniquely identifies a Portworx - volume type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: FSType represents the filesystem type - to mount Must be a filesystem type supported by - the host operating system. Ex. "ext4", "xfs". Implicitly - inferred to be "ext4" if unspecified. type: string required: - volumeID vsphereVolume: - description: Represents a vSphere volume resource. type: object properties: storagePolicyName: - description: Storage Policy Based Management (SPBM) - profile name. type: string storagePolicyID: - description: Storage Policy Based Management (SPBM) - profile ID associated with the StoragePolicyName. type: string volumePath: - description: Path that identifies vSphere volume vmdk type: string fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. - "ext4", "xfs", "ntfs". Implicitly inferred to be - "ext4" if unspecified. type: string required: - volumePath fc: - description: Represents a Fibre Channel volume. Fibre - Channel volumes can only be mounted as read/write once. - Fibre Channel volumes support ownership management and - SELinux relabeling. type: object properties: lun: - description: 'Optional: FC target lun number' type: number targetWWNs: - description: 'Optional: FC target worldwide names - (WWNs)' type: array items: type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in - VolumeMounts.' type: boolean wwids: - description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' type: array items: type: string fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. - "ext4", "xfs", "ntfs". Implicitly inferred to be - "ext4" if unspecified. type: string hostPath: - description: Represents a host path mapped into a pod. - Host path volumes do not support ownership management - or SELinux relabeling. type: object properties: path: - description: 'Path of the directory on the host. If - the path is a symlink, it will follow the link to - the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string type: - description: 'Type for HostPath Volume Defaults to - "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string required: - path @@ -1798,129 +941,51 @@ spec: resources: type: object description: Memory and CPU minimum requirements and limits - for the server. + for the WebLogic Server instance. See `kubectl explain pods.spec.containers.resources`. properties: requests: type: object additionalProperties: type: string - description: 'Requests describes the minimum amount of compute - resources required. If Requests is omitted for a container, - it defaults to Limits if that is explicitly specified, - otherwise to an implementation-defined value. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' limits: type: object additionalProperties: type: string - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' annotations: type: object additionalProperties: type: string - description: The annotations to be attached to generated resources. + description: The annotations to be added to generated resources. env: type: array - description: A list of environment variables to add to a server. + description: 'A list of environment variables to set in the + container running a WebLogic Server instance. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-resource/#jvm-memory-and-java-option-environment-variables. + See `kubectl explain pods.spec.containers.env`.' items: - description: EnvVar represents an environment variable present - in a Container. type: object properties: name: - description: Name of the environment variable. Must be - a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) are expanded - using the previous defined environment variables in - the container and any service environment variables. - If a variable cannot be resolved, the reference in the - input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). Escaped - references will never be expanded, regardless of whether - the variable exists or not. Defaults to "".' type: string valueFrom: - description: EnvVarSource represents a source for the - value of an EnvVar. type: object properties: secretKeyRef: - description: SecretKeySelector selects a key of a - Secret. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret or its - key must be defined type: boolean key: - description: The key of the secret to select from. Must - be a valid secret key. type: string required: - key resourceFieldRef: - description: ResourceFieldSelector represents container - resources (cpu, memory) and their output format type: object properties: divisor: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and - AsInt64() accessors. The serialization format - is: ::= (Note - that may be empty, from the "" case - in .) ::= 0 | 1 - | ... | 9 ::= | - ::= | . - | . | . ::= - "+" | "-" ::= | - ::= | - | ::= Ki | Mi - | Gi | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T - | P | E (Note that 1024 = 1Ki but 1000 = 1k; - I didn''t choose the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms is - used, no quantity may represent a number greater - than 2^63-1 in magnitude, nor may it have more - than 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be extended - in the future if we require larger or smaller - quantities. When a Quantity is parsed from - a string, it will remember the type of suffix - it had, and will use the same type again when - it is serialized. Before serializing, Quantity - will be put in "canonical form". This means - that Exponent/suffix will be adjusted up or - down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision is - lost b. No fractional digits will be emitted c. - The exponent (or suffix) is as large as possible. - The sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole - point of this exercise. Non-canonical values - will still parse as long as they are well formed, - but will be re-emitted in their canonical form. - (So always use canonical form, or don''t diff.) This - format is intended to make it difficult to use - these numbers without writing some sort of special - handling code in the hopes that that will cause - implementors to also use a fixed point implementation.' type: object properties: number: @@ -1932,43 +997,28 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to select' type: string containerName: - description: 'Container name: required for volumes, - optional for env vars' type: string required: - resource configMapKeyRef: - description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap or - its key must be defined type: boolean key: - description: The key to select. type: string required: - key fieldRef: - description: ObjectFieldSelector selects an APIVersioned - field of an object. type: object properties: apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". type: string fieldPath: - description: Path of the field to select in the - specified API version. type: string required: - fieldPath @@ -1976,51 +1026,34 @@ spec: - name restartPolicy: type: string - description: 'Restart policy for all containers within the pod. + description: 'Restart policy for all containers within the Pod. One of Always, OnFailure, Never. Default to Always. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy. + See `kubectl explain pods.spec.restartPolicy`.' nodeSelector: type: object additionalProperties: type: string - description: Selector which must match a node's labels for the - pod to be scheduled on that node. + description: Selector which must match a Node's labels for the + Pod to be scheduled on that Node. See `kubectl explain pods.spec.nodeSelector`. volumeMounts: type: array - description: Additional volume mounts for the server pod. + description: Additional volume mounts for the container running + a WebLogic Server instance. See `kubectl explain pods.spec.containers.volumeMounts`. items: - description: VolumeMount describes a mounting of a Volume - within a container. type: object properties: mountPath: - description: Path within the container at which the volume - should be mounted. Must not contain ':'. type: string mountPropagation: - description: mountPropagation determines how mounts are - propagated from the host to container and the other - way around. When not set, MountPropagationNone is used. - This field is beta in 1.10. type: string name: - description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. type: boolean subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves similarly - to SubPath but environment variable references $(VAR_NAME) - are expanded using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath are mutually - exclusive. This field is beta in 1.15. type: string required: - mountPath @@ -2029,62 +1062,39 @@ spec: type: object additionalProperties: type: string - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. + description: The labels to be added to generated resources. + The label names must not start with "weblogic.". runtimeClassName: type: string description: 'RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this - pod. If no RuntimeClass resource matches the named class, - the pod will not be run. If unset or empty, the "legacy" RuntimeClass + Pod. If no RuntimeClass resource matches the named class, + the Pod will not be run. If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md - This is an alpha feature and may change in the future.' + This is an alpha feature and may change in the future. See + `kubectl explain pods.spec.runtimeClassName`.' tolerations: type: array - description: If specified, the pod's tolerations. + description: If specified, the Pod's tolerations. See `kubectl + explain pods.spec.tolerations`. items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple using - the matching operator . type: object properties: effect: - description: Effect indicates the taint effect to match. - Empty means match all taint effects. When specified, - allowed values are NoSchedule, PreferNoSchedule and - NoExecute. type: string tolerationSeconds: - description: TolerationSeconds represents the period of - time the toleration (which must be of effect NoExecute, - otherwise this field is ignored) tolerates the taint. - By default, it is not set, which means tolerate the - taint forever (do not evict). Zero and negative values - will be treated as 0 (evict immediately) by the system. type: number value: - description: Value is the taint value the toleration matches - to. If the operator is Exists, the value should be empty, - otherwise just a regular string. type: string key: - description: Key is the taint key that the toleration - applies to. Empty means match all taint keys. If the - key is empty, operator must be Exists; this combination - means to match all values and all keys. type: string operator: - description: Operator represents a key's relationship - to the value. Valid operators are Exists and Equal. - Defaults to Equal. Exists is equivalent to wildcard - for value, so that a pod can tolerate all taints of - a particular category. type: string readinessProbe: type: object description: Settings for the readiness probe associated with - a server. + a WebLogic Server instance. properties: periodSeconds: type: number @@ -2100,71 +1110,37 @@ spec: containers: type: array description: Additional containers to be included in the server - pod. + Pod. See `kubectl explain pods.spec.containers`. items: - description: A single application container that you want - to run within a pod. type: object properties: volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of a raw - block device within a container. type: object properties: devicePath: - description: devicePath is the path inside of the - container that the device will be mapped to. type: string name: - description: name must match the name of a persistentVolumeClaim - in the pod type: string required: - devicePath - name image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images in - workload controllers like Deployments and StatefulSets.' type: string imagePullPolicy: - description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag is specified, - or IfNotPresent otherwise. Cannot be updated. More info: - https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is 1. type: number tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket type: object properties: port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. type: object properties: intValue: @@ -2176,64 +1152,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having failed. - Defaults to 1. Must be 1 for liveness and startup. - Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to execute - inside the container, the working directory - for the command is root ('/') in the container's - filesystem. The command is simply exec'd, it - is not run inside a shell, so traditional shell - instructions ('|', etc) won't work. To use a - shell, you need to explicitly call out to that - shell. Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. type: object properties: intValue: @@ -2245,24 +1187,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom header - to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -2270,207 +1203,83 @@ spec: required: - port stdin: - description: Whether this container should allocate a - buffer for stdin in the container runtime. If this is - not set, reads from stdin in the container will always - result in EOF. Default is false. type: boolean terminationMessagePolicy: - description: Indicate how the termination message should - be populated. File will use the contents of terminationMessagePath - to populate the container status message on both success - and failure. FallbackToLogsOnError will use the last - chunk of container log output if the termination message - file is empty and the container exited with an error. - The log output is limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to File. Cannot be updated. type: string terminationMessagePath: - description: 'Optional: Path at which the file to which - the container''s termination message will be written - is mounted into the container''s filesystem. Message - written is intended to be brief final status, such as - an assertion failure message. Will be truncated by the - node if greater than 4096 bytes. The total message length - across all containers will be limited to 12kb. Defaults - to /dev/termination-log. Cannot be updated.' type: string workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which - might be configured in the container image. Cannot be - updated. type: string resources: - description: ResourceRequirements describes the compute - resource requirements. type: object properties: requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is omitted - for a container, it defaults to Limits if that is - explicitly specified, otherwise to an implementation-defined - value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields are - present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take precedence. type: object properties: privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. type: boolean runAsUser: - description: The UID to run the entrypoint of the - container process. Defaults to user specified in - image metadata if unspecified. May also be set in - PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. type: number capabilities: - description: Adds and removes POSIX capabilities from - running containers. type: object properties: add: - description: Added capabilities type: array items: type: string drop: - description: Removed capabilities type: array items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to be applied - to the container type: object properties: role: - description: Role is a SELinux role label that - applies to the container. type: string level: - description: Level is SELinux level label that - applies to the container. type: string type: - description: Type is a SELinux type label that - applies to the container. type: string user: - description: User is a SELinux user label that - applies to the container. type: string windowsOptions: - description: WindowsSecurityContextOptions contain - Windows-specific options and credentials. type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName field. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. type: string runAsUserName: - description: The UserName in Windows to run the - entrypoint of the container process. Defaults - to the user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. This field is alpha-level and it - is only honored by servers that enable the WindowsRunAsUserName - feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. type: string procMount: - description: procMount denotes the type of proc mount - to use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. type: string allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent - process. This bool directly controls if the no_new_privs - flag will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as - Privileged 2) has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of the - container process. Uses runtime default if unset. - May also be set in PodSecurityContext. If set in - both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. type: number runAsNonRoot: - description: Indicates that the container must run - as a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not - run as UID 0 (root) and fail to start the container - if it does. If unset or false, no such validation - will be performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. type: boolean startupProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is 1. type: number tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket type: object properties: port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. type: object properties: intValue: @@ -2482,64 +1291,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having failed. - Defaults to 1. Must be 1 for liveness and startup. - Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to execute - inside the container, the working directory - for the command is root ('/') in the container's - filesystem. The command is simply exec'd, it - is not run inside a shell, so traditional shell - instructions ('|', etc) won't work. To use a - shell, you need to explicitly call out to that - shell. Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. type: object properties: intValue: @@ -2551,24 +1326,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom header - to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -2576,117 +1342,32 @@ spec: required: - port env: - description: List of environment variables to set in the - container. Cannot be updated. type: array items: - description: EnvVar represents an environment variable - present in a Container. type: object properties: name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) are - expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will - never be expanded, regardless of whether the variable - exists or not. Defaults to "".' type: string valueFrom: - description: EnvVarSource represents a source for - the value of an EnvVar. type: object properties: secretKeyRef: - description: SecretKeySelector selects a key - of a Secret. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - or its key must be defined type: boolean key: - description: The key of the secret to select - from. Must be a valid secret key. type: string required: - key resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format type: object properties: divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= | - ::= - | | ::= - Ki | Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | - G | T | P | E (Note that 1024 = 1Ki - but 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No matter which - of the three exponent forms is used, no - quantity may represent a number greater - than 2^63-1 in magnitude, nor may it have - more than 3 decimal places. Numbers larger - or more precise will be capped or rounded - up. (E.g.: 0.1m will rounded up to 1m.) - This may be extended in the future if - we require larger or smaller quantities. When - a Quantity is parsed from a string, it - will remember the type of suffix it had, - and will use the same type again when - it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will be - adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. No - fractional digits will be emitted c. - The exponent (or suffix) is as large as - possible. The sign will be omitted unless - the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note that - the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always use - canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing some - sort of special handling code in the hopes - that that will cause implementors to also - use a fixed point implementation.' type: object properties: number: @@ -2698,188 +1379,88 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to select' type: string containerName: - description: 'Container name: required for - volumes, optional for env vars' type: string required: - resource configMapKeyRef: - description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its key must be defined type: boolean key: - description: The key to select. type: string required: - key fieldRef: - description: ObjectFieldSelector selects an - APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". type: string fieldPath: - description: Path of the field to select - in the specified API version. type: string required: - fieldPath required: - name ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional information - about the network connections a container uses, but - is primarily informational. Not specifying a port here - DOES NOT prevent that port from being exposed. Any port - which is listening on the default "0.0.0.0" address - inside a container will be accessible from the network. - Cannot be updated. type: array items: - description: ContainerPort represents a network port - in a single container. type: object properties: protocol: - description: Protocol for port. Must be UDP, TCP, - or SCTP. Defaults to "TCP". type: string hostIP: - description: What host IP to bind the external port - to. type: string name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in - a pod must have a unique name. Name for the port - that can be referred to by services. type: string containerPort: - description: Number of port to expose on the pod's - IP address. This must be a valid port number, - 0 < x < 65536. type: number hostPort: - description: Number of port to expose on the host. - If specified, this must be a valid port number, - 0 < x < 65536. If HostNetwork is specified, this - must match ContainerPort. Most containers do not - need this. type: number required: - containerPort command: - description: 'Entrypoint array. Not executed within a - shell. The docker image''s ENTRYPOINT is used if this - is not provided. Variable references $(VAR_NAME) are - expanded using the container''s environment. If a variable - cannot be resolved, the reference in the input string - will be unchanged. The $(VAR_NAME) syntax can be escaped - with a double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string volumeMounts: - description: Pod volumes to mount into the container's - filesystem. Cannot be updated. type: array items: - description: VolumeMount describes a mounting of a Volume - within a container. type: object properties: mountPath: - description: Path within the container at which - the volume should be mounted. Must not contain - ':'. type: string mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and - the other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. type: string name: - description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to - false. type: boolean subPath: - description: Path within the volume from which the - container's volume should be mounted. Defaults - to "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment variable - references $(VAR_NAME) are expanded using the - container's environment. Defaults to "" (volume's - root). SubPathExpr and SubPath are mutually exclusive. - This field is beta in 1.15. type: string required: - mountPath - name args: - description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the reference - in the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be updated. - More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string lifecycle: - description: Lifecycle describes actions that the management - system should take in response to container lifecycle - events. For the PostStart and PreStop lifecycle handlers, - management of the container blocks until the action - is complete, unless the container process fails, in - which case the handler is aborted. type: object properties: postStart: - description: Handler defines a specific action that - should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -2891,49 +1472,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -2945,24 +1501,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -2970,22 +1517,12 @@ spec: required: - port preStop: - description: Handler defines a specific action that - should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -2997,49 +1534,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -3051,24 +1563,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -3076,42 +1579,20 @@ spec: required: - port name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. type: string tty: - description: Whether this container should allocate a - TTY for itself, also requires 'stdin' to be true. Default - is false. type: boolean readinessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is 1. type: number tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket type: object properties: port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. type: object properties: intValue: @@ -3123,64 +1604,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having failed. - Defaults to 1. Must be 1 for liveness and startup. - Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to execute - inside the container, the working directory - for the command is root ('/') in the container's - filesystem. The command is simply exec'd, it - is not run inside a shell, so traditional shell - instructions ('|', etc) won't work. To use a - shell, you need to explicitly call out to that - shell. Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. type: object properties: intValue: @@ -3192,24 +1639,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom header - to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -3217,261 +1655,119 @@ spec: required: - port stdinOnce: - description: Whether the container runtime should close - the stdin channel after it has been opened by a single - attach. When stdin is true the stdin stream will remain - open across multiple attach sessions. If stdinOnce is - set to true, stdin is opened on container start, is - empty until the first client attaches to stdin, and - then remains open and accepts data until the client - disconnects, at which time stdin is closed and remains - closed until the container is restarted. If this flag - is false, a container processes that reads from stdin - will never receive an EOF. Default is false type: boolean envFrom: - description: List of sources to populate environment variables - in the container. The keys defined within a source must - be a C_IDENTIFIER. All invalid keys will be reported - as an event when the container is starting. When a key - exists in multiple sources, the value associated with - the last source will take precedence. Values defined - by an Env with a duplicate key will take precedence. - Cannot be updated. type: array items: - description: EnvFromSource represents the source of - a set of ConfigMaps type: object properties: configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field - will represent the key-value pairs as environment - variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap must - be defined type: boolean prefix: - description: An optional identifier to prepend to - each key in the ConfigMap. Must be a C_IDENTIFIER. type: string secretRef: - description: SecretEnvSource selects a Secret to - populate the environment variables with. The - contents of the target Secret's Data field will - represent the key-value pairs as environment variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret must - be defined type: boolean required: - name containerSecurityContext: type: object description: Container-level security attributes. Will override - any matching pod-level attributes. + any matching Pod-level attributes. See `kubectl explain pods.spec.containers.securityContext`. properties: privileged: type: boolean - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent to - root on the host. Defaults to false. runAsUser: type: number - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. capabilities: type: object - description: Adds and removes POSIX capabilities from running - containers. properties: add: type: array - description: Added capabilities items: type: string drop: type: array - description: Removed capabilities items: type: string seLinuxOptions: type: object - description: SELinuxOptions are the labels to be applied - to the container properties: role: type: string - description: Role is a SELinux role label that applies - to the container. level: type: string - description: Level is SELinux level label that applies - to the container. type: type: string - description: Type is a SELinux type label that applies - to the container. user: type: string - description: User is a SELinux user label that applies - to the container. windowsOptions: type: object - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. properties: gmsaCredentialSpec: type: string - description: GMSACredentialSpec is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec named - by the GMSACredentialSpecName field. This field is - alpha-level and is only honored by servers that enable - the WindowsGMSA feature flag. runAsUserName: type: string - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and it - is only honored by servers that enable the WindowsRunAsUserName - feature flag. gmsaCredentialSpecName: type: string - description: GMSACredentialSpecName is the name of the - GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. procMount: type: string - description: procMount denotes the type of proc mount to - use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. allowPrivilegeEscalation: type: boolean - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent process. - This bool directly controls if the no_new_privs flag will - be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' runAsGroup: type: number - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. runAsNonRoot: type: boolean - description: Indicates that the container must run as a - non-root user. If true, the Kubelet will validate the - image at runtime to ensure that it does not run as UID - 0 (root) and fail to start the container if it does. If - unset or false, no such validation will be performed. - May also be set in PodSecurityContext. If set in both - SecurityContext and PodSecurityContext, the value specified - in SecurityContext takes precedence. readOnlyRootFilesystem: type: boolean - description: Whether this container has a read-only root - filesystem. Default is false. schedulerName: type: string - description: If specified, the pod will be dispatched by specified - scheduler. If not specified, the pod will be dispatched by - default scheduler. + description: If specified, the Pod will be dispatched by the + specified scheduler. If not specified, the Pod will be dispatched + by the default scheduler. See `kubectl explain pods.spec.schedulerName`. initContainers: type: array description: Initialization containers to be included in the - server pod. + server Pod. See `kubectl explain pods.spec.initContainers`. items: - description: A single application container that you want - to run within a pod. type: object properties: volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of a raw - block device within a container. type: object properties: devicePath: - description: devicePath is the path inside of the - container that the device will be mapped to. type: string name: - description: name must match the name of a persistentVolumeClaim - in the pod type: string required: - devicePath - name image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images in - workload controllers like Deployments and StatefulSets.' type: string imagePullPolicy: - description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag is specified, - or IfNotPresent otherwise. Cannot be updated. More info: - https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is 1. type: number tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket type: object properties: port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. type: object properties: intValue: @@ -3483,64 +1779,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having failed. - Defaults to 1. Must be 1 for liveness and startup. - Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to execute - inside the container, the working directory - for the command is root ('/') in the container's - filesystem. The command is simply exec'd, it - is not run inside a shell, so traditional shell - instructions ('|', etc) won't work. To use a - shell, you need to explicitly call out to that - shell. Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. type: object properties: intValue: @@ -3552,24 +1814,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom header - to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -3577,207 +1830,83 @@ spec: required: - port stdin: - description: Whether this container should allocate a - buffer for stdin in the container runtime. If this is - not set, reads from stdin in the container will always - result in EOF. Default is false. type: boolean terminationMessagePolicy: - description: Indicate how the termination message should - be populated. File will use the contents of terminationMessagePath - to populate the container status message on both success - and failure. FallbackToLogsOnError will use the last - chunk of container log output if the termination message - file is empty and the container exited with an error. - The log output is limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to File. Cannot be updated. type: string terminationMessagePath: - description: 'Optional: Path at which the file to which - the container''s termination message will be written - is mounted into the container''s filesystem. Message - written is intended to be brief final status, such as - an assertion failure message. Will be truncated by the - node if greater than 4096 bytes. The total message length - across all containers will be limited to 12kb. Defaults - to /dev/termination-log. Cannot be updated.' type: string workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which - might be configured in the container image. Cannot be - updated. type: string resources: - description: ResourceRequirements describes the compute - resource requirements. type: object properties: requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is omitted - for a container, it defaults to Limits if that is - explicitly specified, otherwise to an implementation-defined - value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields are - present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take precedence. type: object properties: privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. type: boolean runAsUser: - description: The UID to run the entrypoint of the - container process. Defaults to user specified in - image metadata if unspecified. May also be set in - PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. type: number capabilities: - description: Adds and removes POSIX capabilities from - running containers. type: object properties: add: - description: Added capabilities type: array items: type: string drop: - description: Removed capabilities type: array items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to be applied - to the container type: object properties: role: - description: Role is a SELinux role label that - applies to the container. type: string level: - description: Level is SELinux level label that - applies to the container. type: string type: - description: Type is a SELinux type label that - applies to the container. type: string user: - description: User is a SELinux user label that - applies to the container. type: string windowsOptions: - description: WindowsSecurityContextOptions contain - Windows-specific options and credentials. type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName field. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. type: string runAsUserName: - description: The UserName in Windows to run the - entrypoint of the container process. Defaults - to the user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. This field is alpha-level and it - is only honored by servers that enable the WindowsRunAsUserName - feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. type: string procMount: - description: procMount denotes the type of proc mount - to use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. type: string allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent - process. This bool directly controls if the no_new_privs - flag will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as - Privileged 2) has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of the - container process. Uses runtime default if unset. - May also be set in PodSecurityContext. If set in - both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. type: number runAsNonRoot: - description: Indicates that the container must run - as a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not - run as UID 0 (root) and fail to start the container - if it does. If unset or false, no such validation - will be performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. type: boolean startupProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is 1. type: number tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket type: object properties: port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. type: object properties: intValue: @@ -3789,64 +1918,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having failed. - Defaults to 1. Must be 1 for liveness and startup. - Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to execute - inside the container, the working directory - for the command is root ('/') in the container's - filesystem. The command is simply exec'd, it - is not run inside a shell, so traditional shell - instructions ('|', etc) won't work. To use a - shell, you need to explicitly call out to that - shell. Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. type: object properties: intValue: @@ -3858,24 +1953,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom header - to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -3883,117 +1969,32 @@ spec: required: - port env: - description: List of environment variables to set in the - container. Cannot be updated. type: array items: - description: EnvVar represents an environment variable - present in a Container. type: object properties: name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) are - expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will - never be expanded, regardless of whether the variable - exists or not. Defaults to "".' type: string valueFrom: - description: EnvVarSource represents a source for - the value of an EnvVar. type: object properties: secretKeyRef: - description: SecretKeySelector selects a key - of a Secret. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - or its key must be defined type: boolean key: - description: The key of the secret to select - from. Must be a valid secret key. type: string required: - key resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format type: object properties: divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= | - ::= - | | ::= - Ki | Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | - G | T | P | E (Note that 1024 = 1Ki - but 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No matter which - of the three exponent forms is used, no - quantity may represent a number greater - than 2^63-1 in magnitude, nor may it have - more than 3 decimal places. Numbers larger - or more precise will be capped or rounded - up. (E.g.: 0.1m will rounded up to 1m.) - This may be extended in the future if - we require larger or smaller quantities. When - a Quantity is parsed from a string, it - will remember the type of suffix it had, - and will use the same type again when - it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will be - adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. No - fractional digits will be emitted c. - The exponent (or suffix) is as large as - possible. The sign will be omitted unless - the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note that - the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always use - canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing some - sort of special handling code in the hopes - that that will cause implementors to also - use a fixed point implementation.' type: object properties: number: @@ -4005,188 +2006,88 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to select' type: string containerName: - description: 'Container name: required for - volumes, optional for env vars' type: string required: - resource configMapKeyRef: - description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its key must be defined type: boolean key: - description: The key to select. type: string required: - key fieldRef: - description: ObjectFieldSelector selects an - APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". type: string fieldPath: - description: Path of the field to select - in the specified API version. type: string required: - fieldPath required: - name ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional information - about the network connections a container uses, but - is primarily informational. Not specifying a port here - DOES NOT prevent that port from being exposed. Any port - which is listening on the default "0.0.0.0" address - inside a container will be accessible from the network. - Cannot be updated. type: array items: - description: ContainerPort represents a network port - in a single container. type: object properties: protocol: - description: Protocol for port. Must be UDP, TCP, - or SCTP. Defaults to "TCP". type: string hostIP: - description: What host IP to bind the external port - to. type: string name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in - a pod must have a unique name. Name for the port - that can be referred to by services. type: string containerPort: - description: Number of port to expose on the pod's - IP address. This must be a valid port number, - 0 < x < 65536. type: number hostPort: - description: Number of port to expose on the host. - If specified, this must be a valid port number, - 0 < x < 65536. If HostNetwork is specified, this - must match ContainerPort. Most containers do not - need this. type: number required: - containerPort command: - description: 'Entrypoint array. Not executed within a - shell. The docker image''s ENTRYPOINT is used if this - is not provided. Variable references $(VAR_NAME) are - expanded using the container''s environment. If a variable - cannot be resolved, the reference in the input string - will be unchanged. The $(VAR_NAME) syntax can be escaped - with a double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string volumeMounts: - description: Pod volumes to mount into the container's - filesystem. Cannot be updated. type: array items: - description: VolumeMount describes a mounting of a Volume - within a container. type: object properties: mountPath: - description: Path within the container at which - the volume should be mounted. Must not contain - ':'. type: string mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and - the other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. type: string name: - description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to - false. type: boolean subPath: - description: Path within the volume from which the - container's volume should be mounted. Defaults - to "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment variable - references $(VAR_NAME) are expanded using the - container's environment. Defaults to "" (volume's - root). SubPathExpr and SubPath are mutually exclusive. - This field is beta in 1.15. type: string required: - mountPath - name args: - description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the reference - in the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be updated. - More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string lifecycle: - description: Lifecycle describes actions that the management - system should take in response to container lifecycle - events. For the PostStart and PreStop lifecycle handlers, - management of the container blocks until the action - is complete, unless the container process fails, in - which case the handler is aborted. type: object properties: postStart: - description: Handler defines a specific action that - should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -4198,49 +2099,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -4252,24 +2128,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -4277,22 +2144,12 @@ spec: required: - port preStop: - description: Handler defines a specific action that - should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -4304,49 +2161,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -4358,24 +2190,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -4383,42 +2206,20 @@ spec: required: - port name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. type: string tty: - description: Whether this container should allocate a - TTY for itself, also requires 'stdin' to be true. Default - is false. type: boolean readinessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is 1. type: number tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket type: object properties: port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. type: object properties: intValue: @@ -4430,64 +2231,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having failed. - Defaults to 1. Must be 1 for liveness and startup. - Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to execute - inside the container, the working directory - for the command is root ('/') in the container's - filesystem. The command is simply exec'd, it - is not run inside a shell, so traditional shell - instructions ('|', etc) won't work. To use a - shell, you need to explicitly call out to that - shell. Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. type: object properties: intValue: @@ -4499,24 +2266,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom header - to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -4524,84 +2282,44 @@ spec: required: - port stdinOnce: - description: Whether the container runtime should close - the stdin channel after it has been opened by a single - attach. When stdin is true the stdin stream will remain - open across multiple attach sessions. If stdinOnce is - set to true, stdin is opened on container start, is - empty until the first client attaches to stdin, and - then remains open and accepts data until the client - disconnects, at which time stdin is closed and remains - closed until the container is restarted. If this flag - is false, a container processes that reads from stdin - will never receive an EOF. Default is false type: boolean envFrom: - description: List of sources to populate environment variables - in the container. The keys defined within a source must - be a C_IDENTIFIER. All invalid keys will be reported - as an event when the container is starting. When a key - exists in multiple sources, the value associated with - the last source will take precedence. Values defined - by an Env with a duplicate key will take precedence. - Cannot be updated. type: array items: - description: EnvFromSource represents the source of - a set of ConfigMaps type: object properties: configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field - will represent the key-value pairs as environment - variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap must - be defined type: boolean prefix: - description: An optional identifier to prepend to - each key in the ConfigMap. Must be a C_IDENTIFIER. type: string secretRef: - description: SecretEnvSource selects a Secret to - populate the environment variables with. The - contents of the target Secret's Data field will - represent the key-value pairs as environment variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret must - be defined type: boolean required: - name shutdown: type: object - description: Configures how the operator should shutdown the + description: Configures how the operator should shut down the server instance. properties: ignoreSessions: type: boolean description: For graceful shutdown only, indicates to ignore pending HTTP sessions during in-flight work handling. - Not required. Defaults to false. + Defaults to false. shutdownType: type: string - description: Tells the operator how to shutdown server instances. - Not required. Defaults to graceful shutdown. + description: Specifies how the operator will shut down server + instances. Defaults to graceful shutdown. enum: - Graceful - Forced @@ -4609,106 +2327,51 @@ spec: type: number description: For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting down - the server. Not required. Defaults to 30 seconds. + the server. Defaults to 30 seconds. affinity: type: object - description: If specified, the pod's scheduling constraints + description: If specified, the Pod's scheduling constraints. + See `kubectl explain pods.spec.affinity` properties: nodeAffinity: type: object - description: Node affinity is a group of node affinity scheduling - rules. properties: requiredDuringSchedulingIgnoredDuringExecution: type: object - description: A node selector represents the union of - the results of one or more label queries over a set - of nodes; that is, it represents the OR of the selectors - represented by the node selector terms. properties: nodeSelectorTerms: type: array - description: Required. A list of node selector terms. - The terms are ORed. items: - description: A null or empty node selector term - matches no objects. The requirements of them - are ANDed. The TopologySelectorTerm type implements - a subset of the NodeSelectorTerm. type: object properties: matchExpressions: - description: A list of node selector requirements - by node's labels. type: array items: - description: A node selector requirement - is a selector that contains values, a - key, and an operator that relates the - key and values. type: object properties: values: - description: An array of string values. - If the operator is In or NotIn, the - values array must be non-empty. If - the operator is Exists or DoesNotExist, - the values array must be empty. If - the operator is Gt or Lt, the values - array must have a single element, - which will be interpreted as an integer. - This array is replaced during a strategic - merge patch. type: array items: type: string key: - description: The label key that the - selector applies to. type: string operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. type: string required: - key - operator matchFields: - description: A list of node selector requirements - by node's fields. type: array items: - description: A node selector requirement - is a selector that contains values, a - key, and an operator that relates the - key and values. type: object properties: values: - description: An array of string values. - If the operator is In or NotIn, the - values array must be non-empty. If - the operator is Exists or DoesNotExist, - the values array must be empty. If - the operator is Gt or Lt, the values - array must have a single element, - which will be interpreted as an integer. - This array is replaced during a strategic - merge patch. type: array items: type: string key: - description: The label key that the - selector applies to. type: string operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. type: string required: - key @@ -4717,210 +2380,83 @@ spec: - nodeSelectorTerms preferredDuringSchedulingIgnoredDuringExecution: type: array - description: The scheduler will prefer to schedule pods - to nodes that satisfy the affinity expressions specified - by this field, but it may choose a node that violates - one or more of the expressions. The node that is most - preferred is the one with the greatest sum of weights, - i.e. for each node that meets all of the scheduling - requirements (resource request, requiredDuringScheduling - affinity expressions, etc.), compute a sum by iterating - through the elements of this field and adding "weight" - to the sum if the node matches the corresponding matchExpressions; - the node(s) with the highest sum are the most preferred. items: - description: An empty preferred scheduling term matches - all objects with implicit weight 0 (i.e. it's a - no-op). A null preferred scheduling term matches - no objects (i.e. is also a no-op). type: object properties: preference: - description: A null or empty node selector term - matches no objects. The requirements of them - are ANDed. The TopologySelectorTerm type implements - a subset of the NodeSelectorTerm. type: object properties: matchExpressions: - description: A list of node selector requirements - by node's labels. type: array items: - description: A node selector requirement - is a selector that contains values, a - key, and an operator that relates the - key and values. type: object properties: values: - description: An array of string values. - If the operator is In or NotIn, the - values array must be non-empty. If - the operator is Exists or DoesNotExist, - the values array must be empty. If - the operator is Gt or Lt, the values - array must have a single element, - which will be interpreted as an integer. - This array is replaced during a strategic - merge patch. type: array items: type: string key: - description: The label key that the - selector applies to. type: string operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. type: string required: - key - operator matchFields: - description: A list of node selector requirements - by node's fields. type: array items: - description: A node selector requirement - is a selector that contains values, a - key, and an operator that relates the - key and values. type: object properties: values: - description: An array of string values. - If the operator is In or NotIn, the - values array must be non-empty. If - the operator is Exists or DoesNotExist, - the values array must be empty. If - the operator is Gt or Lt, the values - array must have a single element, - which will be interpreted as an integer. - This array is replaced during a strategic - merge patch. type: array items: type: string key: - description: The label key that the - selector applies to. type: string operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. type: string required: - key - operator weight: - description: Weight associated with matching the - corresponding nodeSelectorTerm, in the range - 1-100. type: number required: - preference - weight podAffinity: type: object - description: Pod affinity is a group of inter pod affinity - scheduling rules. properties: requiredDuringSchedulingIgnoredDuringExecution: type: array - description: If the affinity requirements specified - by this field are not met at scheduling time, the - pod will not be scheduled onto the node. If the affinity - requirements specified by this field cease to be met - at some point during pod execution (e.g. due to a - pod label update), the system may or may not try to - eventually evict the pod from its node. When there - are multiple elements, the lists of nodes corresponding - to each podAffinityTerm are intersected, i.e. all - terms must be satisfied. items: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or - not co-located (anti-affinity) with, where co-located - is defined as running on a node whose value of the - label with key matches that of any - node on which a pod of the set of pods is running type: object properties: labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label selector - matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a list of - label selector requirements. The requirements - are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, a - key, and an operator that relates the - key and values. type: object properties: values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. type: array items: type: string key: - description: key is the label key that - the selector applies to. type: string operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only - "value". The requirements are ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified - namespaces, where co-located is defined as running - on a node whose value of the label with key - topologyKey matches that of any node on which - any of the selected pods is running. Empty topologyKey - is not allowed. type: string namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" type: array items: type: string @@ -4928,213 +2464,82 @@ spec: - topologyKey preferredDuringSchedulingIgnoredDuringExecution: type: array - description: The scheduler will prefer to schedule pods - to nodes that satisfy the affinity expressions specified - by this field, but it may choose a node that violates - one or more of the expressions. The node that is most - preferred is the one with the greatest sum of weights, - i.e. for each node that meets all of the scheduling - requirements (resource request, requiredDuringScheduling - affinity expressions, etc.), compute a sum by iterating - through the elements of this field and adding "weight" - to the sum if the node has pods which matches the - corresponding podAffinityTerm; the node(s) with the - highest sum are the most preferred. items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred - node(s) type: object properties: podAffinityTerm: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which - a pod of the set of pods is running type: object properties: labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty - label selector matches all objects. A null - label selector matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. This - array is replaced during a strategic - merge patch. type: array items: type: string key: - description: key is the label key - that the selector applies to. type: string operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose value - of the label with key topologyKey matches - that of any node on which any of the selected - pods is running. Empty topologyKey is not - allowed. type: string namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" type: array items: type: string required: - topologyKey weight: - description: weight associated with matching the - corresponding podAffinityTerm, in the range - 1-100. type: number required: - podAffinityTerm - weight podAntiAffinity: type: object - description: Pod anti affinity is a group of inter pod anti - affinity scheduling rules. properties: requiredDuringSchedulingIgnoredDuringExecution: type: array - description: If the anti-affinity requirements specified - by this field are not met at scheduling time, the - pod will not be scheduled onto the node. If the anti-affinity - requirements specified by this field cease to be met - at some point during pod execution (e.g. due to a - pod label update), the system may or may not try to - eventually evict the pod from its node. When there - are multiple elements, the lists of nodes corresponding - to each podAffinityTerm are intersected, i.e. all - terms must be satisfied. items: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or - not co-located (anti-affinity) with, where co-located - is defined as running on a node whose value of the - label with key matches that of any - node on which a pod of the set of pods is running type: object properties: labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label selector - matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a list of - label selector requirements. The requirements - are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, a - key, and an operator that relates the - key and values. type: object properties: values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. type: array items: type: string key: - description: key is the label key that - the selector applies to. type: string operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only - "value". The requirements are ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified - namespaces, where co-located is defined as running - on a node whose value of the label with key - topologyKey matches that of any node on which - any of the selected pods is running. Empty topologyKey - is not allowed. type: string namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" type: array items: type: string @@ -5142,156 +2547,89 @@ spec: - topologyKey preferredDuringSchedulingIgnoredDuringExecution: type: array - description: The scheduler will prefer to schedule pods - to nodes that satisfy the anti-affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. The - node that is most preferred is the one with the greatest - sum of weights, i.e. for each node that meets all - of the scheduling requirements (resource request, - requiredDuringScheduling anti-affinity expressions, - etc.), compute a sum by iterating through the elements - of this field and adding "weight" to the sum if the - node has pods which matches the corresponding podAffinityTerm; - the node(s) with the highest sum are the most preferred. items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred - node(s) type: object properties: podAffinityTerm: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which - a pod of the set of pods is running type: object properties: labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty - label selector matches all objects. A null - label selector matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. This - array is replaced during a strategic - merge patch. type: array items: type: string key: - description: key is the label key - that the selector applies to. type: string operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose value - of the label with key topologyKey matches - that of any node on which any of the selected - pods is running. Empty topologyKey is not - allowed. type: string namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" type: array items: type: string required: - topologyKey weight: - description: weight associated with matching the - corresponding podAffinityTerm, in the range - 1-100. type: number required: - podAffinityTerm - weight serverStartPolicy: type: string - description: The strategy for deciding whether to start a server. - Legal values are ALWAYS, NEVER, or IF_NEEDED. + description: 'The strategy for deciding whether to start a WebLogic + Server instance. Legal values are ALWAYS, NEVER, or IF_NEEDED. + Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.' enum: - ALWAYS - NEVER - IF_NEEDED adminService: type: object - description: Configures which of the Administration Server's WebLogic - admin channels should be exposed outside the Kubernetes cluster - via a node port service. + description: Customization affecting the generation of the Kubernetes + Service for the Administration Server. These settings can also + specify the creation of a second NodePort Service to expose specific + channels or network access points outside the Kubernetes cluster. properties: channels: type: array description: Specifies which of the Administration Server's WebLogic channels should be exposed outside the Kubernetes - cluster via a node port service, along with the node port - for each channel. If not specified, the Administration Server's - node port service will not be created. + cluster via a NodePort Service, along with the port for each + channel. If not specified, the Administration Server's NodePort + Service will not be created. items: - description: Describes a single channel used by the Administration - Server. type: object properties: channelName: - description: "Name of channel.\n'default' refers to the\ - \ Administration Server's default channel (configured\ - \ via the ServerMBean's ListenPort) \n'default-secure'\ - \ refers to the Administration Server's default secure\ - \ channel (configured via the ServerMBean's SSLMBean's\ - \ ListenPort) \n'default-admin' refers to the Administration\ - \ Server's default administrative channel (configured\ - \ via the DomainMBean's AdministrationPort) \nOtherwise,\ - \ the name is the name of one of the Administration\ - \ Server's network access points (configured via the\ - \ ServerMBean's NetworkAccessMBeans)." + description: Name of the channel. The "default" value + refers to the Administration Server's default channel, + which is configured using the ServerMBean's ListenPort. + The "default-secure" value refers to the Administration + Server's default secure channel, which is configured + using the ServerMBean's SSLMBean's ListenPort. The "default-admin" + value refers to the Administration Server's default + administrative channel, which is configured using the + DomainMBean's AdministrationPort. Otherwise, provide + the name of one of the Administration Server's network + access points, which is configured using the ServerMBean's + NetworkAccessMBeans. The "default", "default-secure", + and "default-admin" channels may not be specified here + when using Istio. type: string nodePort: description: Specifies the port number used to access @@ -5305,2416 +2643,851 @@ spec: type: object additionalProperties: type: string - description: Annotations to associate with the external channel - service. + description: Annotations to associate with the Administration + Server's Service(s). labels: type: object additionalProperties: type: string - description: Labels to associate with the external channel service. + description: Labels to associate with the Administration Server's + Service(s). restartVersion: type: string - description: If present, every time this value is updated the operator - will restart the required servers. - serverPod: - type: object - description: Configuration affecting server pods. - properties: - nodeName: - type: string - description: NodeName is a request to schedule this pod onto a specific - node. If it is non-empty, the scheduler simply schedules this - pod onto that node, assuming that it fits resource requirements. - livenessProbe: - type: object - description: Settings for the liveness probe associated with a server. - properties: - periodSeconds: - type: number - description: The number of seconds between checks. - timeoutSeconds: - type: number - description: The number of seconds with no response that indicates - a failure. - initialDelaySeconds: - type: number - description: The number of seconds before the first check is - performed. - readinessGates: - type: array - description: 'If specified, all readiness gates will be evaluated - for pod readiness. A pod is ready when all its containers are - ready AND all conditions specified in the readiness gates have - status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' - items: - description: PodReadinessGate contains the reference to a pod - condition + description: 'Changes to this field cause the operator to restart + WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.' + logHome: + type: string + description: The directory in a server's container in which to store + the domain, Node Manager, server logs, server *.out, and optionally + HTTP access log files if `httpAccessLogInLogHome` is true. Ignored + if `logHomeEnabled` is false. + includeServerOutInPodLog: + type: boolean + description: Specifies whether the server .out file will be included + in the Pod's log. Defaults to true. + clusters: + type: array + description: Lifecycle options for all of the Managed Server members + of a WebLogic cluster, including Java options, environment variables, + additional Pod content, and the ability to explicitly start, stop, + or restart cluster members. The `clusterName` field of each entry + must match a cluster that already exists in the WebLogic domain configuration. + items: + type: object + properties: + serverStartState: + description: The WebLogic runtime state in which the server is + to be started. Use ADMIN if the server should start in the admin + state. Defaults to RUNNING. + type: string + enum: + - RUNNING + - ADMIN + serverService: + description: Customization affecting the generation of Kubernetes + Services for WebLogic Server instances. type: object properties: - conditionType: - description: ConditionType refers to a condition in the pod's - condition list with matching type. - type: string - required: - - conditionType - serviceAccountName: - type: string - description: Name of the ServiceAccount to be used to run this pod. - If it is not set, default ServiceAccount will be used. The ServiceAccount - has to exist at the time the pod is created. - podSecurityContext: - type: object - description: Pod-level security attributes. - properties: - runAsUser: - type: number - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata if unspecified. - May also be set in SecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence for that container. - seLinuxOptions: - type: object - description: SELinuxOptions are the labels to be applied to - the container - properties: - role: - type: string - description: Role is a SELinux role label that applies to - the container. - level: - type: string - description: Level is SELinux level label that applies to - the container. - type: - type: string - description: Type is a SELinux type label that applies to - the container. - user: - type: string - description: User is a SELinux user label that applies to - the container. - fsGroup: - type: number - description: 'A special supplemental group that applies to all - containers in a pod. Some volume types allow the Kubelet to - change the ownership of that volume to be owned by the pod: 1. - The owning GID will be the FSGroup 2. The setgid bit is set - (new files created in the volume will be owned by FSGroup) - 3. The permission bits are OR''d with rw-rw---- If unset, - the Kubelet will not modify the ownership and permissions - of any volume.' - windowsOptions: - type: object - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. - properties: - gmsaCredentialSpec: - type: string - description: GMSACredentialSpec is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec named - by the GMSACredentialSpecName field. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. - runAsUserName: + precreateService: + description: If true, the operator will create Services even + for Managed Server instances without running Pods. + type: boolean + annotations: + description: The annotations to be added to generated resources. + additionalProperties: type: string - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set in PodSecurityContext. - If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - This field is alpha-level and it is only honored by servers - that enable the WindowsRunAsUserName feature flag. - gmsaCredentialSpecName: + type: object + labels: + description: The labels to be added to generated resources. + The label names must not start with "weblogic.". + additionalProperties: type: string - description: GMSACredentialSpecName is the name of the GMSA - credential spec to use. This field is alpha-level and - is only honored by servers that enable the WindowsGMSA - feature flag. - supplementalGroups: - type: array - description: A list of groups applied to the first process run - in each container, in addition to the container's primary - GID. If unspecified, no groups will be added to any container. - items: - type: number - runAsGroup: - type: number - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be set in - SecurityContext. If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence for - that container. - runAsNonRoot: - type: boolean - description: Indicates that the container must run as a non-root - user. If true, the Kubelet will validate the image at runtime - to ensure that it does not run as UID 0 (root) and fail to - start the container if it does. If unset or false, no such - validation will be performed. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, the value - specified in SecurityContext takes precedence. - sysctls: - type: array - description: Sysctls hold a list of namespaced sysctls used - for the pod. Pods with unsupported sysctls (by the container - runtime) might fail to launch. - items: - description: Sysctl defines a kernel parameter to be set type: object - properties: - name: - description: Name of a property to set - type: string - value: - description: Value of a property to set - type: string - required: - - name - - value - priorityClassName: - type: string - description: If specified, indicates the pod's priority. "system-node-critical" - and "system-cluster-critical" are two special keywords which indicate - the highest priorities with the former being the highest priority. - Any other name must be defined by creating a PriorityClass object - with that name. If not specified, the pod priority will be default - or zero if there is no default. - volumes: - type: array - description: Additional volumes to be created in the server pod. - items: - description: Volume represents a named volume in a pod that may - be accessed by any container in the pod. + maxUnavailable: + description: The maximum number of cluster members that can be + temporarily unavailable. Defaults to 1. + type: number + minimum: 1.0 + replicas: + description: The number of cluster member Managed Server instances + to start for this WebLogic cluster. The operator will sort cluster + member Managed Server names from the WebLogic domain configuration + by normalizing any numbers in the Managed Server name and then + sorting alphabetically. This is done so that server names such + as "managed-server10" come after "managed-server9". The operator + will then start Managed Server instances from the sorted list, + up to the `replicas` count, unless specific Managed Servers + are specified as starting in their entry under the `managedServers` + field. In that case, the specified Managed Server instances + will be started and then additional cluster members will be + started, up to the `replicas` count, by finding further cluster + members in the sorted list that are not already started. If + cluster members are started because of their related entries + under `managedServers`, then this cluster may have more cluster + members running than its `replicas` count. Defaults to 0. + type: number + minimum: 0.0 + clusterName: + description: The name of the cluster. This value must match the + name of a WebLogic cluster already defined in the WebLogic domain + configuration. Required. + type: string + allowReplicasBelowMinDynClusterSize: + description: Specifies whether the number of running cluster members + is allowed to drop below the minimum dynamic cluster size configured + in the WebLogic domain configuration. Otherwise, the operator + will ensure that the number of running cluster members is not + less than the minimum dynamic cluster setting. This setting + applies to dynamic clusters only. Defaults to true. + type: boolean + serverPod: + description: Customization affecting the generation of Pods for + WebLogic Server instances. type: object properties: - quobyte: - description: Represents a Quobyte mount that lasts the lifetime - of a pod. Quobyte volumes do not support ownership management - or SELinux relabeling. - type: object - properties: - volume: - description: Volume is a string that references an already - created Quobyte volume by name. - type: string - registry: - description: Registry represents a single or multiple - Quobyte Registry services specified as a string as host:port - pair (multiple entries are separated with commas) which - acts as the central registry for volumes - type: string - readOnly: - description: ReadOnly here will force the Quobyte volume - to be mounted with read-only permissions. Defaults to - false. - type: boolean - user: - description: User to map volume access to Defaults to - serivceaccount user - type: string - tenant: - description: Tenant owning the given Quobyte volume in - the Backend Used with dynamically provisioned Quobyte - volumes, value is set by the plugin - type: string - group: - description: Group to map volume access to Default is - no group - type: string - required: - - registry - - volume - azureFile: - description: AzureFile represents an Azure File Service mount - on the host and bind mount to the pod. + nodeName: + description: NodeName is a request to schedule this Pod onto + a specific Node. If it is non-empty, the scheduler simply + schedules this pod onto that node, assuming that it fits + the resource requirements. See `kubectl explain pods.spec.nodeName`. + type: string + livenessProbe: + description: Settings for the liveness probe associated with + a WebLogic Server instance. type: object properties: - secretName: - description: the name of secret that contains Azure Storage - Account Name and Key - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - shareName: - description: Share Name - type: string - required: - - secretName - - shareName - flexVolume: - description: FlexVolume represents a generic volume resource - that is provisioned/attached using an exec based plugin. + periodSeconds: + description: The number of seconds between checks. + type: number + timeoutSeconds: + description: The number of seconds with no response that + indicates a failure. + type: number + initialDelaySeconds: + description: The number of seconds before the first check + is performed. + type: number + readinessGates: + description: 'If specified, all readiness gates will be evaluated + for Pod readiness. A Pod is ready when all its containers + are ready AND all conditions specified in the readiness + gates have a status equal to "True". More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md.' + type: array + items: + type: object + properties: + conditionType: + type: string + required: + - conditionType + serviceAccountName: + description: Name of the ServiceAccount to be used to run + this Pod. If it is not set, default ServiceAccount will + be used. The ServiceAccount has to exist at the time the + Pod is created. See `kubectl explain pods.spec.serviceAccountName`. + type: string + podSecurityContext: + description: Pod-level security attributes. See `kubectl explain + pods.spec.securityContext`. type: object properties: - driver: - description: Driver is the name of the driver to use for - this volume. - type: string - options: - description: 'Optional: Extra command options if any.' - additionalProperties: - type: string + runAsUser: + type: number + seLinuxOptions: type: object - secretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the same - namespace. + properties: + role: + type: string + level: + type: string + type: + type: string + user: + type: string + fsGroup: + type: number + windowsOptions: type: object properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + gmsaCredentialSpec: type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' - type: boolean - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". The default filesystem depends on FlexVolume - script. - type: string - required: - - driver - secret: - description: Adapts a Secret into a volume. The contents - of the target Secret's Data field will be presented in a - volume as files using the keys in the Data field as the - file names. Secret volumes support ownership management - and SELinux relabeling. - type: object - properties: - secretName: - description: 'Name of the secret in the pod''s namespace - to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: string - defaultMode: - description: 'Optional: mode bits to use on created files - by default. Must be a value between 0 and 0777. Defaults - to 0644. Directories within the path are not affected - by this setting. This might be in conflict with other - options that affect the file mode, like fsGroup, and - the result can be other mode bits set.' + runAsUserName: + type: string + gmsaCredentialSpecName: + type: string + supplementalGroups: + type: array + items: + type: number + runAsGroup: type: number - optional: - description: Specify whether the Secret or its keys must - be defined + runAsNonRoot: type: boolean - items: - description: If unspecified, each key-value pair in the - Data field of the referenced Secret will be projected - into the volume as a file whose name is the key and - content is the value. If specified, the listed keys - will be projected into the specified paths, and unlisted - keys will not be present. If a key is specified which - is not present in the Secret, the volume setup will - error unless it is marked optional. Paths must be relative - and may not contain the '..' path or start with '..'. + sysctls: type: array items: - description: Maps a string key to a path within a volume. type: object properties: - mode: - description: 'Optional: mode bits to use on this - file, must be a value between 0 and 0777. If not - specified, the volume defaultMode will be used. - This might be in conflict with other options that - affect the file mode, like fsGroup, and the result - can be other mode bits set.' - type: number - path: - description: The relative path of the file to map - the key to. May not be an absolute path. May not - contain the path element '..'. May not start with - the string '..'. + name: type: string - key: - description: The key to project. + value: type: string required: - - key - - path - projected: - description: Represents a projected volume source - type: object - properties: - sources: - description: list of volume projections - type: array - items: - description: Projection that may be projected along - with other supported volume types + - name + - value + priorityClassName: + description: If specified, indicates the Pod's priority. "system-node-critical" + and "system-cluster-critical" are two special keywords which + indicate the highest priorities with the former being the + highest priority. Any other name must be defined by creating + a PriorityClass object with that name. If not specified, + the pod priority will be the default or zero, if there is + no default. See `kubectl explain pods.spec.priorityClassName`. + type: string + volumes: + description: Additional volumes to be created in the server + Pod. See `kubectl explain pods.spec.volumes`. + type: array + items: + type: object + properties: + quobyte: type: object properties: - downwardAPI: - description: Represents downward API info for projecting - into a projected volume. Note that this is identical - to a downwardAPI volume source without the default - mode. + volume: + type: string + registry: + type: string + readOnly: + type: boolean + user: + type: string + tenant: + type: string + group: + type: string + required: + - registry + - volume + azureFile: + type: object + properties: + secretName: + type: string + readOnly: + type: boolean + shareName: + type: string + required: + - secretName + - shareName + flexVolume: + type: object + properties: + driver: + type: string + options: + additionalProperties: + type: string type: object - properties: - items: - description: Items is a list of DownwardAPIVolume - file - type: array - items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field - type: object - properties: - mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might - be in conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode bits - set.' - type: number - path: - description: 'Required: Path is the relative - path name of the file to be created. - Must not be absolute or contain the - ''..'' path. Must be utf-8 encoded. - The first item of the relative path - must not start with ''..''' - type: string - resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and - their output format - type: object - properties: - divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition to - String() and AsInt64() accessors. The - serialization format is: ::= - (Note that - may be empty, from the - "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= - "+" | "-" ::= - | ::= - | | - ::= - Ki | Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k - | M | G | T | P | E (Note that - 1024 = 1Ki but 1000 = 1k; I didn''t - choose the capitalization.) - ::= "e" | "E" No - matter which of the three exponent - forms is used, no quantity may represent - a number greater than 2^63-1 in - magnitude, nor may it have more - than 3 decimal places. Numbers larger - or more precise will be capped or - rounded up. (E.g.: 0.1m will rounded - up to 1m.) This may be extended - in the future if we require larger - or smaller quantities. When a Quantity - is parsed from a string, it will - remember the type of suffix it had, - and will use the same type again - when it is serialized. Before serializing, - Quantity will be put in "canonical - form". This means that Exponent/suffix - will be adjusted up or down (with - a corresponding increase or decrease - in Mantissa) such that: a. No - precision is lost b. No fractional - digits will be emitted c. The - exponent (or suffix) is as large - as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be - internally represented by a floating - point number. That is the whole - point of this exercise. Non-canonical - values will still parse as long - as they are well formed, but will - be re-emitted in their canonical - form. (So always use canonical form, - or don''t diff.) This format is - intended to make it difficult to - use these numbers without writing - some sort of special handling code - in the hopes that that will cause - implementors to also use a fixed - point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to - select' - type: string - containerName: - description: 'Container name: required - for volumes, optional for env vars' - type: string - required: - - resource - fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. - type: object - properties: - apiVersion: - description: Version of the schema - the FieldPath is written in terms - of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to - select in the specified API version. - type: string - required: - - fieldPath - required: - - path - configMap: - description: Adapts a ConfigMap into a projected - volume. The contents of the target ConfigMap's - Data field will be presented in a projected volume - as files using the keys in the Data field as the - file names, unless the items element is populated - with specific mappings of keys to paths. Note - that this is identical to a configmap volume source - without the default mode. + secretRef: type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string - optional: - description: Specify whether the ConfigMap or - its keys must be defined - type: boolean - items: - description: If unspecified, each key-value - pair in the Data field of the referenced ConfigMap - will be projected into the volume as a file - whose name is the key and content is the value. - If specified, the listed keys will be projected - into the specified paths, and unlisted keys - will not be present. If a key is specified - which is not present in the ConfigMap, the - volume setup will error unless it is marked - optional. Paths must be relative and may not - contain the '..' path or start with '..'. - type: array - items: - description: Maps a string key to a path within - a volume. + readOnly: + type: boolean + fsType: + type: string + required: + - driver + secret: + type: object + properties: + secretName: + type: string + defaultMode: + type: number + optional: + type: boolean + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + key: + type: string + required: + - key + - path + projected: + type: object + properties: + sources: + type: array + items: + type: object + properties: + downwardAPI: type: object properties: - mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might - be in conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode bits - set.' - type: number - path: - description: The relative path of the - file to map the key to. May not be an - absolute path. May not contain the path - element '..'. May not start with the - string '..'. - type: string - key: - description: The key to project. - type: string - required: - - key - - path - secret: - description: Adapts a secret into a projected volume. The - contents of the target Secret's Data field will - be presented in a projected volume as files using - the keys in the Data field as the file names. - Note that this is identical to a secret volume - source without the default mode. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - items: - description: If unspecified, each key-value - pair in the Data field of the referenced Secret - will be projected into the volume as a file - whose name is the key and content is the value. - If specified, the listed keys will be projected - into the specified paths, and unlisted keys - will not be present. If a key is specified - which is not present in the Secret, the volume - setup will error unless it is marked optional. - Paths must be relative and may not contain - the '..' path or start with '..'. - type: array - items: - description: Maps a string key to a path within - a volume. + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + resourceFieldRef: + type: object + properties: + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: + type: string + required: + - resource + fieldRef: + type: object + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + required: + - path + configMap: type: object properties: - mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might - be in conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode bits - set.' - type: number - path: - description: The relative path of the - file to map the key to. May not be an - absolute path. May not contain the path - element '..'. May not start with the - string '..'. + name: type: string - key: - description: The key to project. + optional: + type: boolean + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + key: + type: string + required: + - key + - path + secret: + type: object + properties: + name: type: string - required: - - key + optional: + type: boolean + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + key: + type: string + required: + - key + - path + serviceAccountToken: + type: object + properties: + path: + type: string + audience: + type: string + expirationSeconds: + type: number + required: - path - serviceAccountToken: - description: ServiceAccountTokenProjection represents - a projected service account token volume. This - projection can be used to insert a service account - token into the pods runtime filesystem for use - against APIs (Kubernetes API Server or otherwise). - type: object - properties: - path: - description: Path is the path relative to the - mount point of the file to project the token - into. - type: string - audience: - description: Audience is the intended audience - of the token. A recipient of a token must - identify itself with an identifier specified - in the audience of the token, and otherwise - should reject the token. The audience defaults - to the identifier of the apiserver. - type: string - expirationSeconds: - description: ExpirationSeconds is the requested - duration of validity of the service account - token. As the token approaches expiration, - the kubelet volume plugin will proactively - rotate the service account token. The kubelet - will start trying to rotate the token if the - token is older than 80 percent of its time - to live or if the token is older than 24 hours.Defaults - to 1 hour and must be at least 10 minutes. - type: number - required: - - path - defaultMode: - description: Mode bits to use on created files by default. - Must be a value between 0 and 0777. Directories within - the path are not affected by this setting. This might - be in conflict with other options that affect the file - mode, like fsGroup, and the result can be other mode - bits set. - type: number - required: - - sources - cephfs: - description: Represents a Ceph Filesystem mount that lasts - the lifetime of a pod Cephfs volumes do not support ownership - management or SELinux relabeling. - type: object - properties: - path: - description: 'Optional: Used as the mounted root, rather - than the full Ceph tree, default is /' - type: string - secretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the same - namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - secretFile: - description: 'Optional: SecretFile is the path to key - ring for User, default is /etc/ceph/user.secret More - info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: boolean - user: - description: 'Optional: User is the rados user name, default - is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - monitors: - description: 'Required: Monitors is a collection of Ceph - monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: array - items: - type: string - required: - - monitors - scaleIO: - description: ScaleIOVolumeSource represents a persistent ScaleIO - volume - type: object - properties: - system: - description: The name of the storage system as configured - in ScaleIO. - type: string - protectionDomain: - description: The name of the ScaleIO Protection Domain - for the configured storage. - type: string - sslEnabled: - description: Flag to enable/disable SSL communication - with Gateway, default false - type: boolean - storageMode: - description: Indicates whether the storage for a volume - should be ThickProvisioned or ThinProvisioned. Default - is ThinProvisioned. - type: string - volumeName: - description: The name of a volume already created in the - ScaleIO system that is associated with this volume source. - type: string - secretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the same - namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Default is "xfs". - type: string - storagePool: - description: The ScaleIO Storage Pool associated with - the protection domain. - type: string - gateway: - description: The host address of the ScaleIO API Gateway. - type: string - required: - - gateway - - secretRef - - system - emptyDir: - description: Represents an empty directory for a pod. Empty - directory volumes support ownership management and SELinux - relabeling. - type: object - properties: - sizeLimit: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and AsInt64() - accessors. The serialization format is: ::= - (Note that may be - empty, from the "" case in .) ::= - 0 | 1 | ... | 9 ::= | - ::= | . | - . | . ::= "+" | "-" - ::= | ::= - | | ::= - Ki | Mi | Gi | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T | P | E (Note - that 1024 = 1Ki but 1000 = 1k; I didn''t choose the - capitalization.) ::= "e" - | "E" No matter which of the three exponent - forms is used, no quantity may represent a number greater - than 2^63-1 in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more precise will - be capped or rounded up. (E.g.: 0.1m will rounded up - to 1m.) This may be extended in the future if we require - larger or smaller quantities. When a Quantity is parsed - from a string, it will remember the type of suffix it - had, and will use the same type again when it is serialized. Before - serializing, Quantity will be put in "canonical form". - This means that Exponent/suffix will be adjusted up - or down (with a corresponding increase or decrease in - Mantissa) such that: a. No precision is lost b. - No fractional digits will be emitted c. The exponent - (or suffix) is as large as possible. The sign will be - omitted unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi will be serialized - as "1536Mi" Note that the quantity will NEVER be internally - represented by a floating point number. That is the - whole point of this exercise. Non-canonical values - will still parse as long as they are well formed, but - will be re-emitted in their canonical form. (So always - use canonical form, or don''t diff.) This format is - intended to make it difficult to use these numbers without - writing some sort of special handling code in the hopes - that that will cause implementors to also use a fixed - point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - medium: - description: 'What type of storage medium should back - this directory. The default is "" which means to use - the node''s default medium. Must be an empty string - (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: string - glusterfs: - description: Represents a Glusterfs mount that lasts the lifetime - of a pod. Glusterfs volumes do not support ownership management - or SELinux relabeling. - type: object - properties: - path: - description: 'Path is the Glusterfs volume path. More - info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - endpoints: - description: 'EndpointsName is the endpoint name that - details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - readOnly: - description: 'ReadOnly here will force the Glusterfs volume - to be mounted with read-only permissions. Defaults to - false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: boolean - required: - - endpoints - - path - gcePersistentDisk: - description: Represents a Persistent Disk resource in Google - Compute Engine. A GCE PD must exist before mounting to - a container. The disk must also be in the same GCE project - and zone as the kubelet. A GCE PD can only be mounted as - read/write once or read-only many times. GCE PDs support - ownership management and SELinux relabeling. - type: object - properties: - partition: - description: 'The partition in the volume that you want - to mount. If omitted, the default is to mount by volume - name. Examples: For volume /dev/sda1, you specify the - partition as "1". Similarly, the volume partition for - /dev/sda is "0" (or you can leave the property empty). - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: number - readOnly: - description: 'ReadOnly here will force the ReadOnly setting - in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: boolean - pdName: - description: 'Unique name of the PD resource in GCE. Used - to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - fsType: - description: 'Filesystem type of the volume that you want - to mount. Tip: Ensure that the filesystem type is supported - by the host operating system. Examples: "ext4", "xfs", - "ntfs". Implicitly inferred to be "ext4" if unspecified. - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - required: - - pdName - photonPersistentDisk: - description: Represents a Photon Controller persistent disk - resource. - type: object - properties: - pdID: - description: ID that identifies Photon Controller persistent - disk - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. - type: string - required: - - pdID - azureDisk: - description: AzureDisk represents an Azure Data Disk mount - on the host and bind mount to the pod. - type: object - properties: - diskName: - description: The Name of the data disk in the blob storage - type: string - kind: - description: 'Expected values Shared: multiple blob disks - per storage account Dedicated: single blob disk per - storage account Managed: azure managed data disk (only - in managed availability set). defaults to shared' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - cachingMode: - description: 'Host Caching mode: None, Read Only, Read - Write.' - type: string - diskURI: - description: The URI the data disk in the blob storage - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. - type: string - required: - - diskName - - diskURI - cinder: - description: Represents a cinder volume resource in Openstack. - A Cinder volume must exist before mounting to a container. - The volume must also be in the same region as the kubelet. - Cinder volumes support ownership management and SELinux - relabeling. - type: object - properties: - secretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the same - namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - volumeID: - description: 'volume id used to identify the volume in - cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: boolean - fsType: - description: 'Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - required: - - volumeID - downwardAPI: - description: DownwardAPIVolumeSource represents a volume containing - downward API info. Downward API volumes support ownership - management and SELinux relabeling. - type: object - properties: - defaultMode: - description: 'Optional: mode bits to use on created files - by default. Must be a value between 0 and 0777. Defaults - to 0644. Directories within the path are not affected - by this setting. This might be in conflict with other - options that affect the file mode, like fsGroup, and - the result can be other mode bits set.' - type: number - items: - description: Items is a list of downward API volume file - type: array - items: - description: DownwardAPIVolumeFile represents information - to create the file containing the pod field + defaultMode: + type: number + required: + - sources + cephfs: type: object properties: - mode: - description: 'Optional: mode bits to use on this - file, must be a value between 0 and 0777. If not - specified, the volume defaultMode will be used. - This might be in conflict with other options that - affect the file mode, like fsGroup, and the result - can be other mode bits set.' - type: number path: - description: 'Required: Path is the relative path - name of the file to be created. Must not be absolute - or contain the ''..'' path. Must be utf-8 encoded. - The first item of the relative path must not start - with ''..''' type: string - resourceFieldRef: - description: ResourceFieldSelector represents container - resources (cpu, memory) and their output format + secretRef: type: object properties: - divisor: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" case - in .) ::= 0 | - 1 | ... | 9 ::= - | ::= - | . | . | . - ::= "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | Ti | - Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | - T | P | E (Note that 1024 = 1Ki but 1000 - = 1k; I didn''t choose the capitalization.) - ::= "e" | - "E" No matter which of the - three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than 3 - decimal places. Numbers larger or more precise - will be capped or rounded up. (E.g.: 0.1m - will rounded up to 1m.) This may be extended - in the future if we require larger or smaller - quantities. When a Quantity is parsed from - a string, it will remember the type of suffix - it had, and will use the same type again when - it is serialized. Before serializing, Quantity - will be put in "canonical form". This means - that Exponent/suffix will be adjusted up or - down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision - is lost b. No fractional digits will be - emitted c. The exponent (or suffix) is as - large as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi will - be serialized as "1536Mi" Note that the quantity - will NEVER be internally represented by a - floating point number. That is the whole point - of this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or don''t - diff.) This format is intended to make it - difficult to use these numbers without writing - some sort of special handling code in the - hopes that that will cause implementors to - also use a fixed point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to select' - type: string - containerName: - description: 'Container name: required for volumes, - optional for env vars' + name: type: string - required: - - resource - fieldRef: - description: ObjectFieldSelector selects an APIVersioned - field of an object. + secretFile: + type: string + readOnly: + type: boolean + user: + type: string + monitors: + type: array + items: + type: string + required: + - monitors + scaleIO: + type: object + properties: + system: + type: string + protectionDomain: + type: string + sslEnabled: + type: boolean + storageMode: + type: string + volumeName: + type: string + secretRef: type: object properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in - the specified API version. + name: type: string - required: - - fieldPath + readOnly: + type: boolean + fsType: + type: string + storagePool: + type: string + gateway: + type: string required: - - path - awsElasticBlockStore: - description: Represents a Persistent Disk resource in AWS. An - AWS EBS disk must exist before mounting to a container. - The disk must also be in the same AWS zone as the kubelet. - An AWS EBS disk can only be mounted as read/write once. - AWS EBS volumes support ownership management and SELinux - relabeling. - type: object - properties: - partition: - description: 'The partition in the volume that you want - to mount. If omitted, the default is to mount by volume - name. Examples: For volume /dev/sda1, you specify the - partition as "1". Similarly, the volume partition for - /dev/sda is "0" (or you can leave the property empty).' - type: number - volumeID: - description: 'Unique ID of the persistent disk resource - in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - readOnly: - description: 'Specify "true" to force and set the ReadOnly - property in VolumeMounts to "true". If omitted, the - default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: boolean - fsType: - description: 'Filesystem type of the volume that you want - to mount. Tip: Ensure that the filesystem type is supported - by the host operating system. Examples: "ext4", "xfs", - "ntfs". Implicitly inferred to be "ext4" if unspecified. - More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - required: - - volumeID - flocker: - description: Represents a Flocker volume mounted by the Flocker - agent. One and only one of datasetName and datasetUUID should - be set. Flocker volumes do not support ownership management - or SELinux relabeling. - type: object - properties: - datasetName: - description: Name of the dataset stored as metadata -> - name on the dataset for Flocker should be considered - as deprecated - type: string - datasetUUID: - description: UUID of the dataset. This is unique identifier - of a Flocker dataset - type: string - iscsi: - description: Represents an ISCSI disk. ISCSI volumes can only - be mounted as read/write once. ISCSI volumes support ownership - management and SELinux relabeling. - type: object - properties: - chapAuthSession: - description: whether support iSCSI Session CHAP authentication - type: boolean - iscsiInterface: - description: iSCSI Interface Name that uses an iSCSI transport. - Defaults to 'default' (tcp). - type: string - lun: - description: iSCSI Target Lun number. - type: number - chapAuthDiscovery: - description: whether support iSCSI Discovery CHAP authentication - type: boolean - iqn: - description: Target iSCSI Qualified Name. - type: string - portals: - description: iSCSI Target Portal List. The portal is either - an IP or ip_addr:port if the port is other than default - (typically TCP ports 860 and 3260). - type: array - items: - type: string - secretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the same - namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - initiatorName: - description: Custom iSCSI Initiator Name. If initiatorName - is specified with iscsiInterface simultaneously, new - iSCSI interface : will be - created for the connection. - type: string - readOnly: - description: ReadOnly here will force the ReadOnly setting - in VolumeMounts. Defaults to false. - type: boolean - fsType: - description: 'Filesystem type of the volume that you want - to mount. Tip: Ensure that the filesystem type is supported - by the host operating system. Examples: "ext4", "xfs", - "ntfs". Implicitly inferred to be "ext4" if unspecified. - More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' - type: string - targetPortal: - description: iSCSI Target Portal. The Portal is either - an IP or ip_addr:port if the port is other than default - (typically TCP ports 860 and 3260). - type: string - required: - - iqn - - lun - - targetPortal - rbd: - description: Represents a Rados Block Device mount that lasts - the lifetime of a pod. RBD volumes support ownership management - and SELinux relabeling. - type: object - properties: - image: - description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - pool: - description: 'The rados pool name. Default is rbd. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - secretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the same - namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - readOnly: - description: 'ReadOnly here will force the ReadOnly setting - in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: boolean - fsType: - description: 'Filesystem type of the volume that you want - to mount. Tip: Ensure that the filesystem type is supported - by the host operating system. Examples: "ext4", "xfs", - "ntfs". Implicitly inferred to be "ext4" if unspecified. - More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' - type: string - keyring: - description: 'Keyring is the path to key ring for RBDUser. - Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - user: - description: 'The rados user name. Default is admin. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - monitors: - description: 'A collection of Ceph monitors. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: array - items: - type: string - required: - - image - - monitors - configMap: - description: Adapts a ConfigMap into a volume. The contents - of the target ConfigMap's Data field will be presented in - a volume as files using the keys in the Data field as the - file names, unless the items element is populated with specific - mappings of keys to paths. ConfigMap volumes support ownership - management and SELinux relabeling. - type: object - properties: - defaultMode: - description: 'Optional: mode bits to use on created files - by default. Must be a value between 0 and 0777. Defaults - to 0644. Directories within the path are not affected - by this setting. This might be in conflict with other - options that affect the file mode, like fsGroup, and - the result can be other mode bits set.' - type: number - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap or its keys - must be defined - type: boolean - items: - description: If unspecified, each key-value pair in the - Data field of the referenced ConfigMap will be projected - into the volume as a file whose name is the key and - content is the value. If specified, the listed keys - will be projected into the specified paths, and unlisted - keys will not be present. If a key is specified which - is not present in the ConfigMap, the volume setup will - error unless it is marked optional. Paths must be relative - and may not contain the '..' path or start with '..'. - type: array - items: - description: Maps a string key to a path within a volume. + - gateway + - secretRef + - system + emptyDir: + type: object + properties: + sizeLimit: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + medium: + type: string + glusterfs: type: object properties: - mode: - description: 'Optional: mode bits to use on this - file, must be a value between 0 and 0777. If not - specified, the volume defaultMode will be used. - This might be in conflict with other options that - affect the file mode, like fsGroup, and the result - can be other mode bits set.' - type: number path: - description: The relative path of the file to map - the key to. May not be an absolute path. May not - contain the path element '..'. May not start with - the string '..'. type: string - key: - description: The key to project. + endpoints: type: string + readOnly: + type: boolean required: - - key + - endpoints - path - storageos: - description: Represents a StorageOS persistent volume resource. - type: object - properties: - volumeNamespace: - description: VolumeNamespace specifies the scope of the - volume within StorageOS. If no namespace is specified - then the Pod's namespace will be used. This allows - the Kubernetes name scoping to be mirrored within StorageOS - for tighter integration. Set VolumeName to any name - to override the default behaviour. Set to "default" - if you are not using namespaces within StorageOS. Namespaces - that do not pre-exist within StorageOS will be created. - type: string - volumeName: - description: VolumeName is the human-readable name of - the StorageOS volume. Volume names are only unique - within a namespace. - type: string - secretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the same - namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. - type: string - csi: - description: Represents a source location of a volume to mount, - managed by an external CSI driver - type: object - properties: - driver: - description: Driver is the name of the CSI driver that - handles this volume. Consult with your admin for the - correct name as registered in the cluster. - type: string - nodePublishSecretRef: - description: LocalObjectReference contains enough information - to let you locate the referenced object inside the same - namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - readOnly: - description: Specifies a read-only configuration for the - volume. Defaults to false (read/write). - type: boolean - fsType: - description: Filesystem type to mount. Ex. "ext4", "xfs", - "ntfs". If not provided, the empty value is passed to - the associated CSI driver which will determine the default - filesystem to apply. - type: string - volumeAttributes: - description: VolumeAttributes stores driver-specific properties - that are passed to the CSI driver. Consult your driver's - documentation for supported values. - additionalProperties: - type: string - type: object - required: - - driver - name: - description: 'Volume''s name. Must be a DNS_LABEL and unique - within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - nfs: - description: Represents an NFS mount that lasts the lifetime - of a pod. NFS volumes do not support ownership management - or SELinux relabeling. - type: object - properties: - path: - description: 'Path that is exported by the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - server: - description: 'Server is the hostname or IP address of - the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - readOnly: - description: 'ReadOnly here will force the NFS export - to be mounted with read-only permissions. Defaults to - false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: boolean - required: - - path - - server - persistentVolumeClaim: - description: PersistentVolumeClaimVolumeSource references - the user's PVC in the same namespace. This volume finds - the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource - is, essentially, a wrapper around another type of volume - that is owned by someone else (the system). - type: object - properties: - claimName: - description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: string - readOnly: - description: Will force the ReadOnly setting in VolumeMounts. - Default false. - type: boolean - required: - - claimName - gitRepo: - description: 'Represents a volume that is populated with the - contents of a git repository. Git repo volumes do not support - ownership management. Git repo volumes support SELinux relabeling. DEPRECATED: - GitRepo is deprecated. To provision a container with a git - repo, mount an EmptyDir into an InitContainer that clones - the repo using git, then mount the EmptyDir into the Pod''s - container.' - type: object - properties: - repository: - description: Repository URL - type: string - directory: - description: Target directory name. Must not contain or - start with '..'. If '.' is supplied, the volume directory - will be the git repository. Otherwise, if specified, - the volume will contain the git repository in the subdirectory - with the given name. - type: string - revision: - description: Commit hash for the specified revision. - type: string - required: - - repository - portworxVolume: - description: PortworxVolumeSource represents a Portworx volume - resource. - type: object - properties: - volumeID: - description: VolumeID uniquely identifies a Portworx volume - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - fsType: - description: FSType represents the filesystem type to - mount Must be a filesystem type supported by the host - operating system. Ex. "ext4", "xfs". Implicitly inferred - to be "ext4" if unspecified. - type: string - required: - - volumeID - vsphereVolume: - description: Represents a vSphere volume resource. - type: object - properties: - storagePolicyName: - description: Storage Policy Based Management (SPBM) profile - name. - type: string - storagePolicyID: - description: Storage Policy Based Management (SPBM) profile - ID associated with the StoragePolicyName. - type: string - volumePath: - description: Path that identifies vSphere volume vmdk - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. - type: string - required: - - volumePath - fc: - description: Represents a Fibre Channel volume. Fibre Channel - volumes can only be mounted as read/write once. Fibre Channel - volumes support ownership management and SELinux relabeling. - type: object - properties: - lun: - description: 'Optional: FC target lun number' - type: number - targetWWNs: - description: 'Optional: FC target worldwide names (WWNs)' - type: array - items: - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' - type: boolean - wwids: - description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs and - lun must be set, but not both simultaneously.' - type: array - items: - type: string - fsType: - description: Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. - type: string - hostPath: - description: Represents a host path mapped into a pod. Host - path volumes do not support ownership management or SELinux - relabeling. - type: object - properties: - path: - description: 'Path of the directory on the host. If the - path is a symlink, it will follow the link to the real - path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - type: - description: 'Type for HostPath Volume Defaults to "" - More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - required: - - path - required: - - name - resources: - type: object - description: Memory and CPU minimum requirements and limits for - the server. - properties: - requests: - type: object - additionalProperties: - type: string - description: 'Requests describes the minimum amount of compute - resources required. If Requests is omitted for a container, - it defaults to Limits if that is explicitly specified, otherwise - to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - limits: - type: object - additionalProperties: - type: string - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - annotations: - type: object - additionalProperties: - type: string - description: The annotations to be attached to generated resources. - env: - type: array - description: A list of environment variables to add to a server. - items: - description: EnvVar represents an environment variable present - in a Container. - type: object - properties: - name: - description: Name of the environment variable. Must be a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are expanded - using the previous defined environment variables in the - container and any service environment variables. If a variable - cannot be resolved, the reference in the input string will - be unchanged. The $(VAR_NAME) syntax can be escaped with - a double $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable exists or - not. Defaults to "".' - type: string - valueFrom: - description: EnvVarSource represents a source for the value - of an EnvVar. - type: object - properties: - secretKeyRef: - description: SecretKeySelector selects a key of a Secret. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - required: - - key - resourceFieldRef: - description: ResourceFieldSelector represents container - resources (cpu, memory) and their output format - type: object - properties: - divisor: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and AsInt64() - accessors. The serialization format is: ::= - (Note that may - be empty, from the "" case in .) ::= - 0 | 1 | ... | 9 ::= | - ::= | - . | . | . ::= - "+" | "-" ::= | - ::= | - | ::= Ki | Mi | Gi - | Ti | Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T | P - | E (Note that 1024 = 1Ki but 1000 = 1k; I didn''t - choose the capitalization.) ::= - "e" | "E" No matter - which of the three exponent forms is used, no quantity - may represent a number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal places. Numbers - larger or more precise will be capped or rounded - up. (E.g.: 0.1m will rounded up to 1m.) This may - be extended in the future if we require larger or - smaller quantities. When a Quantity is parsed from - a string, it will remember the type of suffix it - had, and will use the same type again when it is - serialized. Before serializing, Quantity will be - put in "canonical form". This means that Exponent/suffix - will be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such that: a. - No precision is lost b. No fractional digits will - be emitted c. The exponent (or suffix) is as large - as possible. The sign will be omitted unless the - number is negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole point - of this exercise. Non-canonical values will still - parse as long as they are well formed, but will - be re-emitted in their canonical form. (So always - use canonical form, or don''t diff.) This format - is intended to make it difficult to use these numbers - without writing some sort of special handling code - in the hopes that that will cause implementors to - also use a fixed point implementation.' - type: object - properties: - number: - type: number - format: + gcePersistentDisk: + type: object + properties: + partition: + type: number + readOnly: + type: boolean + pdName: + type: string + fsType: + type: string + required: + - pdName + photonPersistentDisk: + type: object + properties: + pdID: + type: string + fsType: + type: string + required: + - pdID + azureDisk: + type: object + properties: + diskName: + type: string + kind: + type: string + readOnly: + type: boolean + cachingMode: + type: string + diskURI: + type: string + fsType: + type: string + required: + - diskName + - diskURI + cinder: + type: object + properties: + secretRef: + type: object + properties: + name: + type: string + volumeID: + type: string + readOnly: + type: boolean + fsType: + type: string + required: + - volumeID + downwardAPI: + type: object + properties: + defaultMode: + type: number + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + resourceFieldRef: + type: object + properties: + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: + type: string + required: + - resource + fieldRef: + type: object + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + required: + - path + awsElasticBlockStore: + type: object + properties: + partition: + type: number + volumeID: + type: string + readOnly: + type: boolean + fsType: + type: string + required: + - volumeID + flocker: + type: object + properties: + datasetName: + type: string + datasetUUID: + type: string + iscsi: + type: object + properties: + chapAuthSession: + type: boolean + iscsiInterface: + type: string + lun: + type: number + chapAuthDiscovery: + type: boolean + iqn: + type: string + portals: + type: array + items: type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to select' - type: string - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - required: - - resource - configMapKeyRef: - description: Selects a key from a ConfigMap. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - key: - description: The key to select. - type: string - required: - - key - fieldRef: - description: ObjectFieldSelector selects an APIVersioned - field of an object. - type: object - properties: - apiVersion: - description: Version of the schema the FieldPath is - written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the specified - API version. - type: string - required: - - fieldPath - required: - - name - restartPolicy: - type: string - description: 'Restart policy for all containers within the pod. - One of Always, OnFailure, Never. Default to Always. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' - nodeSelector: - type: object - additionalProperties: - type: string - description: Selector which must match a node's labels for the pod - to be scheduled on that node. - volumeMounts: - type: array - description: Additional volume mounts for the server pod. - items: - description: VolumeMount describes a mounting of a Volume within - a container. - type: object - properties: - mountPath: - description: Path within the container at which the volume - should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts are propagated - from the host to container and the other way around. When - not set, MountPropagationNone is used. This field is beta - in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from which the - container's volume should be mounted. Behaves similarly - to SubPath but environment variable references $(VAR_NAME) - are expanded using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath are mutually - exclusive. This field is beta in 1.15. - type: string - required: - - mountPath - - name - labels: - type: object - additionalProperties: - type: string - description: The labels to be attached to generated resources. The - label names must not start with 'weblogic.'. - runtimeClassName: - type: string - description: 'RuntimeClassName refers to a RuntimeClass object in - the node.k8s.io group, which should be used to run this pod. If - no RuntimeClass resource matches the named class, the pod will - not be run. If unset or empty, the "legacy" RuntimeClass will - be used, which is an implicit class with an empty definition that - uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md - This is an alpha feature and may change in the future.' - tolerations: - type: array - description: If specified, the pod's tolerations. - items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple using the - matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to match. Empty - means match all taint effects. When specified, allowed values - are NoSchedule, PreferNoSchedule and NoExecute. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time - the toleration (which must be of effect NoExecute, otherwise - this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do - not evict). Zero and negative values will be treated as - 0 (evict immediately) by the system. - type: number - value: - description: Value is the taint value the toleration matches - to. If the operator is Exists, the value should be empty, - otherwise just a regular string. - type: string - key: - description: Key is the taint key that the toleration applies - to. Empty means match all taint keys. If the key is empty, - operator must be Exists; this combination means to match - all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the - value. Valid operators are Exists and Equal. Defaults to - Equal. Exists is equivalent to wildcard for value, so that - a pod can tolerate all taints of a particular category. - type: string - readinessProbe: - type: object - description: Settings for the readiness probe associated with a - server. - properties: - periodSeconds: - type: number - description: The number of seconds between checks. - timeoutSeconds: - type: number - description: The number of seconds with no response that indicates - a failure. - initialDelaySeconds: - type: number - description: The number of seconds before the first check is - performed. - containers: - type: array - description: Additional containers to be included in the server - pod. - items: - description: A single application container that you want to run - within a pod. - type: object - properties: - volumeDevices: - description: volumeDevices is the list of block devices to - be used by the container. This is a beta feature. - type: array - items: - description: volumeDevice describes a mapping of a raw block - device within a container. - type: object - properties: - devicePath: - description: devicePath is the path inside of the container - that the device will be mapped to. - type: string - name: - description: name must match the name of a persistentVolumeClaim - in the pod - type: string - required: - - devicePath - - name - image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config management - to default or override container images in workload controllers - like Deployments and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One of Always, Never, IfNotPresent. - Defaults to Always if :latest tag is specified, or IfNotPresent - otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - livenessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive or - ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold an - int32 or a string. When used in JSON or YAML marshalling - and unmarshalling, it produces or consumes the inner - type. This allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: + secretRef: + type: object + properties: + name: + type: string + initiatorName: + type: string + readOnly: + type: boolean + fsType: + type: string + targetPortal: + type: string + required: + - iqn + - lun + - targetPortal + rbd: + type: object + properties: + image: + type: string + pool: + type: string + secretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + keyring: + type: string + user: + type: string + monitors: + type: array + items: type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is 1. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', - etc) won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - type: array + required: + - image + - monitors + configMap: + type: object + properties: + defaultMode: + type: number + name: + type: string + optional: + type: boolean items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + key: + type: string + required: + - key + - path + storageos: + type: object + properties: + volumeNamespace: + type: string + volumeName: + type: string + secretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + csi: + type: object + properties: + driver: + type: string + nodePublishSecretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + volumeAttributes: + additionalProperties: + type: string + type: object + required: + - driver + name: + type: string + nfs: + type: object + properties: + path: + type: string + server: + type: string + readOnly: + type: boolean + required: + - path + - server + persistentVolumeClaim: + type: object + properties: + claimName: + type: string + readOnly: + type: boolean + required: + - claimName + gitRepo: + type: object + properties: + repository: + type: string + directory: + type: string + revision: + type: string + required: + - repository + portworxVolume: + type: object + properties: + volumeID: + type: string + readOnly: + type: boolean + fsType: + type: string + required: + - volumeID + vsphereVolume: + type: object + properties: + storagePolicyName: type: string - httpGet: - description: HTTPGetAction describes an action based on - HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can hold an - int32 or a string. When used in JSON or YAML marshalling - and unmarshalling, it produces or consumes the inner - type. This allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: + storagePolicyID: + type: string + volumePath: + type: string + fsType: + type: string + required: + - volumePath + fc: + type: object + properties: + lun: + type: number + targetWWNs: + type: array + items: type: string - required: - - isInt - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - stdin: - description: Whether this container should allocate a buffer - for stdin in the container runtime. If this is not set, - reads from stdin in the container will always result in - EOF. Default is false. - type: boolean - terminationMessagePolicy: - description: Indicate how the termination message should be - populated. File will use the contents of terminationMessagePath - to populate the container status message on both success - and failure. FallbackToLogsOnError will use the last chunk - of container log output if the termination message file - is empty and the container exited with an error. The log - output is limited to 2048 bytes or 80 lines, whichever is - smaller. Defaults to File. Cannot be updated. - type: string - terminationMessagePath: - description: 'Optional: Path at which the file to which the - container''s termination message will be written is mounted - into the container''s filesystem. Message written is intended - to be brief final status, such as an assertion failure message. - Will be truncated by the node if greater than 4096 bytes. - The total message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot be updated.' - type: string - workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which might - be configured in the container image. Cannot be updated. - type: string + readOnly: + type: boolean + wwids: + type: array + items: + type: string + fsType: + type: string + hostPath: + type: object + properties: + path: + type: string + type: + type: string + required: + - path + required: + - name resources: - description: ResourceRequirements describes the compute resource - requirements. + description: Memory and CPU minimum requirements and limits + for the WebLogic Server instance. See `kubectl explain pods.spec.containers.resources`. type: object properties: requests: - description: 'Requests describes the minimum amount of - compute resources required. If Requests is omitted for - a container, it defaults to Limits if that is explicitly - specified, otherwise to an implementation-defined value. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object - securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields are present - in both SecurityContext and PodSecurityContext. When both - are set, the values in SecurityContext take precedence. - type: object - properties: - privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. - type: boolean - runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - type: number - capabilities: - description: Adds and removes POSIX capabilities from - running containers. - type: object - properties: - add: - description: Added capabilities - type: array - items: - type: string - drop: - description: Removed capabilities - type: array - items: - type: string - seLinuxOptions: - description: SELinuxOptions are the labels to be applied - to the container - type: object - properties: - role: - description: Role is a SELinux role label that applies - to the container. - type: string - level: - description: Level is SELinux level label that applies - to the container. - type: string - type: - description: Type is a SELinux type label that applies - to the container. - type: string - user: - description: User is a SELinux user label that applies - to the container. - type: string - windowsOptions: - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. - type: string - runAsUserName: - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and - it is only honored by servers that enable the WindowsRunAsUserName - feature flag. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name of - the GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. - type: string - procMount: - description: procMount denotes the type of proc mount - to use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. - type: string - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent process. - This bool directly controls if the no_new_privs flag - will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' - type: boolean - runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. - type: number - runAsNonRoot: - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if it - does. If unset or false, no such validation will be - performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - type: boolean - readOnlyRootFilesystem: - description: Whether this container has a read-only root - filesystem. Default is false. - type: boolean - startupProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive or - ready to receive traffic. + annotations: + description: The annotations to be added to generated resources. + additionalProperties: + type: string type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold an - int32 or a string. When used in JSON or YAML marshalling - and unmarshalling, it produces or consumes the inner - type. This allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is 1. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', - etc) won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based on - HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can hold an - int32 or a string. When used in JSON or YAML marshalling - and unmarshalling, it produces or consumes the inner - type. This allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port env: - description: List of environment variables to set in the container. - Cannot be updated. + description: 'A list of environment variables to set in the + container running a WebLogic Server instance. More info: + https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-resource/#jvm-memory-and-java-option-environment-variables. + See `kubectl explain pods.spec.containers.env`.' type: array items: - description: EnvVar represents an environment variable present - in a Container. type: object properties: name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) are expanded - using the previous defined environment variables in - the container and any service environment variables. - If a variable cannot be resolved, the reference in - the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Defaults to - "".' type: string valueFrom: - description: EnvVarSource represents a source for the - value of an EnvVar. type: object properties: secretKeyRef: - description: SecretKeySelector selects a key of - a Secret. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret or its - key must be defined type: boolean key: - description: The key of the secret to select - from. Must be a valid secret key. type: string required: - key resourceFieldRef: - description: ResourceFieldSelector represents container - resources (cpu, memory) and their output format type: object properties: divisor: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" case - in .) ::= 0 | - 1 | ... | 9 ::= - | ::= - | . | . | . - ::= "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | Ti | - Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | - T | P | E (Note that 1024 = 1Ki but 1000 - = 1k; I didn''t choose the capitalization.) - ::= "e" | - "E" No matter which of the - three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than 3 - decimal places. Numbers larger or more precise - will be capped or rounded up. (E.g.: 0.1m - will rounded up to 1m.) This may be extended - in the future if we require larger or smaller - quantities. When a Quantity is parsed from - a string, it will remember the type of suffix - it had, and will use the same type again when - it is serialized. Before serializing, Quantity - will be put in "canonical form". This means - that Exponent/suffix will be adjusted up or - down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision - is lost b. No fractional digits will be - emitted c. The exponent (or suffix) is as - large as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi will - be serialized as "1536Mi" Note that the quantity - will NEVER be internally represented by a - floating point number. That is the whole point - of this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or don''t - diff.) This format is intended to make it - difficult to use these numbers without writing - some sort of special handling code in the - hopes that that will cause implementors to - also use a fixed point implementation.' type: object properties: number: @@ -7726,7772 +3499,4152 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to select' type: string containerName: - description: 'Container name: required for volumes, - optional for env vars' type: string required: - resource configMapKeyRef: - description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap or - its key must be defined type: boolean key: - description: The key to select. type: string required: - key fieldRef: - description: ObjectFieldSelector selects an APIVersioned - field of an object. type: object properties: apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". type: string fieldPath: - description: Path of the field to select in - the specified API version. type: string required: - fieldPath required: - name - ports: - description: List of ports to expose from the container. Exposing - a port here gives the system additional information about - the network connections a container uses, but is primarily - informational. Not specifying a port here DOES NOT prevent - that port from being exposed. Any port which is listening - on the default "0.0.0.0" address inside a container will - be accessible from the network. Cannot be updated. + restartPolicy: + description: 'Restart policy for all containers within the + Pod. One of Always, OnFailure, Never. Default to Always. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy. + See `kubectl explain pods.spec.restartPolicy`.' + type: string + nodeSelector: + description: Selector which must match a Node's labels for + the Pod to be scheduled on that Node. See `kubectl explain + pods.spec.nodeSelector`. + additionalProperties: + type: string + type: object + volumeMounts: + description: Additional volume mounts for the container running + a WebLogic Server instance. See `kubectl explain pods.spec.containers.volumeMounts`. type: array items: - description: ContainerPort represents a network port in - a single container. type: object properties: - protocol: - description: Protocol for port. Must be UDP, TCP, or - SCTP. Defaults to "TCP". + mountPath: type: string - hostIP: - description: What host IP to bind the external port - to. + mountPropagation: type: string name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in a pod - must have a unique name. Name for the port that can - be referred to by services. type: string - containerPort: - description: Number of port to expose on the pod's IP - address. This must be a valid port number, 0 < x < - 65536. - type: number - hostPort: - description: Number of port to expose on the host. If - specified, this must be a valid port number, 0 < x - < 65536. If HostNetwork is specified, this must match - ContainerPort. Most containers do not need this. - type: number + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string required: - - containerPort - command: - description: 'Entrypoint array. Not executed within a shell. - The docker image''s ENTRYPOINT is used if this is not provided. - Variable references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the reference - in the input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). Escaped - references will never be expanded, regardless of whether - the variable exists or not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + - mountPath + - name + labels: + description: The labels to be added to generated resources. + The label names must not start with "weblogic.". + additionalProperties: type: string - volumeMounts: - description: Pod volumes to mount into the container's filesystem. - Cannot be updated. + type: object + runtimeClassName: + description: 'RuntimeClassName refers to a RuntimeClass object + in the node.k8s.io group, which should be used to run this + Pod. If no RuntimeClass resource matches the named class, + the Pod will not be run. If unset or empty, the "legacy" + RuntimeClass will be used, which is an implicit class with + an empty definition that uses the default runtime handler. + More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future. See + `kubectl explain pods.spec.runtimeClassName`.' + type: string + tolerations: + description: If specified, the Pod's tolerations. See `kubectl + explain pods.spec.tolerations`. type: array items: - description: VolumeMount describes a mounting of a Volume - within a container. type: object properties: - mountPath: - description: Path within the container at which the - volume should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and the - other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. + effect: type: string - name: - description: This must match the Name of a Volume. + tolerationSeconds: + type: number + value: type: string - readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's - root). + key: type: string - subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves - similarly to SubPath but environment variable references - $(VAR_NAME) are expanded using the container's environment. - Defaults to "" (volume's root). SubPathExpr and SubPath - are mutually exclusive. This field is beta in 1.15. + operator: type: string - required: - - mountPath - - name - args: - description: 'Arguments to the entrypoint. The docker image''s - CMD is used if this is not provided. Variable references - $(VAR_NAME) are expanded using the container''s environment. - If a variable cannot be resolved, the reference in the input - string will be unchanged. The $(VAR_NAME) syntax can be - escaped with a double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: - type: string - lifecycle: - description: Lifecycle describes actions that the management - system should take in response to container lifecycle events. - For the PostStart and PreStop lifecycle handlers, management - of the container blocks until the action is complete, unless - the container process fails, in which case the handler is - aborted. + readinessProbe: + description: Settings for the readiness probe associated with + a WebLogic Server instance. type: object properties: - postStart: - description: Handler defines a specific action that should - be taken - type: object - properties: - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory - for the command is root ('/') in the container's - filesystem. The command is simply exec'd, it - is not run inside a shell, so traditional shell - instructions ('|', etc) won't work. To use a - shell, you need to explicitly call out to that - shell. Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. + periodSeconds: + description: The number of seconds between checks. + type: number + timeoutSeconds: + description: The number of seconds with no response that + indicates a failure. + type: number + initialDelaySeconds: + description: The number of seconds before the first check + is performed. + type: number + containers: + description: Additional containers to be included in the server + Pod. See `kubectl explain pods.spec.containers`. + type: array + items: + type: object + properties: + volumeDevices: + type: array + items: type: object properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. + devicePath: type: string - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. + name: type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes + required: + - devicePath + - name + image: + type: string + imagePullPolicy: + type: string + livenessProbe: + type: object + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: + type: object + properties: + port: type: object properties: - name: - description: The header field name - type: string - value: - description: The header field value + intValue: + type: number + isInt: + type: boolean + strValue: type: string required: - - name - - value - required: - - port - preStop: - description: Handler defines a specific action that should - be taken - type: object - properties: - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory - for the command is root ('/') in the container's - filesystem. The command is simply exec'd, it - is not run inside a shell, so traditional shell - instructions ('|', etc) won't work. To use a - shell, you need to explicitly call out to that - shell. Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + - isInt + host: type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: type: object properties: - name: - description: The header field name - type: string - value: - description: The header field value + intValue: + type: number + isInt: + type: boolean + strValue: type: string required: - - name - - value - required: - - port - name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. - type: string - tty: - description: Whether this container should allocate a TTY - for itself, also requires 'stdin' to be true. Default is - false. - type: boolean - readinessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive or - ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold an - int32 or a string. When used in JSON or YAML marshalling - and unmarshalling, it produces or consumes the inner - type. This allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is 1. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', - etc) won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based on - HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can hold an - int32 or a string. When used in JSON or YAML marshalling - and unmarshalling, it produces or consumes the inner - type. This allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + stdin: + type: boolean + terminationMessagePolicy: + type: string + terminationMessagePath: + type: string + workingDir: + type: string + resources: + type: object + properties: + requests: + additionalProperties: type: string - required: - - isInt - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes + type: object + limits: + additionalProperties: + type: string + type: object + securityContext: + type: object + properties: + privileged: + type: boolean + runAsUser: + type: number + capabilities: type: object properties: - name: - description: The header field name + add: + type: array + items: + type: string + drop: + type: array + items: + type: string + seLinuxOptions: + type: object + properties: + role: type: string - value: - description: The header field value + level: type: string - required: - - name - - value - required: - - port - stdinOnce: - description: Whether the container runtime should close the - stdin channel after it has been opened by a single attach. - When stdin is true the stdin stream will remain open across - multiple attach sessions. If stdinOnce is set to true, stdin - is opened on container start, is empty until the first client - attaches to stdin, and then remains open and accepts data - until the client disconnects, at which time stdin is closed - and remains closed until the container is restarted. If - this flag is false, a container processes that reads from - stdin will never receive an EOF. Default is false - type: boolean - envFrom: - description: List of sources to populate environment variables - in the container. The keys defined within a source must - be a C_IDENTIFIER. All invalid keys will be reported as - an event when the container is starting. When a key exists - in multiple sources, the value associated with the last - source will take precedence. Values defined by an Env with - a duplicate key will take precedence. Cannot be updated. - type: array - items: - description: EnvFromSource represents the source of a set - of ConfigMaps - type: object - properties: - configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The contents - of the target ConfigMap's Data field will represent - the key-value pairs as environment variables. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: + type: string + user: + type: string + windowsOptions: + type: object + properties: + gmsaCredentialSpec: + type: string + runAsUserName: + type: string + gmsaCredentialSpecName: + type: string + procMount: type: string - optional: - description: Specify whether the ConfigMap must - be defined + allowPrivilegeEscalation: type: boolean - prefix: - description: An optional identifier to prepend to each - key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: SecretEnvSource selects a Secret to populate - the environment variables with. The contents of the - target Secret's Data field will represent the key-value - pairs as environment variables. + runAsGroup: + type: number + runAsNonRoot: + type: boolean + readOnlyRootFilesystem: + type: boolean + startupProbe: type: object properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret must be - defined - type: boolean - required: - - name - containerSecurityContext: - type: object - description: Container-level security attributes. Will override - any matching pod-level attributes. - properties: - privileged: - type: boolean - description: Run container in privileged mode. Processes in - privileged containers are essentially equivalent to root on - the host. Defaults to false. - runAsUser: - type: number - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. - capabilities: - type: object - description: Adds and removes POSIX capabilities from running - containers. - properties: - add: - type: array - description: Added capabilities - items: - type: string - drop: - type: array - description: Removed capabilities - items: - type: string - seLinuxOptions: - type: object - description: SELinuxOptions are the labels to be applied to - the container - properties: - role: - type: string - description: Role is a SELinux role label that applies to - the container. - level: - type: string - description: Level is SELinux level label that applies to - the container. - type: - type: string - description: Type is a SELinux type label that applies to - the container. - user: - type: string - description: User is a SELinux user label that applies to - the container. - windowsOptions: - type: object - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. - properties: - gmsaCredentialSpec: - type: string - description: GMSACredentialSpec is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec named - by the GMSACredentialSpecName field. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. - runAsUserName: - type: string - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set in PodSecurityContext. - If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - This field is alpha-level and it is only honored by servers - that enable the WindowsRunAsUserName feature flag. - gmsaCredentialSpecName: - type: string - description: GMSACredentialSpecName is the name of the GMSA - credential spec to use. This field is alpha-level and - is only honored by servers that enable the WindowsGMSA - feature flag. - procMount: - type: string - description: procMount denotes the type of proc mount to use - for the containers. The default is DefaultProcMount which - uses the container runtime defaults for readonly paths and - masked paths. This requires the ProcMountType feature flag - to be enabled. - allowPrivilegeEscalation: - type: boolean - description: 'AllowPrivilegeEscalation controls whether a process - can gain more privileges than its parent process. This bool - directly controls if the no_new_privs flag will be set on - the container process. AllowPrivilegeEscalation is true always - when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' - runAsGroup: - type: number - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be set in - PodSecurityContext. If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - runAsNonRoot: - type: boolean - description: Indicates that the container must run as a non-root - user. If true, the Kubelet will validate the image at runtime - to ensure that it does not run as UID 0 (root) and fail to - start the container if it does. If unset or false, no such - validation will be performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, the value - specified in SecurityContext takes precedence. - readOnlyRootFilesystem: - type: boolean - description: Whether this container has a read-only root filesystem. - Default is false. - schedulerName: - type: string - description: If specified, the pod will be dispatched by specified - scheduler. If not specified, the pod will be dispatched by default - scheduler. - initContainers: - type: array - description: Initialization containers to be included in the server - pod. - items: - description: A single application container that you want to run - within a pod. - type: object - properties: - volumeDevices: - description: volumeDevices is the list of block devices to - be used by the container. This is a beta feature. - type: array - items: - description: volumeDevice describes a mapping of a raw block - device within a container. - type: object - properties: - devicePath: - description: devicePath is the path inside of the container - that the device will be mapped to. - type: string - name: - description: name must match the name of a persistentVolumeClaim - in the pod - type: string - required: - - devicePath - - name - image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config management - to default or override container images in workload controllers - like Deployments and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One of Always, Never, IfNotPresent. - Defaults to Always if :latest tag is specified, or IfNotPresent - otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - livenessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive or - ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold an - int32 or a string. When used in JSON or YAML marshalling - and unmarshalling, it produces or consumes the inner - type. This allows you to have, for example, a JSON - field that can accept a name or number. + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + env: + type: array + items: type: object properties: - intValue: - type: number - isInt: - type: boolean - strValue: + name: + type: string + value: + type: string + valueFrom: + type: object + properties: + secretKeyRef: + type: object + properties: + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + resourceFieldRef: + type: object + properties: + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: + type: string + required: + - resource + configMapKeyRef: + type: object + properties: + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + fieldRef: + type: object + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + required: + - name + ports: + type: array + items: + type: object + properties: + protocol: + type: string + hostIP: + type: string + name: type: string + containerPort: + type: number + hostPort: + type: number required: - - isInt - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is 1. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', - etc) won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based on - HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. + - containerPort + command: + type: array + items: type: string - port: - description: IntOrString is a type that can hold an - int32 or a string. When used in JSON or YAML marshalling - and unmarshalling, it produces or consumes the inner - type. This allows you to have, for example, a JSON - field that can accept a name or number. + volumeMounts: + type: array + items: type: object properties: - intValue: - type: number - isInt: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: type: boolean - strValue: + subPath: + type: string + subPathExpr: type: string required: - - isInt - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in httpHeaders - instead. + - mountPath + - name + args: + type: array + items: type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes + lifecycle: + type: object + properties: + postStart: + type: object + properties: + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + preStop: + type: object + properties: + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + name: + type: string + tty: + type: boolean + readinessProbe: + type: object + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: type: object properties: - name: - description: The header field name + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: type: string - value: - description: The header field value + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value required: - - name - - value - required: - - port - stdin: - description: Whether this container should allocate a buffer - for stdin in the container runtime. If this is not set, - reads from stdin in the container will always result in - EOF. Default is false. - type: boolean - terminationMessagePolicy: - description: Indicate how the termination message should be - populated. File will use the contents of terminationMessagePath - to populate the container status message on both success - and failure. FallbackToLogsOnError will use the last chunk - of container log output if the termination message file - is empty and the container exited with an error. The log - output is limited to 2048 bytes or 80 lines, whichever is - smaller. Defaults to File. Cannot be updated. - type: string - terminationMessagePath: - description: 'Optional: Path at which the file to which the - container''s termination message will be written is mounted - into the container''s filesystem. Message written is intended - to be brief final status, such as an assertion failure message. - Will be truncated by the node if greater than 4096 bytes. - The total message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot be updated.' - type: string - workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which might - be configured in the container image. Cannot be updated. - type: string - resources: - description: ResourceRequirements describes the compute resource - requirements. - type: object - properties: - requests: - description: 'Requests describes the minimum amount of - compute resources required. If Requests is omitted for - a container, it defaults to Limits if that is explicitly - specified, otherwise to an implementation-defined value. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - limits: - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields are present - in both SecurityContext and PodSecurityContext. When both - are set, the values in SecurityContext take precedence. + - port + stdinOnce: + type: boolean + envFrom: + type: array + items: + type: object + properties: + configMapRef: + type: object + properties: + name: + type: string + optional: + type: boolean + prefix: + type: string + secretRef: + type: object + properties: + name: + type: string + optional: + type: boolean + required: + - name + containerSecurityContext: + description: Container-level security attributes. Will override + any matching Pod-level attributes. See `kubectl explain + pods.spec.containers.securityContext`. type: object properties: privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. type: boolean runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: number capabilities: - description: Adds and removes POSIX capabilities from - running containers. type: object properties: add: - description: Added capabilities type: array items: type: string drop: - description: Removed capabilities type: array items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to be applied - to the container type: object properties: role: - description: Role is a SELinux role label that applies - to the container. type: string level: - description: Level is SELinux level label that applies - to the container. type: string type: - description: Type is a SELinux type label that applies - to the container. type: string user: - description: User is a SELinux user label that applies - to the container. type: string windowsOptions: - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. type: string runAsUserName: - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and - it is only honored by servers that enable the WindowsRunAsUserName - feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name of - the GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. type: string procMount: - description: procMount denotes the type of proc mount - to use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. type: string allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent process. - This bool directly controls if the no_new_privs flag - will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. type: number runAsNonRoot: - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if it - does. If unset or false, no such validation will be - performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only root - filesystem. Default is false. type: boolean - startupProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive or - ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold an - int32 or a string. When used in JSON or YAML marshalling - and unmarshalling, it produces or consumes the inner - type. This allows you to have, for example, a JSON - field that can accept a name or number. + schedulerName: + description: If specified, the Pod will be dispatched by the + specified scheduler. If not specified, the Pod will be dispatched + by the default scheduler. See `kubectl explain pods.spec.schedulerName`. + type: string + initContainers: + description: Initialization containers to be included in the + server Pod. See `kubectl explain pods.spec.initContainers`. + type: array + items: + type: object + properties: + volumeDevices: + type: array + items: type: object properties: - intValue: - type: number - isInt: - type: boolean - strValue: + devicePath: type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is 1. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', - etc) won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based on - HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can hold an - int32 or a string. When used in JSON or YAML marshalling - and unmarshalling, it produces or consumes the inner - type. This allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: + name: type: string required: - - isInt - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes + - devicePath + - name + image: + type: string + imagePullPolicy: + type: string + livenessProbe: + type: object + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: type: object properties: - name: - description: The header field name + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: type: string - value: - description: The header field value + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value required: - - name - - value - required: - - port - env: - description: List of environment variables to set in the container. - Cannot be updated. - type: array - items: - description: EnvVar represents an environment variable present - in a Container. - type: object - properties: - name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. + - port + stdin: + type: boolean + terminationMessagePolicy: type: string - value: - description: 'Variable references $(VAR_NAME) are expanded - using the previous defined environment variables in - the container and any service environment variables. - If a variable cannot be resolved, the reference in - the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Defaults to - "".' + terminationMessagePath: type: string - valueFrom: - description: EnvVarSource represents a source for the - value of an EnvVar. + workingDir: + type: string + resources: type: object properties: - secretKeyRef: - description: SecretKeySelector selects a key of - a Secret. + requests: + additionalProperties: + type: string + type: object + limits: + additionalProperties: + type: string + type: object + securityContext: + type: object + properties: + privileged: + type: boolean + runAsUser: + type: number + capabilities: type: object properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - required: - - key - resourceFieldRef: - description: ResourceFieldSelector represents container - resources (cpu, memory) and their output format + add: + type: array + items: + type: string + drop: + type: array + items: + type: string + seLinuxOptions: type: object properties: - divisor: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" case - in .) ::= 0 | - 1 | ... | 9 ::= - | ::= - | . | . | . - ::= "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | Ti | - Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | - T | P | E (Note that 1024 = 1Ki but 1000 - = 1k; I didn''t choose the capitalization.) - ::= "e" | - "E" No matter which of the - three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than 3 - decimal places. Numbers larger or more precise - will be capped or rounded up. (E.g.: 0.1m - will rounded up to 1m.) This may be extended - in the future if we require larger or smaller - quantities. When a Quantity is parsed from - a string, it will remember the type of suffix - it had, and will use the same type again when - it is serialized. Before serializing, Quantity - will be put in "canonical form". This means - that Exponent/suffix will be adjusted up or - down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision - is lost b. No fractional digits will be - emitted c. The exponent (or suffix) is as - large as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi will - be serialized as "1536Mi" Note that the quantity - will NEVER be internally represented by a - floating point number. That is the whole point - of this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or don''t - diff.) This format is intended to make it - difficult to use these numbers without writing - some sort of special handling code in the - hopes that that will cause implementors to - also use a fixed point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to select' + role: type: string - containerName: - description: 'Container name: required for volumes, - optional for env vars' + level: type: string - required: - - resource - configMapKeyRef: - description: Selects a key from a ConfigMap. + type: + type: string + user: + type: string + windowsOptions: type: object properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + gmsaCredentialSpec: type: string - optional: - description: Specify whether the ConfigMap or - its key must be defined - type: boolean - key: - description: The key to select. + runAsUserName: type: string - required: - - key - fieldRef: - description: ObjectFieldSelector selects an APIVersioned - field of an object. + gmsaCredentialSpecName: + type: string + procMount: + type: string + allowPrivilegeEscalation: + type: boolean + runAsGroup: + type: number + runAsNonRoot: + type: boolean + readOnlyRootFilesystem: + type: boolean + startupProbe: + type: object + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: type: object properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in - the specified API version. + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: type: string required: - - fieldPath - required: - - name - ports: - description: List of ports to expose from the container. Exposing - a port here gives the system additional information about - the network connections a container uses, but is primarily - informational. Not specifying a port here DOES NOT prevent - that port from being exposed. Any port which is listening - on the default "0.0.0.0" address inside a container will - be accessible from the network. Cannot be updated. - type: array - items: - description: ContainerPort represents a network port in - a single container. - type: object - properties: - protocol: - description: Protocol for port. Must be UDP, TCP, or - SCTP. Defaults to "TCP". - type: string - hostIP: - description: What host IP to bind the external port - to. - type: string - name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in a pod - must have a unique name. Name for the port that can - be referred to by services. - type: string - containerPort: - description: Number of port to expose on the pod's IP - address. This must be a valid port number, 0 < x < - 65536. - type: number - hostPort: - description: Number of port to expose on the host. If - specified, this must be a valid port number, 0 < x - < 65536. If HostNetwork is specified, this must match - ContainerPort. Most containers do not need this. - type: number - required: - - containerPort - command: - description: 'Entrypoint array. Not executed within a shell. - The docker image''s ENTRYPOINT is used if this is not provided. - Variable references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the reference - in the input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). Escaped - references will never be expanded, regardless of whether - the variable exists or not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: - type: string - volumeMounts: - description: Pod volumes to mount into the container's filesystem. - Cannot be updated. - type: array - items: - description: VolumeMount describes a mounting of a Volume - within a container. - type: object - properties: - mountPath: - description: Path within the container at which the - volume should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and the - other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's - root). - type: string - subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves - similarly to SubPath but environment variable references - $(VAR_NAME) are expanded using the container's environment. - Defaults to "" (volume's root). SubPathExpr and SubPath - are mutually exclusive. This field is beta in 1.15. - type: string - required: - - mountPath - - name - args: - description: 'Arguments to the entrypoint. The docker image''s - CMD is used if this is not provided. Variable references - $(VAR_NAME) are expanded using the container''s environment. - If a variable cannot be resolved, the reference in the input - string will be unchanged. The $(VAR_NAME) syntax can be - escaped with a double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: - type: string - lifecycle: - description: Lifecycle describes actions that the management - system should take in response to container lifecycle events. - For the PostStart and PreStop lifecycle handlers, management - of the container blocks until the action is complete, unless - the container process fails, in which case the handler is - aborted. - type: object - properties: - postStart: - description: Handler defines a specific action that should - be taken - type: object - properties: - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory - for the command is root ('/') in the container's - filesystem. The command is simply exec'd, it - is not run inside a shell, so traditional shell - instructions ('|', etc) won't work. To use a - shell, you need to explicitly call out to that - shell. Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: type: object properties: - name: - description: The header field name - type: string - value: - description: The header field value + intValue: + type: number + isInt: + type: boolean + strValue: type: string required: - - name - - value - required: - - port - preStop: - description: Handler defines a specific action that should - be taken - type: object - properties: - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory - for the command is root ('/') in the container's - filesystem. The command is simply exec'd, it - is not run inside a shell, so traditional shell - instructions ('|', etc) won't work. To use a - shell, you need to explicitly call out to that - shell. Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. - type: array - items: + - isInt + host: type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + env: + type: array + items: type: object properties: - path: - description: Path to access on the HTTP server. + name: type: string - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. + value: type: string - port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or - YAML marshalling and unmarshalling, it produces - or consumes the inner type. This allows you - to have, for example, a JSON field that can - accept a name or number. + valueFrom: type: object properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. - type: string - tty: - description: Whether this container should allocate a TTY - for itself, also requires 'stdin' to be true. Default is - false. - type: boolean - readinessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive or - ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action based - on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can hold an - int32 or a string. When used in JSON or YAML marshalling - and unmarshalling, it produces or consumes the inner - type. This allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is 1. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', - etc) won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based on - HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can hold an - int32 or a string. When used in JSON or YAML marshalling - and unmarshalling, it produces or consumes the inner - type. This allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - stdinOnce: - description: Whether the container runtime should close the - stdin channel after it has been opened by a single attach. - When stdin is true the stdin stream will remain open across - multiple attach sessions. If stdinOnce is set to true, stdin - is opened on container start, is empty until the first client - attaches to stdin, and then remains open and accepts data - until the client disconnects, at which time stdin is closed - and remains closed until the container is restarted. If - this flag is false, a container processes that reads from - stdin will never receive an EOF. Default is false - type: boolean - envFrom: - description: List of sources to populate environment variables - in the container. The keys defined within a source must - be a C_IDENTIFIER. All invalid keys will be reported as - an event when the container is starting. When a key exists - in multiple sources, the value associated with the last - source will take precedence. Values defined by an Env with - a duplicate key will take precedence. Cannot be updated. - type: array - items: - description: EnvFromSource represents the source of a set - of ConfigMaps - type: object - properties: - configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The contents - of the target ConfigMap's Data field will represent - the key-value pairs as environment variables. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap must - be defined - type: boolean - prefix: - description: An optional identifier to prepend to each - key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: SecretEnvSource selects a Secret to populate - the environment variables with. The contents of the - target Secret's Data field will represent the key-value - pairs as environment variables. - type: object - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret must be - defined - type: boolean - required: - - name - shutdown: - type: object - description: Configures how the operator should shutdown the server - instance. - properties: - ignoreSessions: - type: boolean - description: For graceful shutdown only, indicates to ignore - pending HTTP sessions during in-flight work handling. Not - required. Defaults to false. - shutdownType: - type: string - description: Tells the operator how to shutdown server instances. - Not required. Defaults to graceful shutdown. - enum: - - Graceful - - Forced - timeoutSeconds: - type: number - description: For graceful shutdown only, number of seconds to - wait before aborting in-flight work and shutting down the - server. Not required. Defaults to 30 seconds. - affinity: - type: object - description: If specified, the pod's scheduling constraints - properties: - nodeAffinity: - type: object - description: Node affinity is a group of node affinity scheduling - rules. - properties: - requiredDuringSchedulingIgnoredDuringExecution: - type: object - description: A node selector represents the union of the - results of one or more label queries over a set of nodes; - that is, it represents the OR of the selectors represented - by the node selector terms. - properties: - nodeSelectorTerms: + secretKeyRef: + type: object + properties: + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + resourceFieldRef: + type: object + properties: + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: + type: string + required: + - resource + configMapKeyRef: + type: object + properties: + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + fieldRef: + type: object + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + required: + - name + ports: type: array - description: Required. A list of node selector terms. - The terms are ORed. items: - description: A null or empty node selector term matches - no objects. The requirements of them are ANDed. - The TopologySelectorTerm type implements a subset - of the NodeSelectorTerm. type: object properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - type: array - items: - description: A node selector requirement is - a selector that contains values, a key, and - an operator that relates the key and values. - type: object - properties: - values: - description: An array of string values. - If the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values - array must be empty. If the operator is - Gt or Lt, the values array must have a - single element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - type: array - items: - type: string - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - required: - - key - - operator - matchFields: - description: A list of node selector requirements - by node's fields. - type: array - items: - description: A node selector requirement is - a selector that contains values, a key, and - an operator that relates the key and values. - type: object - properties: - values: - description: An array of string values. - If the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values - array must be empty. If the operator is - Gt or Lt, the values array must have a - single element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - type: array - items: - type: string - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - required: - - key - - operator - required: - - nodeSelectorTerms - preferredDuringSchedulingIgnoredDuringExecution: - type: array - description: The scheduler will prefer to schedule pods - to nodes that satisfy the affinity expressions specified - by this field, but it may choose a node that violates - one or more of the expressions. The node that is most - preferred is the one with the greatest sum of weights, - i.e. for each node that meets all of the scheduling requirements - (resource request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements - of this field and adding "weight" to the sum if the node - matches the corresponding matchExpressions; the node(s) - with the highest sum are the most preferred. - items: - description: An empty preferred scheduling term matches - all objects with implicit weight 0 (i.e. it's a no-op). - A null preferred scheduling term matches no objects - (i.e. is also a no-op). - type: object - properties: - preference: - description: A null or empty node selector term matches - no objects. The requirements of them are ANDed. - The TopologySelectorTerm type implements a subset - of the NodeSelectorTerm. + protocol: + type: string + hostIP: + type: string + name: + type: string + containerPort: + type: number + hostPort: + type: number + required: + - containerPort + command: + type: array + items: + type: string + volumeMounts: + type: array + items: type: object properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - type: array - items: - description: A node selector requirement is - a selector that contains values, a key, and - an operator that relates the key and values. + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + args: + type: array + items: + type: string + lifecycle: + type: object + properties: + postStart: + type: object + properties: + tcpSocket: type: object properties: - values: - description: An array of string values. - If the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values - array must be empty. If the operator is - Gt or Lt, the values array must have a - single element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - type: array - items: - type: string - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: type: string required: - - key - - operator - matchFields: - description: A list of node selector requirements - by node's fields. - type: array - items: - description: A node selector requirement is - a selector that contains values, a key, and - an operator that relates the key and values. + - port + exec: type: object properties: - values: - description: An array of string values. - If the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values - array must be empty. If the operator is - Gt or Lt, the values array must have a - single element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. + command: type: array items: type: string - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - required: - - key - - operator - weight: - description: Weight associated with matching the corresponding - nodeSelectorTerm, in the range 1-100. - type: number - required: - - preference - - weight - podAffinity: - type: object - description: Pod affinity is a group of inter pod affinity scheduling - rules. - properties: - requiredDuringSchedulingIgnoredDuringExecution: - type: array - description: If the affinity requirements specified by this - field are not met at scheduling time, the pod will not - be scheduled onto the node. If the affinity requirements - specified by this field cease to be met at some point - during pod execution (e.g. due to a pod label update), - the system may or may not try to eventually evict the - pod from its node. When there are multiple elements, the - lists of nodes corresponding to each podAffinityTerm are - intersected, i.e. all terms must be satisfied. - items: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or not - co-located (anti-affinity) with, where co-located is - defined as running on a node whose value of the label - with key matches that of any node on which - a pod of the set of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label query over - a set of resources. The result of matchLabels and - matchExpressions are ANDed. An empty label selector - matches all objects. A null label selector matches - no objects. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - type: array - items: - description: A label selector requirement is - a selector that contains values, a key, and - an operator that relates the key and values. + httpGet: type: object properties: - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If - the operator is Exists or DoesNotExist, - the values array must be empty. This array - is replaced during a strategic merge patch. - type: array - items: - type: string - key: - description: key is the label key that the - selector applies to. + path: type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and DoesNotExist. + scheme: type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". - The requirements are ANDed. - additionalProperties: - type: string - type: object - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified namespaces, - where co-located is defined as running on a node - whose value of the label with key topologyKey matches - that of any node on which any of the selected pods - is running. Empty topologyKey is not allowed. - type: string - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - type: array - items: - type: string - required: - - topologyKey - preferredDuringSchedulingIgnoredDuringExecution: - type: array - description: The scheduler will prefer to schedule pods - to nodes that satisfy the affinity expressions specified - by this field, but it may choose a node that violates - one or more of the expressions. The node that is most - preferred is the one with the greatest sum of weights, - i.e. for each node that meets all of the scheduling requirements - (resource request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements - of this field and adding "weight" to the sum if the node - has pods which matches the corresponding podAffinityTerm; - the node(s) with the highest sum are the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred - node(s) - type: object - properties: - podAffinityTerm: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or - not co-located (anti-affinity) with, where co-located - is defined as running on a node whose value of the - label with key matches that of any - node on which a pod of the set of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label selector - matches no objects. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of - label selector requirements. The requirements - are ANDed. - type: array - items: - description: A label selector requirement - is a selector that contains values, a - key, and an operator that relates the - key and values. + port: type: object properties: - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - type: array - items: - type: string - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only - "value". The requirements are ANDed. - additionalProperties: - type: string - type: object - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified - namespaces, where co-located is defined as running - on a node whose value of the label with key - topologyKey matches that of any node on which - any of the selected pods is running. Empty topologyKey - is not allowed. - type: string - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - type: array - items: - type: string - required: - - topologyKey - weight: - description: weight associated with matching the corresponding - podAffinityTerm, in the range 1-100. - type: number - required: - - podAffinityTerm - - weight - podAntiAffinity: - type: object - description: Pod anti affinity is a group of inter pod anti - affinity scheduling rules. - properties: - requiredDuringSchedulingIgnoredDuringExecution: - type: array - description: If the anti-affinity requirements specified - by this field are not met at scheduling time, the pod - will not be scheduled onto the node. If the anti-affinity - requirements specified by this field cease to be met at - some point during pod execution (e.g. due to a pod label - update), the system may or may not try to eventually evict - the pod from its node. When there are multiple elements, - the lists of nodes corresponding to each podAffinityTerm - are intersected, i.e. all terms must be satisfied. - items: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or not - co-located (anti-affinity) with, where co-located is - defined as running on a node whose value of the label - with key matches that of any node on which - a pod of the set of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label query over - a set of resources. The result of matchLabels and - matchExpressions are ANDed. An empty label selector - matches all objects. A null label selector matches - no objects. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - type: array - items: - description: A label selector requirement is - a selector that contains values, a key, and - an operator that relates the key and values. - type: object - properties: - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If - the operator is Exists or DoesNotExist, - the values array must be empty. This array - is replaced during a strategic merge patch. + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: type: array items: - type: string - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and DoesNotExist. - type: string + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value required: - - key - - operator - matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". - The requirements are ANDed. - additionalProperties: - type: string - type: object - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified namespaces, - where co-located is defined as running on a node - whose value of the label with key topologyKey matches - that of any node on which any of the selected pods - is running. Empty topologyKey is not allowed. - type: string - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - type: array - items: - type: string - required: - - topologyKey - preferredDuringSchedulingIgnoredDuringExecution: - type: array - description: The scheduler will prefer to schedule pods - to nodes that satisfy the anti-affinity expressions specified - by this field, but it may choose a node that violates - one or more of the expressions. The node that is most - preferred is the one with the greatest sum of weights, - i.e. for each node that meets all of the scheduling requirements - (resource request, requiredDuringScheduling anti-affinity - expressions, etc.), compute a sum by iterating through - the elements of this field and adding "weight" to the - sum if the node has pods which matches the corresponding - podAffinityTerm; the node(s) with the highest sum are - the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred - node(s) - type: object - properties: - podAffinityTerm: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or - not co-located (anti-affinity) with, where co-located - is defined as running on a node whose value of the - label with key matches that of any - node on which a pod of the set of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label selector - matches no objects. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of - label selector requirements. The requirements - are ANDed. - type: array - items: - description: A label selector requirement - is a selector that contains values, a - key, and an operator that relates the - key and values. + - port + preStop: + type: object + properties: + tcpSocket: + type: object + properties: + port: type: object properties: - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - type: array - items: - type: string - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. + intValue: + type: number + isInt: + type: boolean + strValue: type: string required: - - key - - operator - matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only - "value". The requirements are ANDed. - additionalProperties: + - isInt + host: type: string - type: object - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified - namespaces, where co-located is defined as running - on a node whose value of the label with key - topologyKey matches that of any node on which - any of the selected pods is running. Empty topologyKey - is not allowed. - type: string - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - type: array - items: - type: string - required: - - topologyKey - weight: - description: weight associated with matching the corresponding - podAffinityTerm, in the range 1-100. - type: number - required: - - podAffinityTerm - - weight - logHome: - type: string - description: The in-pod name of the directory in which to store the - domain, Node Manager, server logs, and server *.out files. - includeServerOutInPodLog: - type: boolean - description: If true (the default), then the server .out file will be - included in the pod's stdout. - managedServers: - type: array - description: Configuration for individual Managed Servers. - items: - description: ManagedServer represents the operator configuration for - a single Managed Server. - type: object - properties: - serverStartState: - description: The state in which the server is to be started. Use - ADMIN if server should start in the admin state. Defaults to - RUNNING. - type: string - enum: - - RUNNING - - ADMIN - serverService: - description: Customization affecting ClusterIP Kubernetes services - for WebLogic Server instances. - type: object - properties: - precreateService: - description: If true, operator will create server services - even for server instances without running pods. - type: boolean - annotations: - description: The annotations to be attached to generated resources. - additionalProperties: - type: string - type: object - labels: - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. - additionalProperties: - type: string - type: object - serverName: - description: The name of the Managed Server. Required. - type: string - serverPod: - description: Configuration affecting server pods. - type: object - properties: - nodeName: - description: NodeName is a request to schedule this pod onto - a specific node. If it is non-empty, the scheduler simply - schedules this pod onto that node, assuming that it fits - resource requirements. - type: string - livenessProbe: - description: Settings for the liveness probe associated with - a server. - type: object - properties: - periodSeconds: - description: The number of seconds between checks. - type: number - timeoutSeconds: - description: The number of seconds with no response that - indicates a failure. - type: number - initialDelaySeconds: - description: The number of seconds before the first check - is performed. - type: number - readinessGates: - description: 'If specified, all readiness gates will be evaluated - for pod readiness. A pod is ready when all its containers - are ready AND all conditions specified in the readiness - gates have status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' - type: array - items: - description: PodReadinessGate contains the reference to - a pod condition - type: object - properties: - conditionType: - description: ConditionType refers to a condition in - the pod's condition list with matching type. - type: string - required: - - conditionType - serviceAccountName: - description: Name of the ServiceAccount to be used to run - this pod. If it is not set, default ServiceAccount will - be used. The ServiceAccount has to exist at the time the - pod is created. - type: string - podSecurityContext: - description: Pod-level security attributes. - type: object - properties: - runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence - for that container. - type: number - seLinuxOptions: - description: SELinuxOptions are the labels to be applied - to the container - type: object - properties: - role: - description: Role is a SELinux role label that applies - to the container. - type: string - level: - description: Level is SELinux level label that applies - to the container. - type: string - type: - description: Type is a SELinux type label that applies - to the container. - type: string - user: - description: User is a SELinux user label that applies - to the container. - type: string - fsGroup: - description: 'A special supplemental group that applies - to all containers in a pod. Some volume types allow - the Kubelet to change the ownership of that volume to - be owned by the pod: 1. The owning GID will be the - FSGroup 2. The setgid bit is set (new files created - in the volume will be owned by FSGroup) 3. The permission - bits are OR''d with rw-rw---- If unset, the Kubelet - will not modify the ownership and permissions of any - volume.' - type: number - windowsOptions: - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. - type: object - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. - type: string - runAsUserName: - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and - it is only honored by servers that enable the WindowsRunAsUserName - feature flag. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name of - the GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. - type: string - supplementalGroups: - description: A list of groups applied to the first process - run in each container, in addition to the container's - primary GID. If unspecified, no groups will be added - to any container. - type: array - items: - type: number - runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in SecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence for that container. - type: number - runAsNonRoot: - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if it - does. If unset or false, no such validation will be - performed. May also be set in SecurityContext. If set - in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. - type: boolean - sysctls: - description: Sysctls hold a list of namespaced sysctls - used for the pod. Pods with unsupported sysctls (by - the container runtime) might fail to launch. - type: array - items: - description: Sysctl defines a kernel parameter to be - set - type: object - properties: - name: - description: Name of a property to set - type: string - value: - description: Value of a property to set - type: string - required: - - name - - value - priorityClassName: - description: If specified, indicates the pod's priority. "system-node-critical" - and "system-cluster-critical" are two special keywords which - indicate the highest priorities with the former being the - highest priority. Any other name must be defined by creating - a PriorityClass object with that name. If not specified, - the pod priority will be default or zero if there is no - default. - type: string - volumes: - description: Additional volumes to be created in the server - pod. - type: array - items: - description: Volume represents a named volume in a pod that - may be accessed by any container in the pod. - type: object - properties: - quobyte: - description: Represents a Quobyte mount that lasts the - lifetime of a pod. Quobyte volumes do not support - ownership management or SELinux relabeling. - type: object - properties: - volume: - description: Volume is a string that references - an already created Quobyte volume by name. - type: string - registry: - description: Registry represents a single or multiple - Quobyte Registry services specified as a string - as host:port pair (multiple entries are separated - with commas) which acts as the central registry - for volumes - type: string - readOnly: - description: ReadOnly here will force the Quobyte - volume to be mounted with read-only permissions. - Defaults to false. - type: boolean - user: - description: User to map volume access to Defaults - to serivceaccount user - type: string - tenant: - description: Tenant owning the given Quobyte volume - in the Backend Used with dynamically provisioned - Quobyte volumes, value is set by the plugin - type: string - group: - description: Group to map volume access to Default - is no group - type: string - required: - - registry - - volume - azureFile: - description: AzureFile represents an Azure File Service - mount on the host and bind mount to the pod. - type: object - properties: - secretName: - description: the name of secret that contains Azure - Storage Account Name and Key - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - shareName: - description: Share Name - type: string - required: - - secretName - - shareName - flexVolume: - description: FlexVolume represents a generic volume - resource that is provisioned/attached using an exec - based plugin. + required: + - port + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + name: + type: string + tty: + type: boolean + readinessProbe: type: object properties: - driver: - description: Driver is the name of the driver to - use for this volume. - type: string - options: - description: 'Optional: Extra command options if - any.' - additionalProperties: - type: string - type: object - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: type: object properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' - type: boolean - fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". The default - filesystem depends on FlexVolume script. - type: string - required: - - driver - secret: - description: Adapts a Secret into a volume. The contents - of the target Secret's Data field will be presented - in a volume as files using the keys in the Data field - as the file names. Secret volumes support ownership - management and SELinux relabeling. - type: object - properties: - secretName: - description: 'Name of the secret in the pod''s namespace - to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: string - defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect - the file mode, like fsGroup, and the result can - be other mode bits set.' + required: + - port + timeoutSeconds: type: number - optional: - description: Specify whether the Secret or its keys - must be defined - type: boolean - items: - description: If unspecified, each key-value pair - in the Data field of the referenced Secret will - be projected into the volume as a file whose name - is the key and content is the value. If specified, - the listed keys will be projected into the specified - paths, and unlisted keys will not be present. - If a key is specified which is not present in - the Secret, the volume setup will error unless - it is marked optional. Paths must be relative - and may not contain the '..' path or start with - '..'. - type: array - items: - description: Maps a string key to a path within - a volume. + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + stdinOnce: + type: boolean + envFrom: + type: array + items: + type: object + properties: + configMapRef: type: object properties: - mode: - description: 'Optional: mode bits to use on - this file, must be a value between 0 and - 0777. If not specified, the volume defaultMode - will be used. This might be in conflict - with other options that affect the file - mode, like fsGroup, and the result can be - other mode bits set.' - type: number - path: - description: The relative path of the file - to map the key to. May not be an absolute - path. May not contain the path element '..'. - May not start with the string '..'. - type: string - key: - description: The key to project. + name: type: string - required: - - key - - path - projected: - description: Represents a projected volume source - type: object - properties: - sources: - description: list of volume projections - type: array - items: - description: Projection that may be projected - along with other supported volume types + optional: + type: boolean + prefix: + type: string + secretRef: type: object properties: - downwardAPI: - description: Represents downward API info - for projecting into a projected volume. - Note that this is identical to a downwardAPI - volume source without the default mode. - type: object - properties: + name: + type: string + optional: + type: boolean + required: + - name + shutdown: + description: Configures how the operator should shut down + the server instance. + type: object + properties: + ignoreSessions: + description: For graceful shutdown only, indicates to + ignore pending HTTP sessions during in-flight work handling. + Defaults to false. + type: boolean + shutdownType: + description: Specifies how the operator will shut down + server instances. Defaults to graceful shutdown. + type: string + enum: + - Graceful + - Forced + timeoutSeconds: + description: For graceful shutdown only, number of seconds + to wait before aborting in-flight work and shutting + down the server. Defaults to 30 seconds. + type: number + affinity: + description: If specified, the Pod's scheduling constraints. + See `kubectl explain pods.spec.affinity` + type: object + properties: + nodeAffinity: + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: object + properties: + nodeSelectorTerms: + type: array + items: + type: object + properties: + matchExpressions: + type: array items: - description: Items is a list of DownwardAPIVolume - file - type: array - items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field - type: object - properties: - mode: - description: 'Optional: mode bits - to use on this file, must be a - value between 0 and 0777. If not - specified, the volume defaultMode - will be used. This might be in - conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode - bits set.' - type: number - path: - description: 'Required: Path is the - relative path name of the file - to be created. Must not be absolute - or contain the ''..'' path. Must - be utf-8 encoded. The first item - of the relative path must not - start with ''..''' + type: object + properties: + values: + type: array + items: type: string - resourceFieldRef: - description: ResourceFieldSelector - represents container resources - (cpu, memory) and their output - format - type: object - properties: - divisor: - description: 'Quantity is a - fixed-point representation - of a number. It provides convenient - marshaling/unmarshaling in - JSON and YAML, in addition - to String() and AsInt64() - accessors. The serialization - format is: ::= - (Note - that may be empty, - from the "" case in .) - ::= 0 | - 1 | ... | 9 ::= - | - ::= - | . | . - | . ::= - "+" | "-" ::= - | - ::= - | | - ::= Ki | - Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | - "" | k | M | G | T | P | E (Note - that 1024 = 1Ki but 1000 = - 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No - matter which of the three - exponent forms is used, no - quantity may represent a number - greater than 2^63-1 in magnitude, - nor may it have more than - 3 decimal places. Numbers - larger or more precise will - be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) - This may be extended in the - future if we require larger - or smaller quantities. When - a Quantity is parsed from - a string, it will remember - the type of suffix it had, - and will use the same type - again when it is serialized. Before - serializing, Quantity will - be put in "canonical form". - This means that Exponent/suffix - will be adjusted up or down - (with a corresponding increase - or decrease in Mantissa) such - that: a. No precision is - lost b. No fractional digits - will be emitted c. The exponent - (or suffix) is as large as - possible. The sign will be - omitted unless the number - is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER - be internally represented - by a floating point number. - That is the whole point of - this exercise. Non-canonical - values will still parse as - long as they are well formed, - but will be re-emitted in - their canonical form. (So - always use canonical form, - or don''t diff.) This format - is intended to make it difficult - to use these numbers without - writing some sort of special - handling code in the hopes - that that will cause implementors - to also use a fixed point - implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource - to select' - type: string - containerName: - description: 'Container name: - required for volumes, optional - for env vars' - type: string - required: - - resource - fieldRef: - description: ObjectFieldSelector - selects an APIVersioned field - of an object. - type: object - properties: - apiVersion: - description: Version of the - schema the FieldPath is written - in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field - to select in the specified - API version. - type: string - required: - - fieldPath - required: - - path - configMap: - description: Adapts a ConfigMap into a projected - volume. The contents of the target ConfigMap's - Data field will be presented in a projected - volume as files using the keys in the Data - field as the file names, unless the items - element is populated with specific mappings - of keys to paths. Note that this is identical - to a configmap volume source without the - default mode. - type: object - properties: - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap - or its keys must be defined - type: boolean + key: + type: string + operator: + type: string + required: + - key + - operator + matchFields: + type: array items: - description: If unspecified, each key-value - pair in the Data field of the referenced - ConfigMap will be projected into the - volume as a file whose name is the key - and content is the value. If specified, - the listed keys will be projected into - the specified paths, and unlisted keys - will not be present. If a key is specified - which is not present in the ConfigMap, - the volume setup will error unless it - is marked optional. Paths must be relative - and may not contain the '..' path or - start with '..'. - type: array - items: - description: Maps a string key to a - path within a volume. - type: object - properties: - mode: - description: 'Optional: mode bits - to use on this file, must be a - value between 0 and 0777. If not - specified, the volume defaultMode - will be used. This might be in - conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode - bits set.' - type: number - path: - description: The relative path of - the file to map the key to. May - not be an absolute path. May not - contain the path element '..'. - May not start with the string - '..'. + type: object + properties: + values: + type: array + items: type: string - key: - description: The key to project. + key: + type: string + operator: + type: string + required: + - key + - operator + required: + - nodeSelectorTerms + preferredDuringSchedulingIgnoredDuringExecution: + type: array + items: + type: object + properties: + preference: + type: object + properties: + matchExpressions: + type: array + items: + type: object + properties: + values: + type: array + items: type: string - required: - - key - - path - secret: - description: Adapts a secret into a projected - volume. The contents of the target Secret's - Data field will be presented in a projected - volume as files using the keys in the Data - field as the file names. Note that this - is identical to a secret volume source without - the default mode. - type: object - properties: - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean + key: + type: string + operator: + type: string + required: + - key + - operator + matchFields: + type: array items: - description: If unspecified, each key-value - pair in the Data field of the referenced - Secret will be projected into the volume - as a file whose name is the key and - content is the value. If specified, - the listed keys will be projected into - the specified paths, and unlisted keys - will not be present. If a key is specified - which is not present in the Secret, - the volume setup will error unless it - is marked optional. Paths must be relative - and may not contain the '..' path or - start with '..'. - type: array - items: - description: Maps a string key to a - path within a volume. - type: object - properties: - mode: - description: 'Optional: mode bits - to use on this file, must be a - value between 0 and 0777. If not - specified, the volume defaultMode - will be used. This might be in - conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode - bits set.' - type: number - path: - description: The relative path of - the file to map the key to. May - not be an absolute path. May not - contain the path element '..'. - May not start with the string - '..'. + type: object + properties: + values: + type: array + items: type: string - key: - description: The key to project. + key: + type: string + operator: + type: string + required: + - key + - operator + weight: + type: number + required: + - preference + - weight + podAffinity: + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + items: + type: object + properties: + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: + type: object + properties: + values: + type: array + items: type: string - required: - - key - - path - serviceAccountToken: - description: ServiceAccountTokenProjection - represents a projected service account token - volume. This projection can be used to insert - a service account token into the pods runtime - filesystem for use against APIs (Kubernetes - API Server or otherwise). - type: object - properties: - path: - description: Path is the path relative - to the mount point of the file to project - the token into. - type: string - audience: - description: Audience is the intended - audience of the token. A recipient of - a token must identify itself with an - identifier specified in the audience - of the token, and otherwise should reject - the token. The audience defaults to - the identifier of the apiserver. + key: + type: string + operator: + type: string + required: + - key + - operator + matchLabels: + additionalProperties: type: string - expirationSeconds: - description: ExpirationSeconds is the - requested duration of validity of the - service account token. As the token - approaches expiration, the kubelet volume - plugin will proactively rotate the service - account token. The kubelet will start - trying to rotate the token if the token - is older than 80 percent of its time - to live or if the token is older than - 24 hours.Defaults to 1 hour and must - be at least 10 minutes. - type: number - required: - - path - defaultMode: - description: Mode bits to use on created files by - default. Must be a value between 0 and 0777. Directories - within the path are not affected by this setting. - This might be in conflict with other options that - affect the file mode, like fsGroup, and the result - can be other mode bits set. - type: number - required: - - sources - cephfs: - description: Represents a Ceph Filesystem mount that - lasts the lifetime of a pod Cephfs volumes do not - support ownership management or SELinux relabeling. - type: object - properties: - path: - description: 'Optional: Used as the mounted root, - rather than the full Ceph tree, default is /' - type: string - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. + type: object + topologyKey: + type: string + namespaces: + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + items: type: object properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - secretFile: - description: 'Optional: SecretFile is the path to - key ring for User, default is /etc/ceph/user.secret - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: boolean - user: - description: 'Optional: User is the rados user name, - default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - monitors: - description: 'Required: Monitors is a collection - of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: array - items: - type: string - required: - - monitors - scaleIO: - description: ScaleIOVolumeSource represents a persistent - ScaleIO volume - type: object - properties: - system: - description: The name of the storage system as configured - in ScaleIO. - type: string - protectionDomain: - description: The name of the ScaleIO Protection - Domain for the configured storage. - type: string - sslEnabled: - description: Flag to enable/disable SSL communication - with Gateway, default false - type: boolean - storageMode: - description: Indicates whether the storage for a - volume should be ThickProvisioned or ThinProvisioned. - Default is ThinProvisioned. - type: string - volumeName: - description: The name of a volume already created - in the ScaleIO system that is associated with - this volume source. - type: string - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. + podAffinityTerm: + type: object + properties: + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: + type: object + properties: + values: + type: array + items: + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + matchLabels: + additionalProperties: + type: string + type: object + topologyKey: + type: string + namespaces: + type: array + items: + type: string + required: + - topologyKey + weight: + type: number + required: + - podAffinityTerm + - weight + podAntiAffinity: + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + items: type: object properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Default is - "xfs". - type: string - storagePool: - description: The ScaleIO Storage Pool associated - with the protection domain. - type: string - gateway: - description: The host address of the ScaleIO API - Gateway. - type: string - required: - - gateway - - secretRef - - system - emptyDir: - description: Represents an empty directory for a pod. - Empty directory volumes support ownership management - and SELinux relabeling. - type: object - properties: - sizeLimit: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and - AsInt64() accessors. The serialization format - is: ::= (Note - that may be empty, from the "" case in - .) ::= 0 | 1 | ... - | 9 ::= | - ::= | . - | . | . ::= - "+" | "-" ::= | - ::= | - | ::= Ki | Mi | - Gi | Ti | Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T | - P | E (Note that 1024 = 1Ki but 1000 = 1k; I - didn''t choose the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms is used, - no quantity may represent a number greater than - 2^63-1 in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more precise - will be capped or rounded up. (E.g.: 0.1m will - rounded up to 1m.) This may be extended in the - future if we require larger or smaller quantities. When - a Quantity is parsed from a string, it will remember - the type of suffix it had, and will use the same - type again when it is serialized. Before serializing, - Quantity will be put in "canonical form". This - means that Exponent/suffix will be adjusted up - or down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision is lost b. - No fractional digits will be emitted c. The - exponent (or suffix) is as large as possible. - The sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole - point of this exercise. Non-canonical values - will still parse as long as they are well formed, - but will be re-emitted in their canonical form. - (So always use canonical form, or don''t diff.) This - format is intended to make it difficult to use - these numbers without writing some sort of special - handling code in the hopes that that will cause - implementors to also use a fixed point implementation.' + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: + type: object + properties: + values: + type: array + items: + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + matchLabels: + additionalProperties: + type: string + type: object + topologyKey: + type: string + namespaces: + type: array + items: + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + items: type: object properties: - number: + podAffinityTerm: + type: object + properties: + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: + type: object + properties: + values: + type: array + items: + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + matchLabels: + additionalProperties: + type: string + type: object + topologyKey: + type: string + namespaces: + type: array + items: + type: string + required: + - topologyKey + weight: type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - medium: - description: 'What type of storage medium should - back this directory. The default is "" which means - to use the node''s default medium. Must be an - empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: string - glusterfs: - description: Represents a Glusterfs mount that lasts - the lifetime of a pod. Glusterfs volumes do not support - ownership management or SELinux relabeling. + required: + - podAffinityTerm + - weight + clusterService: + description: Customization affecting Kubernetes Service generated + for this WebLogic cluster. + type: object + properties: + annotations: + description: The annotations to be added to generated resources. + additionalProperties: + type: string + type: object + labels: + description: The labels to be added to generated resources. + The label names must not start with "weblogic.". + additionalProperties: + type: string + type: object + serverStartPolicy: + description: 'The strategy for deciding whether to start a WebLogic + Server instance. Legal values are NEVER, or IF_NEEDED. Defaults + to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.' + type: string + enum: + - NEVER + - IF_NEEDED + maxConcurrentStartup: + description: The maximum number of Managed Servers instances that + the operator will start in parallel for this cluster in response + to a change in the `replicas` count. If more Managed Server + instances must be started, the operator will wait until a Managed + Server Pod is in the `Ready` state before starting the next + Managed Server instance. A value of 0 means all Managed Server + instances will start in parallel. Defaults to 0. + type: number + minimum: 0.0 + restartVersion: + description: 'Changes to this field cause the operator to restart + WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.' + type: string + required: + - clusterName + serverStartState: + type: string + description: The WebLogic runtime state in which the server is to be + started. Use ADMIN if the server should start in the admin state. + Defaults to RUNNING. + enum: + - RUNNING + - ADMIN + image: + type: string + description: The WebLogic container image; required when `domainHomeSourceType` + is Image or FromModel; otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4. + imagePullPolicy: + type: string + description: The image pull policy for the WebLogic container image. + Legal values are Always, Never, and IfNotPresent. Defaults to Always + if image ends in :latest; IfNotPresent, otherwise. + enum: + - Always + - Never + - IfNotPresent + maxClusterConcurrentStartup: + type: number + description: The maximum number of cluster member Managed Server instances + that the operator will start in parallel for a given cluster, if `maxConcurrentStartup` + is not specified for a specific cluster under the `clusters` field. + A value of 0 means there is no configured limit. Defaults to 0. + minimum: 0.0 + replicas: + type: number + description: The default number of cluster member Managed Server instances + to start for each WebLogic cluster in the domain configuration, unless + `replicas` is specified for that cluster under the `clusters` field. + For each cluster, the operator will sort cluster member Managed Server + names from the WebLogic domain configuration by normalizing any numbers + in the Managed Server name and then sorting alphabetically. This is + done so that server names such as "managed-server10" come after "managed-server9". + The operator will then start Managed Servers from the sorted list, + up to the `replicas` count, unless specific Managed Servers are specified + as starting in their entry under the `managedServers` field. In that + case, the specified Managed Servers will be started and then additional + cluster members will be started, up to the `replicas` count, by finding + further cluster members in the sorted list that are not already started. + If cluster members are started because of their entries under `managedServers`, + then a cluster may have more cluster members running than its `replicas` + count. Defaults to 0. + minimum: 0.0 + domainHomeInImage: + type: boolean + description: Deprecated. Use `domainHomeSourceType` instead. Ignored + if `domainHomeSourceType` is specified. True indicates that the domain + home file system is present in the container image specified by the + image field. False indicates that the domain home file system is located + on a persistent volume. Defaults to unset. + serverStartPolicy: + type: string + description: 'The strategy for deciding whether to start a WebLogic + Server instance. Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED. + Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.' + enum: + - NEVER + - IF_NEEDED + - ADMIN_ONLY + restartVersion: + type: string + description: 'Changes to this field cause the operator to restart WebLogic + Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.' + introspectVersion: + type: string + description: 'Changes to this field cause the operator to repeat its + introspection of the WebLogic domain configuration. Repeating introspection + is required for the operator to recognize changes to the domain configuration, + such as adding a new WebLogic cluster or Managed Server instance, + to regenerate configuration overrides, or to regenerate the WebLogic + domain home when the `domainHomeSourceType` is FromModel. Introspection + occurs automatically, without requiring change to this field, when + servers are first started or restarted after a full domain shut down. + For the FromModel `domainHomeSourceType`, introspection also occurs + when a running server must be restarted because of changes to any + of the fields listed here: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#properties-that-cause-servers-to-be-restarted. + See also `domains.spec.configuration.overridesConfigurationStrategy`.' + dataHome: + type: string + description: An optional directory in a server's container for data + storage of default and custom file stores. If `dataHome` is not specified + or its value is either not set or empty, then the data storage directories + are determined from the WebLogic domain configuration. + configOverrides: + type: string + description: Deprecated. Use `configuration.overridesConfigMap` instead. + Ignored if `configuration.overridesConfigMap` is specified. The name + of the ConfigMap for optional WebLogic configuration overrides. + logHomeEnabled: + type: boolean + description: Specifies whether the log home folder is enabled. Defaults + to true if `domainHomeSourceType` is PersistentVolume; false, otherwise. + allowReplicasBelowMinDynClusterSize: + type: boolean + description: Whether to allow the number of running cluster member Managed + Server instances to drop below the minimum dynamic cluster size configured + in the WebLogic domain configuration, if this is not specified for + a specific cluster under the `clusters` field. Defaults to true. + serverPod: + type: object + description: Customization affecting the generation of Pods for WebLogic + Server instances. + properties: + nodeName: + type: string + description: NodeName is a request to schedule this Pod onto a specific + Node. If it is non-empty, the scheduler simply schedules this + pod onto that node, assuming that it fits the resource requirements. + See `kubectl explain pods.spec.nodeName`. + livenessProbe: + type: object + description: Settings for the liveness probe associated with a WebLogic + Server instance. + properties: + periodSeconds: + type: number + description: The number of seconds between checks. + timeoutSeconds: + type: number + description: The number of seconds with no response that indicates + a failure. + initialDelaySeconds: + type: number + description: The number of seconds before the first check is + performed. + readinessGates: + type: array + description: 'If specified, all readiness gates will be evaluated + for Pod readiness. A Pod is ready when all its containers are + ready AND all conditions specified in the readiness gates have + a status equal to "True". More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md.' + items: + type: object + properties: + conditionType: + type: string + required: + - conditionType + serviceAccountName: + type: string + description: Name of the ServiceAccount to be used to run this Pod. + If it is not set, default ServiceAccount will be used. The ServiceAccount + has to exist at the time the Pod is created. See `kubectl explain + pods.spec.serviceAccountName`. + podSecurityContext: + type: object + description: Pod-level security attributes. See `kubectl explain + pods.spec.securityContext`. + properties: + runAsUser: + type: number + seLinuxOptions: + type: object + properties: + role: + type: string + level: + type: string + type: + type: string + user: + type: string + fsGroup: + type: number + windowsOptions: + type: object + properties: + gmsaCredentialSpec: + type: string + runAsUserName: + type: string + gmsaCredentialSpecName: + type: string + supplementalGroups: + type: array + items: + type: number + runAsGroup: + type: number + runAsNonRoot: + type: boolean + sysctls: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + priorityClassName: + type: string + description: If specified, indicates the Pod's priority. "system-node-critical" + and "system-cluster-critical" are two special keywords which indicate + the highest priorities with the former being the highest priority. + Any other name must be defined by creating a PriorityClass object + with that name. If not specified, the pod priority will be the + default or zero, if there is no default. See `kubectl explain + pods.spec.priorityClassName`. + volumes: + type: array + description: Additional volumes to be created in the server Pod. + See `kubectl explain pods.spec.volumes`. + items: + type: object + properties: + quobyte: + type: object + properties: + volume: + type: string + registry: + type: string + readOnly: + type: boolean + user: + type: string + tenant: + type: string + group: + type: string + required: + - registry + - volume + azureFile: + type: object + properties: + secretName: + type: string + readOnly: + type: boolean + shareName: + type: string + required: + - secretName + - shareName + flexVolume: + type: object + properties: + driver: + type: string + options: + additionalProperties: + type: string + type: object + secretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + required: + - driver + secret: + type: object + properties: + secretName: + type: string + defaultMode: + type: number + optional: + type: boolean + items: + type: array + items: type: object properties: + mode: + type: number path: - description: 'Path is the Glusterfs volume path. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string - endpoints: - description: 'EndpointsName is the endpoint name - that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + key: type: string - readOnly: - description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. - Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: boolean required: - - endpoints + - key - path - gcePersistentDisk: - description: Represents a Persistent Disk resource in - Google Compute Engine. A GCE PD must exist before - mounting to a container. The disk must also be in - the same GCE project and zone as the kubelet. A GCE - PD can only be mounted as read/write once or read-only - many times. GCE PDs support ownership management and - SELinux relabeling. - type: object - properties: - partition: - description: 'The partition in the volume that you - want to mount. If omitted, the default is to mount - by volume name. Examples: For volume /dev/sda1, - you specify the partition as "1". Similarly, the - volume partition for /dev/sda is "0" (or you can - leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: number - readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More - info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: boolean - pdName: - description: 'Unique name of the PD resource in - GCE. Used to identify the disk in GCE. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - required: - - pdName - photonPersistentDisk: - description: Represents a Photon Controller persistent - disk resource. - type: object - properties: - pdID: - description: ID that identifies Photon Controller - persistent disk - type: string - fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. - type: string - required: - - pdID - azureDisk: - description: AzureDisk represents an Azure Data Disk - mount on the host and bind mount to the pod. - type: object - properties: - diskName: - description: The Name of the data disk in the blob - storage - type: string - kind: - description: 'Expected values Shared: multiple blob - disks per storage account Dedicated: single blob - disk per storage account Managed: azure managed - data disk (only in managed availability set). - defaults to shared' - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - cachingMode: - description: 'Host Caching mode: None, Read Only, - Read Write.' - type: string - diskURI: - description: The URI the data disk in the blob storage - type: string - fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. - type: string - required: - - diskName - - diskURI - cinder: - description: Represents a cinder volume resource in - Openstack. A Cinder volume must exist before mounting - to a container. The volume must also be in the same - region as the kubelet. Cinder volumes support ownership - management and SELinux relabeling. + projected: + type: object + properties: + sources: + type: array + items: type: object properties: - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. + downwardAPI: type: object properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - volumeID: - description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: boolean - fsType: - description: 'Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - required: - - volumeID - downwardAPI: - description: DownwardAPIVolumeSource represents a volume - containing downward API info. Downward API volumes - support ownership management and SELinux relabeling. - type: object - properties: - defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect - the file mode, like fsGroup, and the result can - be other mode bits set.' - type: number - items: - description: Items is a list of downward API volume - file - type: array - items: - description: DownwardAPIVolumeFile represents - information to create the file containing the - pod field - type: object - properties: - mode: - description: 'Optional: mode bits to use on - this file, must be a value between 0 and - 0777. If not specified, the volume defaultMode - will be used. This might be in conflict - with other options that affect the file - mode, like fsGroup, and the result can be - other mode bits set.' - type: number - path: - description: 'Required: Path is the relative - path name of the file to be created. Must - not be absolute or contain the ''..'' path. - Must be utf-8 encoded. The first item of - the relative path must not start with ''..''' - type: string - resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format + items: + type: array + items: type: object properties: - divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the - "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | - Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M - | G | T | P | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms - is used, no quantity may represent a - number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may - be extended in the future if we require - larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type again - when it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. - No fractional digits will be emitted c. - The exponent (or suffix) is as large - as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always - use canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing - some sort of special handling code in - the hopes that that will cause implementors - to also use a fixed point implementation.' + mode: + type: number + path: + type: string + resourceFieldRef: type: object properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to select' - type: string - containerName: - description: 'Container name: required - for volumes, optional for env vars' - type: string - required: - - resource - fieldRef: - description: ObjectFieldSelector selects an - APIVersioned field of an object. - type: object - properties: - apiVersion: - description: Version of the schema the - FieldPath is written in terms of, defaults - to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath - required: - - path - awsElasticBlockStore: - description: Represents a Persistent Disk resource in - AWS. An AWS EBS disk must exist before mounting to - a container. The disk must also be in the same AWS - zone as the kubelet. An AWS EBS disk can only be mounted - as read/write once. AWS EBS volumes support ownership - management and SELinux relabeling. - type: object - properties: - partition: - description: 'The partition in the volume that you - want to mount. If omitted, the default is to mount - by volume name. Examples: For volume /dev/sda1, - you specify the partition as "1". Similarly, the - volume partition for /dev/sda is "0" (or you can - leave the property empty).' - type: number - volumeID: - description: 'Unique ID of the persistent disk resource - in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - readOnly: - description: 'Specify "true" to force and set the - ReadOnly property in VolumeMounts to "true". If - omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: boolean - fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - required: - - volumeID - flocker: - description: Represents a Flocker volume mounted by - the Flocker agent. One and only one of datasetName - and datasetUUID should be set. Flocker volumes do - not support ownership management or SELinux relabeling. - type: object - properties: - datasetName: - description: Name of the dataset stored as metadata - -> name on the dataset for Flocker should be considered - as deprecated - type: string - datasetUUID: - description: UUID of the dataset. This is unique - identifier of a Flocker dataset - type: string - iscsi: - description: Represents an ISCSI disk. ISCSI volumes - can only be mounted as read/write once. ISCSI volumes - support ownership management and SELinux relabeling. - type: object - properties: - chapAuthSession: - description: whether support iSCSI Session CHAP - authentication - type: boolean - iscsiInterface: - description: iSCSI Interface Name that uses an iSCSI - transport. Defaults to 'default' (tcp). - type: string - lun: - description: iSCSI Target Lun number. - type: number - chapAuthDiscovery: - description: whether support iSCSI Discovery CHAP - authentication - type: boolean - iqn: - description: Target iSCSI Qualified Name. - type: string - portals: - description: iSCSI Target Portal List. The portal - is either an IP or ip_addr:port if the port is - other than default (typically TCP ports 860 and - 3260). - type: array - items: - type: string - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - initiatorName: - description: Custom iSCSI Initiator Name. If initiatorName - is specified with iscsiInterface simultaneously, - new iSCSI interface : - will be created for the connection. - type: string - readOnly: - description: ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. - type: boolean - fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' - type: string - targetPortal: - description: iSCSI Target Portal. The Portal is - either an IP or ip_addr:port if the port is other - than default (typically TCP ports 860 and 3260). - type: string - required: - - iqn - - lun - - targetPortal - rbd: - description: Represents a Rados Block Device mount that - lasts the lifetime of a pod. RBD volumes support ownership - management and SELinux relabeling. - type: object - properties: - image: - description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - pool: - description: 'The rados pool name. Default is rbd. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: boolean - fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' - type: string - keyring: - description: 'Keyring is the path to key ring for - RBDUser. Default is /etc/ceph/keyring. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - user: - description: 'The rados user name. Default is admin. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - monitors: - description: 'A collection of Ceph monitors. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: array - items: - type: string - required: - - image - - monitors - configMap: - description: Adapts a ConfigMap into a volume. The - contents of the target ConfigMap's Data field will - be presented in a volume as files using the keys in - the Data field as the file names, unless the items - element is populated with specific mappings of keys - to paths. ConfigMap volumes support ownership management - and SELinux relabeling. - type: object - properties: - defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect - the file mode, like fsGroup, and the result can - be other mode bits set.' - type: number - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap or its - keys must be defined - type: boolean - items: - description: If unspecified, each key-value pair - in the Data field of the referenced ConfigMap - will be projected into the volume as a file whose - name is the key and content is the value. If specified, - the listed keys will be projected into the specified - paths, and unlisted keys will not be present. - If a key is specified which is not present in - the ConfigMap, the volume setup will error unless - it is marked optional. Paths must be relative - and may not contain the '..' path or start with - '..'. - type: array - items: - description: Maps a string key to a path within - a volume. - type: object - properties: - mode: - description: 'Optional: mode bits to use on - this file, must be a value between 0 and - 0777. If not specified, the volume defaultMode - will be used. This might be in conflict - with other options that affect the file - mode, like fsGroup, and the result can be - other mode bits set.' - type: number - path: - description: The relative path of the file - to map the key to. May not be an absolute - path. May not contain the path element '..'. - May not start with the string '..'. - type: string - key: - description: The key to project. - type: string - required: - - key - - path - storageos: - description: Represents a StorageOS persistent volume - resource. - type: object - properties: - volumeNamespace: - description: VolumeNamespace specifies the scope - of the volume within StorageOS. If no namespace - is specified then the Pod's namespace will be - used. This allows the Kubernetes name scoping - to be mirrored within StorageOS for tighter integration. - Set VolumeName to any name to override the default - behaviour. Set to "default" if you are not using - namespaces within StorageOS. Namespaces that do - not pre-exist within StorageOS will be created. - type: string - volumeName: - description: VolumeName is the human-readable name - of the StorageOS volume. Volume names are only - unique within a namespace. - type: string - secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: + type: string + required: + - resource + fieldRef: + type: object + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + required: + - path + configMap: type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. - type: string - csi: - description: Represents a source location of a volume - to mount, managed by an external CSI driver - type: object - properties: - driver: - description: Driver is the name of the CSI driver - that handles this volume. Consult with your admin - for the correct name as registered in the cluster. - type: string - nodePublishSecretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. + optional: + type: boolean + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + key: + type: string + required: + - key + - path + secret: type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string - readOnly: - description: Specifies a read-only configuration - for the volume. Defaults to false (read/write). - type: boolean - fsType: - description: Filesystem type to mount. Ex. "ext4", - "xfs", "ntfs". If not provided, the empty value - is passed to the associated CSI driver which will - determine the default filesystem to apply. - type: string - volumeAttributes: - description: VolumeAttributes stores driver-specific - properties that are passed to the CSI driver. - Consult your driver's documentation for supported - values. - additionalProperties: - type: string + optional: + type: boolean + items: + type: array + items: + type: object + properties: + mode: + type: number + path: + type: string + key: + type: string + required: + - key + - path + serviceAccountToken: type: object - required: - - driver - name: - description: 'Volume''s name. Must be a DNS_LABEL and - unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + properties: + path: + type: string + audience: + type: string + expirationSeconds: + type: number + required: + - path + defaultMode: + type: number + required: + - sources + cephfs: + type: object + properties: + path: + type: string + secretRef: + type: object + properties: + name: + type: string + secretFile: + type: string + readOnly: + type: boolean + user: + type: string + monitors: + type: array + items: type: string - nfs: - description: Represents an NFS mount that lasts the - lifetime of a pod. NFS volumes do not support ownership - management or SELinux relabeling. - type: object - properties: - path: - description: 'Path that is exported by the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - server: - description: 'Server is the hostname or IP address - of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - readOnly: - description: 'ReadOnly here will force the NFS export - to be mounted with read-only permissions. Defaults - to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: boolean - required: - - path - - server - persistentVolumeClaim: - description: PersistentVolumeClaimVolumeSource references - the user's PVC in the same namespace. This volume - finds the bound PV and mounts that volume for the - pod. A PersistentVolumeClaimVolumeSource is, essentially, - a wrapper around another type of volume that is owned - by someone else (the system). - type: object - properties: - claimName: - description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: string - readOnly: - description: Will force the ReadOnly setting in - VolumeMounts. Default false. - type: boolean - required: - - claimName - gitRepo: - description: 'Represents a volume that is populated - with the contents of a git repository. Git repo volumes - do not support ownership management. Git repo volumes - support SELinux relabeling. DEPRECATED: GitRepo is - deprecated. To provision a container with a git repo, - mount an EmptyDir into an InitContainer that clones - the repo using git, then mount the EmptyDir into the - Pod''s container.' - type: object - properties: - repository: - description: Repository URL - type: string - directory: - description: Target directory name. Must not contain - or start with '..'. If '.' is supplied, the volume - directory will be the git repository. Otherwise, - if specified, the volume will contain the git - repository in the subdirectory with the given - name. - type: string - revision: - description: Commit hash for the specified revision. - type: string - required: - - repository - portworxVolume: - description: PortworxVolumeSource represents a Portworx - volume resource. - type: object - properties: - volumeID: - description: VolumeID uniquely identifies a Portworx - volume - type: string - readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - fsType: - description: FSType represents the filesystem type - to mount Must be a filesystem type supported by - the host operating system. Ex. "ext4", "xfs". - Implicitly inferred to be "ext4" if unspecified. - type: string - required: - - volumeID - vsphereVolume: - description: Represents a vSphere volume resource. + required: + - monitors + scaleIO: + type: object + properties: + system: + type: string + protectionDomain: + type: string + sslEnabled: + type: boolean + storageMode: + type: string + volumeName: + type: string + secretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + storagePool: + type: string + gateway: + type: string + required: + - gateway + - secretRef + - system + emptyDir: + type: object + properties: + sizeLimit: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + medium: + type: string + glusterfs: + type: object + properties: + path: + type: string + endpoints: + type: string + readOnly: + type: boolean + required: + - endpoints + - path + gcePersistentDisk: + type: object + properties: + partition: + type: number + readOnly: + type: boolean + pdName: + type: string + fsType: + type: string + required: + - pdName + photonPersistentDisk: + type: object + properties: + pdID: + type: string + fsType: + type: string + required: + - pdID + azureDisk: + type: object + properties: + diskName: + type: string + kind: + type: string + readOnly: + type: boolean + cachingMode: + type: string + diskURI: + type: string + fsType: + type: string + required: + - diskName + - diskURI + cinder: + type: object + properties: + secretRef: + type: object + properties: + name: + type: string + volumeID: + type: string + readOnly: + type: boolean + fsType: + type: string + required: + - volumeID + downwardAPI: + type: object + properties: + defaultMode: + type: number + items: + type: array + items: type: object properties: - storagePolicyName: - description: Storage Policy Based Management (SPBM) - profile name. - type: string - storagePolicyID: - description: Storage Policy Based Management (SPBM) - profile ID associated with the StoragePolicyName. - type: string - volumePath: - description: Path that identifies vSphere volume - vmdk - type: string - fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. + mode: + type: number + path: type: string + resourceFieldRef: + type: object + properties: + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: + type: string + required: + - resource + fieldRef: + type: object + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath required: - - volumePath - fc: - description: Represents a Fibre Channel volume. Fibre - Channel volumes can only be mounted as read/write - once. Fibre Channel volumes support ownership management - and SELinux relabeling. + - path + awsElasticBlockStore: + type: object + properties: + partition: + type: number + volumeID: + type: string + readOnly: + type: boolean + fsType: + type: string + required: + - volumeID + flocker: + type: object + properties: + datasetName: + type: string + datasetUUID: + type: string + iscsi: + type: object + properties: + chapAuthSession: + type: boolean + iscsiInterface: + type: string + lun: + type: number + chapAuthDiscovery: + type: boolean + iqn: + type: string + portals: + type: array + items: + type: string + secretRef: + type: object + properties: + name: + type: string + initiatorName: + type: string + readOnly: + type: boolean + fsType: + type: string + targetPortal: + type: string + required: + - iqn + - lun + - targetPortal + rbd: + type: object + properties: + image: + type: string + pool: + type: string + secretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + keyring: + type: string + user: + type: string + monitors: + type: array + items: + type: string + required: + - image + - monitors + configMap: + type: object + properties: + defaultMode: + type: number + name: + type: string + optional: + type: boolean + items: + type: array + items: type: object properties: - lun: - description: 'Optional: FC target lun number' + mode: type: number - targetWWNs: - description: 'Optional: FC target worldwide names - (WWNs)' - type: array - items: - type: string - readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' - type: boolean - wwids: - description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' - type: array - items: - type: string - fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. - type: string - hostPath: - description: Represents a host path mapped into a pod. - Host path volumes do not support ownership management - or SELinux relabeling. - type: object - properties: path: - description: 'Path of the directory on the host. - If the path is a symlink, it will follow the link - to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string - type: - description: 'Type for HostPath Volume Defaults - to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + key: type: string required: + - key - path - required: - - name - resources: - description: Memory and CPU minimum requirements and limits - for the server. + storageos: + type: object + properties: + volumeNamespace: + type: string + volumeName: + type: string + secretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + csi: + type: object + properties: + driver: + type: string + nodePublishSecretRef: + type: object + properties: + name: + type: string + readOnly: + type: boolean + fsType: + type: string + volumeAttributes: + additionalProperties: + type: string + type: object + required: + - driver + name: + type: string + nfs: + type: object + properties: + path: + type: string + server: + type: string + readOnly: + type: boolean + required: + - path + - server + persistentVolumeClaim: + type: object + properties: + claimName: + type: string + readOnly: + type: boolean + required: + - claimName + gitRepo: + type: object + properties: + repository: + type: string + directory: + type: string + revision: + type: string + required: + - repository + portworxVolume: + type: object + properties: + volumeID: + type: string + readOnly: + type: boolean + fsType: + type: string + required: + - volumeID + vsphereVolume: type: object properties: - requests: - description: 'Requests describes the minimum amount of - compute resources required. If Requests is omitted for - a container, it defaults to Limits if that is explicitly - specified, otherwise to an implementation-defined value. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - limits: - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - annotations: - description: The annotations to be attached to generated resources. - additionalProperties: - type: string + storagePolicyName: + type: string + storagePolicyID: + type: string + volumePath: + type: string + fsType: + type: string + required: + - volumePath + fc: type: object - env: - description: A list of environment variables to add to a server. - type: array - items: - description: EnvVar represents an environment variable present - in a Container. - type: object - properties: - name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. + properties: + lun: + type: number + targetWWNs: + type: array + items: type: string - value: - description: 'Variable references $(VAR_NAME) are expanded - using the previous defined environment variables in - the container and any service environment variables. - If a variable cannot be resolved, the reference in - the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Defaults to - "".' + readOnly: + type: boolean + wwids: + type: array + items: type: string - valueFrom: - description: EnvVarSource represents a source for the - value of an EnvVar. - type: object - properties: - secretKeyRef: - description: SecretKeySelector selects a key of - a Secret. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - required: - - key - resourceFieldRef: - description: ResourceFieldSelector represents container - resources (cpu, memory) and their output format - type: object - properties: - divisor: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" case - in .) ::= 0 | - 1 | ... | 9 ::= - | ::= - | . | . | . - ::= "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | Ti | - Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | - T | P | E (Note that 1024 = 1Ki but 1000 - = 1k; I didn''t choose the capitalization.) - ::= "e" | - "E" No matter which of the - three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than 3 - decimal places. Numbers larger or more precise - will be capped or rounded up. (E.g.: 0.1m - will rounded up to 1m.) This may be extended - in the future if we require larger or smaller - quantities. When a Quantity is parsed from - a string, it will remember the type of suffix - it had, and will use the same type again when - it is serialized. Before serializing, Quantity - will be put in "canonical form". This means - that Exponent/suffix will be adjusted up or - down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision - is lost b. No fractional digits will be - emitted c. The exponent (or suffix) is as - large as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi will - be serialized as "1536Mi" Note that the quantity - will NEVER be internally represented by a - floating point number. That is the whole point - of this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or don''t - diff.) This format is intended to make it - difficult to use these numbers without writing - some sort of special handling code in the - hopes that that will cause implementors to - also use a fixed point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to select' - type: string - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - required: - - resource - configMapKeyRef: - description: Selects a key from a ConfigMap. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap or - its key must be defined - type: boolean - key: - description: The key to select. - type: string - required: - - key - fieldRef: - description: ObjectFieldSelector selects an APIVersioned - field of an object. - type: object - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in - the specified API version. - type: string - required: - - fieldPath - required: - - name - restartPolicy: - description: 'Restart policy for all containers within the - pod. One of Always, OnFailure, Never. Default to Always. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + fsType: + type: string + hostPath: + type: object + properties: + path: + type: string + type: + type: string + required: + - path + required: + - name + resources: + type: object + description: Memory and CPU minimum requirements and limits for + the WebLogic Server instance. See `kubectl explain pods.spec.containers.resources`. + properties: + requests: + type: object + additionalProperties: type: string - nodeSelector: - description: Selector which must match a node's labels for - the pod to be scheduled on that node. - additionalProperties: - type: string + limits: + type: object + additionalProperties: + type: string + annotations: + type: object + additionalProperties: + type: string + description: The annotations to be added to generated resources. + env: + type: array + description: 'A list of environment variables to set in the container + running a WebLogic Server instance. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-resource/#jvm-memory-and-java-option-environment-variables. + See `kubectl explain pods.spec.containers.env`.' + items: + type: object + properties: + name: + type: string + value: + type: string + valueFrom: type: object - volumeMounts: - description: Additional volume mounts for the server pod. + properties: + secretKeyRef: + type: object + properties: + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + resourceFieldRef: + type: object + properties: + divisor: + type: object + properties: + number: + type: number + format: + type: string + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: + type: string + required: + - resource + configMapKeyRef: + type: object + properties: + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + fieldRef: + type: object + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + required: + - name + restartPolicy: + type: string + description: 'Restart policy for all containers within the Pod. + One of Always, OnFailure, Never. Default to Always. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy. + See `kubectl explain pods.spec.restartPolicy`.' + nodeSelector: + type: object + additionalProperties: + type: string + description: Selector which must match a Node's labels for the Pod + to be scheduled on that Node. See `kubectl explain pods.spec.nodeSelector`. + volumeMounts: + type: array + description: Additional volume mounts for the container running + a WebLogic Server instance. See `kubectl explain pods.spec.containers.volumeMounts`. + items: + type: object + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + labels: + type: object + additionalProperties: + type: string + description: The labels to be added to generated resources. The + label names must not start with "weblogic.". + runtimeClassName: + type: string + description: 'RuntimeClassName refers to a RuntimeClass object in + the node.k8s.io group, which should be used to run this Pod. If + no RuntimeClass resource matches the named class, the Pod will + not be run. If unset or empty, the "legacy" RuntimeClass will + be used, which is an implicit class with an empty definition that + uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future. See `kubectl + explain pods.spec.runtimeClassName`.' + tolerations: + type: array + description: If specified, the Pod's tolerations. See `kubectl explain + pods.spec.tolerations`. + items: + type: object + properties: + effect: + type: string + tolerationSeconds: + type: number + value: + type: string + key: + type: string + operator: + type: string + readinessProbe: + type: object + description: Settings for the readiness probe associated with a + WebLogic Server instance. + properties: + periodSeconds: + type: number + description: The number of seconds between checks. + timeoutSeconds: + type: number + description: The number of seconds with no response that indicates + a failure. + initialDelaySeconds: + type: number + description: The number of seconds before the first check is + performed. + containers: + type: array + description: Additional containers to be included in the server + Pod. See `kubectl explain pods.spec.containers`. + items: + type: object + properties: + volumeDevices: type: array items: - description: VolumeMount describes a mounting of a Volume - within a container. type: object properties: - mountPath: - description: Path within the container at which the - volume should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and the - other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. + devicePath: type: string name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's - root). - type: string - subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves - similarly to SubPath but environment variable references - $(VAR_NAME) are expanded using the container's environment. - Defaults to "" (volume's root). SubPathExpr and SubPath - are mutually exclusive. This field is beta in 1.15. type: string required: - - mountPath + - devicePath - name - labels: - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. - additionalProperties: - type: string + image: + type: string + imagePullPolicy: + type: string + livenessProbe: type: object - runtimeClassName: - description: 'RuntimeClassName refers to a RuntimeClass object - in the node.k8s.io group, which should be used to run this - pod. If no RuntimeClass resource matches the named class, - the pod will not be run. If unset or empty, the "legacy" - RuntimeClass will be used, which is an implicit class with - an empty definition that uses the default runtime handler. - More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md - This is an alpha feature and may change in the future.' + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + stdin: + type: boolean + terminationMessagePolicy: type: string - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple using - the matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to match. - Empty means match all taint effects. When specified, - allowed values are NoSchedule, PreferNoSchedule and - NoExecute. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period - of time the toleration (which must be of effect NoExecute, - otherwise this field is ignored) tolerates the taint. - By default, it is not set, which means tolerate the - taint forever (do not evict). Zero and negative values - will be treated as 0 (evict immediately) by the system. - type: number - value: - description: Value is the taint value the toleration - matches to. If the operator is Exists, the value should - be empty, otherwise just a regular string. - type: string - key: - description: Key is the taint key that the toleration - applies to. Empty means match all taint keys. If the - key is empty, operator must be Exists; this combination - means to match all values and all keys. + terminationMessagePath: + type: string + workingDir: + type: string + resources: + type: object + properties: + requests: + additionalProperties: type: string - operator: - description: Operator represents a key's relationship - to the value. Valid operators are Exists and Equal. - Defaults to Equal. Exists is equivalent to wildcard - for value, so that a pod can tolerate all taints of - a particular category. + type: object + limits: + additionalProperties: type: string - readinessProbe: - description: Settings for the readiness probe associated with - a server. + type: object + securityContext: + type: object + properties: + privileged: + type: boolean + runAsUser: + type: number + capabilities: + type: object + properties: + add: + type: array + items: + type: string + drop: + type: array + items: + type: string + seLinuxOptions: + type: object + properties: + role: + type: string + level: + type: string + type: + type: string + user: + type: string + windowsOptions: + type: object + properties: + gmsaCredentialSpec: + type: string + runAsUserName: + type: string + gmsaCredentialSpecName: + type: string + procMount: + type: string + allowPrivilegeEscalation: + type: boolean + runAsGroup: + type: number + runAsNonRoot: + type: boolean + readOnlyRootFilesystem: + type: boolean + startupProbe: type: object properties: + failureThreshold: + type: number periodSeconds: - description: The number of seconds between checks. type: number + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port timeoutSeconds: - description: The number of seconds with no response that - indicates a failure. + type: number + successThreshold: type: number initialDelaySeconds: - description: The number of seconds before the first check - is performed. type: number - containers: - description: Additional containers to be included in the server - pod. + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + env: type: array items: - description: A single application container that you want - to run within a pod. type: object properties: - volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. - type: array - items: - description: volumeDevice describes a mapping of a - raw block device within a container. - type: object - properties: - devicePath: - description: devicePath is the path inside of - the container that the device will be mapped - to. - type: string - name: - description: name must match the name of a persistentVolumeClaim - in the pod - type: string - required: - - devicePath - - name - image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' + name: type: string - imagePullPolicy: - description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag is - specified, or IfNotPresent otherwise. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + value: type: string - livenessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. + valueFrom: type: object properties: - failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + secretKeyRef: type: object properties: - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + name: + type: string + optional: + type: boolean + key: type: string required: - - port - timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. + - key + resourceFieldRef: type: object properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + divisor: type: object properties: - intValue: + number: type: number - isInt: - type: boolean - strValue: + format: type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value required: - - port - stdin: - description: Whether this container should allocate - a buffer for stdin in the container runtime. If this - is not set, reads from stdin in the container will - always result in EOF. Default is false. - type: boolean - terminationMessagePolicy: - description: Indicate how the termination message should - be populated. File will use the contents of terminationMessagePath - to populate the container status message on both success - and failure. FallbackToLogsOnError will use the last - chunk of container log output if the termination message - file is empty and the container exited with an error. - The log output is limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to File. Cannot be - updated. - type: string - terminationMessagePath: - description: 'Optional: Path at which the file to which - the container''s termination message will be written - is mounted into the container''s filesystem. Message - written is intended to be brief final status, such - as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' - type: string - workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which - might be configured in the container image. Cannot - be updated. - type: string - resources: - description: ResourceRequirements describes the compute - resource requirements. - type: object - properties: - requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - limits: - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields are - present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take precedence. - type: object - properties: - privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. - type: boolean - runAsUser: - description: The UID to run the entrypoint of the - container process. Defaults to user specified - in image metadata if unspecified. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. - type: number - capabilities: - description: Adds and removes POSIX capabilities - from running containers. - type: object - properties: - add: - description: Added capabilities - type: array - items: - type: string - drop: - description: Removed capabilities - type: array - items: - type: string - seLinuxOptions: - description: SELinuxOptions are the labels to be - applied to the container + - resource + configMapKeyRef: type: object properties: - role: - description: Role is a SELinux role label that - applies to the container. - type: string - level: - description: Level is SELinux level label that - applies to the container. - type: string - type: - description: Type is a SELinux type label that - applies to the container. + name: type: string - user: - description: User is a SELinux user label that - applies to the container. + optional: + type: boolean + key: type: string - windowsOptions: - description: WindowsSecurityContextOptions contain - Windows-specific options and credentials. + required: + - key + fieldRef: type: object properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the - GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName field. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. - type: string - runAsUserName: - description: The UserName in Windows to run - the entrypoint of the container process. Defaults - to the user specified in image metadata if - unspecified. May also be set in PodSecurityContext. - If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. This field is alpha-level and - it is only honored by servers that enable - the WindowsRunAsUserName feature flag. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + apiVersion: type: string - procMount: - description: procMount denotes the type of proc - mount to use for the containers. The default is - DefaultProcMount which uses the container runtime - defaults for readonly paths and masked paths. - This requires the ProcMountType feature flag to - be enabled. - type: string - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the container - process. AllowPrivilegeEscalation is true always - when the container is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' - type: boolean - runAsGroup: - description: The GID to run the entrypoint of the - container process. Uses runtime default if unset. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - type: number - runAsNonRoot: - description: Indicates that the container must run - as a non-root user. If true, the Kubelet will - validate the image at runtime to ensure that it - does not run as UID 0 (root) and fail to start - the container if it does. If unset or false, no - such validation will be performed. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. - type: boolean - readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. - type: boolean - startupProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + fieldPath: type: string required: - - port - timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. - type: array - items: + - fieldPath + required: + - name + ports: + type: array + items: + type: object + properties: + protocol: + type: string + hostIP: + type: string + name: + type: string + containerPort: + type: number + hostPort: + type: number + required: + - containerPort + command: + type: array + items: + type: string + volumeMounts: + type: array + items: + type: object + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + args: + type: array + items: + type: string + lifecycle: + type: object + properties: + postStart: + type: object + properties: + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + required: + - isInt + host: + type: string + required: + - port + exec: + type: object + properties: + command: + type: array + items: type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: type: object properties: - intValue: - type: number - isInt: - type: boolean - strValue: + name: + type: string + value: type: string required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - env: - description: List of environment variables to set in - the container. Cannot be updated. - type: array - items: - description: EnvVar represents an environment variable - present in a Container. + - name + - value + required: + - port + preStop: + type: object + properties: + tcpSocket: type: object properties: - name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, - the reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a - double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether - the variable exists or not. Defaults to "".' - type: string - valueFrom: - description: EnvVarSource represents a source - for the value of an EnvVar. + port: type: object properties: - secretKeyRef: - description: SecretKeySelector selects a key - of a Secret. - type: object - properties: - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - required: - - key - resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format - type: object - properties: - divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the - "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | - Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M - | G | T | P | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms - is used, no quantity may represent a - number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may - be extended in the future if we require - larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type again - when it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. - No fractional digits will be emitted c. - The exponent (or suffix) is as large - as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always - use canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing - some sort of special handling code in - the hopes that that will cause implementors - to also use a fixed point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to select' - type: string - containerName: - description: 'Container name: required - for volumes, optional for env vars' - type: string - required: - - resource - configMapKeyRef: - description: Selects a key from a ConfigMap. - type: object - properties: - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - key: - description: The key to select. - type: string - required: - - key - fieldRef: - description: ObjectFieldSelector selects an - APIVersioned field of an object. - type: object - properties: - apiVersion: - description: Version of the schema the - FieldPath is written in terms of, defaults - to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string required: - - name - ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional information - about the network connections a container uses, but - is primarily informational. Not specifying a port - here DOES NOT prevent that port from being exposed. - Any port which is listening on the default "0.0.0.0" - address inside a container will be accessible from - the network. Cannot be updated. - type: array - items: - description: ContainerPort represents a network port - in a single container. + - port + exec: type: object properties: - protocol: - description: Protocol for port. Must be UDP, TCP, - or SCTP. Defaults to "TCP". + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: type: string - hostIP: - description: What host IP to bind the external - port to. + scheme: type: string - name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in - a pod must have a unique name. Name for the - port that can be referred to by services. + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: type: string - containerPort: - description: Number of port to expose on the pod's - IP address. This must be a valid port number, - 0 < x < 65536. - type: number - hostPort: - description: Number of port to expose on the host. - If specified, this must be a valid port number, - 0 < x < 65536. If HostNetwork is specified, - this must match ContainerPort. Most containers - do not need this. + httpHeaders: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + name: + type: string + tty: + type: boolean + readinessProbe: + type: object + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: type: number + isInt: + type: boolean + strValue: + type: string required: - - containerPort - command: - description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used if - this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. If - a variable cannot be resolved, the reference in the - input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be updated. - More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + - isInt + host: type: string - volumeMounts: - description: Pod volumes to mount into the container's - filesystem. Cannot be updated. - type: array - items: - description: VolumeMount describes a mounting of a - Volume within a container. + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: type: object properties: - mountPath: - description: Path within the container at which - the volume should be mounted. Must not contain - ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and - the other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to - false. + intValue: + type: number + isInt: type: boolean - subPath: - description: Path within the volume from which - the container's volume should be mounted. Defaults - to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment - variable references $(VAR_NAME) are expanded - using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath - are mutually exclusive. This field is beta in - 1.15. + strValue: type: string required: - - mountPath - - name - args: - description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. The - $(VAR_NAME) syntax can be escaped with a double $$, - ie: $$(VAR_NAME). Escaped references will never be - expanded, regardless of whether the variable exists - or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: + - isInt + host: type: string - lifecycle: - description: Lifecycle describes actions that the management - system should take in response to container lifecycle - events. For the PostStart and PreStop lifecycle handlers, - management of the container blocks until the action - is complete, unless the container process fails, in - which case the handler is aborted. - type: object - properties: - postStart: - description: Handler defines a specific action that - should be taken - type: object - properties: - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in - container" action. - type: object - properties: - command: - description: Command is the command line - to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP - server. - type: string - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - preStop: - description: Handler defines a specific action that - should be taken + httpHeaders: + type: array + items: type: object properties: - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in - container" action. - type: object - properties: - command: - description: Command is the command line - to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP - server. - type: string - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. + name: + type: string + value: + type: string + required: + - name + - value + required: + - port + stdinOnce: + type: boolean + envFrom: + type: array + items: + type: object + properties: + configMapRef: + type: object + properties: + name: + type: string + optional: + type: boolean + prefix: type: string - tty: - description: Whether this container should allocate - a TTY for itself, also requires 'stdin' to be true. - Default is false. - type: boolean - readinessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. + secretRef: type: object properties: - failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. + name: + type: string + optional: + type: boolean + required: + - name + containerSecurityContext: + type: object + description: Container-level security attributes. Will override + any matching Pod-level attributes. See `kubectl explain pods.spec.containers.securityContext`. + properties: + privileged: + type: boolean + runAsUser: + type: number + capabilities: + type: object + properties: + add: + type: array + items: + type: string + drop: + type: array + items: + type: string + seLinuxOptions: + type: object + properties: + role: + type: string + level: + type: string + type: + type: string + user: + type: string + windowsOptions: + type: object + properties: + gmsaCredentialSpec: + type: string + runAsUserName: + type: string + gmsaCredentialSpecName: + type: string + procMount: + type: string + allowPrivilegeEscalation: + type: boolean + runAsGroup: + type: number + runAsNonRoot: + type: boolean + readOnlyRootFilesystem: + type: boolean + schedulerName: + type: string + description: If specified, the Pod will be dispatched by the specified + scheduler. If not specified, the Pod will be dispatched by the + default scheduler. See `kubectl explain pods.spec.schedulerName`. + initContainers: + type: array + description: Initialization containers to be included in the server + Pod. See `kubectl explain pods.spec.initContainers`. + items: + type: object + properties: + volumeDevices: + type: array + items: + type: object + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + image: + type: string + imagePullPolicy: + type: string + livenessProbe: + type: object + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: type: object properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + name: type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. + value: type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value required: - - port - stdinOnce: - description: Whether the container runtime should close - the stdin channel after it has been opened by a single - attach. When stdin is true the stdin stream will remain - open across multiple attach sessions. If stdinOnce - is set to true, stdin is opened on container start, - is empty until the first client attaches to stdin, - and then remains open and accepts data until the client - disconnects, at which time stdin is closed and remains - closed until the container is restarted. If this flag - is false, a container processes that reads from stdin - will never receive an EOF. Default is false - type: boolean - envFrom: - description: List of sources to populate environment - variables in the container. The keys defined within - a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is - starting. When a key exists in multiple sources, the - value associated with the last source will take precedence. - Values defined by an Env with a duplicate key will - take precedence. Cannot be updated. - type: array - items: - description: EnvFromSource represents the source of - a set of ConfigMaps - type: object - properties: - configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field - will represent the key-value pairs as environment - variables. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap - must be defined - type: boolean - prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: SecretEnvSource selects a Secret - to populate the environment variables with. The - contents of the target Secret's Data field will - represent the key-value pairs as environment - variables. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret must - be defined - type: boolean - required: - - name - containerSecurityContext: - description: Container-level security attributes. Will override - any matching pod-level attributes. + - name + - value + required: + - port + stdin: + type: boolean + terminationMessagePolicy: + type: string + terminationMessagePath: + type: string + workingDir: + type: string + resources: + type: object + properties: + requests: + additionalProperties: + type: string + type: object + limits: + additionalProperties: + type: string + type: object + securityContext: type: object properties: privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. type: boolean runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: number capabilities: - description: Adds and removes POSIX capabilities from - running containers. type: object properties: add: - description: Added capabilities type: array items: type: string drop: - description: Removed capabilities type: array items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to be applied - to the container type: object properties: role: - description: Role is a SELinux role label that applies - to the container. type: string level: - description: Level is SELinux level label that applies - to the container. type: string type: - description: Type is a SELinux type label that applies - to the container. type: string user: - description: User is a SELinux user label that applies - to the container. type: string windowsOptions: - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. type: string runAsUserName: - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and - it is only honored by servers that enable the WindowsRunAsUserName - feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name of - the GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. type: string procMount: - description: procMount denotes the type of proc mount - to use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. type: string allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent process. - This bool directly controls if the no_new_privs flag - will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. type: number runAsNonRoot: - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if it - does. If unset or false, no such validation will be - performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only root - filesystem. Default is false. type: boolean - schedulerName: - description: If specified, the pod will be dispatched by specified - scheduler. If not specified, the pod will be dispatched - by default scheduler. - type: string - initContainers: - description: Initialization containers to be included in the - server pod. - type: array - items: - description: A single application container that you want - to run within a pod. - type: object - properties: - volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. - type: array - items: - description: volumeDevice describes a mapping of a - raw block device within a container. + startupProbe: + type: object + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: + type: object + properties: + port: type: object properties: - devicePath: - description: devicePath is the path inside of - the container that the device will be mapped - to. - type: string - name: - description: name must match the name of a persistentVolumeClaim - in the pod + intValue: + type: number + isInt: + type: boolean + strValue: type: string required: - - devicePath - - name - image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag is - specified, or IfNotPresent otherwise. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - livenessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. + - isInt + host: + type: string + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: type: object properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + name: type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. + value: type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value required: - - port - stdin: - description: Whether this container should allocate - a buffer for stdin in the container runtime. If this - is not set, reads from stdin in the container will - always result in EOF. Default is false. - type: boolean - terminationMessagePolicy: - description: Indicate how the termination message should - be populated. File will use the contents of terminationMessagePath - to populate the container status message on both success - and failure. FallbackToLogsOnError will use the last - chunk of container log output if the termination message - file is empty and the container exited with an error. - The log output is limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to File. Cannot be - updated. - type: string - terminationMessagePath: - description: 'Optional: Path at which the file to which - the container''s termination message will be written - is mounted into the container''s filesystem. Message - written is intended to be brief final status, such - as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' + - name + - value + required: + - port + env: + type: array + items: + type: object + properties: + name: type: string - workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which - might be configured in the container image. Cannot - be updated. + value: type: string - resources: - description: ResourceRequirements describes the compute - resource requirements. - type: object - properties: - requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - limits: - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - additionalProperties: - type: string - type: object - securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields are - present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take precedence. + valueFrom: type: object properties: - privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. - type: boolean - runAsUser: - description: The UID to run the entrypoint of the - container process. Defaults to user specified - in image metadata if unspecified. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. - type: number - capabilities: - description: Adds and removes POSIX capabilities - from running containers. - type: object - properties: - add: - description: Added capabilities - type: array - items: - type: string - drop: - description: Removed capabilities - type: array - items: - type: string - seLinuxOptions: - description: SELinuxOptions are the labels to be - applied to the container - type: object - properties: - role: - description: Role is a SELinux role label that - applies to the container. - type: string - level: - description: Level is SELinux level label that - applies to the container. - type: string - type: - description: Type is a SELinux type label that - applies to the container. - type: string - user: - description: User is a SELinux user label that - applies to the container. - type: string - windowsOptions: - description: WindowsSecurityContextOptions contain - Windows-specific options and credentials. + secretKeyRef: type: object properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the - GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName field. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. - type: string - runAsUserName: - description: The UserName in Windows to run - the entrypoint of the container process. Defaults - to the user specified in image metadata if - unspecified. May also be set in PodSecurityContext. - If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. This field is alpha-level and - it is only honored by servers that enable - the WindowsRunAsUserName feature flag. + name: type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + optional: + type: boolean + key: type: string - procMount: - description: procMount denotes the type of proc - mount to use for the containers. The default is - DefaultProcMount which uses the container runtime - defaults for readonly paths and masked paths. - This requires the ProcMountType feature flag to - be enabled. - type: string - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the container - process. AllowPrivilegeEscalation is true always - when the container is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' - type: boolean - runAsGroup: - description: The GID to run the entrypoint of the - container process. Uses runtime default if unset. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - type: number - runAsNonRoot: - description: Indicates that the container must run - as a non-root user. If true, the Kubelet will - validate the image at runtime to ensure that it - does not run as UID 0 (root) and fail to start - the container if it does. If unset or false, no - such validation will be performed. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. - type: boolean - readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. - type: boolean - startupProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + required: + - key + resourceFieldRef: type: object properties: - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + divisor: type: object properties: - intValue: + number: type: number - isInt: - type: boolean - strValue: + format: type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + enum: + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI + resource: + type: string + containerName: type: string required: - - port - timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. + - resource + configMapKeyRef: type: object properties: - command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. + name: + type: string + optional: + type: boolean + key: + type: string + required: + - key + fieldRef: type: object properties: - path: - description: Path to access on the HTTP server. - type: string - scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + apiVersion: type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. + fieldPath: type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value required: - - port - env: - description: List of environment variables to set in - the container. Cannot be updated. - type: array - items: - description: EnvVar represents an environment variable - present in a Container. + - fieldPath + required: + - name + ports: + type: array + items: + type: object + properties: + protocol: + type: string + hostIP: + type: string + name: + type: string + containerPort: + type: number + hostPort: + type: number + required: + - containerPort + command: + type: array + items: + type: string + volumeMounts: + type: array + items: + type: object + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + args: + type: array + items: + type: string + lifecycle: + type: object + properties: + postStart: + type: object + properties: + tcpSocket: type: object properties: - name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, - the reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a - double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether - the variable exists or not. Defaults to "".' - type: string - valueFrom: - description: EnvVarSource represents a source - for the value of an EnvVar. + port: type: object properties: - secretKeyRef: - description: SecretKeySelector selects a key - of a Secret. - type: object - properties: - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - required: - - key - resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format - type: object - properties: - divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the - "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | - Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M - | G | T | P | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms - is used, no quantity may represent a - number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may - be extended in the future if we require - larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type again - when it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. - No fractional digits will be emitted c. - The exponent (or suffix) is as large - as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always - use canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing - some sort of special handling code in - the hopes that that will cause implementors - to also use a fixed point implementation.' - type: object - properties: - number: - type: number - format: - type: string - enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI - resource: - description: 'Required: resource to select' - type: string - containerName: - description: 'Container name: required - for volumes, optional for env vars' - type: string - required: - - resource - configMapKeyRef: - description: Selects a key from a ConfigMap. - type: object - properties: - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - key: - description: The key to select. - type: string - required: - - key - fieldRef: - description: ObjectFieldSelector selects an - APIVersioned field of an object. - type: object - properties: - apiVersion: - description: Version of the schema the - FieldPath is written in terms of, defaults - to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string required: - - name - ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional information - about the network connections a container uses, but - is primarily informational. Not specifying a port - here DOES NOT prevent that port from being exposed. - Any port which is listening on the default "0.0.0.0" - address inside a container will be accessible from - the network. Cannot be updated. - type: array - items: - description: ContainerPort represents a network port - in a single container. + - port + exec: type: object properties: - protocol: - description: Protocol for port. Must be UDP, TCP, - or SCTP. Defaults to "TCP". - type: string - hostIP: - description: What host IP to bind the external - port to. - type: string - name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in - a pod must have a unique name. Name for the - port that can be referred to by services. - type: string - containerPort: - description: Number of port to expose on the pod's - IP address. This must be a valid port number, - 0 < x < 65536. - type: number - hostPort: - description: Number of port to expose on the host. - If specified, this must be a valid port number, - 0 < x < 65536. If HostNetwork is specified, - this must match ContainerPort. Most containers - do not need this. - type: number - required: - - containerPort - command: - description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used if - this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. If - a variable cannot be resolved, the reference in the - input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be updated. - More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: - type: string - volumeMounts: - description: Pod volumes to mount into the container's - filesystem. Cannot be updated. - type: array - items: - description: VolumeMount describes a mounting of a - Volume within a container. + command: + type: array + items: + type: string + httpGet: type: object properties: - mountPath: - description: Path within the container at which - the volume should be mounted. Must not contain - ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and - the other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. + path: type: string - readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to - false. - type: boolean - subPath: - description: Path within the volume from which - the container's volume should be mounted. Defaults - to "" (volume's root). + scheme: type: string - subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment - variable references $(VAR_NAME) are expanded - using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath - are mutually exclusive. This field is beta in - 1.15. + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: type: string - required: - - mountPath - - name - args: - description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. The - $(VAR_NAME) syntax can be escaped with a double $$, - ie: $$(VAR_NAME). Escaped references will never be - expanded, regardless of whether the variable exists - or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - type: array - items: - type: string - lifecycle: - description: Lifecycle describes actions that the management - system should take in response to container lifecycle - events. For the PostStart and PreStop lifecycle handlers, - management of the container blocks until the action - is complete, unless the container process fails, in - which case the handler is aborted. - type: object - properties: - postStart: - description: Handler defines a specific action that - should be taken - type: object - properties: - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in - container" action. - type: object - properties: - command: - description: Command is the command line - to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. - type: object - properties: - path: - description: Path to access on the HTTP - server. - type: string - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. - type: string - port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - required: - - port - preStop: - description: Handler defines a specific action that - should be taken - type: object - properties: - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - exec: - description: ExecAction describes a "run in - container" action. - type: object - properties: - command: - description: Command is the command line - to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + httpHeaders: + type: array + items: type: object properties: - path: - description: Path to access on the HTTP - server. - type: string - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + name: type: string - port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. - type: object - properties: - intValue: - type: number - isInt: - type: boolean - strValue: - type: string - required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + value: type: string - httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value required: - - port - name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. - type: string - tty: - description: Whether this container should allocate - a TTY for itself, also requires 'stdin' to be true. - Default is false. - type: boolean - readinessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. - type: object - properties: - failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. - type: number - periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. - type: number - tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket - type: object - properties: - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + - name + - value + required: + - port + preStop: + type: object + properties: + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: type: object properties: - intValue: - type: number - isInt: - type: boolean - strValue: + name: + type: string + value: type: string required: - - isInt - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - required: - - port - timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. - type: number - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - type: number - exec: - description: ExecAction describes a "run in container" - action. - type: object - properties: - command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. - type: array - items: - type: string - httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. + - name + - value + required: + - port + name: + type: string + tty: + type: boolean + readinessProbe: + type: object + properties: + failureThreshold: + type: number + periodSeconds: + type: number + tcpSocket: + type: object + properties: + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + required: + - port + timeoutSeconds: + type: number + successThreshold: + type: number + initialDelaySeconds: + type: number + exec: + type: object + properties: + command: + type: array + items: + type: string + httpGet: + type: object + properties: + path: + type: string + scheme: + type: string + port: + type: object + properties: + intValue: + type: number + isInt: + type: boolean + strValue: + type: string + required: + - isInt + host: + type: string + httpHeaders: + type: array + items: type: object properties: - path: - description: Path to access on the HTTP server. + name: type: string - scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + value: type: string - port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + required: + - name + - value + required: + - port + stdinOnce: + type: boolean + envFrom: + type: array + items: + type: object + properties: + configMapRef: + type: object + properties: + name: + type: string + optional: + type: boolean + prefix: + type: string + secretRef: + type: object + properties: + name: + type: string + optional: + type: boolean + required: + - name + shutdown: + type: object + description: Configures how the operator should shut down the server + instance. + properties: + ignoreSessions: + type: boolean + description: For graceful shutdown only, indicates to ignore + pending HTTP sessions during in-flight work handling. Defaults + to false. + shutdownType: + type: string + description: Specifies how the operator will shut down server + instances. Defaults to graceful shutdown. + enum: + - Graceful + - Forced + timeoutSeconds: + type: number + description: For graceful shutdown only, number of seconds to + wait before aborting in-flight work and shutting down the + server. Defaults to 30 seconds. + affinity: + type: object + description: If specified, the Pod's scheduling constraints. See + `kubectl explain pods.spec.affinity` + properties: + nodeAffinity: + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: object + properties: + nodeSelectorTerms: + type: array + items: + type: object + properties: + matchExpressions: + type: array + items: type: object properties: - intValue: - type: number - isInt: - type: boolean - strValue: + values: + type: array + items: + type: string + key: + type: string + operator: type: string required: - - isInt - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - type: array - items: - description: HTTPHeader describes a custom - header to be used in HTTP probes - type: object - properties: - name: - description: The header field name - type: string - value: - description: The header field value + - key + - operator + matchFields: + type: array + items: + type: object + properties: + values: + type: array + items: type: string - required: - - name - - value - required: - - port - stdinOnce: - description: Whether the container runtime should close - the stdin channel after it has been opened by a single - attach. When stdin is true the stdin stream will remain - open across multiple attach sessions. If stdinOnce - is set to true, stdin is opened on container start, - is empty until the first client attaches to stdin, - and then remains open and accepts data until the client - disconnects, at which time stdin is closed and remains - closed until the container is restarted. If this flag - is false, a container processes that reads from stdin - will never receive an EOF. Default is false - type: boolean - envFrom: - description: List of sources to populate environment - variables in the container. The keys defined within - a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is - starting. When a key exists in multiple sources, the - value associated with the last source will take precedence. - Values defined by an Env with a duplicate key will - take precedence. Cannot be updated. - type: array - items: - description: EnvFromSource represents the source of - a set of ConfigMaps - type: object - properties: - configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field - will represent the key-value pairs as environment - variables. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the ConfigMap - must be defined - type: boolean - prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: SecretEnvSource selects a Secret - to populate the environment variables with. The - contents of the target Secret's Data field will - represent the key-value pairs as environment - variables. - type: object - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - optional: - description: Specify whether the Secret must - be defined - type: boolean + key: + type: string + operator: + type: string + required: + - key + - operator required: - - name - shutdown: - description: Configures how the operator should shutdown the - server instance. - type: object - properties: - ignoreSessions: - description: For graceful shutdown only, indicates to - ignore pending HTTP sessions during in-flight work handling. - Not required. Defaults to false. - type: boolean - shutdownType: - description: Tells the operator how to shutdown server - instances. Not required. Defaults to graceful shutdown. - type: string - enum: - - Graceful - - Forced - timeoutSeconds: - description: For graceful shutdown only, number of seconds - to wait before aborting in-flight work and shutting - down the server. Not required. Defaults to 30 seconds. - type: number - affinity: - description: If specified, the pod's scheduling constraints - type: object - properties: - nodeAffinity: - description: Node affinity is a group of node affinity - scheduling rules. + - nodeSelectorTerms + preferredDuringSchedulingIgnoredDuringExecution: + type: array + items: type: object properties: - requiredDuringSchedulingIgnoredDuringExecution: - description: A node selector represents the union - of the results of one or more label queries over - a set of nodes; that is, it represents the OR of - the selectors represented by the node selector terms. + preference: type: object properties: - nodeSelectorTerms: - description: Required. A list of node selector - terms. The terms are ORed. + matchExpressions: type: array items: - description: A null or empty node selector term - matches no objects. The requirements of them - are ANDed. The TopologySelectorTerm type implements - a subset of the NodeSelectorTerm. type: object properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - type: array - items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - type: array - items: - type: string - key: - description: The label key that the - selector applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. - type: string - required: - - key - - operator - matchFields: - description: A list of node selector requirements - by node's fields. + values: type: array items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - type: array - items: - type: string - key: - description: The label key that the - selector applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. - type: string - required: - - key - - operator - required: - - nodeSelectorTerms - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule - pods to nodes that satisfy the affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. The - node that is most preferred is the one with the - greatest sum of weights, i.e. for each node that - meets all of the scheduling requirements (resource - request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements - of this field and adding "weight" to the sum if - the node matches the corresponding matchExpressions; - the node(s) with the highest sum are the most preferred. - type: array - items: - description: An empty preferred scheduling term - matches all objects with implicit weight 0 (i.e. - it's a no-op). A null preferred scheduling term - matches no objects (i.e. is also a no-op). - type: object - properties: - preference: - description: A null or empty node selector term - matches no objects. The requirements of them - are ANDed. The TopologySelectorTerm type implements - a subset of the NodeSelectorTerm. + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + matchFields: + type: array + items: type: object properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - type: array - items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - type: array - items: - type: string - key: - description: The label key that the - selector applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. - type: string - required: - - key - - operator - matchFields: - description: A list of node selector requirements - by node's fields. + values: type: array items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. - type: array - items: - type: string - key: - description: The label key that the - selector applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. - type: string - required: - - key - - operator - weight: - description: Weight associated with matching - the corresponding nodeSelectorTerm, in the - range 1-100. - type: number - required: - - preference - - weight - podAffinity: - description: Pod affinity is a group of inter pod affinity - scheduling rules. + type: string + key: + type: string + operator: + type: string + required: + - key + - operator + weight: + type: number + required: + - preference + - weight + podAffinity: + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + items: type: object properties: - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified - by this field are not met at scheduling time, the - pod will not be scheduled onto the node. If the - affinity requirements specified by this field cease - to be met at some point during pod execution (e.g. - due to a pod label update), the system may or may - not try to eventually evict the pod from its node. - When there are multiple elements, the lists of nodes - corresponding to each podAffinityTerm are intersected, - i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) with, - where co-located is defined as running on a node - whose value of the label with key - matches that of any node on which a pod of the - set of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label - selector matches no objects. + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: type: object properties: - matchExpressions: - description: matchExpressions is a list - of label selector requirements. The requirements - are ANDed. + values: type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: values is an array of - string values. If the operator is - In or NotIn, the values array must - be non-empty. If the operator is - Exists or DoesNotExist, the values - array must be empty. This array - is replaced during a strategic merge - patch. - type: array - items: - type: string - key: - description: key is the label key - that the selector applies to. - type: string - operator: - description: operator represents a - key's relationship to a set of values. - Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. - additionalProperties: type: string - type: object - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the - pods matching the labelSelector in the specified - namespaces, where co-located is defined as - running on a node whose value of the label - with key topologyKey matches that of any node - on which any of the selected pods is running. - Empty topologyKey is not allowed. - type: string - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - type: array - items: - type: string - required: - - topologyKey - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule - pods to nodes that satisfy the affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. The - node that is most preferred is the one with the - greatest sum of weights, i.e. for each node that - meets all of the scheduling requirements (resource - request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements - of this field and adding "weight" to the sum if - the node has pods which matches the corresponding - podAffinityTerm; the node(s) with the highest sum - are the most preferred. + key: + type: string + operator: + type: string + required: + - key + - operator + matchLabels: + additionalProperties: + type: string + type: object + topologyKey: + type: string + namespaces: type: array items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred - node(s) - type: object - properties: - podAffinityTerm: - description: Defines a set of pods (namely those - matching the labelSelector relative to the - given namespace(s)) that this pod should be - co-located (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on - which a pod of the set of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label - query over a set of resources. The result - of matchLabels and matchExpressions are - ANDed. An empty label selector matches - all objects. A null label selector matches - no objects. + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + items: + type: object + properties: + podAffinityTerm: + type: object + properties: + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: type: object properties: - matchExpressions: - description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. + values: type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. - This array is replaced during - a strategic merge patch. - type: array - items: - type: string - key: - description: key is the label - key that the selector applies - to. - type: string - operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map of - {key,value} pairs. A single {key,value} - in the matchLabels map is equivalent - to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are - ANDed. - additionalProperties: type: string - type: object - topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose - value of the label with key topologyKey - matches that of any node on which any - of the selected pods is running. Empty - topologyKey is not allowed. + key: + type: string + operator: + type: string + required: + - key + - operator + matchLabels: + additionalProperties: type: string - namespaces: - description: namespaces specifies which - namespaces the labelSelector applies to - (matches against); null or empty list - means "this pod's namespace" - type: array - items: - type: string - required: - - topologyKey - weight: - description: weight associated with matching - the corresponding podAffinityTerm, in the - range 1-100. - type: number - required: - - podAffinityTerm - - weight - podAntiAffinity: - description: Pod anti affinity is a group of inter pod - anti affinity scheduling rules. + type: object + topologyKey: + type: string + namespaces: + type: array + items: + type: string + required: + - topologyKey + weight: + type: number + required: + - podAffinityTerm + - weight + podAntiAffinity: + type: object + properties: + requiredDuringSchedulingIgnoredDuringExecution: + type: array + items: type: object properties: - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified - by this field are not met at scheduling time, the - pod will not be scheduled onto the node. If the - anti-affinity requirements specified by this field - cease to be met at some point during pod execution - (e.g. due to a pod label update), the system may - or may not try to eventually evict the pod from - its node. When there are multiple elements, the - lists of nodes corresponding to each podAffinityTerm - are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) with, - where co-located is defined as running on a node - whose value of the label with key - matches that of any node on which a pod of the - set of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label - selector matches no objects. + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: type: object properties: - matchExpressions: - description: matchExpressions is a list - of label selector requirements. The requirements - are ANDed. + values: type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: values is an array of - string values. If the operator is - In or NotIn, the values array must - be non-empty. If the operator is - Exists or DoesNotExist, the values - array must be empty. This array - is replaced during a strategic merge - patch. - type: array - items: - type: string - key: - description: key is the label key - that the selector applies to. - type: string - operator: - description: operator represents a - key's relationship to a set of values. - Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. - additionalProperties: type: string - type: object - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the - pods matching the labelSelector in the specified - namespaces, where co-located is defined as - running on a node whose value of the label - with key topologyKey matches that of any node - on which any of the selected pods is running. - Empty topologyKey is not allowed. + key: + type: string + operator: + type: string + required: + - key + - operator + matchLabels: + additionalProperties: type: string - namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" - type: array - items: - type: string - required: - - topologyKey - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule - pods to nodes that satisfy the anti-affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. The - node that is most preferred is the one with the - greatest sum of weights, i.e. for each node that - meets all of the scheduling requirements (resource - request, requiredDuringScheduling anti-affinity - expressions, etc.), compute a sum by iterating through - the elements of this field and adding "weight" to - the sum if the node has pods which matches the corresponding - podAffinityTerm; the node(s) with the highest sum - are the most preferred. + type: object + topologyKey: + type: string + namespaces: type: array items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred - node(s) - type: object - properties: - podAffinityTerm: - description: Defines a set of pods (namely those - matching the labelSelector relative to the - given namespace(s)) that this pod should be - co-located (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on - which a pod of the set of pods is running - type: object - properties: - labelSelector: - description: A label selector is a label - query over a set of resources. The result - of matchLabels and matchExpressions are - ANDed. An empty label selector matches - all objects. A null label selector matches - no objects. + type: string + required: + - topologyKey + preferredDuringSchedulingIgnoredDuringExecution: + type: array + items: + type: object + properties: + podAffinityTerm: + type: object + properties: + labelSelector: + type: object + properties: + matchExpressions: + type: array + items: type: object properties: - matchExpressions: - description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. + values: type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. - type: object - properties: - values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. - This array is replaced during - a strategic merge patch. - type: array - items: - type: string - key: - description: key is the label - key that the selector applies - to. - type: string - operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - required: - - key - - operator - matchLabels: - description: matchLabels is a map of - {key,value} pairs. A single {key,value} - in the matchLabels map is equivalent - to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are - ANDed. - additionalProperties: type: string - type: object - topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose - value of the label with key topologyKey - matches that of any node on which any - of the selected pods is running. Empty - topologyKey is not allowed. + key: + type: string + operator: + type: string + required: + - key + - operator + matchLabels: + additionalProperties: type: string - namespaces: - description: namespaces specifies which - namespaces the labelSelector applies to - (matches against); null or empty list - means "this pod's namespace" - type: array - items: - type: string - required: - - topologyKey - weight: - description: weight associated with matching - the corresponding podAffinityTerm, in the - range 1-100. - type: number - required: - - podAffinityTerm - - weight - serverStartPolicy: - description: The strategy for deciding whether to start a server. - Legal values are ALWAYS, NEVER, or IF_NEEDED. - type: string - enum: - - ALWAYS - - NEVER - - IF_NEEDED - restartVersion: - description: If present, every time this value is updated the - operator will restart the required servers. - type: string - required: - - serverName - clusters: + type: object + topologyKey: + type: string + namespaces: + type: array + items: + type: string + required: + - topologyKey + weight: + type: number + required: + - podAffinityTerm + - weight + managedServers: type: array - description: Configuration for the clusters. + description: Lifecycle options for individual Managed Servers, including + Java options, environment variables, additional Pod content, and the + ability to explicitly start, stop, or restart a named server instance. + The `serverName` field of each entry must match a Managed Server that + already exists in the WebLogic domain configuration or that matches + a dynamic cluster member based on the server template. items: - description: An element representing a cluster in the domain configuration. type: object properties: serverStartState: - description: The state in which the server is to be started. Use - ADMIN if server should start in the admin state. Defaults to - RUNNING. + description: The WebLogic runtime state in which the server is + to be started. Use ADMIN if the server should start in the admin + state. Defaults to RUNNING. type: string enum: - RUNNING - ADMIN serverService: - description: Customization affecting ClusterIP Kubernetes services - for WebLogic Server instances. + description: Customization affecting the generation of Kubernetes + Services for WebLogic Server instances. type: object properties: precreateService: - description: If true, operator will create server services - even for server instances without running pods. + description: If true, the operator will create Services even + for Managed Server instances without running Pods. type: boolean annotations: - description: The annotations to be attached to generated resources. + description: The annotations to be added to generated resources. additionalProperties: type: string type: object labels: - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. + description: The labels to be added to generated resources. + The label names must not start with "weblogic.". additionalProperties: type: string type: object - maxUnavailable: - description: The maximum number of cluster members that can be - temporarily unavailable. Defaults to 1. - type: number - minimum: 1.0 - replicas: - description: The number of cluster members to run. - type: number - minimum: 0.0 - clusterName: - description: The name of this cluster. Required + serverName: + description: The name of the Managed Server. This name must match + the name of a Managed Server instance or of a dynamic cluster + member name from a server template already defined in the WebLogic + domain configuration. Required. type: string serverPod: - description: Configuration affecting server pods. + description: Customization affecting the generation of Pods for + WebLogic Server instances. type: object properties: nodeName: - description: NodeName is a request to schedule this pod onto - a specific node. If it is non-empty, the scheduler simply + description: NodeName is a request to schedule this Pod onto + a specific Node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits - resource requirements. + the resource requirements. See `kubectl explain pods.spec.nodeName`. type: string livenessProbe: description: Settings for the liveness probe associated with - a server. + a WebLogic Server instance. type: object properties: periodSeconds: @@ -15507,459 +7660,185 @@ spec: type: number readinessGates: description: 'If specified, all readiness gates will be evaluated - for pod readiness. A pod is ready when all its containers + for Pod readiness. A Pod is ready when all its containers are ready AND all conditions specified in the readiness - gates have status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + gates have a status equal to "True". More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md.' type: array items: - description: PodReadinessGate contains the reference to - a pod condition type: object properties: conditionType: - description: ConditionType refers to a condition in - the pod's condition list with matching type. type: string required: - conditionType serviceAccountName: description: Name of the ServiceAccount to be used to run - this pod. If it is not set, default ServiceAccount will + this Pod. If it is not set, default ServiceAccount will be used. The ServiceAccount has to exist at the time the - pod is created. + Pod is created. See `kubectl explain pods.spec.serviceAccountName`. type: string podSecurityContext: - description: Pod-level security attributes. + description: Pod-level security attributes. See `kubectl explain + pods.spec.securityContext`. type: object properties: runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence - for that container. type: number seLinuxOptions: - description: SELinuxOptions are the labels to be applied - to the container type: object properties: role: - description: Role is a SELinux role label that applies - to the container. type: string level: - description: Level is SELinux level label that applies - to the container. type: string type: - description: Type is a SELinux type label that applies - to the container. type: string user: - description: User is a SELinux user label that applies - to the container. type: string fsGroup: - description: 'A special supplemental group that applies - to all containers in a pod. Some volume types allow - the Kubelet to change the ownership of that volume to - be owned by the pod: 1. The owning GID will be the - FSGroup 2. The setgid bit is set (new files created - in the volume will be owned by FSGroup) 3. The permission - bits are OR''d with rw-rw---- If unset, the Kubelet - will not modify the ownership and permissions of any - volume.' type: number windowsOptions: - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. type: string runAsUserName: - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and - it is only honored by servers that enable the WindowsRunAsUserName - feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name of - the GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. type: string supplementalGroups: - description: A list of groups applied to the first process - run in each container, in addition to the container's - primary GID. If unspecified, no groups will be added - to any container. type: array items: type: number runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in SecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence for that container. type: number runAsNonRoot: - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if it - does. If unset or false, no such validation will be - performed. May also be set in SecurityContext. If set - in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. type: boolean sysctls: - description: Sysctls hold a list of namespaced sysctls - used for the pod. Pods with unsupported sysctls (by - the container runtime) might fail to launch. type: array items: - description: Sysctl defines a kernel parameter to be - set type: object properties: name: - description: Name of a property to set type: string value: - description: Value of a property to set type: string required: - name - value priorityClassName: - description: If specified, indicates the pod's priority. "system-node-critical" + description: If specified, indicates the Pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, - the pod priority will be default or zero if there is no - default. + the pod priority will be the default or zero, if there is + no default. See `kubectl explain pods.spec.priorityClassName`. type: string volumes: description: Additional volumes to be created in the server - pod. + Pod. See `kubectl explain pods.spec.volumes`. type: array items: - description: Volume represents a named volume in a pod that - may be accessed by any container in the pod. type: object properties: quobyte: - description: Represents a Quobyte mount that lasts the - lifetime of a pod. Quobyte volumes do not support - ownership management or SELinux relabeling. type: object properties: volume: - description: Volume is a string that references - an already created Quobyte volume by name. type: string registry: - description: Registry represents a single or multiple - Quobyte Registry services specified as a string - as host:port pair (multiple entries are separated - with commas) which acts as the central registry - for volumes type: string readOnly: - description: ReadOnly here will force the Quobyte - volume to be mounted with read-only permissions. - Defaults to false. type: boolean user: - description: User to map volume access to Defaults - to serivceaccount user type: string tenant: - description: Tenant owning the given Quobyte volume - in the Backend Used with dynamically provisioned - Quobyte volumes, value is set by the plugin type: string group: - description: Group to map volume access to Default - is no group type: string required: - registry - volume azureFile: - description: AzureFile represents an Azure File Service - mount on the host and bind mount to the pod. type: object properties: secretName: - description: the name of secret that contains Azure - Storage Account Name and Key type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean shareName: - description: Share Name type: string required: - secretName - shareName flexVolume: - description: FlexVolume represents a generic volume - resource that is provisioned/attached using an exec - based plugin. type: object properties: driver: - description: Driver is the name of the driver to - use for this volume. type: string options: - description: 'Optional: Extra command options if - any.' additionalProperties: type: string type: object secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' type: boolean fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". The default - filesystem depends on FlexVolume script. type: string required: - driver secret: - description: Adapts a Secret into a volume. The contents - of the target Secret's Data field will be presented - in a volume as files using the keys in the Data field - as the file names. Secret volumes support ownership - management and SELinux relabeling. type: object properties: secretName: - description: 'Name of the secret in the pod''s namespace - to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' type: string defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect - the file mode, like fsGroup, and the result can - be other mode bits set.' type: number optional: - description: Specify whether the Secret or its keys - must be defined type: boolean items: - description: If unspecified, each key-value pair - in the Data field of the referenced Secret will - be projected into the volume as a file whose name - is the key and content is the value. If specified, - the listed keys will be projected into the specified - paths, and unlisted keys will not be present. - If a key is specified which is not present in - the Secret, the volume setup will error unless - it is marked optional. Paths must be relative - and may not contain the '..' path or start with - '..'. type: array items: - description: Maps a string key to a path within - a volume. type: object properties: mode: - description: 'Optional: mode bits to use on - this file, must be a value between 0 and - 0777. If not specified, the volume defaultMode - will be used. This might be in conflict - with other options that affect the file - mode, like fsGroup, and the result can be - other mode bits set.' type: number path: - description: The relative path of the file - to map the key to. May not be an absolute - path. May not contain the path element '..'. - May not start with the string '..'. type: string key: - description: The key to project. type: string required: - key - path projected: - description: Represents a projected volume source type: object properties: sources: - description: list of volume projections type: array items: - description: Projection that may be projected - along with other supported volume types type: object properties: downwardAPI: - description: Represents downward API info - for projecting into a projected volume. - Note that this is identical to a downwardAPI - volume source without the default mode. type: object properties: items: - description: Items is a list of DownwardAPIVolume - file type: array items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field type: object properties: mode: - description: 'Optional: mode bits - to use on this file, must be a - value between 0 and 0777. If not - specified, the volume defaultMode - will be used. This might be in - conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode - bits set.' type: number path: - description: 'Required: Path is the - relative path name of the file - to be created. Must not be absolute - or contain the ''..'' path. Must - be utf-8 encoded. The first item - of the relative path must not - start with ''..''' type: string resourceFieldRef: - description: ResourceFieldSelector - represents container resources - (cpu, memory) and their output - format type: object properties: divisor: - description: 'Quantity is a - fixed-point representation - of a number. It provides convenient - marshaling/unmarshaling in - JSON and YAML, in addition - to String() and AsInt64() - accessors. The serialization - format is: ::= - (Note - that may be empty, - from the "" case in .) - ::= 0 | - 1 | ... | 9 ::= - | - ::= - | . | . - | . ::= - "+" | "-" ::= - | - ::= - | | - ::= Ki | - Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | - "" | k | M | G | T | P | E (Note - that 1024 = 1Ki but 1000 = - 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No - matter which of the three - exponent forms is used, no - quantity may represent a number - greater than 2^63-1 in magnitude, - nor may it have more than - 3 decimal places. Numbers - larger or more precise will - be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) - This may be extended in the - future if we require larger - or smaller quantities. When - a Quantity is parsed from - a string, it will remember - the type of suffix it had, - and will use the same type - again when it is serialized. Before - serializing, Quantity will - be put in "canonical form". - This means that Exponent/suffix - will be adjusted up or down - (with a corresponding increase - or decrease in Mantissa) such - that: a. No precision is - lost b. No fractional digits - will be emitted c. The exponent - (or suffix) is as large as - possible. The sign will be - omitted unless the number - is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER - be internally represented - by a floating point number. - That is the whole point of - this exercise. Non-canonical - values will still parse as - long as they are well formed, - but will be re-emitted in - their canonical form. (So - always use canonical form, - or don''t diff.) This format - is intended to make it difficult - to use these numbers without - writing some sort of special - handling code in the hopes - that that will cause implementors - to also use a fixed point - implementation.' type: object properties: number: @@ -15971,368 +7850,135 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource - to select' type: string containerName: - description: 'Container name: - required for volumes, optional - for env vars' type: string required: - resource fieldRef: - description: ObjectFieldSelector - selects an APIVersioned field - of an object. type: object properties: apiVersion: - description: Version of the - schema the FieldPath is written - in terms of, defaults to "v1". type: string fieldPath: - description: Path of the field - to select in the specified - API version. type: string required: - fieldPath required: - path configMap: - description: Adapts a ConfigMap into a projected - volume. The contents of the target ConfigMap's - Data field will be presented in a projected - volume as files using the keys in the Data - field as the file names, unless the items - element is populated with specific mappings - of keys to paths. Note that this is identical - to a configmap volume source without the - default mode. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its keys must be defined type: boolean items: - description: If unspecified, each key-value - pair in the Data field of the referenced - ConfigMap will be projected into the - volume as a file whose name is the key - and content is the value. If specified, - the listed keys will be projected into - the specified paths, and unlisted keys - will not be present. If a key is specified - which is not present in the ConfigMap, - the volume setup will error unless it - is marked optional. Paths must be relative - and may not contain the '..' path or - start with '..'. type: array items: - description: Maps a string key to a - path within a volume. type: object properties: mode: - description: 'Optional: mode bits - to use on this file, must be a - value between 0 and 0777. If not - specified, the volume defaultMode - will be used. This might be in - conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode - bits set.' type: number path: - description: The relative path of - the file to map the key to. May - not be an absolute path. May not - contain the path element '..'. - May not start with the string - '..'. type: string key: - description: The key to project. type: string required: - key - path secret: - description: Adapts a secret into a projected - volume. The contents of the target Secret's - Data field will be presented in a projected - volume as files using the keys in the Data - field as the file names. Note that this - is identical to a secret volume source without - the default mode. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - or its key must be defined type: boolean items: - description: If unspecified, each key-value - pair in the Data field of the referenced - Secret will be projected into the volume - as a file whose name is the key and - content is the value. If specified, - the listed keys will be projected into - the specified paths, and unlisted keys - will not be present. If a key is specified - which is not present in the Secret, - the volume setup will error unless it - is marked optional. Paths must be relative - and may not contain the '..' path or - start with '..'. type: array items: - description: Maps a string key to a - path within a volume. type: object properties: mode: - description: 'Optional: mode bits - to use on this file, must be a - value between 0 and 0777. If not - specified, the volume defaultMode - will be used. This might be in - conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode - bits set.' type: number path: - description: The relative path of - the file to map the key to. May - not be an absolute path. May not - contain the path element '..'. - May not start with the string - '..'. type: string key: - description: The key to project. type: string required: - key - path serviceAccountToken: - description: ServiceAccountTokenProjection - represents a projected service account token - volume. This projection can be used to insert - a service account token into the pods runtime - filesystem for use against APIs (Kubernetes - API Server or otherwise). type: object properties: path: - description: Path is the path relative - to the mount point of the file to project - the token into. type: string audience: - description: Audience is the intended - audience of the token. A recipient of - a token must identify itself with an - identifier specified in the audience - of the token, and otherwise should reject - the token. The audience defaults to - the identifier of the apiserver. type: string expirationSeconds: - description: ExpirationSeconds is the - requested duration of validity of the - service account token. As the token - approaches expiration, the kubelet volume - plugin will proactively rotate the service - account token. The kubelet will start - trying to rotate the token if the token - is older than 80 percent of its time - to live or if the token is older than - 24 hours.Defaults to 1 hour and must - be at least 10 minutes. type: number required: - path defaultMode: - description: Mode bits to use on created files by - default. Must be a value between 0 and 0777. Directories - within the path are not affected by this setting. - This might be in conflict with other options that - affect the file mode, like fsGroup, and the result - can be other mode bits set. type: number required: - sources cephfs: - description: Represents a Ceph Filesystem mount that - lasts the lifetime of a pod Cephfs volumes do not - support ownership management or SELinux relabeling. type: object properties: path: - description: 'Optional: Used as the mounted root, - rather than the full Ceph tree, default is /' type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string secretFile: - description: 'Optional: SecretFile is the path to - key ring for User, default is /etc/ceph/user.secret - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: boolean user: - description: 'Optional: User is the rados user name, - default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string monitors: - description: 'Required: Monitors is a collection - of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: array items: type: string required: - monitors scaleIO: - description: ScaleIOVolumeSource represents a persistent - ScaleIO volume type: object properties: system: - description: The name of the storage system as configured - in ScaleIO. type: string protectionDomain: - description: The name of the ScaleIO Protection - Domain for the configured storage. type: string sslEnabled: - description: Flag to enable/disable SSL communication - with Gateway, default false type: boolean storageMode: - description: Indicates whether the storage for a - volume should be ThickProvisioned or ThinProvisioned. - Default is ThinProvisioned. type: string volumeName: - description: The name of a volume already created - in the ScaleIO system that is associated with - this volume source. type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Default is - "xfs". type: string storagePool: - description: The ScaleIO Storage Pool associated - with the protection domain. type: string gateway: - description: The host address of the ScaleIO API - Gateway. type: string required: - gateway - secretRef - system emptyDir: - description: Represents an empty directory for a pod. - Empty directory volumes support ownership management - and SELinux relabeling. type: object properties: sizeLimit: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and - AsInt64() accessors. The serialization format - is: ::= (Note - that may be empty, from the "" case in - .) ::= 0 | 1 | ... - | 9 ::= | - ::= | . - | . | . ::= - "+" | "-" ::= | - ::= | - | ::= Ki | Mi | - Gi | Ti | Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T | - P | E (Note that 1024 = 1Ki but 1000 = 1k; I - didn''t choose the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms is used, - no quantity may represent a number greater than - 2^63-1 in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more precise - will be capped or rounded up. (E.g.: 0.1m will - rounded up to 1m.) This may be extended in the - future if we require larger or smaller quantities. When - a Quantity is parsed from a string, it will remember - the type of suffix it had, and will use the same - type again when it is serialized. Before serializing, - Quantity will be put in "canonical form". This - means that Exponent/suffix will be adjusted up - or down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision is lost b. - No fractional digits will be emitted c. The - exponent (or suffix) is as large as possible. - The sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole - point of this exercise. Non-canonical values - will still parse as long as they are well formed, - but will be re-emitted in their canonical form. - (So always use canonical form, or don''t diff.) This - format is intended to make it difficult to use - these numbers without writing some sort of special - handling code in the hopes that that will cause - implementors to also use a fixed point implementation.' type: object properties: number: @@ -16344,266 +7990,93 @@ spec: - DECIMAL_SI - BINARY_SI medium: - description: 'What type of storage medium should - back this directory. The default is "" which means - to use the node''s default medium. Must be an - empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' type: string glusterfs: - description: Represents a Glusterfs mount that lasts - the lifetime of a pod. Glusterfs volumes do not support - ownership management or SELinux relabeling. type: object properties: path: - description: 'Path is the Glusterfs volume path. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string endpoints: - description: 'EndpointsName is the endpoint name - that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string readOnly: - description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. - Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: boolean required: - endpoints - path gcePersistentDisk: - description: Represents a Persistent Disk resource in - Google Compute Engine. A GCE PD must exist before - mounting to a container. The disk must also be in - the same GCE project and zone as the kubelet. A GCE - PD can only be mounted as read/write once or read-only - many times. GCE PDs support ownership management and - SELinux relabeling. type: object properties: partition: - description: 'The partition in the volume that you - want to mount. If omitted, the default is to mount - by volume name. Examples: For volume /dev/sda1, - you specify the partition as "1". Similarly, the - volume partition for /dev/sda is "0" (or you can - leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: number readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More - info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: boolean pdName: - description: 'Unique name of the PD resource in - GCE. Used to identify the disk in GCE. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string required: - pdName photonPersistentDisk: - description: Represents a Photon Controller persistent - disk resource. type: object properties: pdID: - description: ID that identifies Photon Controller - persistent disk type: string fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string required: - pdID azureDisk: - description: AzureDisk represents an Azure Data Disk - mount on the host and bind mount to the pod. type: object properties: diskName: - description: The Name of the data disk in the blob - storage type: string kind: - description: 'Expected values Shared: multiple blob - disks per storage account Dedicated: single blob - disk per storage account Managed: azure managed - data disk (only in managed availability set). - defaults to shared' type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean cachingMode: - description: 'Host Caching mode: None, Read Only, - Read Write.' type: string diskURI: - description: The URI the data disk in the blob storage type: string fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string required: - diskName - diskURI cinder: - description: Represents a cinder volume resource in - Openstack. A Cinder volume must exist before mounting - to a container. The volume must also be in the same - region as the kubelet. Cinder volumes support ownership - management and SELinux relabeling. type: object properties: secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string volumeID: - description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: boolean fsType: - description: 'Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://examples.k8s.io/mysql-cinder-pd/README.md' type: string required: - volumeID downwardAPI: - description: DownwardAPIVolumeSource represents a volume - containing downward API info. Downward API volumes - support ownership management and SELinux relabeling. type: object properties: defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect - the file mode, like fsGroup, and the result can - be other mode bits set.' type: number items: - description: Items is a list of downward API volume - file type: array items: - description: DownwardAPIVolumeFile represents - information to create the file containing the - pod field type: object properties: mode: - description: 'Optional: mode bits to use on - this file, must be a value between 0 and - 0777. If not specified, the volume defaultMode - will be used. This might be in conflict - with other options that affect the file - mode, like fsGroup, and the result can be - other mode bits set.' type: number path: - description: 'Required: Path is the relative - path name of the file to be created. Must - not be absolute or contain the ''..'' path. - Must be utf-8 encoded. The first item of - the relative path must not start with ''..''' type: string resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format type: object properties: divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the - "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | - Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M - | G | T | P | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms - is used, no quantity may represent a - number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may - be extended in the future if we require - larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type again - when it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. - No fractional digits will be emitted c. - The exponent (or suffix) is as large - as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always - use canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing - some sort of special handling code in - the hopes that that will cause implementors - to also use a fixed point implementation.' type: object properties: number: @@ -16615,198 +8088,97 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to select' type: string containerName: - description: 'Container name: required - for volumes, optional for env vars' type: string required: - resource fieldRef: - description: ObjectFieldSelector selects an - APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the - FieldPath is written in terms of, defaults - to "v1". type: string fieldPath: - description: Path of the field to select - in the specified API version. type: string required: - fieldPath required: - path awsElasticBlockStore: - description: Represents a Persistent Disk resource in - AWS. An AWS EBS disk must exist before mounting to - a container. The disk must also be in the same AWS - zone as the kubelet. An AWS EBS disk can only be mounted - as read/write once. AWS EBS volumes support ownership - management and SELinux relabeling. type: object properties: partition: - description: 'The partition in the volume that you - want to mount. If omitted, the default is to mount - by volume name. Examples: For volume /dev/sda1, - you specify the partition as "1". Similarly, the - volume partition for /dev/sda is "0" (or you can - leave the property empty).' type: number volumeID: - description: 'Unique ID of the persistent disk resource - in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string readOnly: - description: 'Specify "true" to force and set the - ReadOnly property in VolumeMounts to "true". If - omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: boolean fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string required: - volumeID flocker: - description: Represents a Flocker volume mounted by - the Flocker agent. One and only one of datasetName - and datasetUUID should be set. Flocker volumes do - not support ownership management or SELinux relabeling. type: object properties: datasetName: - description: Name of the dataset stored as metadata - -> name on the dataset for Flocker should be considered - as deprecated type: string datasetUUID: - description: UUID of the dataset. This is unique - identifier of a Flocker dataset type: string iscsi: - description: Represents an ISCSI disk. ISCSI volumes - can only be mounted as read/write once. ISCSI volumes - support ownership management and SELinux relabeling. type: object properties: chapAuthSession: - description: whether support iSCSI Session CHAP - authentication type: boolean iscsiInterface: - description: iSCSI Interface Name that uses an iSCSI - transport. Defaults to 'default' (tcp). type: string lun: - description: iSCSI Target Lun number. type: number chapAuthDiscovery: - description: whether support iSCSI Discovery CHAP - authentication type: boolean iqn: - description: Target iSCSI Qualified Name. type: string portals: - description: iSCSI Target Portal List. The portal - is either an IP or ip_addr:port if the port is - other than default (typically TCP ports 860 and - 3260). type: array items: type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string initiatorName: - description: Custom iSCSI Initiator Name. If initiatorName - is specified with iscsiInterface simultaneously, - new iSCSI interface : - will be created for the connection. type: string readOnly: - description: ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. type: boolean fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' type: string targetPortal: - description: iSCSI Target Portal. The Portal is - either an IP or ip_addr:port if the port is other - than default (typically TCP ports 860 and 3260). type: string required: - iqn - lun - targetPortal rbd: - description: Represents a Rados Block Device mount that - lasts the lifetime of a pod. RBD volumes support ownership - management and SELinux relabeling. type: object properties: image: - description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string pool: - description: 'The rados pool name. Default is rbd. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: boolean fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' type: string keyring: - description: 'Keyring is the path to key ring for - RBDUser. Default is /etc/ceph/keyring. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string user: - description: 'The rados user name. Default is admin. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string monitors: - description: 'A collection of Ceph monitors. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: array items: type: string @@ -16814,317 +8186,145 @@ spec: - image - monitors configMap: - description: Adapts a ConfigMap into a volume. The - contents of the target ConfigMap's Data field will - be presented in a volume as files using the keys in - the Data field as the file names, unless the items - element is populated with specific mappings of keys - to paths. ConfigMap volumes support ownership management - and SELinux relabeling. type: object properties: defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect - the file mode, like fsGroup, and the result can - be other mode bits set.' type: number name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap or its - keys must be defined type: boolean items: - description: If unspecified, each key-value pair - in the Data field of the referenced ConfigMap - will be projected into the volume as a file whose - name is the key and content is the value. If specified, - the listed keys will be projected into the specified - paths, and unlisted keys will not be present. - If a key is specified which is not present in - the ConfigMap, the volume setup will error unless - it is marked optional. Paths must be relative - and may not contain the '..' path or start with - '..'. type: array items: - description: Maps a string key to a path within - a volume. type: object properties: mode: - description: 'Optional: mode bits to use on - this file, must be a value between 0 and - 0777. If not specified, the volume defaultMode - will be used. This might be in conflict - with other options that affect the file - mode, like fsGroup, and the result can be - other mode bits set.' type: number path: - description: The relative path of the file - to map the key to. May not be an absolute - path. May not contain the path element '..'. - May not start with the string '..'. type: string key: - description: The key to project. type: string required: - key - path storageos: - description: Represents a StorageOS persistent volume - resource. type: object properties: volumeNamespace: - description: VolumeNamespace specifies the scope - of the volume within StorageOS. If no namespace - is specified then the Pod's namespace will be - used. This allows the Kubernetes name scoping - to be mirrored within StorageOS for tighter integration. - Set VolumeName to any name to override the default - behaviour. Set to "default" if you are not using - namespaces within StorageOS. Namespaces that do - not pre-exist within StorageOS will be created. type: string volumeName: - description: VolumeName is the human-readable name - of the StorageOS volume. Volume names are only - unique within a namespace. type: string secretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string csi: - description: Represents a source location of a volume - to mount, managed by an external CSI driver type: object properties: driver: - description: Driver is the name of the CSI driver - that handles this volume. Consult with your admin - for the correct name as registered in the cluster. type: string nodePublishSecretRef: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: Specifies a read-only configuration - for the volume. Defaults to false (read/write). type: boolean fsType: - description: Filesystem type to mount. Ex. "ext4", - "xfs", "ntfs". If not provided, the empty value - is passed to the associated CSI driver which will - determine the default filesystem to apply. type: string volumeAttributes: - description: VolumeAttributes stores driver-specific - properties that are passed to the CSI driver. - Consult your driver's documentation for supported - values. additionalProperties: type: string type: object required: - driver name: - description: 'Volume''s name. Must be a DNS_LABEL and - unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string nfs: - description: Represents an NFS mount that lasts the - lifetime of a pod. NFS volumes do not support ownership - management or SELinux relabeling. type: object properties: path: - description: 'Path that is exported by the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string server: - description: 'Server is the hostname or IP address - of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string readOnly: - description: 'ReadOnly here will force the NFS export - to be mounted with read-only permissions. Defaults - to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: boolean required: - path - server persistentVolumeClaim: - description: PersistentVolumeClaimVolumeSource references - the user's PVC in the same namespace. This volume - finds the bound PV and mounts that volume for the - pod. A PersistentVolumeClaimVolumeSource is, essentially, - a wrapper around another type of volume that is owned - by someone else (the system). type: object properties: claimName: - description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' type: string readOnly: - description: Will force the ReadOnly setting in - VolumeMounts. Default false. type: boolean required: - claimName gitRepo: - description: 'Represents a volume that is populated - with the contents of a git repository. Git repo volumes - do not support ownership management. Git repo volumes - support SELinux relabeling. DEPRECATED: GitRepo is - deprecated. To provision a container with a git repo, - mount an EmptyDir into an InitContainer that clones - the repo using git, then mount the EmptyDir into the - Pod''s container.' type: object properties: repository: - description: Repository URL type: string directory: - description: Target directory name. Must not contain - or start with '..'. If '.' is supplied, the volume - directory will be the git repository. Otherwise, - if specified, the volume will contain the git - repository in the subdirectory with the given - name. type: string revision: - description: Commit hash for the specified revision. type: string required: - repository portworxVolume: - description: PortworxVolumeSource represents a Portworx - volume resource. type: object properties: volumeID: - description: VolumeID uniquely identifies a Portworx - volume type: string readOnly: - description: Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: FSType represents the filesystem type - to mount Must be a filesystem type supported by - the host operating system. Ex. "ext4", "xfs". - Implicitly inferred to be "ext4" if unspecified. type: string required: - volumeID vsphereVolume: - description: Represents a vSphere volume resource. type: object properties: storagePolicyName: - description: Storage Policy Based Management (SPBM) - profile name. type: string storagePolicyID: - description: Storage Policy Based Management (SPBM) - profile ID associated with the StoragePolicyName. type: string volumePath: - description: Path that identifies vSphere volume - vmdk type: string fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string required: - volumePath fc: - description: Represents a Fibre Channel volume. Fibre - Channel volumes can only be mounted as read/write - once. Fibre Channel volumes support ownership management - and SELinux relabeling. type: object properties: lun: - description: 'Optional: FC target lun number' type: number targetWWNs: - description: 'Optional: FC target worldwide names - (WWNs)' type: array items: type: string readOnly: - description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' type: boolean wwids: - description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' type: array items: type: string fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. type: string hostPath: - description: Represents a host path mapped into a pod. - Host path volumes do not support ownership management - or SELinux relabeling. type: object properties: path: - description: 'Path of the directory on the host. - If the path is a symlink, it will follow the link - to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string type: - description: 'Type for HostPath Volume Defaults - to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string required: - path @@ -17132,135 +8332,53 @@ spec: - name resources: description: Memory and CPU minimum requirements and limits - for the server. + for the WebLogic Server instance. See `kubectl explain pods.spec.containers.resources`. type: object properties: requests: - description: 'Requests describes the minimum amount of - compute resources required. If Requests is omitted for - a container, it defaults to Limits if that is explicitly - specified, otherwise to an implementation-defined value. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object annotations: - description: The annotations to be attached to generated resources. + description: The annotations to be added to generated resources. additionalProperties: type: string type: object env: - description: A list of environment variables to add to a server. + description: 'A list of environment variables to set in the + container running a WebLogic Server instance. More info: + https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-resource/#jvm-memory-and-java-option-environment-variables. + See `kubectl explain pods.spec.containers.env`.' type: array items: - description: EnvVar represents an environment variable present - in a Container. type: object properties: name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) are expanded - using the previous defined environment variables in - the container and any service environment variables. - If a variable cannot be resolved, the reference in - the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Defaults to - "".' type: string valueFrom: - description: EnvVarSource represents a source for the - value of an EnvVar. type: object properties: secretKeyRef: - description: SecretKeySelector selects a key of - a Secret. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret or its - key must be defined type: boolean key: - description: The key of the secret to select - from. Must be a valid secret key. type: string required: - key resourceFieldRef: - description: ResourceFieldSelector represents container - resources (cpu, memory) and their output format type: object properties: divisor: - description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" case - in .) ::= 0 | - 1 | ... | 9 ::= - | ::= - | . | . | . - ::= "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | Ti | - Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | - T | P | E (Note that 1024 = 1Ki but 1000 - = 1k; I didn''t choose the capitalization.) - ::= "e" | - "E" No matter which of the - three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than 3 - decimal places. Numbers larger or more precise - will be capped or rounded up. (E.g.: 0.1m - will rounded up to 1m.) This may be extended - in the future if we require larger or smaller - quantities. When a Quantity is parsed from - a string, it will remember the type of suffix - it had, and will use the same type again when - it is serialized. Before serializing, Quantity - will be put in "canonical form". This means - that Exponent/suffix will be adjusted up or - down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision - is lost b. No fractional digits will be - emitted c. The exponent (or suffix) is as - large as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi will - be serialized as "1536Mi" Note that the quantity - will NEVER be internally represented by a - floating point number. That is the whole point - of this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or don''t - diff.) This format is intended to make it - difficult to use these numbers without writing - some sort of special handling code in the - hopes that that will cause implementors to - also use a fixed point implementation.' type: object properties: number: @@ -17272,43 +8390,28 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to select' type: string containerName: - description: 'Container name: required for volumes, - optional for env vars' type: string required: - resource configMapKeyRef: - description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap or - its key must be defined type: boolean key: - description: The key to select. type: string required: - key fieldRef: - description: ObjectFieldSelector selects an APIVersioned - field of an object. type: object properties: apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". type: string fieldPath: - description: Path of the field to select in - the specified API version. type: string required: - fieldPath @@ -17316,116 +8419,76 @@ spec: - name restartPolicy: description: 'Restart policy for all containers within the - pod. One of Always, OnFailure, Never. Default to Always. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + Pod. One of Always, OnFailure, Never. Default to Always. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy. + See `kubectl explain pods.spec.restartPolicy`.' type: string nodeSelector: - description: Selector which must match a node's labels for - the pod to be scheduled on that node. + description: Selector which must match a Node's labels for + the Pod to be scheduled on that Node. See `kubectl explain + pods.spec.nodeSelector`. additionalProperties: type: string type: object volumeMounts: - description: Additional volume mounts for the server pod. + description: Additional volume mounts for the container running + a WebLogic Server instance. See `kubectl explain pods.spec.containers.volumeMounts`. type: array items: - description: VolumeMount describes a mounting of a Volume - within a container. type: object properties: mountPath: - description: Path within the container at which the - volume should be mounted. Must not contain ':'. type: string mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and the - other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. type: string name: - description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. type: boolean subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's - root). type: string subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves - similarly to SubPath but environment variable references - $(VAR_NAME) are expanded using the container's environment. - Defaults to "" (volume's root). SubPathExpr and SubPath - are mutually exclusive. This field is beta in 1.15. type: string required: - mountPath - name labels: - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. + description: The labels to be added to generated resources. + The label names must not start with "weblogic.". additionalProperties: type: string type: object runtimeClassName: description: 'RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this - pod. If no RuntimeClass resource matches the named class, - the pod will not be run. If unset or empty, the "legacy" + Pod. If no RuntimeClass resource matches the named class, + the Pod will not be run. If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md - This is an alpha feature and may change in the future.' + This is an alpha feature and may change in the future. See + `kubectl explain pods.spec.runtimeClassName`.' type: string tolerations: - description: If specified, the pod's tolerations. + description: If specified, the Pod's tolerations. See `kubectl + explain pods.spec.tolerations`. type: array items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple using - the matching operator . type: object properties: effect: - description: Effect indicates the taint effect to match. - Empty means match all taint effects. When specified, - allowed values are NoSchedule, PreferNoSchedule and - NoExecute. type: string tolerationSeconds: - description: TolerationSeconds represents the period - of time the toleration (which must be of effect NoExecute, - otherwise this field is ignored) tolerates the taint. - By default, it is not set, which means tolerate the - taint forever (do not evict). Zero and negative values - will be treated as 0 (evict immediately) by the system. type: number value: - description: Value is the taint value the toleration - matches to. If the operator is Exists, the value should - be empty, otherwise just a regular string. type: string key: - description: Key is the taint key that the toleration - applies to. Empty means match all taint keys. If the - key is empty, operator must be Exists; this combination - means to match all values and all keys. type: string operator: - description: Operator represents a key's relationship - to the value. Valid operators are Exists and Equal. - Defaults to Equal. Exists is equivalent to wildcard - for value, so that a pod can tolerate all taints of - a particular category. type: string readinessProbe: description: Settings for the readiness probe associated with - a server. + a WebLogic Server instance. type: object properties: periodSeconds: @@ -17441,74 +8504,38 @@ spec: type: number containers: description: Additional containers to be included in the server - pod. + Pod. See `kubectl explain pods.spec.containers`. type: array items: - description: A single application container that you want - to run within a pod. type: object properties: volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of a - raw block device within a container. type: object properties: devicePath: - description: devicePath is the path inside of - the container that the device will be mapped - to. type: string name: - description: name must match the name of a persistentVolumeClaim - in the pod type: string required: - devicePath - name image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' type: string imagePullPolicy: - description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag is - specified, or IfNotPresent otherwise. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -17520,64 +8547,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -17589,24 +8582,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -17614,213 +8598,83 @@ spec: required: - port stdin: - description: Whether this container should allocate - a buffer for stdin in the container runtime. If this - is not set, reads from stdin in the container will - always result in EOF. Default is false. type: boolean terminationMessagePolicy: - description: Indicate how the termination message should - be populated. File will use the contents of terminationMessagePath - to populate the container status message on both success - and failure. FallbackToLogsOnError will use the last - chunk of container log output if the termination message - file is empty and the container exited with an error. - The log output is limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to File. Cannot be - updated. type: string terminationMessagePath: - description: 'Optional: Path at which the file to which - the container''s termination message will be written - is mounted into the container''s filesystem. Message - written is intended to be brief final status, such - as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' type: string workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which - might be configured in the container image. Cannot - be updated. type: string resources: - description: ResourceRequirements describes the compute - resource requirements. type: object properties: requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields are - present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take precedence. type: object properties: privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. type: boolean runAsUser: - description: The UID to run the entrypoint of the - container process. Defaults to user specified - in image metadata if unspecified. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. type: number capabilities: - description: Adds and removes POSIX capabilities - from running containers. type: object properties: add: - description: Added capabilities type: array items: type: string drop: - description: Removed capabilities type: array items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to be - applied to the container type: object properties: role: - description: Role is a SELinux role label that - applies to the container. type: string level: - description: Level is SELinux level label that - applies to the container. type: string type: - description: Type is a SELinux type label that - applies to the container. type: string user: - description: User is a SELinux user label that - applies to the container. type: string windowsOptions: - description: WindowsSecurityContextOptions contain - Windows-specific options and credentials. type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the - GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName field. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. type: string runAsUserName: - description: The UserName in Windows to run - the entrypoint of the container process. Defaults - to the user specified in image metadata if - unspecified. May also be set in PodSecurityContext. - If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. This field is alpha-level and - it is only honored by servers that enable - the WindowsRunAsUserName feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. type: string procMount: - description: procMount denotes the type of proc - mount to use for the containers. The default is - DefaultProcMount which uses the container runtime - defaults for readonly paths and masked paths. - This requires the ProcMountType feature flag to - be enabled. type: string allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the container - process. AllowPrivilegeEscalation is true always - when the container is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of the - container process. Uses runtime default if unset. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: number runAsNonRoot: - description: Indicates that the container must run - as a non-root user. If true, the Kubelet will - validate the image at runtime to ensure that it - does not run as UID 0 (root) and fail to start - the container if it does. If unset or false, no - such validation will be performed. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. type: boolean startupProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -17832,64 +8686,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -17901,24 +8721,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -17926,120 +8737,32 @@ spec: required: - port env: - description: List of environment variables to set in - the container. Cannot be updated. type: array items: - description: EnvVar represents an environment variable - present in a Container. type: object properties: name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, - the reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a - double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether - the variable exists or not. Defaults to "".' type: string valueFrom: - description: EnvVarSource represents a source - for the value of an EnvVar. type: object properties: secretKeyRef: - description: SecretKeySelector selects a key - of a Secret. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - or its key must be defined type: boolean key: - description: The key of the secret to - select from. Must be a valid secret - key. type: string required: - key resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format type: object properties: divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the - "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | - Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M - | G | T | P | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms - is used, no quantity may represent a - number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may - be extended in the future if we require - larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type again - when it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. - No fractional digits will be emitted c. - The exponent (or suffix) is as large - as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always - use canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing - some sort of special handling code in - the hopes that that will cause implementors - to also use a fixed point implementation.' type: object properties: number: @@ -18051,191 +8774,88 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to select' type: string containerName: - description: 'Container name: required - for volumes, optional for env vars' type: string required: - resource configMapKeyRef: - description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its key must be defined type: boolean key: - description: The key to select. type: string required: - key fieldRef: - description: ObjectFieldSelector selects an - APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the - FieldPath is written in terms of, defaults - to "v1". type: string fieldPath: - description: Path of the field to select - in the specified API version. type: string required: - fieldPath required: - name ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional information - about the network connections a container uses, but - is primarily informational. Not specifying a port - here DOES NOT prevent that port from being exposed. - Any port which is listening on the default "0.0.0.0" - address inside a container will be accessible from - the network. Cannot be updated. type: array items: - description: ContainerPort represents a network port - in a single container. type: object properties: protocol: - description: Protocol for port. Must be UDP, TCP, - or SCTP. Defaults to "TCP". type: string hostIP: - description: What host IP to bind the external - port to. type: string name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in - a pod must have a unique name. Name for the - port that can be referred to by services. type: string containerPort: - description: Number of port to expose on the pod's - IP address. This must be a valid port number, - 0 < x < 65536. type: number hostPort: - description: Number of port to expose on the host. - If specified, this must be a valid port number, - 0 < x < 65536. If HostNetwork is specified, - this must match ContainerPort. Most containers - do not need this. type: number required: - containerPort command: - description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used if - this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. If - a variable cannot be resolved, the reference in the - input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be updated. - More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string volumeMounts: - description: Pod volumes to mount into the container's - filesystem. Cannot be updated. type: array items: - description: VolumeMount describes a mounting of a - Volume within a container. type: object properties: mountPath: - description: Path within the container at which - the volume should be mounted. Must not contain - ':'. type: string mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and - the other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. type: string name: - description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to - false. type: boolean subPath: - description: Path within the volume from which - the container's volume should be mounted. Defaults - to "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment - variable references $(VAR_NAME) are expanded - using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath - are mutually exclusive. This field is beta in - 1.15. type: string required: - mountPath - name args: - description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. The - $(VAR_NAME) syntax can be escaped with a double $$, - ie: $$(VAR_NAME). Escaped references will never be - expanded, regardless of whether the variable exists - or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string lifecycle: - description: Lifecycle describes actions that the management - system should take in response to container lifecycle - events. For the PostStart and PreStop lifecycle handlers, - management of the container blocks until the action - is complete, unless the container process fails, in - which case the handler is aborted. type: object properties: postStart: - description: Handler defines a specific action that - should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -18247,50 +8867,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in - container" action. type: object properties: command: - description: Command is the command line - to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP - server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -18302,24 +8896,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -18327,22 +8912,12 @@ spec: required: - port preStop: - description: Handler defines a specific action that - should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -18354,50 +8929,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in - container" action. type: object properties: command: - description: Command is the command line - to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP - server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -18409,24 +8958,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -18434,43 +8974,20 @@ spec: required: - port name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. type: string tty: - description: Whether this container should allocate - a TTY for itself, also requires 'stdin' to be true. - Default is false. type: boolean readinessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -18482,64 +8999,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -18551,24 +9034,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -18576,264 +9050,120 @@ spec: required: - port stdinOnce: - description: Whether the container runtime should close - the stdin channel after it has been opened by a single - attach. When stdin is true the stdin stream will remain - open across multiple attach sessions. If stdinOnce - is set to true, stdin is opened on container start, - is empty until the first client attaches to stdin, - and then remains open and accepts data until the client - disconnects, at which time stdin is closed and remains - closed until the container is restarted. If this flag - is false, a container processes that reads from stdin - will never receive an EOF. Default is false type: boolean envFrom: - description: List of sources to populate environment - variables in the container. The keys defined within - a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is - starting. When a key exists in multiple sources, the - value associated with the last source will take precedence. - Values defined by an Env with a duplicate key will - take precedence. Cannot be updated. type: array items: - description: EnvFromSource represents the source of - a set of ConfigMaps type: object properties: configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field - will represent the key-value pairs as environment - variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - must be defined type: boolean prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. type: string secretRef: - description: SecretEnvSource selects a Secret - to populate the environment variables with. The - contents of the target Secret's Data field will - represent the key-value pairs as environment - variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret must - be defined type: boolean required: - name containerSecurityContext: description: Container-level security attributes. Will override - any matching pod-level attributes. + any matching Pod-level attributes. See `kubectl explain + pods.spec.containers.securityContext`. type: object properties: privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. type: boolean runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: number capabilities: - description: Adds and removes POSIX capabilities from - running containers. type: object properties: add: - description: Added capabilities type: array items: type: string drop: - description: Removed capabilities type: array items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to be applied - to the container type: object properties: role: - description: Role is a SELinux role label that applies - to the container. type: string level: - description: Level is SELinux level label that applies - to the container. type: string type: - description: Type is a SELinux type label that applies - to the container. type: string user: - description: User is a SELinux user label that applies - to the container. type: string windowsOptions: - description: WindowsSecurityContextOptions contain Windows-specific - options and credentials. type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. type: string runAsUserName: - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and - it is only honored by servers that enable the WindowsRunAsUserName - feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name of - the GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. type: string procMount: - description: procMount denotes the type of proc mount - to use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. type: string allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent process. - This bool directly controls if the no_new_privs flag - will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. type: number runAsNonRoot: - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if it - does. If unset or false, no such validation will be - performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only root - filesystem. Default is false. type: boolean schedulerName: - description: If specified, the pod will be dispatched by specified - scheduler. If not specified, the pod will be dispatched - by default scheduler. + description: If specified, the Pod will be dispatched by the + specified scheduler. If not specified, the Pod will be dispatched + by the default scheduler. See `kubectl explain pods.spec.schedulerName`. type: string initContainers: description: Initialization containers to be included in the - server pod. + server Pod. See `kubectl explain pods.spec.initContainers`. type: array items: - description: A single application container that you want - to run within a pod. type: object properties: volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of a - raw block device within a container. type: object properties: devicePath: - description: devicePath is the path inside of - the container that the device will be mapped - to. type: string name: - description: name must match the name of a persistentVolumeClaim - in the pod type: string required: - devicePath - name image: - description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' type: string imagePullPolicy: - description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag is - specified, or IfNotPresent otherwise. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -18845,64 +9175,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -18914,24 +9210,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -18939,213 +9226,83 @@ spec: required: - port stdin: - description: Whether this container should allocate - a buffer for stdin in the container runtime. If this - is not set, reads from stdin in the container will - always result in EOF. Default is false. type: boolean terminationMessagePolicy: - description: Indicate how the termination message should - be populated. File will use the contents of terminationMessagePath - to populate the container status message on both success - and failure. FallbackToLogsOnError will use the last - chunk of container log output if the termination message - file is empty and the container exited with an error. - The log output is limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to File. Cannot be - updated. type: string terminationMessagePath: - description: 'Optional: Path at which the file to which - the container''s termination message will be written - is mounted into the container''s filesystem. Message - written is intended to be brief final status, such - as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' type: string workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which - might be configured in the container image. Cannot - be updated. type: string resources: - description: ResourceRequirements describes the compute - resource requirements. type: object properties: requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object securityContext: - description: SecurityContext holds security configuration - that will be applied to a container. Some fields are - present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take precedence. type: object properties: privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. type: boolean runAsUser: - description: The UID to run the entrypoint of the - container process. Defaults to user specified - in image metadata if unspecified. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. type: number capabilities: - description: Adds and removes POSIX capabilities - from running containers. type: object properties: add: - description: Added capabilities type: array items: type: string drop: - description: Removed capabilities type: array items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to be - applied to the container type: object properties: role: - description: Role is a SELinux role label that - applies to the container. type: string level: - description: Level is SELinux level label that - applies to the container. type: string type: - description: Type is a SELinux type label that - applies to the container. type: string user: - description: User is a SELinux user label that - applies to the container. type: string windowsOptions: - description: WindowsSecurityContextOptions contain - Windows-specific options and credentials. type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the - GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName field. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. type: string runAsUserName: - description: The UserName in Windows to run - the entrypoint of the container process. Defaults - to the user specified in image metadata if - unspecified. May also be set in PodSecurityContext. - If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. This field is alpha-level and - it is only honored by servers that enable - the WindowsRunAsUserName feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. type: string procMount: - description: procMount denotes the type of proc - mount to use for the containers. The default is - DefaultProcMount which uses the container runtime - defaults for readonly paths and masked paths. - This requires the ProcMountType feature flag to - be enabled. type: string allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the container - process. AllowPrivilegeEscalation is true always - when the container is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of the - container process. Uses runtime default if unset. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. type: number runAsNonRoot: - description: Indicates that the container must run - as a non-root user. If true, the Kubelet will - validate the image at runtime to ensure that it - does not run as UID 0 (root) and fail to start - the container if it does. If unset or false, no - such validation will be performed. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. type: boolean startupProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -19157,64 +9314,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -19226,24 +9349,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -19251,120 +9365,32 @@ spec: required: - port env: - description: List of environment variables to set in - the container. Cannot be updated. type: array items: - description: EnvVar represents an environment variable - present in a Container. type: object properties: name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, - the reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a - double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether - the variable exists or not. Defaults to "".' type: string valueFrom: - description: EnvVarSource represents a source - for the value of an EnvVar. type: object properties: secretKeyRef: - description: SecretKeySelector selects a key - of a Secret. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - or its key must be defined type: boolean key: - description: The key of the secret to - select from. Must be a valid secret - key. type: string required: - key resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format type: object properties: divisor: - description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the - "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | - Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M - | G | T | P | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms - is used, no quantity may represent a - number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may - be extended in the future if we require - larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type again - when it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. - No fractional digits will be emitted c. - The exponent (or suffix) is as large - as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always - use canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing - some sort of special handling code in - the hopes that that will cause implementors - to also use a fixed point implementation.' type: object properties: number: @@ -19376,191 +9402,88 @@ spec: - DECIMAL_SI - BINARY_SI resource: - description: 'Required: resource to select' type: string containerName: - description: 'Container name: required - for volumes, optional for env vars' type: string required: - resource configMapKeyRef: - description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its key must be defined type: boolean key: - description: The key to select. type: string required: - key fieldRef: - description: ObjectFieldSelector selects an - APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the - FieldPath is written in terms of, defaults - to "v1". type: string fieldPath: - description: Path of the field to select - in the specified API version. type: string required: - fieldPath required: - name ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional information - about the network connections a container uses, but - is primarily informational. Not specifying a port - here DOES NOT prevent that port from being exposed. - Any port which is listening on the default "0.0.0.0" - address inside a container will be accessible from - the network. Cannot be updated. type: array items: - description: ContainerPort represents a network port - in a single container. type: object properties: protocol: - description: Protocol for port. Must be UDP, TCP, - or SCTP. Defaults to "TCP". type: string hostIP: - description: What host IP to bind the external - port to. type: string name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in - a pod must have a unique name. Name for the - port that can be referred to by services. type: string containerPort: - description: Number of port to expose on the pod's - IP address. This must be a valid port number, - 0 < x < 65536. type: number hostPort: - description: Number of port to expose on the host. - If specified, this must be a valid port number, - 0 < x < 65536. If HostNetwork is specified, - this must match ContainerPort. Most containers - do not need this. type: number required: - containerPort command: - description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used if - this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. If - a variable cannot be resolved, the reference in the - input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be updated. - More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string volumeMounts: - description: Pod volumes to mount into the container's - filesystem. Cannot be updated. type: array items: - description: VolumeMount describes a mounting of a - Volume within a container. type: object properties: mountPath: - description: Path within the container at which - the volume should be mounted. Must not contain - ':'. type: string mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and - the other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. type: string name: - description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to - false. type: boolean subPath: - description: Path within the volume from which - the container's volume should be mounted. Defaults - to "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment - variable references $(VAR_NAME) are expanded - using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath - are mutually exclusive. This field is beta in - 1.15. type: string required: - mountPath - name args: - description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. The - $(VAR_NAME) syntax can be escaped with a double $$, - ie: $$(VAR_NAME). Escaped references will never be - expanded, regardless of whether the variable exists - or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string lifecycle: - description: Lifecycle describes actions that the management - system should take in response to container lifecycle - events. For the PostStart and PreStop lifecycle handlers, - management of the container blocks until the action - is complete, unless the container process fails, in - which case the handler is aborted. type: object properties: postStart: - description: Handler defines a specific action that - should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -19572,50 +9495,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in - container" action. type: object properties: command: - description: Command is the command line - to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP - server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -19627,24 +9524,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -19652,22 +9540,12 @@ spec: required: - port preStop: - description: Handler defines a specific action that - should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -19679,50 +9557,24 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port exec: - description: ExecAction describes a "run in - container" action. type: object properties: command: - description: Command is the command line - to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP - server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. type: object properties: intValue: @@ -19734,24 +9586,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -19759,43 +9602,20 @@ spec: required: - port name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. type: string tty: - description: Whether this container should allocate - a TTY for itself, also requires 'stdin' to be true. - Default is false. type: boolean readinessProbe: - description: Probe describes a health check to be performed - against a container to determine whether it is alive - or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for the - probe to be considered failed after having succeeded. - Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -19807,64 +9627,30 @@ spec: required: - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' type: string required: - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: - description: ExecAction describes a "run in container" - action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. type: object properties: path: - description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. type: object properties: intValue: @@ -19876,24 +9662,15 @@ spec: required: - isInt host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes type: object properties: name: - description: The header field name type: string value: - description: The header field value type: string required: - name @@ -19901,84 +9678,43 @@ spec: required: - port stdinOnce: - description: Whether the container runtime should close - the stdin channel after it has been opened by a single - attach. When stdin is true the stdin stream will remain - open across multiple attach sessions. If stdinOnce - is set to true, stdin is opened on container start, - is empty until the first client attaches to stdin, - and then remains open and accepts data until the client - disconnects, at which time stdin is closed and remains - closed until the container is restarted. If this flag - is false, a container processes that reads from stdin - will never receive an EOF. Default is false type: boolean envFrom: - description: List of sources to populate environment - variables in the container. The keys defined within - a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is - starting. When a key exists in multiple sources, the - value associated with the last source will take precedence. - Values defined by an Env with a duplicate key will - take precedence. Cannot be updated. type: array items: - description: EnvFromSource represents the source of - a set of ConfigMaps type: object properties: configMapRef: - description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field - will represent the key-value pairs as environment - variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - must be defined type: boolean prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. type: string secretRef: - description: SecretEnvSource selects a Secret - to populate the environment variables with. The - contents of the target Secret's Data field will - represent the key-value pairs as environment - variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret must - be defined type: boolean required: - name shutdown: - description: Configures how the operator should shutdown the - server instance. + description: Configures how the operator should shut down + the server instance. type: object properties: ignoreSessions: description: For graceful shutdown only, indicates to ignore pending HTTP sessions during in-flight work handling. - Not required. Defaults to false. + Defaults to false. type: boolean shutdownType: - description: Tells the operator how to shutdown server - instances. Not required. Defaults to graceful shutdown. + description: Specifies how the operator will shut down + server instances. Defaults to graceful shutdown. type: string enum: - Graceful @@ -19986,107 +9722,52 @@ spec: timeoutSeconds: description: For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting - down the server. Not required. Defaults to 30 seconds. + down the server. Defaults to 30 seconds. type: number affinity: - description: If specified, the pod's scheduling constraints + description: If specified, the Pod's scheduling constraints. + See `kubectl explain pods.spec.affinity` type: object properties: nodeAffinity: - description: Node affinity is a group of node affinity - scheduling rules. type: object properties: requiredDuringSchedulingIgnoredDuringExecution: - description: A node selector represents the union - of the results of one or more label queries over - a set of nodes; that is, it represents the OR of - the selectors represented by the node selector terms. type: object properties: nodeSelectorTerms: - description: Required. A list of node selector - terms. The terms are ORed. type: array items: - description: A null or empty node selector term - matches no objects. The requirements of them - are ANDed. The TopologySelectorTerm type implements - a subset of the NodeSelectorTerm. type: object properties: matchExpressions: - description: A list of node selector requirements - by node's labels. type: array items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. type: array items: type: string key: - description: The label key that the - selector applies to. type: string operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. type: string required: - key - operator matchFields: - description: A list of node selector requirements - by node's fields. type: array items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. type: array items: type: string key: - description: The label key that the - selector applies to. type: string operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. type: string required: - key @@ -20094,594 +9775,235 @@ spec: required: - nodeSelectorTerms preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule - pods to nodes that satisfy the affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. The - node that is most preferred is the one with the - greatest sum of weights, i.e. for each node that - meets all of the scheduling requirements (resource - request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements - of this field and adding "weight" to the sum if - the node matches the corresponding matchExpressions; - the node(s) with the highest sum are the most preferred. type: array items: - description: An empty preferred scheduling term - matches all objects with implicit weight 0 (i.e. - it's a no-op). A null preferred scheduling term - matches no objects (i.e. is also a no-op). type: object properties: preference: - description: A null or empty node selector term - matches no objects. The requirements of them - are ANDed. The TopologySelectorTerm type implements - a subset of the NodeSelectorTerm. type: object properties: matchExpressions: - description: A list of node selector requirements - by node's labels. type: array items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. type: array items: type: string key: - description: The label key that the - selector applies to. type: string operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. type: string required: - key - operator matchFields: - description: A list of node selector requirements - by node's fields. type: array items: - description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. type: array items: type: string key: - description: The label key that the - selector applies to. type: string operator: - description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. type: string required: - key - operator weight: - description: Weight associated with matching - the corresponding nodeSelectorTerm, in the - range 1-100. type: number required: - preference - weight podAffinity: - description: Pod affinity is a group of inter pod affinity - scheduling rules. type: object properties: requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified - by this field are not met at scheduling time, the - pod will not be scheduled onto the node. If the - affinity requirements specified by this field cease - to be met at some point during pod execution (e.g. - due to a pod label update), the system may or may - not try to eventually evict the pod from its node. - When there are multiple elements, the lists of nodes - corresponding to each podAffinityTerm are intersected, - i.e. all terms must be satisfied. type: array items: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) with, - where co-located is defined as running on a node - whose value of the label with key - matches that of any node on which a pod of the - set of pods is running type: object properties: labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label - selector matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The requirements - are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: values is an array of - string values. If the operator is - In or NotIn, the values array must - be non-empty. If the operator is - Exists or DoesNotExist, the values - array must be empty. This array - is replaced during a strategic merge - patch. type: array items: type: string key: - description: key is the label key - that the selector applies to. type: string operator: - description: operator represents a - key's relationship to a set of values. - Valid operators are In, NotIn, Exists - and DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the - pods matching the labelSelector in the specified - namespaces, where co-located is defined as - running on a node whose value of the label - with key topologyKey matches that of any node - on which any of the selected pods is running. - Empty topologyKey is not allowed. type: string namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" type: array items: type: string required: - topologyKey preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule - pods to nodes that satisfy the affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. The - node that is most preferred is the one with the - greatest sum of weights, i.e. for each node that - meets all of the scheduling requirements (resource - request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements - of this field and adding "weight" to the sum if - the node has pods which matches the corresponding - podAffinityTerm; the node(s) with the highest sum - are the most preferred. type: array items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred - node(s) type: object properties: podAffinityTerm: - description: Defines a set of pods (namely those - matching the labelSelector relative to the - given namespace(s)) that this pod should be - co-located (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on - which a pod of the set of pods is running type: object properties: labelSelector: - description: A label selector is a label - query over a set of resources. The result - of matchLabels and matchExpressions are - ANDed. An empty label selector matches - all objects. A null label selector matches - no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. - This array is replaced during - a strategic merge patch. type: array items: type: string key: - description: key is the label - key that the selector applies - to. type: string operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map of - {key,value} pairs. A single {key,value} - in the matchLabels map is equivalent - to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are - ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose - value of the label with key topologyKey - matches that of any node on which any - of the selected pods is running. Empty - topologyKey is not allowed. type: string namespaces: - description: namespaces specifies which - namespaces the labelSelector applies to - (matches against); null or empty list - means "this pod's namespace" type: array items: type: string required: - topologyKey weight: - description: weight associated with matching - the corresponding podAffinityTerm, in the - range 1-100. type: number required: - podAffinityTerm - weight podAntiAffinity: - description: Pod anti affinity is a group of inter pod - anti affinity scheduling rules. type: object properties: requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified - by this field are not met at scheduling time, the - pod will not be scheduled onto the node. If the - anti-affinity requirements specified by this field - cease to be met at some point during pod execution - (e.g. due to a pod label update), the system may - or may not try to eventually evict the pod from - its node. When there are multiple elements, the - lists of nodes corresponding to each podAffinityTerm - are intersected, i.e. all terms must be satisfied. type: array items: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) with, - where co-located is defined as running on a node - whose value of the label with key - matches that of any node on which a pod of the - set of pods is running type: object properties: labelSelector: - description: A label selector is a label query - over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label - selector matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The requirements - are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: values is an array of - string values. If the operator is - In or NotIn, the values array must - be non-empty. If the operator is - Exists or DoesNotExist, the values - array must be empty. This array - is replaced during a strategic merge - patch. type: array items: type: string key: - description: key is the label key - that the selector applies to. type: string operator: - description: operator represents a - key's relationship to a set of values. - Valid operators are In, NotIn, Exists - and DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the - pods matching the labelSelector in the specified - namespaces, where co-located is defined as - running on a node whose value of the label - with key topologyKey matches that of any node - on which any of the selected pods is running. - Empty topologyKey is not allowed. type: string namespaces: - description: namespaces specifies which namespaces - the labelSelector applies to (matches against); - null or empty list means "this pod's namespace" type: array items: type: string required: - topologyKey preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule - pods to nodes that satisfy the anti-affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. The - node that is most preferred is the one with the - greatest sum of weights, i.e. for each node that - meets all of the scheduling requirements (resource - request, requiredDuringScheduling anti-affinity - expressions, etc.), compute a sum by iterating through - the elements of this field and adding "weight" to - the sum if the node has pods which matches the corresponding - podAffinityTerm; the node(s) with the highest sum - are the most preferred. type: array items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred - node(s) type: object properties: podAffinityTerm: - description: Defines a set of pods (namely those - matching the labelSelector relative to the - given namespace(s)) that this pod should be - co-located (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on - which a pod of the set of pods is running type: object properties: labelSelector: - description: A label selector is a label - query over a set of resources. The result - of matchLabels and matchExpressions are - ANDed. An empty label selector matches - all objects. A null label selector matches - no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. type: object properties: values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. - This array is replaced during - a strategic merge patch. type: array items: type: string key: - description: key is the label - key that the selector applies - to. type: string operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. type: string required: - key - operator matchLabels: - description: matchLabels is a map of - {key,value} pairs. A single {key,value} - in the matchLabels map is equivalent - to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are - ANDed. additionalProperties: type: string type: object topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose - value of the label with key topologyKey - matches that of any node on which any - of the selected pods is running. Empty - topologyKey is not allowed. type: string namespaces: - description: namespaces specifies which - namespaces the labelSelector applies to - (matches against); null or empty list - means "this pod's namespace" type: array items: type: string required: - topologyKey weight: - description: weight associated with matching - the corresponding podAffinityTerm, in the - range 1-100. type: number required: - podAffinityTerm - weight - clusterService: - description: Customization affecting ClusterIP Kubernetes services - for the WebLogic cluster. - type: object - properties: - annotations: - description: The annotations to be attached to generated resources. - additionalProperties: - type: string - type: object - labels: - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. - additionalProperties: - type: string - type: object serverStartPolicy: - description: The strategy for deciding whether to start a server. - Legal values are NEVER, or IF_NEEDED. + description: 'The strategy for deciding whether to start a WebLogic + Server instance. Legal values are ALWAYS, NEVER, or IF_NEEDED. + Defaults to IF_NEEDED. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#starting-and-stopping-servers.' type: string enum: + - ALWAYS - NEVER - IF_NEEDED restartVersion: - description: If present, every time this value is updated the - operator will restart the required servers. + description: 'Changes to this field cause the operator to restart + WebLogic Server instances. More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/startup/#restarting-servers.' type: string required: - - clusterName + - serverName status: type: object - description: DomainStatus represents information about the status of a domain. - Status may trail the actual state of a system. + description: The current status of the operation of the WebLogic domain. + Updated automatically by the operator. properties: reason: type: string @@ -20694,31 +10016,32 @@ spec: type: object properties: nodeName: - description: Name of node that is hosting the Pod containing this - WebLogic Server. + description: Name of Node that is hosting the Pod containing this + WebLogic Server instance. type: string desiredState: - description: Desired state of this WebLogic Server. Values are - RUNNING, ADMIN, or SHUTDOWN. + description: Desired state of this WebLogic Server instance. Values + are RUNNING, ADMIN, or SHUTDOWN. type: string clusterName: - description: WebLogic cluster name, if the server is part of a - cluster. + description: WebLogic cluster name, if the server is a member + of a cluster. type: string serverName: - description: WebLogic Server name. Required. + description: WebLogic Server instance name. type: string health: description: Current status and health of a specific WebLogic - Server. + Server instance. type: object properties: overallHealth: - description: Server health of this WebLogic Server. If the - value is "Not available", the operator has failed to read - the health. If the value is "Not available (possibly overloaded)", - the operator has failed to read the health of the server - possibly due to the server is in overloaded state. + description: Server health of this WebLogic Server instance. + If the value is "Not available", the operator has failed + to read the health. If the value is "Not available (possibly + overloaded)", the operator has failed to read the health + of the server possibly due to the server is in the overloaded + state. type: string activationTime: format: date-time @@ -20736,21 +10059,22 @@ spec: items: type: string health: - description: Server health of this WebLogic Server. - Required. + description: Server health of this WebLogic Server instance. type: string subsystemName: description: Name of subsystem providing symptom information. - Required. type: string state: - description: Current state of this WebLogic Server. Required. + description: Current state of this WebLogic Server instance. type: string replicas: type: number - description: The number of running Managed Servers in the WebLogic cluster - if there is only one cluster in the domain and where the cluster does - not explicitly configure its replicas in a cluster specification. + description: The number of running cluster member Managed Servers in + the WebLogic cluster if there is exactly one cluster defined in the + domain configuration and where the `replicas` field is set at the + `spec` level rather than for the specific cluster under `clusters`. + This field is provided to support use of Kubernetes scaling for this + limited use case. minimum: 0.0 startTime: type: string @@ -20760,7 +10084,7 @@ spec: format: date-time conditions: type: array - description: Current service state of domain. + description: Current service state of the domain. items: type: object properties: @@ -20770,7 +10094,7 @@ spec: type: string type: description: The type of the condition. Valid types are Progressing, - Available, and Failed. Required. + Available, and Failed. type: string enum: - Progressing @@ -20790,8 +10114,8 @@ spec: description: Last time we probed the condition. type: string status: - description: Status is the status of the condition. Can be True, - False, Unknown. Required. + description: The status of the condition. Can be True, False, + Unknown. type: string message: type: string @@ -20808,30 +10132,30 @@ spec: type: number minimum: 0.0 maximumReplicas: - description: The maximum number of cluster members. Required. + description: The maximum number of cluster members. type: number minimum: 0.0 replicas: - description: The number of intended cluster members. Required. + description: The number of currently running cluster members. type: number minimum: 0.0 clusterName: - description: WebLogic cluster name. Required. + description: WebLogic cluster name. type: string readyReplicas: - description: The number of ready cluster members. Required. + description: The number of ready cluster members. type: number minimum: 0.0 replicasGoal: - description: The requested number of cluster members from the - domain spec. Cluster members will be started by the operator - if this value is larger than zero. + description: The requested number of cluster members. Cluster + members will be started by the operator if this value is larger + than zero. type: number minimum: 0.0 versions: - - name: v7 + - name: v8 served: true storage: true - - name: v6 + - name: v7 served: true storage: false diff --git a/kubernetes/crd/domain-v1beta1-crdv6-240.yaml b/kubernetes/crd/domain-v1beta1-crdv7-260.yaml similarity index 98% rename from kubernetes/crd/domain-v1beta1-crdv6-240.yaml rename to kubernetes/crd/domain-v1beta1-crdv7-260.yaml index be4e5e67b10..fa9aef37cb8 100644 --- a/kubernetes/crd/domain-v1beta1-crdv6-240.yaml +++ b/kubernetes/crd/domain-v1beta1-crdv7-260.yaml @@ -11,7 +11,7 @@ spec: kind: Domain plural: domains shortNames: - - dom + - dom singular: domain preserveUnknownFields: false scope: Namespaced @@ -32,8 +32,8 @@ spec: description: The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING. enum: - - RUNNING - - ADMIN + - RUNNING + - ADMIN image: type: string description: The WebLogic Docker image; required when domainHomeInImage @@ -44,9 +44,26 @@ spec: values are Always, Never and IfNotPresent. Defaults to Always if image ends in :latest, IfNotPresent otherwise. enum: - - Always - - Never - - IfNotPresent + - Always + - Never + - IfNotPresent + configuration: + type: object + description: Properties affecting the WebLogic domain configuration. + properties: + istio: + type: object + description: The Istio service mesh integration settings + properties: + readinessPort: + type: number + description: The WebLogic readiness port for Istio. Defaults + to 8888. Not required. + enabled: + type: boolean + description: True, if this domain is deployed under an Istio + service mesh. Defaults to true when the 'istio' element is + included. Not required. replicas: type: number description: The number of managed servers to run in any cluster that @@ -79,31 +96,14 @@ spec: description: Domain unique identifier. Must be unique across the Kubernetes cluster. Not required. Defaults to the value of metadata.name. pattern: ^[a-z0-9-.]{1,253}$ - experimental: - type: object - description: Experimental feature configurations. - properties: - istio: - type: object - description: Istio service mesh integration configuration. - properties: - readinessPort: - type: number - description: The WebLogic readiness port for Istio. Defaults - to 8888. Not required. - enabled: - type: boolean - description: True, if this domain is deployed under an Istio - service mesh. Defaults to true when the 'istio' element is - included. Not required. serverStartPolicy: type: string description: The strategy for deciding whether to start a server. Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED. enum: - - NEVER - - IF_NEEDED - - ADMIN_ONLY + - NEVER + - IF_NEEDED + - ADMIN_ONLY restartVersion: type: string description: If present, every time this value is updated the operator @@ -172,8 +172,8 @@ spec: description: The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING. enum: - - RUNNING - - ADMIN + - RUNNING + - ADMIN serverService: type: object description: Customization affecting ClusterIP Kubernetes services @@ -236,7 +236,7 @@ spec: pod's condition list with matching type. type: string required: - - conditionType + - conditionType serviceAccountName: type: string description: Name of the ServiceAccount to be used to run this @@ -355,8 +355,8 @@ spec: description: Value of a property to set type: string required: - - name - - value + - name + - value priorityClassName: type: string description: If specified, indicates the pod's priority. "system-node-critical" @@ -410,8 +410,8 @@ spec: is no group type: string required: - - registry - - volume + - registry + - volume azureFile: description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. @@ -429,8 +429,8 @@ spec: description: Share Name type: string required: - - secretName - - shareName + - secretName + - shareName flexVolume: description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. @@ -467,7 +467,7 @@ spec: on FlexVolume script. type: string required: - - driver + - driver secret: description: Adapts a Secret into a volume. The contents of the target Secret's Data field will be presented @@ -528,8 +528,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path projected: description: Represents a projected volume source type: object @@ -662,9 +662,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' @@ -675,7 +675,7 @@ spec: for env vars' type: string required: - - resource + - resource fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -692,9 +692,9 @@ spec: version. type: string required: - - fieldPath + - fieldPath required: - - path + - path configMap: description: Adapts a ConfigMap into a projected volume. The contents of the target ConfigMap's @@ -755,8 +755,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path secret: description: Adapts a secret into a projected volume. The contents of the target Secret's @@ -815,8 +815,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path serviceAccountToken: description: ServiceAccountTokenProjection represents a projected service account token volume. @@ -852,7 +852,7 @@ spec: and must be at least 10 minutes. type: number required: - - path + - path defaultMode: description: Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories @@ -862,7 +862,7 @@ spec: can be other mode bits set. type: number required: - - sources + - sources cephfs: description: Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support @@ -904,7 +904,7 @@ spec: items: type: string required: - - monitors + - monitors scaleIO: description: ScaleIOVolumeSource represents a persistent ScaleIO volume @@ -959,9 +959,9 @@ spec: description: The host address of the ScaleIO API Gateway. type: string required: - - gateway - - secretRef - - system + - gateway + - secretRef + - system emptyDir: description: Represents an empty directory for a pod. Empty directory volumes support ownership management @@ -1022,9 +1022,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI medium: description: 'What type of storage medium should back this directory. The default is "" which means to @@ -1051,8 +1051,8 @@ spec: Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: boolean required: - - endpoints - - path + - endpoints + - path gcePersistentDisk: description: Represents a Persistent Disk resource in Google Compute Engine. A GCE PD must exist before mounting @@ -1087,7 +1087,7 @@ spec: "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string required: - - pdName + - pdName photonPersistentDisk: description: Represents a Photon Controller persistent disk resource. @@ -1104,7 +1104,7 @@ spec: "ext4" if unspecified. type: string required: - - pdID + - pdID azureDisk: description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. @@ -1139,8 +1139,8 @@ spec: "ext4" if unspecified. type: string required: - - diskName - - diskURI + - diskName + - diskURI cinder: description: Represents a cinder volume resource in Openstack. A Cinder volume must exist before mounting to a container. @@ -1176,7 +1176,7 @@ spec: https://examples.k8s.io/mysql-cinder-pd/README.md' type: string required: - - volumeID + - volumeID downwardAPI: description: DownwardAPIVolumeSource represents a volume containing downward API info. Downward API volumes support @@ -1287,9 +1287,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -1298,7 +1298,7 @@ spec: volumes, optional for env vars' type: string required: - - resource + - resource fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -1313,9 +1313,9 @@ spec: in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - path + - path awsElasticBlockStore: description: Represents a Persistent Disk resource in AWS. An AWS EBS disk must exist before mounting to @@ -1350,7 +1350,7 @@ spec: "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string required: - - volumeID + - volumeID flocker: description: Represents a Flocker volume mounted by the Flocker agent. One and only one of datasetName and datasetUUID @@ -1430,9 +1430,9 @@ spec: default (typically TCP ports 860 and 3260). type: string required: - - iqn - - lun - - targetPortal + - iqn + - lun + - targetPortal rbd: description: Represents a Rados Block Device mount that lasts the lifetime of a pod. RBD volumes support ownership @@ -1484,8 +1484,8 @@ spec: items: type: string required: - - image - - monitors + - image + - monitors configMap: description: Adapts a ConfigMap into a volume. The contents of the target ConfigMap's Data field will be presented @@ -1546,8 +1546,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path storageos: description: Represents a StorageOS persistent volume resource. @@ -1627,7 +1627,7 @@ spec: type: string type: object required: - - driver + - driver name: description: 'Volume''s name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' @@ -1652,8 +1652,8 @@ spec: to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: boolean required: - - path - - server + - path + - server persistentVolumeClaim: description: PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. This volume finds @@ -1672,7 +1672,7 @@ spec: Default false. type: boolean required: - - claimName + - claimName gitRepo: description: 'Represents a volume that is populated with the contents of a git repository. Git repo volumes do @@ -1697,7 +1697,7 @@ spec: description: Commit hash for the specified revision. type: string required: - - repository + - repository portworxVolume: description: PortworxVolumeSource represents a Portworx volume resource. @@ -1718,7 +1718,7 @@ spec: inferred to be "ext4" if unspecified. type: string required: - - volumeID + - volumeID vsphereVolume: description: Represents a vSphere volume resource. type: object @@ -1741,7 +1741,7 @@ spec: "ext4" if unspecified. type: string required: - - volumePath + - volumePath fc: description: Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. @@ -1792,9 +1792,9 @@ spec: "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string required: - - path + - path required: - - name + - name resources: type: object description: Memory and CPU minimum requirements and limits @@ -1865,7 +1865,7 @@ spec: be a valid secret key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their output format @@ -1928,9 +1928,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -1939,7 +1939,7 @@ spec: optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object @@ -1956,7 +1956,7 @@ spec: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -1971,9 +1971,9 @@ spec: specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name restartPolicy: type: string description: 'Restart policy for all containers within the pod. @@ -2023,8 +2023,8 @@ spec: exclusive. This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name labels: type: object additionalProperties: @@ -2124,8 +2124,8 @@ spec: in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config @@ -2174,13 +2174,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is @@ -2243,7 +2243,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -2265,10 +2265,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: description: Whether this container should allocate a buffer for stdin in the container runtime. If this is @@ -2480,13 +2480,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is @@ -2549,7 +2549,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -2571,10 +2571,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: description: List of environment variables to set in the container. Cannot be updated. @@ -2622,7 +2622,7 @@ spec: from. Must be a valid secret key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their @@ -2694,9 +2694,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -2705,7 +2705,7 @@ spec: volumes, optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object @@ -2722,7 +2722,7 @@ spec: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -2737,9 +2737,9 @@ spec: in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: description: List of ports to expose from the container. Exposing a port here gives the system additional information @@ -2782,7 +2782,7 @@ spec: need this. type: number required: - - containerPort + - containerPort command: description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this @@ -2839,8 +2839,8 @@ spec: This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable @@ -2889,13 +2889,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -2943,7 +2943,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -2965,10 +2965,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: description: Handler defines a specific action that should be taken @@ -2995,13 +2995,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -3049,7 +3049,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -3071,10 +3071,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). @@ -3121,13 +3121,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is @@ -3190,7 +3190,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -3212,10 +3212,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: description: Whether the container runtime should close the stdin channel after it has been opened by a single @@ -3280,7 +3280,7 @@ spec: be defined type: boolean required: - - name + - name containerSecurityContext: type: object description: Container-level security attributes. Will override @@ -3431,8 +3431,8 @@ spec: in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config @@ -3481,13 +3481,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is @@ -3550,7 +3550,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -3572,10 +3572,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: description: Whether this container should allocate a buffer for stdin in the container runtime. If this is @@ -3787,13 +3787,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is @@ -3856,7 +3856,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -3878,10 +3878,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: description: List of environment variables to set in the container. Cannot be updated. @@ -3929,7 +3929,7 @@ spec: from. Must be a valid secret key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their @@ -4001,9 +4001,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -4012,7 +4012,7 @@ spec: volumes, optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object @@ -4029,7 +4029,7 @@ spec: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -4044,9 +4044,9 @@ spec: in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: description: List of ports to expose from the container. Exposing a port here gives the system additional information @@ -4089,7 +4089,7 @@ spec: need this. type: number required: - - containerPort + - containerPort command: description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this @@ -4146,8 +4146,8 @@ spec: This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable @@ -4196,13 +4196,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -4250,7 +4250,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -4272,10 +4272,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: description: Handler defines a specific action that should be taken @@ -4302,13 +4302,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -4356,7 +4356,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -4378,10 +4378,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). @@ -4428,13 +4428,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is @@ -4497,7 +4497,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -4519,10 +4519,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: description: Whether the container runtime should close the stdin channel after it has been opened by a single @@ -4587,7 +4587,7 @@ spec: be defined type: boolean required: - - name + - name shutdown: type: object description: Configures how the operator should shutdown the @@ -4603,8 +4603,8 @@ spec: description: Tells the operator how to shutdown server instances. Not required. Defaults to graceful shutdown. enum: - - Graceful - - Forced + - Graceful + - Forced timeoutSeconds: type: number description: For graceful shutdown only, number of seconds @@ -4673,8 +4673,8 @@ spec: Gt, and Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. @@ -4711,10 +4711,10 @@ spec: Gt, and Lt. type: string required: - - key - - operator + - key + - operator required: - - nodeSelectorTerms + - nodeSelectorTerms preferredDuringSchedulingIgnoredDuringExecution: type: array description: The scheduler will prefer to schedule pods @@ -4778,8 +4778,8 @@ spec: Gt, and Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. @@ -4816,16 +4816,16 @@ spec: Gt, and Lt. type: string required: - - key - - operator + - key + - operator weight: description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. type: number required: - - preference - - weight + - preference + - weight podAffinity: type: object description: Pod affinity is a group of inter pod affinity @@ -4895,8 +4895,8 @@ spec: DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -4925,7 +4925,7 @@ spec: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: type: array description: The scheduler will prefer to schedule pods @@ -5000,9 +5000,9 @@ spec: In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator - matchLabels: + - key + - operator + matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, @@ -5031,15 +5031,15 @@ spec: items: type: string required: - - topologyKey + - topologyKey weight: description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight podAntiAffinity: type: object description: Pod anti affinity is a group of inter pod anti @@ -5109,8 +5109,8 @@ spec: DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -5139,7 +5139,7 @@ spec: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: type: array description: The scheduler will prefer to schedule pods @@ -5214,8 +5214,8 @@ spec: In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -5245,23 +5245,23 @@ spec: items: type: string required: - - topologyKey + - topologyKey weight: description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight serverStartPolicy: type: string description: The strategy for deciding whether to start a server. Legal values are ALWAYS, NEVER, or IF_NEEDED. enum: - - ALWAYS - - NEVER - - IF_NEEDED + - ALWAYS + - NEVER + - IF_NEEDED adminService: type: object description: Configures which of the Administration Server's WebLogic @@ -5300,7 +5300,7 @@ spec: WebLogic channel. type: number required: - - channelName + - channelName annotations: type: object additionalProperties: @@ -5356,7 +5356,7 @@ spec: condition list with matching type. type: string required: - - conditionType + - conditionType serviceAccountName: type: string description: Name of the ServiceAccount to be used to run this pod. @@ -5471,8 +5471,8 @@ spec: description: Value of a property to set type: string required: - - name - - value + - name + - value priorityClassName: type: string description: If specified, indicates the pod's priority. "system-node-critical" @@ -5524,8 +5524,8 @@ spec: no group type: string required: - - registry - - volume + - registry + - volume azureFile: description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. @@ -5543,8 +5543,8 @@ spec: description: Share Name type: string required: - - secretName - - shareName + - secretName + - shareName flexVolume: description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. @@ -5579,7 +5579,7 @@ spec: script. type: string required: - - driver + - driver secret: description: Adapts a Secret into a volume. The contents of the target Secret's Data field will be presented in a @@ -5637,8 +5637,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path projected: description: Represents a projected volume source type: object @@ -5765,9 +5765,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' @@ -5777,7 +5777,7 @@ spec: for volumes, optional for env vars' type: string required: - - resource + - resource fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -5793,9 +5793,9 @@ spec: select in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - path + - path configMap: description: Adapts a ConfigMap into a projected volume. The contents of the target ConfigMap's @@ -5854,8 +5854,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path secret: description: Adapts a secret into a projected volume. The contents of the target Secret's Data field will @@ -5912,8 +5912,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path serviceAccountToken: description: ServiceAccountTokenProjection represents a projected service account token volume. This @@ -5947,7 +5947,7 @@ spec: to 1 hour and must be at least 10 minutes. type: number required: - - path + - path defaultMode: description: Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories within @@ -5957,7 +5957,7 @@ spec: bits set. type: number required: - - sources + - sources cephfs: description: Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support ownership @@ -5998,7 +5998,7 @@ spec: items: type: string required: - - monitors + - monitors scaleIO: description: ScaleIOVolumeSource represents a persistent ScaleIO volume @@ -6051,9 +6051,9 @@ spec: description: The host address of the ScaleIO API Gateway. type: string required: - - gateway - - secretRef - - system + - gateway + - secretRef + - system emptyDir: description: Represents an empty directory for a pod. Empty directory volumes support ownership management and SELinux @@ -6111,9 +6111,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI medium: description: 'What type of storage medium should back this directory. The default is "" which means to use @@ -6140,8 +6140,8 @@ spec: false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: boolean required: - - endpoints - - path + - endpoints + - path gcePersistentDisk: description: Represents a Persistent Disk resource in Google Compute Engine. A GCE PD must exist before mounting to @@ -6175,7 +6175,7 @@ spec: More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string required: - - pdName + - pdName photonPersistentDisk: description: Represents a Photon Controller persistent disk resource. @@ -6191,7 +6191,7 @@ spec: "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string required: - - pdID + - pdID azureDisk: description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. @@ -6223,8 +6223,8 @@ spec: "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string required: - - diskName - - diskURI + - diskName + - diskURI cinder: description: Represents a cinder volume resource in Openstack. A Cinder volume must exist before mounting to a container. @@ -6258,7 +6258,7 @@ spec: if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: string required: - - volumeID + - volumeID downwardAPI: description: DownwardAPIVolumeSource represents a volume containing downward API info. Downward API volumes support ownership @@ -6362,9 +6362,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -6373,7 +6373,7 @@ spec: optional for env vars' type: string required: - - resource + - resource fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -6388,9 +6388,9 @@ spec: the specified API version. type: string required: - - fieldPath + - fieldPath required: - - path + - path awsElasticBlockStore: description: Represents a Persistent Disk resource in AWS. An AWS EBS disk must exist before mounting to a container. @@ -6424,7 +6424,7 @@ spec: More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string required: - - volumeID + - volumeID flocker: description: Represents a Flocker volume mounted by the Flocker agent. One and only one of datasetName and datasetUUID should @@ -6502,9 +6502,9 @@ spec: (typically TCP ports 860 and 3260). type: string required: - - iqn - - lun - - targetPortal + - iqn + - lun + - targetPortal rbd: description: Represents a Rados Block Device mount that lasts the lifetime of a pod. RBD volumes support ownership management @@ -6553,8 +6553,8 @@ spec: items: type: string required: - - image - - monitors + - image + - monitors configMap: description: Adapts a ConfigMap into a volume. The contents of the target ConfigMap's Data field will be presented in @@ -6612,8 +6612,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path storageos: description: Represents a StorageOS persistent volume resource. type: object @@ -6688,7 +6688,7 @@ spec: type: string type: object required: - - driver + - driver name: description: 'Volume''s name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' @@ -6713,8 +6713,8 @@ spec: false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: boolean required: - - path - - server + - path + - server persistentVolumeClaim: description: PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. This volume finds @@ -6733,7 +6733,7 @@ spec: Default false. type: boolean required: - - claimName + - claimName gitRepo: description: 'Represents a volume that is populated with the contents of a git repository. Git repo volumes do not support @@ -6758,7 +6758,7 @@ spec: description: Commit hash for the specified revision. type: string required: - - repository + - repository portworxVolume: description: PortworxVolumeSource represents a Portworx volume resource. @@ -6778,7 +6778,7 @@ spec: to be "ext4" if unspecified. type: string required: - - volumeID + - volumeID vsphereVolume: description: Represents a vSphere volume resource. type: object @@ -6800,7 +6800,7 @@ spec: "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string required: - - volumePath + - volumePath fc: description: Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel @@ -6847,9 +6847,9 @@ spec: More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string required: - - path + - path required: - - name + - name resources: type: object description: Memory and CPU minimum requirements and limits for @@ -6916,7 +6916,7 @@ spec: be a valid secret key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their output format @@ -6976,9 +6976,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -6987,7 +6987,7 @@ spec: optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object @@ -7003,7 +7003,7 @@ spec: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -7018,9 +7018,9 @@ spec: API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name restartPolicy: type: string description: 'Restart policy for all containers within the pod. @@ -7070,8 +7070,8 @@ spec: exclusive. This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name labels: type: object additionalProperties: @@ -7169,8 +7169,8 @@ spec: in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management @@ -7217,13 +7217,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. @@ -7284,7 +7284,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders @@ -7306,10 +7306,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, @@ -7515,13 +7515,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. @@ -7582,7 +7582,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders @@ -7604,10 +7604,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: description: List of environment variables to set in the container. Cannot be updated. @@ -7655,7 +7655,7 @@ spec: from. Must be a valid secret key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their output format @@ -7722,9 +7722,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -7733,7 +7733,7 @@ spec: optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object @@ -7750,7 +7750,7 @@ spec: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -7765,9 +7765,9 @@ spec: the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: description: List of ports to expose from the container. Exposing a port here gives the system additional information about @@ -7808,7 +7808,7 @@ spec: ContainerPort. Most containers do not need this. type: number required: - - containerPort + - containerPort command: description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. @@ -7862,8 +7862,8 @@ spec: are mutually exclusive. This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references @@ -7911,13 +7911,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -7964,7 +7964,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -7986,10 +7986,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: description: Handler defines a specific action that should be taken @@ -8016,13 +8016,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -8069,7 +8069,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -8091,10 +8091,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). @@ -8140,13 +8140,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. @@ -8207,7 +8207,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders @@ -8229,10 +8229,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. @@ -8292,7 +8292,7 @@ spec: defined type: boolean required: - - name + - name containerSecurityContext: type: object description: Container-level security attributes. Will override @@ -8439,8 +8439,8 @@ spec: in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management @@ -8487,13 +8487,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. @@ -8554,7 +8554,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders @@ -8576,10 +8576,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, @@ -8785,13 +8785,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. @@ -8852,7 +8852,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders @@ -8874,10 +8874,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: description: List of environment variables to set in the container. Cannot be updated. @@ -8925,7 +8925,7 @@ spec: from. Must be a valid secret key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their output format @@ -8992,9 +8992,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -9003,7 +9003,7 @@ spec: optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object @@ -9020,7 +9020,7 @@ spec: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -9035,9 +9035,9 @@ spec: the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: description: List of ports to expose from the container. Exposing a port here gives the system additional information about @@ -9078,7 +9078,7 @@ spec: ContainerPort. Most containers do not need this. type: number required: - - containerPort + - containerPort command: description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. @@ -9132,8 +9132,8 @@ spec: are mutually exclusive. This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references @@ -9181,13 +9181,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -9234,7 +9234,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -9256,10 +9256,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: description: Handler defines a specific action that should be taken @@ -9286,13 +9286,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -9339,7 +9339,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -9361,10 +9361,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). @@ -9410,13 +9410,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. @@ -9477,7 +9477,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders @@ -9499,10 +9499,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. @@ -9562,7 +9562,7 @@ spec: defined type: boolean required: - - name + - name shutdown: type: object description: Configures how the operator should shutdown the server @@ -9578,8 +9578,8 @@ spec: description: Tells the operator how to shutdown server instances. Not required. Defaults to graceful shutdown. enum: - - Graceful - - Forced + - Graceful + - Forced timeoutSeconds: type: number description: For graceful shutdown only, number of seconds to @@ -9646,8 +9646,8 @@ spec: Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. @@ -9682,10 +9682,10 @@ spec: Lt. type: string required: - - key - - operator + - key + - operator required: - - nodeSelectorTerms + - nodeSelectorTerms preferredDuringSchedulingIgnoredDuringExecution: type: array description: The scheduler will prefer to schedule pods @@ -9747,8 +9747,8 @@ spec: Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. @@ -9783,15 +9783,15 @@ spec: Lt. type: string required: - - key - - operator + - key + - operator weight: description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. type: number required: - - preference - - weight + - preference + - weight podAffinity: type: object description: Pod affinity is a group of inter pod affinity scheduling @@ -9857,8 +9857,8 @@ spec: operators are In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -9886,7 +9886,7 @@ spec: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: type: array description: The scheduler will prefer to schedule pods @@ -9958,8 +9958,8 @@ spec: DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -9988,14 +9988,14 @@ spec: items: type: string required: - - topologyKey + - topologyKey weight: description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight podAntiAffinity: type: object description: Pod anti affinity is a group of inter pod anti @@ -10061,8 +10061,8 @@ spec: operators are In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -10090,7 +10090,7 @@ spec: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: type: array description: The scheduler will prefer to schedule pods @@ -10163,8 +10163,8 @@ spec: DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -10193,14 +10193,14 @@ spec: items: type: string required: - - topologyKey + - topologyKey weight: description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight logHome: type: string description: The in-pod name of the directory in which to store the @@ -10223,8 +10223,8 @@ spec: RUNNING. type: string enum: - - RUNNING - - ADMIN + - RUNNING + - ADMIN serverService: description: Customization affecting ClusterIP Kubernetes services for WebLogic Server instances. @@ -10290,7 +10290,7 @@ spec: the pod's condition list with matching type. type: string required: - - conditionType + - conditionType serviceAccountName: description: Name of the ServiceAccount to be used to run this pod. If it is not set, default ServiceAccount will @@ -10412,8 +10412,8 @@ spec: description: Value of a property to set type: string required: - - name - - value + - name + - value priorityClassName: description: If specified, indicates the pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which @@ -10468,8 +10468,8 @@ spec: is no group type: string required: - - registry - - volume + - registry + - volume azureFile: description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. @@ -10487,8 +10487,8 @@ spec: description: Share Name type: string required: - - secretName - - shareName + - secretName + - shareName flexVolume: description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec @@ -10527,7 +10527,7 @@ spec: filesystem depends on FlexVolume script. type: string required: - - driver + - driver secret: description: Adapts a Secret into a volume. The contents of the target Secret's Data field will be presented @@ -10590,8 +10590,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path projected: description: Represents a projected volume source type: object @@ -10736,9 +10736,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' @@ -10749,7 +10749,7 @@ spec: for env vars' type: string required: - - resource + - resource fieldRef: description: ObjectFieldSelector selects an APIVersioned field @@ -10767,9 +10767,9 @@ spec: API version. type: string required: - - fieldPath + - fieldPath required: - - path + - path configMap: description: Adapts a ConfigMap into a projected volume. The contents of the target ConfigMap's @@ -10833,8 +10833,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path secret: description: Adapts a secret into a projected volume. The contents of the target Secret's @@ -10896,8 +10896,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path serviceAccountToken: description: ServiceAccountTokenProjection represents a projected service account token @@ -10935,7 +10935,7 @@ spec: be at least 10 minutes. type: number required: - - path + - path defaultMode: description: Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories @@ -10945,7 +10945,7 @@ spec: can be other mode bits set. type: number required: - - sources + - sources cephfs: description: Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not @@ -10987,7 +10987,7 @@ spec: items: type: string required: - - monitors + - monitors scaleIO: description: ScaleIOVolumeSource represents a persistent ScaleIO volume @@ -11044,9 +11044,9 @@ spec: Gateway. type: string required: - - gateway - - secretRef - - system + - gateway + - secretRef + - system emptyDir: description: Represents an empty directory for a pod. Empty directory volumes support ownership management @@ -11109,9 +11109,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI medium: description: 'What type of storage medium should back this directory. The default is "" which means @@ -11138,8 +11138,8 @@ spec: Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: boolean required: - - endpoints - - path + - endpoints + - path gcePersistentDisk: description: Represents a Persistent Disk resource in Google Compute Engine. A GCE PD must exist before @@ -11176,7 +11176,7 @@ spec: to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string required: - - pdName + - pdName photonPersistentDisk: description: Represents a Photon Controller persistent disk resource. @@ -11193,7 +11193,7 @@ spec: inferred to be "ext4" if unspecified. type: string required: - - pdID + - pdID azureDisk: description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. @@ -11228,8 +11228,8 @@ spec: inferred to be "ext4" if unspecified. type: string required: - - diskName - - diskURI + - diskName + - diskURI cinder: description: Represents a cinder volume resource in Openstack. A Cinder volume must exist before mounting @@ -11265,7 +11265,7 @@ spec: https://examples.k8s.io/mysql-cinder-pd/README.md' type: string required: - - volumeID + - volumeID downwardAPI: description: DownwardAPIVolumeSource represents a volume containing downward API info. Downward API volumes @@ -11380,9 +11380,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -11391,7 +11391,7 @@ spec: for volumes, optional for env vars' type: string required: - - resource + - resource fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -11407,9 +11407,9 @@ spec: in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - path + - path awsElasticBlockStore: description: Represents a Persistent Disk resource in AWS. An AWS EBS disk must exist before mounting to @@ -11444,7 +11444,7 @@ spec: to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string required: - - volumeID + - volumeID flocker: description: Represents a Flocker volume mounted by the Flocker agent. One and only one of datasetName @@ -11526,9 +11526,9 @@ spec: than default (typically TCP ports 860 and 3260). type: string required: - - iqn - - lun - - targetPortal + - iqn + - lun + - targetPortal rbd: description: Represents a Rados Block Device mount that lasts the lifetime of a pod. RBD volumes support ownership @@ -11580,8 +11580,8 @@ spec: items: type: string required: - - image - - monitors + - image + - monitors configMap: description: Adapts a ConfigMap into a volume. The contents of the target ConfigMap's Data field will @@ -11645,8 +11645,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path storageos: description: Represents a StorageOS persistent volume resource. @@ -11727,7 +11727,7 @@ spec: type: string type: object required: - - driver + - driver name: description: 'Volume''s name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' @@ -11752,8 +11752,8 @@ spec: to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: boolean required: - - path - - server + - path + - server persistentVolumeClaim: description: PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. This volume @@ -11773,7 +11773,7 @@ spec: VolumeMounts. Default false. type: boolean required: - - claimName + - claimName gitRepo: description: 'Represents a volume that is populated with the contents of a git repository. Git repo volumes @@ -11800,7 +11800,7 @@ spec: description: Commit hash for the specified revision. type: string required: - - repository + - repository portworxVolume: description: PortworxVolumeSource represents a Portworx volume resource. @@ -11821,7 +11821,7 @@ spec: Implicitly inferred to be "ext4" if unspecified. type: string required: - - volumeID + - volumeID vsphereVolume: description: Represents a vSphere volume resource. type: object @@ -11845,7 +11845,7 @@ spec: inferred to be "ext4" if unspecified. type: string required: - - volumePath + - volumePath fc: description: Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write @@ -11896,9 +11896,9 @@ spec: to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string required: - - path + - path required: - - name + - name resources: description: Memory and CPU minimum requirements and limits for the server. @@ -11970,7 +11970,7 @@ spec: from. Must be a valid secret key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their output format @@ -12037,9 +12037,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -12048,7 +12048,7 @@ spec: optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object @@ -12065,7 +12065,7 @@ spec: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -12080,9 +12080,9 @@ spec: the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name restartPolicy: description: 'Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. @@ -12133,8 +12133,8 @@ spec: are mutually exclusive. This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name labels: description: The labels to be attached to generated resources. The label names must not start with 'weblogic.'. @@ -12236,8 +12236,8 @@ spec: in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config @@ -12287,13 +12287,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum @@ -12356,7 +12356,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -12378,10 +12378,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: description: Whether this container should allocate a buffer for stdin in the container runtime. If this @@ -12599,13 +12599,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum @@ -12668,7 +12668,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -12690,10 +12690,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: description: List of environment variables to set in the container. Cannot be updated. @@ -12742,7 +12742,7 @@ spec: key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their @@ -12816,9 +12816,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -12827,7 +12827,7 @@ spec: for volumes, optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object @@ -12844,7 +12844,7 @@ spec: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -12860,9 +12860,9 @@ spec: in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: description: List of ports to expose from the container. Exposing a port here gives the system additional information @@ -12905,7 +12905,7 @@ spec: do not need this. type: number required: - - containerPort + - containerPort command: description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if @@ -12964,8 +12964,8 @@ spec: 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable @@ -13014,13 +13014,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -13069,7 +13069,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -13091,10 +13091,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: description: Handler defines a specific action that should be taken @@ -13121,13 +13121,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -13176,7 +13176,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -13198,10 +13198,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). @@ -13249,13 +13249,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum @@ -13318,7 +13318,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -13340,10 +13340,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: description: Whether the container runtime should close the stdin channel after it has been opened by a single @@ -13409,7 +13409,7 @@ spec: be defined type: boolean required: - - name + - name containerSecurityContext: description: Container-level security attributes. Will override any matching pod-level attributes. @@ -13561,8 +13561,8 @@ spec: in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config @@ -13612,13 +13612,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum @@ -13681,7 +13681,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -13703,10 +13703,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: description: Whether this container should allocate a buffer for stdin in the container runtime. If this @@ -13924,13 +13924,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum @@ -13993,7 +13993,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -14015,10 +14015,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: description: List of environment variables to set in the container. Cannot be updated. @@ -14067,7 +14067,7 @@ spec: key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their @@ -14141,9 +14141,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -14152,7 +14152,7 @@ spec: for volumes, optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object @@ -14169,7 +14169,7 @@ spec: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -14185,9 +14185,9 @@ spec: in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: description: List of ports to expose from the container. Exposing a port here gives the system additional information @@ -14230,7 +14230,7 @@ spec: do not need this. type: number required: - - containerPort + - containerPort command: description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if @@ -14289,8 +14289,8 @@ spec: 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable @@ -14339,13 +14339,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -14394,7 +14394,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -14416,10 +14416,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: description: Handler defines a specific action that should be taken @@ -14446,13 +14446,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -14501,7 +14501,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -14523,10 +14523,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). @@ -14574,13 +14574,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum @@ -14643,7 +14643,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -14665,10 +14665,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: description: Whether the container runtime should close the stdin channel after it has been opened by a single @@ -14734,7 +14734,7 @@ spec: be defined type: boolean required: - - name + - name shutdown: description: Configures how the operator should shutdown the server instance. @@ -14750,8 +14750,8 @@ spec: instances. Not required. Defaults to graceful shutdown. type: string enum: - - Graceful - - Forced + - Graceful + - Forced timeoutSeconds: description: For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting @@ -14820,8 +14820,8 @@ spec: Gt, and Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. @@ -14858,10 +14858,10 @@ spec: Gt, and Lt. type: string required: - - key - - operator + - key + - operator required: - - nodeSelectorTerms + - nodeSelectorTerms preferredDuringSchedulingIgnoredDuringExecution: description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions @@ -14926,8 +14926,8 @@ spec: Gt, and Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. @@ -14964,16 +14964,16 @@ spec: Gt, and Lt. type: string required: - - key - - operator + - key + - operator weight: description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. type: number required: - - preference - - weight + - preference + - weight podAffinity: description: Pod affinity is a group of inter pod affinity scheduling rules. @@ -15045,8 +15045,8 @@ spec: and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -15075,7 +15075,7 @@ spec: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions @@ -15153,8 +15153,8 @@ spec: In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} @@ -15187,15 +15187,15 @@ spec: items: type: string required: - - topologyKey + - topologyKey weight: description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight podAntiAffinity: description: Pod anti affinity is a group of inter pod anti affinity scheduling rules. @@ -15267,8 +15267,8 @@ spec: and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -15297,7 +15297,7 @@ spec: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions @@ -15375,8 +15375,8 @@ spec: In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} @@ -15409,29 +15409,29 @@ spec: items: type: string required: - - topologyKey + - topologyKey weight: description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight serverStartPolicy: description: The strategy for deciding whether to start a server. Legal values are ALWAYS, NEVER, or IF_NEEDED. type: string enum: - - ALWAYS - - NEVER - - IF_NEEDED + - ALWAYS + - NEVER + - IF_NEEDED restartVersion: description: If present, every time this value is updated the operator will restart the required servers. type: string required: - - serverName + - serverName clusters: type: array description: Configuration for the clusters. @@ -15445,8 +15445,8 @@ spec: RUNNING. type: string enum: - - RUNNING - - ADMIN + - RUNNING + - ADMIN serverService: description: Customization affecting ClusterIP Kubernetes services for WebLogic Server instances. @@ -15521,7 +15521,7 @@ spec: the pod's condition list with matching type. type: string required: - - conditionType + - conditionType serviceAccountName: description: Name of the ServiceAccount to be used to run this pod. If it is not set, default ServiceAccount will @@ -15643,8 +15643,8 @@ spec: description: Value of a property to set type: string required: - - name - - value + - name + - value priorityClassName: description: If specified, indicates the pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which @@ -15699,8 +15699,8 @@ spec: is no group type: string required: - - registry - - volume + - registry + - volume azureFile: description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. @@ -15718,8 +15718,8 @@ spec: description: Share Name type: string required: - - secretName - - shareName + - secretName + - shareName flexVolume: description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec @@ -15758,7 +15758,7 @@ spec: filesystem depends on FlexVolume script. type: string required: - - driver + - driver secret: description: Adapts a Secret into a volume. The contents of the target Secret's Data field will be presented @@ -15821,8 +15821,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path projected: description: Represents a projected volume source type: object @@ -15967,9 +15967,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' @@ -15980,7 +15980,7 @@ spec: for env vars' type: string required: - - resource + - resource fieldRef: description: ObjectFieldSelector selects an APIVersioned field @@ -15998,9 +15998,9 @@ spec: API version. type: string required: - - fieldPath + - fieldPath required: - - path + - path configMap: description: Adapts a ConfigMap into a projected volume. The contents of the target ConfigMap's @@ -16064,8 +16064,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path secret: description: Adapts a secret into a projected volume. The contents of the target Secret's @@ -16127,8 +16127,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path serviceAccountToken: description: ServiceAccountTokenProjection represents a projected service account token @@ -16166,7 +16166,7 @@ spec: be at least 10 minutes. type: number required: - - path + - path defaultMode: description: Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories @@ -16176,7 +16176,7 @@ spec: can be other mode bits set. type: number required: - - sources + - sources cephfs: description: Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not @@ -16218,7 +16218,7 @@ spec: items: type: string required: - - monitors + - monitors scaleIO: description: ScaleIOVolumeSource represents a persistent ScaleIO volume @@ -16275,9 +16275,9 @@ spec: Gateway. type: string required: - - gateway - - secretRef - - system + - gateway + - secretRef + - system emptyDir: description: Represents an empty directory for a pod. Empty directory volumes support ownership management @@ -16340,9 +16340,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI medium: description: 'What type of storage medium should back this directory. The default is "" which means @@ -16369,8 +16369,8 @@ spec: Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: boolean required: - - endpoints - - path + - endpoints + - path gcePersistentDisk: description: Represents a Persistent Disk resource in Google Compute Engine. A GCE PD must exist before @@ -16407,7 +16407,7 @@ spec: to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string required: - - pdName + - pdName photonPersistentDisk: description: Represents a Photon Controller persistent disk resource. @@ -16424,7 +16424,7 @@ spec: inferred to be "ext4" if unspecified. type: string required: - - pdID + - pdID azureDisk: description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. @@ -16459,8 +16459,8 @@ spec: inferred to be "ext4" if unspecified. type: string required: - - diskName - - diskURI + - diskName + - diskURI cinder: description: Represents a cinder volume resource in Openstack. A Cinder volume must exist before mounting @@ -16496,7 +16496,7 @@ spec: https://examples.k8s.io/mysql-cinder-pd/README.md' type: string required: - - volumeID + - volumeID downwardAPI: description: DownwardAPIVolumeSource represents a volume containing downward API info. Downward API volumes @@ -16611,9 +16611,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -16622,7 +16622,7 @@ spec: for volumes, optional for env vars' type: string required: - - resource + - resource fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -16638,9 +16638,9 @@ spec: in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - path + - path awsElasticBlockStore: description: Represents a Persistent Disk resource in AWS. An AWS EBS disk must exist before mounting to @@ -16675,7 +16675,7 @@ spec: to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string required: - - volumeID + - volumeID flocker: description: Represents a Flocker volume mounted by the Flocker agent. One and only one of datasetName @@ -16757,9 +16757,9 @@ spec: than default (typically TCP ports 860 and 3260). type: string required: - - iqn - - lun - - targetPortal + - iqn + - lun + - targetPortal rbd: description: Represents a Rados Block Device mount that lasts the lifetime of a pod. RBD volumes support ownership @@ -16811,8 +16811,8 @@ spec: items: type: string required: - - image - - monitors + - image + - monitors configMap: description: Adapts a ConfigMap into a volume. The contents of the target ConfigMap's Data field will @@ -16876,8 +16876,8 @@ spec: description: The key to project. type: string required: - - key - - path + - key + - path storageos: description: Represents a StorageOS persistent volume resource. @@ -16958,7 +16958,7 @@ spec: type: string type: object required: - - driver + - driver name: description: 'Volume''s name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' @@ -16983,8 +16983,8 @@ spec: to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: boolean required: - - path - - server + - path + - server persistentVolumeClaim: description: PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. This volume @@ -17004,7 +17004,7 @@ spec: VolumeMounts. Default false. type: boolean required: - - claimName + - claimName gitRepo: description: 'Represents a volume that is populated with the contents of a git repository. Git repo volumes @@ -17031,7 +17031,7 @@ spec: description: Commit hash for the specified revision. type: string required: - - repository + - repository portworxVolume: description: PortworxVolumeSource represents a Portworx volume resource. @@ -17052,7 +17052,7 @@ spec: Implicitly inferred to be "ext4" if unspecified. type: string required: - - volumeID + - volumeID vsphereVolume: description: Represents a vSphere volume resource. type: object @@ -17076,7 +17076,7 @@ spec: inferred to be "ext4" if unspecified. type: string required: - - volumePath + - volumePath fc: description: Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write @@ -17127,9 +17127,9 @@ spec: to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string required: - - path + - path required: - - name + - name resources: description: Memory and CPU minimum requirements and limits for the server. @@ -17201,7 +17201,7 @@ spec: from. Must be a valid secret key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their output format @@ -17268,9 +17268,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -17279,7 +17279,7 @@ spec: optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object @@ -17296,7 +17296,7 @@ spec: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -17311,9 +17311,9 @@ spec: the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name restartPolicy: description: 'Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. @@ -17364,8 +17364,8 @@ spec: are mutually exclusive. This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name labels: description: The labels to be attached to generated resources. The label names must not start with 'weblogic.'. @@ -17467,8 +17467,8 @@ spec: in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config @@ -17518,13 +17518,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum @@ -17587,7 +17587,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -17609,10 +17609,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: description: Whether this container should allocate a buffer for stdin in the container runtime. If this @@ -17830,13 +17830,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum @@ -17899,7 +17899,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -17921,10 +17921,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: description: List of environment variables to set in the container. Cannot be updated. @@ -17973,7 +17973,7 @@ spec: key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their @@ -18047,9 +18047,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -18058,7 +18058,7 @@ spec: for volumes, optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object @@ -18075,7 +18075,7 @@ spec: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -18091,9 +18091,9 @@ spec: in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: description: List of ports to expose from the container. Exposing a port here gives the system additional information @@ -18136,7 +18136,7 @@ spec: do not need this. type: number required: - - containerPort + - containerPort command: description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if @@ -18195,8 +18195,8 @@ spec: 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable @@ -18245,13 +18245,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -18300,7 +18300,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -18322,10 +18322,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: description: Handler defines a specific action that should be taken @@ -18352,13 +18352,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -18407,7 +18407,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -18429,10 +18429,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). @@ -18480,13 +18480,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum @@ -18549,7 +18549,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -18571,10 +18571,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: description: Whether the container runtime should close the stdin channel after it has been opened by a single @@ -18640,7 +18640,7 @@ spec: be defined type: boolean required: - - name + - name containerSecurityContext: description: Container-level security attributes. Will override any matching pod-level attributes. @@ -18792,8 +18792,8 @@ spec: in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config @@ -18843,13 +18843,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum @@ -18912,7 +18912,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -18934,10 +18934,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: description: Whether this container should allocate a buffer for stdin in the container runtime. If this @@ -19155,13 +19155,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum @@ -19224,7 +19224,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -19246,10 +19246,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: description: List of environment variables to set in the container. Cannot be updated. @@ -19298,7 +19298,7 @@ spec: key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their @@ -19372,9 +19372,9 @@ spec: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string @@ -19383,7 +19383,7 @@ spec: for volumes, optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object @@ -19400,7 +19400,7 @@ spec: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -19416,9 +19416,9 @@ spec: in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: description: List of ports to expose from the container. Exposing a port here gives the system additional information @@ -19461,7 +19461,7 @@ spec: do not need this. type: number required: - - containerPort + - containerPort command: description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if @@ -19520,8 +19520,8 @@ spec: 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable @@ -19570,13 +19570,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -19625,7 +19625,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -19647,10 +19647,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: description: Handler defines a specific action that should be taken @@ -19677,13 +19677,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -19732,7 +19732,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -19754,10 +19754,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). @@ -19805,13 +19805,13 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum @@ -19874,7 +19874,7 @@ spec: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -19896,10 +19896,10 @@ spec: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: description: Whether the container runtime should close the stdin channel after it has been opened by a single @@ -19965,7 +19965,7 @@ spec: be defined type: boolean required: - - name + - name shutdown: description: Configures how the operator should shutdown the server instance. @@ -19981,8 +19981,8 @@ spec: instances. Not required. Defaults to graceful shutdown. type: string enum: - - Graceful - - Forced + - Graceful + - Forced timeoutSeconds: description: For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting @@ -20051,8 +20051,8 @@ spec: Gt, and Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. @@ -20089,10 +20089,10 @@ spec: Gt, and Lt. type: string required: - - key - - operator + - key + - operator required: - - nodeSelectorTerms + - nodeSelectorTerms preferredDuringSchedulingIgnoredDuringExecution: description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions @@ -20157,8 +20157,8 @@ spec: Gt, and Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. @@ -20195,16 +20195,16 @@ spec: Gt, and Lt. type: string required: - - key - - operator + - key + - operator weight: description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. type: number required: - - preference - - weight + - preference + - weight podAffinity: description: Pod affinity is a group of inter pod affinity scheduling rules. @@ -20276,8 +20276,8 @@ spec: and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -20306,7 +20306,7 @@ spec: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions @@ -20384,8 +20384,8 @@ spec: In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} @@ -20418,15 +20418,15 @@ spec: items: type: string required: - - topologyKey + - topologyKey weight: description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight podAntiAffinity: description: Pod anti affinity is a group of inter pod anti affinity scheduling rules. @@ -20498,8 +20498,8 @@ spec: and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -20528,7 +20528,7 @@ spec: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions @@ -20606,8 +20606,8 @@ spec: In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} @@ -20640,15 +20640,15 @@ spec: items: type: string required: - - topologyKey + - topologyKey weight: description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight clusterService: description: Customization affecting ClusterIP Kubernetes services for the WebLogic cluster. @@ -20670,14 +20670,14 @@ spec: Legal values are NEVER, or IF_NEEDED. type: string enum: - - NEVER - - IF_NEEDED + - NEVER + - IF_NEEDED restartVersion: description: If present, every time this value is updated the operator will restart the required servers. type: string required: - - clusterName + - clusterName status: type: object description: DomainStatus represents information about the status of a domain. @@ -20773,9 +20773,9 @@ spec: Available, and Failed. Required. type: string enum: - - Progressing - - Available - - Failed + - Progressing + - Available + - Failed lastTransitionTime: format: date-time description: Last time the condition transitioned from one status @@ -20829,18 +20829,9 @@ spec: type: number minimum: 0.0 versions: - - name: v6 - served: true - storage: true - - name: v2 - served: true - storage: false - - name: v3 - served: true - storage: false - - name: v4 - served: true - storage: false - - name: v5 - served: true - storage: false + - name: v7 + served: true + storage: true + - name: v6 + served: true + storage: false \ No newline at end of file diff --git a/kubernetes/hands-on-lab/domain.yaml b/kubernetes/hands-on-lab/domain.yaml index c78387c0a15..0bf7fb0b1be 100644 --- a/kubernetes/hands-on-lab/domain.yaml +++ b/kubernetes/hands-on-lab/domain.yaml @@ -1,5 +1,5 @@ -# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. -# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. +# Copyright (c) 2020, 2020, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # # This is an example of how to define a Domain resource. Please read through the comments which explain # what updates are needed. @@ -12,7 +12,6 @@ metadata: # Update this with the namespace your domain will run in: namespace: sample-domain1-ns labels: - weblogic.resourceVersion: domain-v2 # Update this with the `domainUID` of your domain: weblogic.domainUID: sample-domain1 @@ -69,7 +68,7 @@ spec: - name: USER_MEM_ARGS value: "-Xms64m -Xmx256m " # nodeSelector: -# node-for-weblogic: true +# node-for-weblogic: "true" # If you are storing your domain on a persistent volume (as opposed to inside the Docker image), # then uncomment this section and provide the PVC details and mount path here (standard images @@ -98,20 +97,20 @@ spec: #- channelName: T3Channel # serverPod: # nodeSelector: -# wlservers2: true +# wlservers2: "true" # managedServers: # - serverName: managed-server1 # serverPod: # nodeSelector: -# wlservers1: true +# wlservers1: "true" # - serverName: managed-server2 # serverPod: # nodeSelector: -# wlservers1: true +# wlservers1: "true" # - serverName: managed-server3 # serverPod: # nodeSelector: -# wlservers2: true +# wlservers2: "true" # clusters is used to configure the desired behavior for starting member servers of a cluster. # If you use this entry, then the rules will be applied to ALL servers that are members of the named clusters. clusters: diff --git a/kubernetes/hands-on-lab/tutorials/deploy.weblogic_short.ocishell.md b/kubernetes/hands-on-lab/tutorials/deploy.weblogic_short.ocishell.md index 001c8a85441..c3588bc9023 100644 --- a/kubernetes/hands-on-lab/tutorials/deploy.weblogic_short.ocishell.md +++ b/kubernetes/hands-on-lab/tutorials/deploy.weblogic_short.ocishell.md @@ -82,7 +82,7 @@ As a simple solution, it's best to configure path routing, which will route exte Execute the following Ingress resource definition: ```bash cat << EOF | kubectl apply -f - -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: traefik-pathrouting-1 diff --git a/kubernetes/hands-on-lab/tutorials/node.selector.license.ocishell.md b/kubernetes/hands-on-lab/tutorials/node.selector.license.ocishell.md index 66443f25b07..1c5c2e84913 100644 --- a/kubernetes/hands-on-lab/tutorials/node.selector.license.ocishell.md +++ b/kubernetes/hands-on-lab/tutorials/node.selector.license.ocishell.md @@ -52,7 +52,7 @@ serverPod: env: [...] nodeSelector: - node-for-weblogic: true + node-for-weblogic: "true" ``` Be careful with the indentation. You can double check the syntax in the sample [domain.yaml](../domain.yaml) where this part is in a comment. diff --git a/kubernetes/hands-on-lab/tutorials/node.selector.ocishell.md b/kubernetes/hands-on-lab/tutorials/node.selector.ocishell.md index eb04021dc5c..93f87522eec 100644 --- a/kubernetes/hands-on-lab/tutorials/node.selector.ocishell.md +++ b/kubernetes/hands-on-lab/tutorials/node.selector.ocishell.md @@ -63,7 +63,7 @@ adminServer: [...] serverPod: nodeSelector: - wlservers2: true + wlservers2: "true" ``` Assign 2-2 servers (including the Administration Server) to 1-1 labelled node. You can double check the syntax in the sample [domain.yaml](../domain.yaml) where this part is in a comment. @@ -76,15 +76,15 @@ spec: - serverName: managed-server1 serverPod: nodeSelector: - wlservers1: true + wlservers1: "true" - serverName: managed-server2 serverPod: nodeSelector: - wlservers1: true + wlservers1: "true" - serverName: managed-server3 serverPod: nodeSelector: - wlservers2: true + wlservers2: "true" [...] ``` Keep the proper indentation. Save the changes and apply the new domain resource definition. diff --git a/kubernetes/pom.xml b/kubernetes/pom.xml index c5902b16dac..cc5fee78443 100644 --- a/kubernetes/pom.xml +++ b/kubernetes/pom.xml @@ -9,7 +9,7 @@ oracle.kubernetes operator-parent - 2.6.0 + 3.0.0 installation-tests diff --git a/kubernetes/samples/README.md b/kubernetes/samples/README.md index dbd673f4df6..ea615a31a16 100644 --- a/kubernetes/samples/README.md +++ b/kubernetes/samples/README.md @@ -10,8 +10,9 @@ While these samples may be useful and usable as is, it is intended that you woul * [Sample for creating a Kubernetes secret](scripts/create-weblogic-domain-credentials/README.md) that contains the Administration Server credentials. This secret can be used in creating a WebLogic domain resource. * [Sample for creating a PV or PVC](scripts/create-weblogic-domain-pv-pvc/README.md) that can be used by a domain resource as the persistent storage for the WebLogic domain home or log files. -* [Sample for creating a WebLogic domain home on an existing PV or PVC](../../docs-source/content/samples/simple/domains/domain-home-on-pv/_index.md), and the domain resource YAML file for deploying the generated WebLogic domain. -* [Sample for creating a WebLogic domain home inside a Docker image](../../docs-source/content/samples/simple/domains/domain-home-in-image/_index.md), and the domain resource YAML file for deploying the generated WebLogic domain. +* [Sample for creating a WebLogic domain home on an existing PV or PVC (Domain in PV)](../../docs-source/content/samples/simple/domains/domain-home-on-pv/_index.md), and the domain resource YAML file for deploying the generated WebLogic domain. +* [Sample for creating a WebLogic domain home inside a Docker image (Domain in Image)](../../docs-source/content/samples/simple/domains/domain-home-in-image/_index.md), and the domain resource YAML file for deploying the generated WebLogic domain. +* [Sample for creating a WebLogic Deploy Tool model inside a Docker image (Model in Image)](../../docs-source/content/samples/simple/domains/model-in-image/_index.md), and the domain resource YAML file for deploying the generated WebLogic domain. * [Sample for configuring the Elasticsearch and Kibana](scripts/elasticsearch-and-kibana/README.md) deployments and services for the operator's logs. * [Sample for generating a self-signed certificate and private key](scripts/rest/README.md) that can be used for the operator's external REST API. * [Sample for creating an OKE cluster using Terraform](scripts/terraform/README.md). diff --git a/kubernetes/samples/charts/apache-samples/custom-sample/README.md b/kubernetes/samples/charts/apache-samples/custom-sample/README.md index 0a7084b9cb9..9947e18f352 100644 --- a/kubernetes/samples/charts/apache-samples/custom-sample/README.md +++ b/kubernetes/samples/charts/apache-samples/custom-sample/README.md @@ -39,10 +39,8 @@ In this sample, we will provide a custom Apache plugin configuration to fine tun * Create a custom Apache plugin configuration file named `custom_mod_wl_apache.conf`. The file content is similar to below. ``` -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. -# +# Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. -# WebLogicHost ${WEBLOGIC_HOST} @@ -104,8 +102,7 @@ $ touch input.yaml Edit the input parameters file, `input.yaml`. The file content is similar to below. ``` -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. -# +# Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # Use this to provide your own Apache webtier configuration as needed; simply define this diff --git a/kubernetes/samples/charts/apache-samples/custom-sample/certgen.sh b/kubernetes/samples/charts/apache-samples/custom-sample/certgen.sh index 2b8c077f8fa..d3ae420a0b9 100755 --- a/kubernetes/samples/charts/apache-samples/custom-sample/certgen.sh +++ b/kubernetes/samples/charts/apache-samples/custom-sample/certgen.sh @@ -1,14 +1,12 @@ #!/bin/sh +# Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # # Since: June, 2018 # Author: dongbo.xiao@oracle.com # Description: script to start Apache HTTP Server # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. -# -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # Generated configuration file CONFIG_FILE="config.txt" diff --git a/kubernetes/samples/charts/apache-samples/custom-sample/custom_mod_wl_apache.conf b/kubernetes/samples/charts/apache-samples/custom-sample/custom_mod_wl_apache.conf index c3a6f7333e3..77e7e4df3f7 100644 --- a/kubernetes/samples/charts/apache-samples/custom-sample/custom_mod_wl_apache.conf +++ b/kubernetes/samples/charts/apache-samples/custom-sample/custom_mod_wl_apache.conf @@ -1,7 +1,5 @@ -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. -# +# Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. -# WebLogicHost ${WEBLOGIC_HOST} diff --git a/kubernetes/samples/charts/apache-samples/custom-sample/input.yaml b/kubernetes/samples/charts/apache-samples/custom-sample/input.yaml index a68b3389403..ae9297f5226 100644 --- a/kubernetes/samples/charts/apache-samples/custom-sample/input.yaml +++ b/kubernetes/samples/charts/apache-samples/custom-sample/input.yaml @@ -1,5 +1,4 @@ -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. -# +# Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # Use this to provide your own Apache webtier configuration as needed; simply define this diff --git a/kubernetes/samples/charts/apache-webtier/templates/cluster-role-binding.yaml b/kubernetes/samples/charts/apache-webtier/templates/cluster-role-binding.yaml index 4942308d608..e97f7450fc8 100644 --- a/kubernetes/samples/charts/apache-webtier/templates/cluster-role-binding.yaml +++ b/kubernetes/samples/charts/apache-webtier/templates/cluster-role-binding.yaml @@ -6,8 +6,6 @@ kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: {{ template "apache.fullname" . }} - labels: - weblogic.resourceVersion: "loadbalancer-v2" roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole diff --git a/kubernetes/samples/charts/apache-webtier/templates/cluster-role.yaml b/kubernetes/samples/charts/apache-webtier/templates/cluster-role.yaml index 5c2131b43d9..299336825db 100644 --- a/kubernetes/samples/charts/apache-webtier/templates/cluster-role.yaml +++ b/kubernetes/samples/charts/apache-webtier/templates/cluster-role.yaml @@ -6,8 +6,6 @@ kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: {{ template "apache.fullname" . }} - labels: - weblogic.resourceVersion: "loadbalancer-v2" rules: - apiGroups: - "" diff --git a/kubernetes/samples/charts/apache-webtier/templates/deployment.yaml b/kubernetes/samples/charts/apache-webtier/templates/deployment.yaml index 256532f9901..ec7622f1708 100644 --- a/kubernetes/samples/charts/apache-webtier/templates/deployment.yaml +++ b/kubernetes/samples/charts/apache-webtier/templates/deployment.yaml @@ -2,24 +2,21 @@ # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. kind: Deployment -apiVersion: extensions/v1beta1 +apiVersion: apps/v1 metadata: name: {{ template "apache.fullname" . }} namespace: {{ .Release.Namespace }} labels: app: {{ template "apache.fullname" . }} - weblogic.resourceVersion: "loadbalancer-v2" spec: replicas: 1 selector: matchLabels: app: {{ template "apache.fullname" . }} - weblogic.resourceVersion: "loadbalancer-v2" template: metadata: labels: app: {{ template "apache.fullname" . }} - weblogic.resourceVersion: "loadbalancer-v2" spec: serviceAccountName: {{ template "apache.serviceAccountName" . }} terminationGracePeriodSeconds: 60 diff --git a/kubernetes/samples/charts/apache-webtier/templates/secret.yaml b/kubernetes/samples/charts/apache-webtier/templates/secret.yaml index b183ae2b992..1d0cc8213f1 100644 --- a/kubernetes/samples/charts/apache-webtier/templates/secret.yaml +++ b/kubernetes/samples/charts/apache-webtier/templates/secret.yaml @@ -7,8 +7,6 @@ kind: Secret metadata: name: {{ template "apache.fullname" . }}-cert namespace: {{ .Release.Namespace | quote }} - labels: - weblogic.resourceVersion: "loadbalancer-v2" type: Opaque data: tls.crt: {{ .Values.customCert | quote }} diff --git a/kubernetes/samples/charts/apache-webtier/templates/service-account.yaml b/kubernetes/samples/charts/apache-webtier/templates/service-account.yaml index b7568cadc43..367096f46a7 100644 --- a/kubernetes/samples/charts/apache-webtier/templates/service-account.yaml +++ b/kubernetes/samples/charts/apache-webtier/templates/service-account.yaml @@ -6,5 +6,3 @@ kind: ServiceAccount metadata: name: {{ template "apache.serviceAccountName" . }} namespace: {{ .Release.Namespace | quote }} - labels: - weblogic.resourceVersion: "loadbalancer-v2" diff --git a/kubernetes/samples/charts/apache-webtier/templates/service.yaml b/kubernetes/samples/charts/apache-webtier/templates/service.yaml index cc0a086368c..971859663e5 100644 --- a/kubernetes/samples/charts/apache-webtier/templates/service.yaml +++ b/kubernetes/samples/charts/apache-webtier/templates/service.yaml @@ -6,13 +6,10 @@ kind: Service metadata: name: {{ template "apache.fullname" . }} namespace: {{ .Release.Namespace | quote }} - labels: - weblogic.resourceVersion: "loadbalancer-v2" spec: type: NodePort selector: app: {{ template "apache.fullname" . }} - weblogic.resourceVersion: "loadbalancer-v2" ports: - port: 80 nodePort: {{ .Values.httpNodePort }} diff --git a/kubernetes/samples/charts/ingress-per-domain/templates/traefik-ingress.yaml b/kubernetes/samples/charts/ingress-per-domain/templates/traefik-ingress.yaml index ca92552496a..22e7507f096 100644 --- a/kubernetes/samples/charts/ingress-per-domain/templates/traefik-ingress.yaml +++ b/kubernetes/samples/charts/ingress-per-domain/templates/traefik-ingress.yaml @@ -1,15 +1,13 @@ -# Copyright (c) 2018, 2019, Oracle Corporation and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. {{- if eq .Values.type "TRAEFIK" }} --- -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: {{ .Values.wlsDomain.domainUID }}-traefik namespace: {{ .Release.Namespace }} - labels: - weblogic.resourceVersion: domain-v2 annotations: kubernetes.io/ingress.class: traefik spec: diff --git a/kubernetes/samples/charts/ingress-per-domain/templates/voyager-ingress.yaml b/kubernetes/samples/charts/ingress-per-domain/templates/voyager-ingress.yaml index 774385d5c3b..b5f41325ed7 100644 --- a/kubernetes/samples/charts/ingress-per-domain/templates/voyager-ingress.yaml +++ b/kubernetes/samples/charts/ingress-per-domain/templates/voyager-ingress.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2019, Oracle Corporation and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. {{- if eq .Values.type "VOYAGER" }} @@ -8,8 +8,6 @@ kind: Ingress metadata: name: {{ .Values.wlsDomain.domainUID }}-voyager namespace: {{ .Release.Namespace }} - labels: - weblogic.resourceVersion: domain-v2 annotations: ingress.appscode.com/type: 'NodePort' ingress.appscode.com/stats: 'true' @@ -30,8 +28,6 @@ kind: Service metadata: name: {{ .Values.wlsDomain.domainUID }}-voyager-stats namespace: {{ .Release.Namespace }} - labels: - weblogic.resourceVersion: domain-v2 spec: type: NodePort ports: diff --git a/kubernetes/samples/charts/traefik/samples/host-routing.yaml b/kubernetes/samples/charts/traefik/samples/host-routing.yaml index 2cbc13439e8..5738edd1d31 100644 --- a/kubernetes/samples/charts/traefik/samples/host-routing.yaml +++ b/kubernetes/samples/charts/traefik/samples/host-routing.yaml @@ -1,4 +1,4 @@ -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: @@ -16,7 +16,7 @@ spec: servicePort: 8001 --- -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: diff --git a/kubernetes/samples/charts/traefik/samples/path-routing.yaml b/kubernetes/samples/charts/traefik/samples/path-routing.yaml index a9570bb9639..83d169bdff3 100644 --- a/kubernetes/samples/charts/traefik/samples/path-routing.yaml +++ b/kubernetes/samples/charts/traefik/samples/path-routing.yaml @@ -1,4 +1,4 @@ -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: traefik-pathrouting-1 @@ -17,7 +17,7 @@ spec: serviceName: domain1-cluster-cluster-1 servicePort: 8001 --- -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: traefik-pathrouting-2 diff --git a/kubernetes/samples/charts/traefik/samples/tls.yaml b/kubernetes/samples/charts/traefik/samples/tls.yaml index 07acaa48b67..4feab428ae8 100644 --- a/kubernetes/samples/charts/traefik/samples/tls.yaml +++ b/kubernetes/samples/charts/traefik/samples/tls.yaml @@ -1,4 +1,4 @@ -apiVersion: extensions/v1beta1 +apiVersion:networking.k8s.io/v1beta1 kind: Ingress metadata: name: traefik-tls @@ -20,7 +20,7 @@ spec: - domain1.org secretName: domain1-tls-cert --- -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: traefik-tls-2 diff --git a/kubernetes/samples/charts/util/setup.sh b/kubernetes/samples/charts/util/setup.sh index 47178d1f706..978f9552bb2 100755 --- a/kubernetes/samples/charts/util/setup.sh +++ b/kubernetes/samples/charts/util/setup.sh @@ -2,125 +2,117 @@ # Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. -# This script is to create or delete Ingress controllers. We support two ingress controllers: traefik and voyager. - -MYDIR="$(dirname "$(readlink -f "$0")")" -VNAME=voyager-operator # release name of Voyager -TNAME=traefik-operator # release name of Traefik -VSPACE=voyager # NameSpace for Voyager -TSPACE=traefik # NameSpace for Traefik +# This script is to create or delete Ingress controllers. +# We support two ingress controllers: Traefik and Voyager. + +UTILDIR="$(dirname "$(readlink -f "$0")")" +VNAME=voyager-operator # release name for Voyager +TNAME=traefik-operator # release name for Traefik +VSPACE=voyager # namespace for Voyager +TSPACE=traefik # namespace for Traefik DefaultVoyagerVersion=10.0.0 HELM_VERSION=$(helm version --short --client) - if [[ "$HELM_VERSION" =~ "v2" ]]; then - echo "Detected Helm Version [${HELM_VERSION}]" - v_list_args="" - t_list_args="" - v_helm_delete="helm delete --purge" - t_helm_delete="helm delete --purge" - v_helm_install="helm install appscode/voyager --name $VNAME " - t_helm_install="helm install stable/traefik --name $TNAME " - helm_search="helm search repo | grep appscode/voyager" -elif [[ "$HELM_VERSION" =~ "v3" ]]; then - echo "Detected Helm Version [${HELM_VERSION}]" - v_list_args="--namespace $VSPACE " - t_list_args="--namespace $TSPACE " - v_helm_delete="helm uninstall --keep-history --namespace $VSPACE " - t_helm_delete="helm uninstall --keep-history --namespace $TSPACE " - v_helm_install="helm install $VNAME appscode/voyager " - t_helm_install="helm install $TNAME stable/traefik " - helm_search="helm search appscode/voyager" -else - echo "Detected Unsuppoted Helm Version [${HELM_VERSION}]" - exit 1 + echo "Detected unsupported Helm version [${HELM_VERSION}]" + exit -1 fi function createNameSpace() { ns=$1 namespace=`kubectl get namespace ${ns} | grep ${ns} | awk '{print $1}'` if [ -z ${namespace} ]; then - echo "Adding NameSpace[$ns] to Kubernetes Cluster" + echo "Adding namespace[$ns] to Kubernetes cluster" kubectl create namespace ${ns} fi } function createVoyager() { createNameSpace $VSPACE - echo "Creating Voyager operator on namespace 'voyager'." + echo "Creating Voyager operator on namespace ${VSPACE}" echo - if [ "$(${helm_search} | grep voyager | wc -l)" = 0 ]; then - echo "Add Appscode Chart Repository" + if [ "$(helm search appscode/voyager | grep voyager | wc -l)" = 0 ]; then + echo "Add AppsCode chart repository" helm repo add appscode https://charts.appscode.com/stable/ helm repo update else - echo "Appscode Chart Repository is already added." + echo "AppsCode chart repository is already added." fi - echo - if [ "$(helm list ${v_list_args} | grep $VNAME | wc -l)" = 0 ]; then - echo "Installing Voyager Operator." - - ${v_helm_install} --version ${VoyagerVersion} \ + if [ "$(helm list --namespace $VSPACE | grep $VNAME | wc -l)" = 0 ]; then + echo "Installing Voyager operator." + helm install $VNAME appscode/voyager --version ${VoyagerVersion} \ --namespace ${VSPACE} \ --set cloudProvider=baremetal \ --set apiserver.enableValidatingWebhook=false \ --set ingressClass=voyager else echo "Voyager operator is already installed." + exit 0; fi echo - echo "Wait until Voyager operator running." + echo "Wait until Voyager operator pod is running." max=20 count=0 - while [ $count -lt $max ]; do - kubectl -n ${VSPACE} get pod - if [ "$(kubectl -n voyager get pod | grep voyager | awk '{ print $2 }')" = 1/1 ]; then - echo "Voyager operator is running now." + vpod==$(kubectl get po -n ${VSPACE} | grep voyager | awk '{print $1 }') + while test $count -lt $max; do + if test "$(kubectl get po -n ${VSPACE} | grep voyager | awk '{ print $2 }')" = 1/1; then + echo "Voyager operator pod is running now." exit 0; fi count=`expr $count + 1` sleep 5 done - echo "Error: Voyager operator failed to start." + echo "ERROR: Voyager operator pod failed to start." + kubectl describe pod/${vpod} -n ${VSPACE} exit 1 - } function createTraefik() { createNameSpace $TSPACE - echo "Creating Traefik operator on namespace 'traefik'." - echo + echo "Creating Traefik operator on namespace ${TSPACE}" - if [ "$(helm list ${t_list_args} | grep $TNAME | wc -l)" = 0 ]; then - echo "Installing Traefik Operator." - ${t_helm_install} --namespace ${TSPACE} --values ${MYDIR}/../traefik/values.yaml + if [ "$(helm search stable/traefik | grep traefik | wc -l)" = 0 ]; then + echo "Add K8SGoogle chart repository" + helm repo add stable https://kubernetes-charts.storage.googleapis.com + helm repo update else - echo "Traefik Operator is already installed." + echo "K8SGoogle chart repository is already added." + fi + + if [ "$(helm list --namespace $TSPACE | grep $TNAME | wc -l)" = 0 ]; then + echo "Installing Traefik operator." + helm install $TNAME stable/traefik --namespace ${TSPACE} \ + --values ${UTILDIR}/../traefik/values.yaml + else + echo "Traefik operator is already installed." + exit 0; fi echo - echo "Wait until Traefik operator running." + echo "Wait until Traefik operator pod is running." max=20 count=0 + tpod=$(kubectl get po -n ${TSPACE} | grep traefik | awk '{print $1 }') while test $count -lt $max; do - kubectl -n traefik get pod - if test "$(kubectl -n ${TSPACE} get pod | grep traefik | awk '{ print $2 }')" = 1/1; then - echo "Traefik operator is running now." + if test "$(kubectl get po -n ${TSPACE} | grep traefik | awk '{ print $2 }')" = 1/1; then + echo "Traefik operator pod is running now." exit 0; fi count=`expr $count + 1` sleep 5 done - echo "Error: Traefik operator failed to start." + echo "ERROR: Traefik operator pod failed to start." + echo + kubectl describe pod/${tpod} -n ${TSPACE} exit 1 } function purgeCRDs() { - # get rid of Voyager crd deletion deadlock: https://github.com/kubernetes/kubernetes/issues/60538 + # get rid of Voyager CRD deletion deadlock: https://github.com/kubernetes/kubernetes/issues/60538 crds=(certificates ingresses) for crd in "${crds[@]}"; do pairs=($(kubectl get ${crd}.voyager.appscode.com --all-namespaces -o jsonpath='{range .items[*]}{.metadata.name} {.metadata.namespace} {end}' || true)) @@ -128,7 +120,7 @@ function purgeCRDs() { # save objects if [ $total -gt 0 ]; then - echo "dumping ${crd} objects into ${crd}.yaml" + echo "Dumping ${crd} objects into ${crd}.yaml" kubectl get ${crd}.voyager.appscode.com --all-namespaces -o yaml >${crd}.yaml fi @@ -138,7 +130,7 @@ function purgeCRDs() { # remove finalizers kubectl patch ${crd}.voyager.appscode.com $name -n $namespace -p '{"metadata":{"finalizers":[]}}' --type=merge # delete crd object - echo "deleting ${crd} $namespace/$name" + echo "Deleting ${crd} $namespace/$name" kubectl delete ${crd}.voyager.appscode.com $name -n $namespace done @@ -150,28 +142,26 @@ function purgeCRDs() { } function deleteVoyager() { - if [ "$(helm list ${v_list_args} | grep $VNAME | wc -l)" = 1 ]; then - echo "Deleting Voyager Operator. " - ${v_helm_delete} $VNAME + if [ "$(helm list --namespace $VSPACE | grep $VNAME | wc -l)" = 1 ]; then + echo "Deleting voyager operator. " + helm uninstall --namespace $VSPACE $VNAME kubectl delete ns ${VSPACE} purgeCRDs else echo "Voyager operator has already been deleted" fi - echo if [ "$(helm search appscode/voyager | grep voyager | wc -l)" != 0 ]; then - echo "Remove Appscode Chart Repository." + echo "Remove appscode chart repository." helm repo remove appscode fi - echo } function deleteTraefik() { - if [ "$(helm list ${t_list_args}| grep $TNAME | wc -l)" = 1 ]; then + if [ "$(helm list --namespace $TSPACE | grep $TNAME | wc -l)" = 1 ]; then echo "Deleting Traefik operator." - ${t_helm_delete} $TNAME + helm uninstall --namespace $TSPACE $TNAME kubectl delete ns ${TSPACE} else echo "Traefik operator has already been deleted" @@ -185,7 +175,7 @@ function usage() { function main() { if [ "$#" -lt 2 ]; then - echo "[ERROR] Requires atleast 2 positional parameters" + echo "[ERROR] Requires at least 2 positional parameters" usage fi @@ -194,7 +184,7 @@ function main() { usage fi if [ "$2" != traefik ] && [ "$2" != voyager ]; then - echo "[ERROR] The second parameter MUST be either traefik or voyager " + echo "[ERROR] The second parameter MUST be either traefik or voyager " usage fi @@ -203,7 +193,7 @@ function main() { createTraefik else VoyagerVersion="${3:-${DefaultVoyagerVersion}}" - echo "Selected Voyager Version [$VoyagerVersion]" + echo "Selected voyager version [$VoyagerVersion]" createVoyager fi else diff --git a/kubernetes/samples/scripts/common/domain-template.yaml b/kubernetes/samples/scripts/common/domain-template.yaml index 08939ca297e..7c7f85c0d8d 100644 --- a/kubernetes/samples/scripts/common/domain-template.yaml +++ b/kubernetes/samples/scripts/common/domain-template.yaml @@ -3,20 +3,20 @@ # # This is an example of how to define a Domain resource. # -apiVersion: "weblogic.oracle/v7" +apiVersion: "weblogic.oracle/v8" kind: Domain metadata: name: %DOMAIN_UID% namespace: %NAMESPACE% labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: %DOMAIN_UID% spec: # The WebLogic Domain Home domainHome: %DOMAIN_HOME% - # If the domain home is in the image - domainHomeInImage: %DOMAIN_HOME_IN_IMAGE% + # The domain home source type + # Set to PersistentVolume for domain-in-pv, Image for domain-in-image, or FromModel for model-in-image + domainHomeSourceType: %DOMAIN_HOME_SOURCE_TYPE% # The WebLogic Server Docker image that the Operator uses to start the domain image: "%WEBLOGIC_IMAGE%" @@ -39,6 +39,9 @@ spec: # Whether to enable log home %LOG_HOME_ON_PV_PREFIX%logHomeEnabled: %LOG_HOME_ENABLED% + # Whether to write HTTP access log file to log home + %LOG_HOME_ON_PV_PREFIX%httpAccessLogInLogHome: %HTTP_ACCESS_LOG_IN_LOG_HOME% + # The in-pod location for domain log, server logs, server out, and Node Manager log files %LOG_HOME_ON_PV_PREFIX%logHome: %LOG_HOME% # An (optional) in-pod location for data storage of default and custom file stores. @@ -46,6 +49,7 @@ spec: # data storage directories are determined from the WebLogic domain home configuration. dataHome: "%DATA_HOME%" + # serverStartPolicy legal values are "NEVER", "IF_NEEDED", or "ADMIN_ONLY" # This determines which WebLogic Servers the Operator will start up when it discovers this Domain # - "NEVER" will not start any server in the domain @@ -59,7 +63,7 @@ spec: - name: JAVA_OPTIONS value: "%JAVA_OPTIONS%" - name: USER_MEM_ARGS - value: "-Djava.security.egd=file:/dev/./urandom " + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx512m " %OPTIONAL_SERVERPOD_RESOURCES% %LOG_HOME_ON_PV_PREFIX%volumes: %LOG_HOME_ON_PV_PREFIX%- name: weblogic-domain-storage-volume @@ -112,3 +116,4 @@ spec: %ISTIO_PREFIX% istio: %ISTIO_PREFIX% enabled: %ISTIO_ENABLED% %ISTIO_PREFIX% readinessPort: %ISTIO_READINESS_PORT% + diff --git a/kubernetes/samples/scripts/common/jrf-domain-template.yaml b/kubernetes/samples/scripts/common/jrf-domain-template.yaml new file mode 100644 index 00000000000..5486c5e9e09 --- /dev/null +++ b/kubernetes/samples/scripts/common/jrf-domain-template.yaml @@ -0,0 +1,123 @@ +# Copyright (c) 2017, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# This is an example of how to define a Domain resource. +# +apiVersion: "weblogic.oracle/v8" +kind: Domain +metadata: + name: %DOMAIN_UID% + namespace: %NAMESPACE% + labels: + weblogic.domainUID: %DOMAIN_UID% +spec: + # The WebLogic Domain Home + domainHome: %DOMAIN_HOME% + + # The domain home source type + # Set to PersistentVolume for domain-in-pv, Image for domain-in-image, or FromModel for model-in-image + domainHomeSourceType: %DOMAIN_HOME_SOURCE_TYPE% + + # The WebLogic Server Docker image that the Operator uses to start the domain + image: "%WEBLOGIC_IMAGE%" + + # imagePullPolicy defaults to "Always" if image version is :latest + imagePullPolicy: "%WEBLOGIC_IMAGE_PULL_POLICY%" + + # Identify which Secret contains the credentials for pulling an image + %WEBLOGIC_IMAGE_PULL_SECRET_PREFIX%imagePullSecrets: + %WEBLOGIC_IMAGE_PULL_SECRET_PREFIX%- name: %WEBLOGIC_IMAGE_PULL_SECRET_NAME% + + # Identify which Secret contains the WebLogic Admin credentials (note that there is an example of + # how to create that Secret at the end of this file) + webLogicCredentialsSecret: + name: %WEBLOGIC_CREDENTIALS_SECRET_NAME% + + # Whether to include the server out file into the pod's stdout, default is true + includeServerOutInPodLog: %INCLUDE_SERVER_OUT_IN_POD_LOG% + + # Whether to enable log home + %LOG_HOME_ON_PV_PREFIX%logHomeEnabled: %LOG_HOME_ENABLED% + + # Whether to write HTTP access log file to log home + %LOG_HOME_ON_PV_PREFIX%httpAccessLogInLogHome: %HTTP_ACCESS_LOG_IN_LOG_HOME% + + # The in-pod location for domain log, server logs, server out, and Node Manager log files + %LOG_HOME_ON_PV_PREFIX%logHome: %LOG_HOME% + # An (optional) in-pod location for data storage of default and custom file stores. + # If not specified or the value is either not set or empty (e.g. dataHome: "") then the + # data storage directories are determined from the WebLogic domain home configuration. + dataHome: "%DATA_HOME%" + + # serverStartPolicy legal values are "NEVER", "IF_NEEDED", or "ADMIN_ONLY" + # This determines which WebLogic Servers the Operator will start up when it discovers this Domain + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server and clustered servers up to the replica count + serverStartPolicy: "%SERVER_START_POLICY%" + + serverPod: + # an (optional) list of environment variable to be set on the servers + env: + - name: JAVA_OPTIONS + value: "%JAVA_OPTIONS%" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx1024m " + %OPTIONAL_SERVERPOD_RESOURCES% + %LOG_HOME_ON_PV_PREFIX%volumes: + %LOG_HOME_ON_PV_PREFIX%- name: weblogic-domain-storage-volume + %LOG_HOME_ON_PV_PREFIX% persistentVolumeClaim: + %LOG_HOME_ON_PV_PREFIX% claimName: %DOMAIN_PVC_NAME% + %LOG_HOME_ON_PV_PREFIX%volumeMounts: + %LOG_HOME_ON_PV_PREFIX%- mountPath: %DOMAIN_ROOT_DIR% + %LOG_HOME_ON_PV_PREFIX% name: weblogic-domain-storage-volume + + # adminServer is used to configure the desired behavior for starting the administration server. + adminServer: + # serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + %EXPOSE_ANY_CHANNEL_PREFIX%adminService: + %EXPOSE_ANY_CHANNEL_PREFIX% channels: + # The Admin Server's NodePort + %EXPOSE_ADMIN_PORT_PREFIX% - channelName: default + %EXPOSE_ADMIN_PORT_PREFIX% nodePort: %ADMIN_NODE_PORT% + # Uncomment to export the T3Channel as a service + %EXPOSE_T3_CHANNEL_PREFIX% - channelName: T3Channel + serverPod: + # an (optional) list of environment variable to be set on the admin servers + env: + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms512m -Xmx1024m " + + # clusters is used to configure the desired behavior for starting member servers of a cluster. + # If you use this entry, then the rules will be applied to ALL servers that are members of the named clusters. + clusters: + - clusterName: %CLUSTER_NAME% + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: %INITIAL_MANAGED_SERVER_REPLICAS% + # The number of managed servers to start for unlisted clusters + # replicas: 1 + + # Istio + %ISTIO_PREFIX%configuration: + %ISTIO_PREFIX% istio: + %ISTIO_PREFIX% enabled: %ISTIO_ENABLED% + %ISTIO_PREFIX% readinessPort: %ISTIO_READINESS_PORT% + diff --git a/kubernetes/samples/scripts/common/utility.sh b/kubernetes/samples/scripts/common/utility.sh index 199169e405d..f19b58ccbf9 100644 --- a/kubernetes/samples/scripts/common/utility.sh +++ b/kubernetes/samples/scripts/common/utility.sh @@ -301,6 +301,25 @@ function createFiles { else istioPrefix="${disabledPrefix}" fi + + # The FromModel, MII (model-in-image), and WDT_DOMAIN_TYPE updates in this script + # must remain even though they are not referenced by a sample. They're used by the + # Operator integration test code. If you're interested in MII, + # see './kubernetes/samples/scripts/create-weblogic-domain/model-in-image'. + + # MII settings are used for model-in-image integration testing + if [ "${domainHomeSourceType}" == "FromModel" ]; then + miiPrefix="${enabledPrefix}" + else + miiPrefix="${disabledPrefix}" + fi + + # MII settings are used for model-in-image integration testing + if [ -z "${miiConfigMap}" ]; then + miiConfigMapPrefix="${disabledPrefix}" + else + miiConfigMapPrefix="${enabledPrefix}" + fi # For some parameters, use the default value if not defined. if [ -z "${domainPVMountPath}" ]; then @@ -311,6 +330,10 @@ function createFiles { logHome="${domainPVMountPath}/logs/${domainUID}" fi + if [ -z "${httpAccessLogInLogHome}" ]; then + httpAccessLogInLogHome="true" + fi + if [ -z "${dataHome}" ]; then dataHome="" fi @@ -323,8 +346,6 @@ function createFiles { weblogicCredentialsSecretName="${domainUID}-weblogic-credentials" fi - wdtVersion="${WDT_VERSION}" - if [ "${domainHomeInImage}" == "true" ]; then domainPropertiesOutput="${domainOutputDir}/domain.properties" domainHome="/u01/oracle/user_projects/domains/${domainName}" @@ -339,11 +360,14 @@ function createFiles { cp ${domainPropertiesInput} ${domainPropertiesOutput} sed -i -e "s:%DOMAIN_NAME%:${domainName}:g" ${domainPropertiesOutput} sed -i -e "s:%ADMIN_PORT%:${adminPort}:g" ${domainPropertiesOutput} + sed -i -e "s:%ADMIN_SERVER_SSL_PORT%:${adminServerSSLPort}:g" ${domainPropertiesOutput} sed -i -e "s:%ADMIN_SERVER_NAME%:${adminServerName}:g" ${domainPropertiesOutput} sed -i -e "s:%MANAGED_SERVER_PORT%:${managedServerPort}:g" ${domainPropertiesOutput} + sed -i -e "s:%MANAGED_SERVER_SSL_PORT%:${managedServerSSLPort}:g" ${domainPropertiesOutput} sed -i -e "s:%MANAGED_SERVER_NAME_BASE%:${managedServerNameBase}:g" ${domainPropertiesOutput} sed -i -e "s:%CONFIGURED_MANAGED_SERVER_COUNT%:${configuredManagedServerCount}:g" ${domainPropertiesOutput} sed -i -e "s:%CLUSTER_NAME%:${clusterName}:g" ${domainPropertiesOutput} + sed -i -e "s:%SSL_ENABLED%:${sslEnabled}:g" ${domainPropertiesOutput} sed -i -e "s:%PRODUCTION_MODE_ENABLED%:${productionModeEnabled}:g" ${domainPropertiesOutput} sed -i -e "s:%CLUSTER_TYPE%:${clusterType}:g" ${domainPropertiesOutput} sed -i -e "s:%JAVA_OPTIONS%:${javaOptions}:g" ${domainPropertiesOutput} @@ -351,6 +375,7 @@ function createFiles { sed -i -e "s:%T3_PUBLIC_ADDRESS%:${t3PublicAddress}:g" ${domainPropertiesOutput} sed -i -e "s:%EXPOSE_T3_CHANNEL%:${exposeAdminT3Channel}:g" ${domainPropertiesOutput} sed -i -e "s:%FMW_DOMAIN_TYPE%:${fmwDomainType}:g" ${domainPropertiesOutput} + sed -i -e "s:%WDT_DOMAIN_TYPE%:${wdtDomainType}:g" ${domainPropertiesOutput} if [ -z "${image}" ]; then # calculate the internal name to tag the generated image @@ -362,6 +387,9 @@ function createFiles { sed -i -e "s|%IMAGE_NAME%|${image}|g" ${domainPropertiesOutput} fi else + # we're in the domain in PV case + + wdtVersion="${WDT_VERSION:-${wdtVersion}}" createJobOutput="${domainOutputDir}/create-domain-job.yaml" deleteJobOutput="${domainOutputDir}/delete-domain-job.yaml" @@ -395,14 +423,17 @@ function createFiles { sed -i -e "s:%DOMAIN_UID%:${domainUID}:g" ${createJobOutput} sed -i -e "s:%DOMAIN_NAME%:${domainName}:g" ${createJobOutput} sed -i -e "s:%DOMAIN_HOME%:${domainHome}:g" ${createJobOutput} + sed -i -e "s:%SSL_ENABLED%:${sslEnabled}:g" ${createJobOutput} sed -i -e "s:%PRODUCTION_MODE_ENABLED%:${productionModeEnabled}:g" ${createJobOutput} sed -i -e "s:%ADMIN_SERVER_NAME%:${adminServerName}:g" ${createJobOutput} sed -i -e "s:%ADMIN_SERVER_NAME_SVC%:${adminServerNameSVC}:g" ${createJobOutput} sed -i -e "s:%ADMIN_PORT%:${adminPort}:g" ${createJobOutput} + sed -i -e "s:%ADMIN_SERVER_SSL_PORT%:${adminServerSSLPort}:g" ${createJobOutput} sed -i -e "s:%CONFIGURED_MANAGED_SERVER_COUNT%:${configuredManagedServerCount}:g" ${createJobOutput} sed -i -e "s:%MANAGED_SERVER_NAME_BASE%:${managedServerNameBase}:g" ${createJobOutput} sed -i -e "s:%MANAGED_SERVER_NAME_BASE_SVC%:${managedServerNameBaseSVC}:g" ${createJobOutput} sed -i -e "s:%MANAGED_SERVER_PORT%:${managedServerPort}:g" ${createJobOutput} + sed -i -e "s:%MANAGED_SERVER_SSL_PORT%:${managedServerSSLPort}:g" ${createJobOutput} sed -i -e "s:%T3_CHANNEL_PORT%:${t3ChannelPort}:g" ${createJobOutput} sed -i -e "s:%T3_PUBLIC_ADDRESS%:${t3PublicAddress}:g" ${createJobOutput} sed -i -e "s:%CLUSTER_NAME%:${clusterName}:g" ${createJobOutput} @@ -439,13 +470,22 @@ function createFiles { sed -i -e "s:%DOMAIN_ROOT_DIR%:${domainPVMountPath}:g" ${deleteJobOutput} fi - if [ "${domainHomeInImage}" == "true" ]; then + if [ "${domainHomeSourceType}" == "FromModel" ]; then + # leave domainHomeSourceType to FromModel + if [ "${logHomeOnPV}" == "true" ]; then + logHomeOnPVPrefix="${enabledPrefix}" + else + logHomeOnPVPrefix="${disabledPrefix}" + fi + elif [ "${domainHomeInImage}" == "true" ]; then + domainHomeSourceType="Image" if [ "${logHomeOnPV}" == "true" ]; then logHomeOnPVPrefix="${enabledPrefix}" else logHomeOnPVPrefix="${disabledPrefix}" fi else + domainHomeSourceType="PersistentVolume" logHomeOnPVPrefix="${enabledPrefix}" logHomeOnPV=true fi @@ -457,7 +497,7 @@ function createFiles { sed -i -e "s:%DOMAIN_UID%:${domainUID}:g" ${dcrOutput} sed -i -e "s:%NAMESPACE%:$namespace:g" ${dcrOutput} sed -i -e "s:%DOMAIN_HOME%:${domainHome}:g" ${dcrOutput} - sed -i -e "s:%DOMAIN_HOME_IN_IMAGE%:${domainHomeInImage}:g" ${dcrOutput} + sed -i -e "s:%DOMAIN_HOME_SOURCE_TYPE%:${domainHomeSourceType}:g" ${dcrOutput} sed -i -e "s:%WEBLOGIC_IMAGE_PULL_POLICY%:${imagePullPolicy}:g" ${dcrOutput} sed -i -e "s:%WEBLOGIC_IMAGE_PULL_SECRET_PREFIX%:${imagePullSecretPrefix}:g" ${dcrOutput} sed -i -e "s:%WEBLOGIC_IMAGE_PULL_SECRET_NAME%:${imagePullSecretName}:g" ${dcrOutput} @@ -466,6 +506,7 @@ function createFiles { sed -i -e "s:%LOG_HOME_ON_PV_PREFIX%:${logHomeOnPVPrefix}:g" ${dcrOutput} sed -i -e "s:%LOG_HOME_ENABLED%:${logHomeOnPV}:g" ${dcrOutput} sed -i -e "s:%LOG_HOME%:${logHome}:g" ${dcrOutput} + sed -i -e "s:%HTTP_ACCESS_LOG_IN_LOG_HOME%:${httpAccessLogInLogHome}:g" ${dcrOutput} sed -i -e "s:%DATA_HOME%:${dataHome}:g" ${dcrOutput} sed -i -e "s:%SERVER_START_POLICY%:${serverStartPolicy}:g" ${dcrOutput} sed -i -e "s:%JAVA_OPTIONS%:${javaOptions}:g" ${dcrOutput} @@ -485,6 +526,11 @@ function createFiles { sed -i -e "s:%ISTIO_PREFIX%:${istioPrefix}:g" ${dcrOutput} sed -i -e "s:%ISTIO_ENABLED%:${istioEnabled}:g" ${dcrOutput} sed -i -e "s:%ISTIO_READINESS_PORT%:${istioReadinessPort}:g" ${dcrOutput} + # MII settings are used for model-in-image integration testing + sed -i -e "s:%MII_PREFIX%:${miiPrefix}:g" ${dcrOutput} + sed -i -e "s:%MII_CONFIG_MAP_PREFIX%:${miiConfigMapPrefix}:g" ${dcrOutput} + sed -i -e "s:%MII_CONFIG_MAP%:${miiConfigMap}:g" ${dcrOutput} + sed -i -e "s:%WDT_DOMAIN_TYPE%:${wdtDomainType}:g" ${dcrOutput} buildServerPodResources if [ -z "${serverPodResources}" ]; then @@ -585,7 +631,7 @@ function checkPodDelete(){ exit -2 fi - echo "Checking Status for Pod [$pod] in namesapce [${ns}]" + echo "Checking Status for Pod [$pod] in namespace [${ns}]" max=10 count=1 while [ $count -le $max ] ; do @@ -646,7 +692,7 @@ function checkPodState(){ kubectl -n ${ns} get po ${pname} } -# Checks if a pod is available in a given namespace +# Checks if a pod is available in a given namespace function checkPod(){ max=20 @@ -682,7 +728,7 @@ function checkPod(){ fi } -# Checks if a service is available in a given namespace +# Checks if a service is available in a given namespace function checkService(){ svc=$1 ns=$2 @@ -698,4 +744,4 @@ function checkService(){ fi done echo "Service [$svc] found" -} \ No newline at end of file +} diff --git a/kubernetes/samples/scripts/common/validate.sh b/kubernetes/samples/scripts/common/validate.sh index a2cafa3b3a2..8f480643709 100755 --- a/kubernetes/samples/scripts/common/validate.sh +++ b/kubernetes/samples/scripts/common/validate.sh @@ -393,6 +393,10 @@ function validateCommonInputs { validateWeblogicImagePullPolicy validateWeblogicImagePullSecretName validateFmwDomainType + # Below three validate methods are used for MII integration testing + validateWdtDomainType + validateWdtModelFile + validateWdtModelPropertiesFile failIfValidationErrors } @@ -409,3 +413,53 @@ function validateDomainPVC { failIfValidationErrors } +# +# Function to validate the WDT model file exists +# used for MII integration testing +# +function validateWdtModelFile { + # Check if the model file exists + if [ ! -z $wdtModelFile ]; then + if [ ! -f $wdtModelFile ]; then + validationError "The WDT model file ${wdtModelFile} does not exist" + fi + fi + failIfValidationErrors +} + +# +# Function to validate the WDT model property file exists +# used for MII integration testing +# +function validateWdtModelPropertiesFile { + # Check if the model property file exists + if [ ! -z $wdtModelPropertiesFile ]; then + if [ ! -f $wdtModelPropertiesFile ]; then + validationError "The WDT model property file ${wdtModelPropertiesFile} does not exist" + fi + fi + failIfValidationErrors +} + +# Function to validate the wdtDomainType +# used for MII integration testing +function validateWdtDomainType { + if [ ! -z ${wdtDomainType} ]; then + case ${wdtDomainType} in + "WLS") + ;; + "JRF") + ;; + "RestrictedJRF") + ;; + *) + validationError "Invalid value for wdtDomainType: ${wdtDomainType}. Valid values are WLS or JRF or restrictedJRF." + ;; + esac + else + # Set the default + wdtDomainType="WLS" + fi + failIfValidationErrors +} + diff --git a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/common/Dockerfile b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/common/Dockerfile index 21064adabb3..6d0a43b8b33 100644 --- a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/common/Dockerfile +++ b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/common/Dockerfile @@ -4,13 +4,13 @@ # # ORACLE DOCKERFILES PROJECT # -------------------------- -# This is the Dockerfile for Oracle FMW Infrastructure 12.2.1.3 domain +# This is the Dockerfile for Oracle FMW Infrastructure 12.2.1.4 domain # # HOW TO BUILD THIS IMAGE # ----------------------- -# The Oracle FMW Infrastructure image extends the Oracle WebLogic Infrastructure 12.2.1.3 image, you must first build the Oracle WebLogic Infrastructure image. +# The Oracle FMW Infrastructure image extends the Oracle WebLogic Infrastructure 12.2.1.4 image, you must first build the Oracle WebLogic Infrastructure image. # Run: -# $ docker build -f Dockerfile --network=InfraNET -t 12213-fmw-domain-in-image . +# $ docker build -f Dockerfile --network=InfraNET -t 12214-fmw-domain-in-image . # # IMPORTANT # --------- @@ -18,7 +18,7 @@ # # From # ------------------------- -FROM oracle/fmw-infrastructure:12.2.1.3 +FROM oracle/fmw-infrastructure:12.2.1.4 # Maintainer # ---------- diff --git a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/common/createFMWDomain.py b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/common/createFMWDomain.py index 63668f15959..dfa3c8b99ad 100644 --- a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/common/createFMWDomain.py +++ b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/common/createFMWDomain.py @@ -1,8 +1,5 @@ -# -# Copyright (c) 2014, 2019 Oracle and/or its affiliates. All rights reserved. -# -#Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. -# +# Copyright (c) 2014, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. import os import sys diff --git a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/common/createFMWDomain.sh b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/common/createFMWDomain.sh index 47a84fea8b8..88925ac4a93 100644 --- a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/common/createFMWDomain.sh +++ b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/common/createFMWDomain.sh @@ -1,10 +1,6 @@ #!/bin/bash -# -# -# Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. -# +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. echo "Configuring Domain for first time " echo "=====================================" diff --git a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/create-domain-inputs.yaml b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/create-domain-inputs.yaml index ffe881b43d6..af35356cc85 100644 --- a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/create-domain-inputs.yaml +++ b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/create-domain-inputs.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2019, Oracle Corporation and/or its affiliates. All rights reserved. +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # The version of this inputs file. Do not modify. @@ -79,12 +79,19 @@ includeServerOutInPodLog: true # The default is false. logHomeOnPV: false -# The in-pod location for domain log, server logs, server out, and node manager log files -# If not specified, the value is derived from the domainUID as /shared/logs/ +# The in-pod location for domain log, server logs, server out, Node Manager log, and +# HTTP access log files. If not specified, the value is derived from the domainUID as +# /shared/logs/. # This parameter is required if 'logHomeOnPV' is true. # Otherwise, it is ignored. logHome: /shared/logs/domain1 +# Set this value to 'false' to have HTTP access log files written to the directory +# configured in the WebLogic domain home. +# The default is 'true', which means HTTP access log files will be written to +# the logHome directory when logHomeOnPV is enabled. +httpAccessLogInLogHome: true + # Port for the T3Channel of the NetworkAccessPoint t3ChannelPort: 30012 @@ -122,11 +129,11 @@ domainPVMountPath: /shared # Base OracleFMWInfrastructure binary image used to build the OracleFMWInfrastructure domain image # The operator requires OracleFMWInfrastructure Server 12.2.1.3.0 with patch 29135930 applied. -# The OracleFMWInfrastructure Docker image, `fmw-infrastructure:12.2.1.3`, has all the necessary patches applied. +# The OracleFMWInfrastructure Docker image, `fmw-infrastructure:12.2.1.4`, has all the necessary patches applied. # Refer to [OracleFMWInfrastructure Docker images](../../../../../site/weblogic-docker-images.md) for details on how # to obtain or create the image. # See README.md for more help. -domainHomeImageBase: container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.3 +domainHomeImageBase: container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.4 # Location of the OracleFMWInfrastructure "domain home in image" Docker image sample in the # `https://github.com/oracle/docker-images.git` project. @@ -135,16 +142,25 @@ domainHomeImageBase: container-registry.oracle.com/middleware/fmw-infrastructure # which uses WDT, instead of WLST, to generate the domain configuration. domainHomeImageBuildPath: ./docker-images/OracleFMWInfrastructure/samples/12213-domain-home-in-image -# Uncomment and edit value(s) below to specify the maximum amount of -# compute resources allowed, and minimum amount of compute resources -# required for each server pod. -# These are optional. +# Uncomment to customize the WebLogic Deploy Tool (WDT) version used by the WDT +# "domain home in image" Docker image sample in the Docker images project. See +# "domainHomeImageBuildPath". Set to "LATEST" to use the latest version. +# wdtVersion: LATEST + +# Resource request for each server pod (Memory and CPU). This is minimum amount of compute +# resources required for each server pod. Edit value(s) below as per pod sizing requirements. +# These are optional. # Please refer to the kubernetes documentation on Managing Compute # Resources for Containers for details. -# -# serverPodMemoryRequest: "64Mi" -# serverPodCpuRequest: "250m" -# serverPodMemoryLimit: "1Gi" +serverPodMemoryRequest: "1280Mi" +serverPodCpuRequest: "500m" + +# Uncomment and edit value(s) below to specify the maximum amount of compute resources allowed +# for each server pod. +# These are optional. +# Please refer to the kubernetes documentation on Managing Compute +# Resources for Containers for details. +# serverPodMemoryLimit: "2Gi" # serverPodCpuLimit: "1000m" # diff --git a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/create-domain.sh b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/create-domain.sh index 67abf5d0209..db40c54c2c0 100755 --- a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/create-domain.sh +++ b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-in-image/create-domain.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Copyright (c) 2019, Oracle Corporation and/or its affiliates. All rights reserved. +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # # Description @@ -141,7 +141,7 @@ function initialize { validationError "The template file ${domainPropertiesInput} for creating a WebLogic domain was not found" fi - dcrInput="${scriptDir}/../../common/domain-template.yaml" + dcrInput="${scriptDir}/../../common/jrf-domain-template.yaml" if [ ! -f ${dcrInput} ]; then validationError "The template file ${dcrInput} for creating the domain resource was not found" fi @@ -213,6 +213,9 @@ function createDomainHome { cp -f ${scriptDir}/common/createFMWDomain.py \ ${dockerDir}/container-scripts/createFMWDomain.py + # Set WDT_VERSION in case dockerDir references a WDT sample + # (wdtVersion comes from the inputs file) + export WDT_VERSION="${WDT_VERSION:-${wdtVersion:-1.9.1}}" bash ${dockerDir}/build.sh if [ "$?" != "0" ]; then diff --git a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/create-domain-inputs.yaml b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/create-domain-inputs.yaml index df515c16b7f..9001c4a10ca 100644 --- a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/create-domain-inputs.yaml +++ b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/create-domain-inputs.yaml @@ -38,12 +38,12 @@ managedServerNameBase: managed-server managedServerPort: 8001 # WebLogic Server Docker image. -# The operator requires WebLogic Server 12.2.1.3.0 with patch 29135930 applied. -# The existing WebLogic Docker image, `container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.3`, was updated on May 25, 2019, -# and has all the necessary patches applied; a `docker pull` is required if you already have this image. +# The operator requires WebLogic Server 12.2.1.3.0 with patch 29135930 applied or 12.2.1.4.0. +# The existing WebLogic Docker image, `container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.3`, +# has all the necessary patches applied; a `docker pull` is required if you already have this image. # Refer to https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/fmw-infra/ # for details on how to obtain or create the image. -image: container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.3 +image: container-registry.oracle.com/middleware/fmw-infrastructure:12.2.1.4 # Image pull policy # Legal values are "IfNotPresent", "Always", or "Never" @@ -65,10 +65,17 @@ weblogicCredentialsSecretName: domain1-weblogic-credentials # The default is true. includeServerOutInPodLog: true -# The in-pod location for domain log, server logs, server out, and node manager log files -# If not specified, the value is derived from the domainUID as /shared/logs/ +# The in-pod location for domain log, server logs, server out, Node Manager log, and +# HTTP access log files. If not specified, the value is derived from the domainUID as +# /shared/logs/. logHome: /shared/logs/domain1 +# Set this value to 'false' to have HTTP access log files written to the directory +# configured in the WebLogic domain home. +# The default is 'true', which means HTTP access log files will be written to +# the logHome directory. +httpAccessLogInLogHome: true + # Port for the T3Channel of the NetworkAccessPoint t3ChannelPort: 30012 @@ -135,16 +142,20 @@ createDomainScriptName: create-domain-job.sh # so that the Kubernetes pod can use the scripts and supporting files to create a domain home. createDomainFilesDir: wlst -# Uncomment and edit value(s) below to specify the maximum amount of -# compute resources allowed, and minimum amount of compute resources -# required for each server pod. -# These are optional. +# Resource request for each server pod (Memory and CPU). This is minimum amount of compute +# resources required for each server pod. Edit value(s) below as per pod sizing requirements. +# These are optional. # Please refer to the kubernetes documentation on Managing Compute # Resources for Containers for details. -# -# serverPodMemoryRequest: "64Mi" -# serverPodCpuRequest: "250m" -# serverPodMemoryLimit: "1Gi" +serverPodMemoryRequest: "1280Mi" +serverPodCpuRequest: "500m" + +# Uncomment and edit value(s) below to specify the maximum amount of compute resources allowed +# for each server pod. +# These are optional. +# Please refer to the kubernetes documentation on Managing Compute +# Resources for Containers for details. +# serverPodMemoryLimit: "2Gi" # serverPodCpuLimit: "1000m" # diff --git a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/create-domain-job-template.yaml b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/create-domain-job-template.yaml index 7e62bea2452..1e4f9281a26 100644 --- a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/create-domain-job-template.yaml +++ b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/create-domain-job-template.yaml @@ -9,7 +9,6 @@ spec: template: metadata: labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: %DOMAIN_UID% weblogic.domainName: %DOMAIN_NAME% app: %DOMAIN_UID%-create-fmw-infra-sample-domain-job diff --git a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/create-domain.sh b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/create-domain.sh index 586b4edb87a..0a44c27e9d4 100755 --- a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/create-domain.sh +++ b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/create-domain.sh @@ -118,7 +118,7 @@ function initialize { validationError "The template file ${deleteJobInput} for deleting a WebLogic domain was not found" fi - dcrInput="${scriptDir}/../../common/domain-template.yaml" + dcrInput="${scriptDir}/../../common/jrf-domain-template.yaml" if [ ! -f ${dcrInput} ]; then validationError "The template file ${dcrInput} for creating the domain resource was not found" fi @@ -185,7 +185,7 @@ function createDomainConfigmap { fail "The configmap ${cmName} was not created" fi - kubectl label configmap ${cmName} -n $namespace weblogic.resourceVersion=domain-v2 weblogic.domainUID=$domainUID weblogic.domainName=$domainName + kubectl label configmap ${cmName} -n $namespace weblogic.domainUID=$domainUID weblogic.domainName=$domainName rm -rf $externalFilesTmpDir } diff --git a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/delete-domain-job-template.yaml b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/delete-domain-job-template.yaml index b4650ec818b..5fa0845112c 100644 --- a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/delete-domain-job-template.yaml +++ b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/delete-domain-job-template.yaml @@ -6,7 +6,6 @@ metadata: name: %DOMAIN_UID%-delete-fmw-infra-sample-domain-job-cm namespace: %NAMESPACE% labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: %DOMAIN_UID% weblogic.domainName: %DOMAIN_NAME% data: @@ -27,7 +26,6 @@ spec: template: metadata: labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: %DOMAIN_UID% weblogic.domainName: %DOMAIN_NAME% app: %DOMAIN_UID%-delete-fmw-infra-sample-domain-job diff --git a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/wdt/create-domain-script.sh b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/wdt/create-domain-script.sh index 77ae3c4c8fd..69011a87b5c 100755 --- a/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/wdt/create-domain-script.sh +++ b/kubernetes/samples/scripts/create-fmw-infrastructure-domain/domain-home-on-pv/wdt/create-domain-script.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright (c) 2018, 2019, Oracle Corporation and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # # Description: @@ -45,7 +45,7 @@ # default: weblogic-deploy.zip # # WDT_VERSION WDT version -# default: 1.7.0 +# default: 1.9.1 # # WDT_INSTALL_ZIP_URL URL for downloading WDT install zip # default: https://github.com/oracle/weblogic-deploy-tooling/releases/download/weblogic-deploy-tooling-$WDT_VERSION/$WDT_INSTALL_ZIP_FILE @@ -75,7 +75,7 @@ WDT_MODEL_FILE=${WDT_MODEL_FILE:-"$SCRIPTPATH/wdt_model.yaml"} WDT_VAR_FILE=${WDT_VAR_FILE:-"$SCRIPTPATH/create-domain-inputs.yaml"} WDT_DIR=${WDT_DIR:-/shared/wdt} -WDT_VERSION=${WDT_VERSION:-1.7.1} +WDT_VERSION=${WDT_VERSION:-1.9.1} WDT_INSTALL_ZIP_FILE="${WDT_INSTALL_ZIP_FILE:-weblogic-deploy.zip}" WDT_INSTALL_ZIP_URL=${WDT_INSTALL_ZIP_URL:-"https://github.com/oracle/weblogic-deploy-tooling/releases/download/weblogic-deploy-tooling-$WDT_VERSION/$WDT_INSTALL_ZIP_FILE"} diff --git a/kubernetes/samples/scripts/create-oracle-db-service/common/oracle.db.yaml b/kubernetes/samples/scripts/create-oracle-db-service/common/oracle.db.yaml index d42bbd514e6..da0a9056cc8 100644 --- a/kubernetes/samples/scripts/create-oracle-db-service/common/oracle.db.yaml +++ b/kubernetes/samples/scripts/create-oracle-db-service/common/oracle.db.yaml @@ -16,7 +16,7 @@ spec: sessionAffinity: None type: LoadBalancer --- -apiVersion: extensions/v1beta1 +apiVersion: apps/v1 kind: Deployment metadata: name: oracle-db diff --git a/kubernetes/samples/scripts/create-oracle-db-service/start-db-service.sh b/kubernetes/samples/scripts/create-oracle-db-service/start-db-service.sh index f57780d6378..50eca685baa 100755 --- a/kubernetes/samples/scripts/create-oracle-db-service/start-db-service.sh +++ b/kubernetes/samples/scripts/create-oracle-db-service/start-db-service.sh @@ -74,7 +74,7 @@ sed -i -e "s?name: docker-store?name: ${pullsecret}?g" ${scriptDir}/common/oracl sed -i -e "s?image:.*?image: ${dbimage}?g" ${scriptDir}/common/oracle.db.yaml sed -i -e "s?namespace:.*?namespace: ${namespace}?g" ${scriptDir}/common/oracle.db.yaml -# Modify the NodePort based on input +# Modify the NodePort based on input if [ "${nodeport}" = "none" ]; then sed -i -e "s? nodePort:? #nodePort:?g" ${scriptDir}/common/oracle.db.yaml sed -i -e "s? type:.*LoadBalancer? #type: LoadBalancer?g" ${scriptDir}/common/oracle.db.yaml @@ -109,4 +109,4 @@ if [ ! "${nodeport}" = "none" ]; then else echo "Oracle DB Service is RUNNING and does not specify a public NodePort" fi -echo "Oracle DB Service URL [oracle-db.${namespace}.svc.cluster.local:1521/devpdb.k8s]" \ No newline at end of file +echo "Oracle DB Service URL [oracle-db.${namespace}.svc.cluster.local:1521/devpdb.k8s]" diff --git a/kubernetes/samples/scripts/create-rcu-schema/create-rcu-schema.sh b/kubernetes/samples/scripts/create-rcu-schema/create-rcu-schema.sh index 9184c9df800..73f504431d6 100755 --- a/kubernetes/samples/scripts/create-rcu-schema/create-rcu-schema.sh +++ b/kubernetes/samples/scripts/create-rcu-schema/create-rcu-schema.sh @@ -135,7 +135,7 @@ kubectl exec -n $namespace -i rcu -- bash -c 'cat > /u01/oracle/createRepository kubectl exec -n $namespace -i rcu -- bash -c 'cat > /u01/oracle/pwd.txt' < pwd.txt rm -rf createRepository.sh pwd.txt -kubectl exec -n $namespace -it rcu /bin/bash /u01/oracle/createRepository.sh ${dburl} ${schemaPrefix} ${rcuType} ${sysPassword} +kubectl exec -n $namespace -i rcu /bin/bash /u01/oracle/createRepository.sh ${dburl} ${schemaPrefix} ${rcuType} ${sysPassword} if [ $? != 0 ]; then echo "######################"; echo "[ERROR] Could not create the RCU Repository"; diff --git a/kubernetes/samples/scripts/create-rcu-schema/drop-rcu-schema.sh b/kubernetes/samples/scripts/create-rcu-schema/drop-rcu-schema.sh index 6cdf6bd888f..2c0f17b689e 100755 --- a/kubernetes/samples/scripts/create-rcu-schema/drop-rcu-schema.sh +++ b/kubernetes/samples/scripts/create-rcu-schema/drop-rcu-schema.sh @@ -87,7 +87,7 @@ kubectl exec -n $namespace -i rcu -- bash -c 'cat > /u01/oracle/dropRepository.s kubectl exec -n $namespace -i rcu -- bash -c 'cat > /u01/oracle/pwd.txt' < pwd.txt rm -rf dropRepository.sh pwd.txt -kubectl exec -n $namespace -it rcu /bin/bash /u01/oracle/dropRepository.sh ${dburl} ${schemaPrefix} ${rcuType} ${sysPassword} +kubectl exec -n $namespace -i rcu /bin/bash /u01/oracle/dropRepository.sh ${dburl} ${schemaPrefix} ${rcuType} ${sysPassword} if [ $? != 0 ]; then echo "######################"; echo "[ERROR] Could not drop the RCU Repository based on dburl[${dburl}] schemaPrefix[${schemaPrefix}] "; diff --git a/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-database/db-with-pv.yaml b/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-database/db-with-pv.yaml index 0e94ce0fe9b..cdb207d617c 100644 --- a/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-database/db-with-pv.yaml +++ b/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-database/db-with-pv.yaml @@ -18,7 +18,7 @@ spec: sessionAffinity: None type: LoadBalancer --- -apiVersion: extensions/v1beta1 +apiVersion: apps/v1 kind: Deployment metadata: name: oracle-db diff --git a/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-domain-inputs.yaml b/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-domain-inputs.yaml index 0c0819ff08d..efa085e9545 100644 --- a/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-domain-inputs.yaml +++ b/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-domain-inputs.yaml @@ -75,10 +75,17 @@ weblogicCredentialsSecretName: soainfra-domain-credentials # The default is true. includeServerOutInPodLog: true -# The in-pod location for domain log, server logs, server out, and node manager log files -# If not specified, the value is derived from the domainUID as /shared/logs/ +# The in-pod location for domain log, server logs, server out, Node Manager log, and +# HTTP access log files. If not specified, the value is derived from the domainUID as +# /shared/logs/. logHome: /u01/oracle/user_projects/domains/logs/soainfra +# Set this value to 'false' to have HTTP access log files written to the directory +# configured in the WebLogic domain home. +# The default is 'true', which means HTTP access log files will be written to +# the logHome directory. +httpAccessLogInLogHome: true + # Port for the T3Channel of the NetworkAccessPoint t3ChannelPort: 30012 diff --git a/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-domain-job-template.yaml b/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-domain-job-template.yaml index 2516b0d396a..24d62f3c7b4 100644 --- a/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-domain-job-template.yaml +++ b/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-domain-job-template.yaml @@ -9,7 +9,6 @@ spec: template: metadata: labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: %DOMAIN_UID% weblogic.domainName: %DOMAIN_NAME% app: %DOMAIN_UID%-create-fmw-infra-sample-domain-job diff --git a/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-domain.sh b/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-domain.sh index c4627522a24..c00e7b9918b 100755 --- a/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-domain.sh +++ b/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/create-domain.sh @@ -172,7 +172,7 @@ function createDomainConfigmap { fail "The configmap ${cmName} was not created" fi - kubectl label configmap ${cmName} -n $namespace weblogic.resourceVersion=domain-v2 weblogic.domainUID=$domainUID weblogic.domainName=$domainName + kubectl label configmap ${cmName} -n $namespace weblogic.domainUID=$domainUID weblogic.domainName=$domainName rm -rf $externalFilesTmpDir } diff --git a/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/delete-domain-job-template.yaml b/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/delete-domain-job-template.yaml index b4650ec818b..5fa0845112c 100644 --- a/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/delete-domain-job-template.yaml +++ b/kubernetes/samples/scripts/create-soa-domain/domain-home-on-pv/delete-domain-job-template.yaml @@ -6,7 +6,6 @@ metadata: name: %DOMAIN_UID%-delete-fmw-infra-sample-domain-job-cm namespace: %NAMESPACE% labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: %DOMAIN_UID% weblogic.domainName: %DOMAIN_NAME% data: @@ -27,7 +26,6 @@ spec: template: metadata: labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: %DOMAIN_UID% weblogic.domainName: %DOMAIN_NAME% app: %DOMAIN_UID%-delete-fmw-infra-sample-domain-job diff --git a/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/README.md b/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/README.md index 292aa3a8d21..efbb275df03 100644 --- a/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/README.md +++ b/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/README.md @@ -81,8 +81,6 @@ apiVersion: v1 metadata: name: weblogic-sample-pvc namespace: default - labels: - weblogic.resourceVersion: domain-v2 storageClassName: weblogic-sample-storage-class accessModes: @@ -101,9 +99,8 @@ apiVersion: v1 kind: PersistentVolume metadata: name: weblogic-sample-pv - labels: - weblogic.resourceVersion: domain-v2 - # weblogic.domainUID: + # labels: + # weblogic.domainUID: spec: storageClassName: weblogic-sample-storage-class capacity: @@ -133,7 +130,6 @@ metadata: name: domain1-weblogic-sample-pvc namespace: default labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: domain1 spec: storageClassName: domain1-weblogic-sample-storage-class @@ -154,7 +150,6 @@ kind: PersistentVolume metadata: name: domain1-weblogic-sample-pv labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: domain1 spec: storageClassName: domain1-weblogic-sample-storage-class @@ -178,7 +173,6 @@ should have the value `Bound`, indicating the that persistent volume has been cl ``` $ kubectl describe pv weblogic-sample-pv Name: weblogic-sample-pv -Labels: weblogic.resourceVersion=domain-v2 Annotations: pv.kubernetes.io/bound-by-controller=yes StorageClass: weblogic-sample-storage-class Status: Bound @@ -204,7 +198,6 @@ Namespace: default StorageClass: weblogic-sample-storage-class Status: Bound Volume: weblogic-sample-pv -Labels: weblogic.resourceVersion=domain-v2 Annotations: pv.kubernetes.io/bind-completed=yes pv.kubernetes.io/bound-by-controller=yes Finalizers: [] diff --git a/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/pv-template.yaml b/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/pv-template.yaml index 331dd09162f..9d1337a0afb 100644 --- a/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/pv-template.yaml +++ b/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/pv-template.yaml @@ -6,7 +6,6 @@ kind: PersistentVolume metadata: name: %DOMAIN_UID%%SEPARATOR%%BASE_NAME%-pv labels: - weblogic.resourceVersion: domain-v2 %DOMAIN_UID_LABEL_PREFIX%weblogic.domainUID: %DOMAIN_UID% spec: storageClassName: %DOMAIN_UID%%SEPARATOR%%BASE_NAME%-storage-class diff --git a/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/pvc-template.yaml b/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/pvc-template.yaml index 5c597388149..35bb1e4c920 100644 --- a/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/pvc-template.yaml +++ b/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/pvc-template.yaml @@ -7,7 +7,6 @@ metadata: name: %DOMAIN_UID%%SEPARATOR%%BASE_NAME%-pvc namespace: %NAMESPACE% labels: - weblogic.resourceVersion: domain-v2 %DOMAIN_UID_LABEL_PREFIX%weblogic.domainUID: %DOMAIN_UID% spec: storageClassName: %DOMAIN_UID%%SEPARATOR%%BASE_NAME%-storage-class diff --git a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-in-image/create-domain-inputs.yaml b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-in-image/create-domain-inputs.yaml index 8c88e547fca..36cecc5ae50 100644 --- a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-in-image/create-domain-inputs.yaml +++ b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-in-image/create-domain-inputs.yaml @@ -4,9 +4,16 @@ # The version of this inputs file. Do not modify. version: create-weblogic-sample-domain-inputs-v1 +# Enable SSL in the admin and managed server(s). +# Setting this to true requires updating the javaOptions parameter below. +sslEnabled: false + # Port number for admin server adminPort: 7001 +# SSL Port number for admin server +adminServerSSLPort: 7002 + # Name of the Admin Server adminServerName: admin-server @@ -34,6 +41,9 @@ managedServerNameBase: managed-server # Port number for each managed server managedServerPort: 8001 +# SSL Port number for each managed server +managedServerSSLPort: 8002 + # Boolean indicating if production mode is enabled for the domain productionModeEnabled: true @@ -79,12 +89,19 @@ includeServerOutInPodLog: true # The default is false. logHomeOnPV: false -# The in-pod location for domain log, server logs, server out, and node manager log files -# If not specified, the value is derived from the domainUID as /shared/logs/ +# The in-pod location for domain log, server logs, server out, Node Manager log, and +# HTTP access log files. If not specified, the value is derived from the domainUID as +# /shared/logs/. # This parameter is required if 'logHomeOnPV' is true. # Otherwise, it is ignored. logHome: /shared/logs/domain1 +# Set this value to 'false' to have HTTP access log files written to the directory +# configured in the WebLogic domain home. +# The default is 'true', which means HTTP access log files will be written to +# the logHome directory when logHomeOnPV is enabled. +httpAccessLogInLogHome: true + # An (optional) in-pod location for data storage of default and custom file stores. # If not specified or the value is either not set or empty (e.g. dataHome: "") then the # data storage directories are determined from the WebLogic domain home configuration. @@ -112,6 +129,8 @@ exposeAdminNodePort: false namespace: default # Java Option for WebLogic Server +# Add -Dweblogic.security.SSL.ignoreHostnameVerification=true if sslEnabled is true. +# The reason is the WebLogic generated Demo certificate's host name is different from that of the runtime container. javaOptions: -Dweblogic.StdoutDebugEnabled=false # Name of the persistent volume claim @@ -126,12 +145,12 @@ persistentVolumeClaimName: domain1-weblogic-sample-pvc domainPVMountPath: /shared # Base WebLogic binary image used to build the WebLogic domain image -# The operator requires WebLogic Server 12.2.1.3.0 with patch 29135930 applied. +# The operator requires WebLogic Server 12.2.1.3.0 with patch 29135930 applied or 12.2.1.4.0. # The WebLogic Docker image, `weblogic:12.2.1.3`, has all the necessary patches applied. # Refer to [WebLogic Docker images](../../../../../site/weblogic-docker-images.md) for details on how # to obtain or create the image. # See README.md for more help. -domainHomeImageBase: container-registry.oracle.com/middleware/weblogic:12.2.1.3 +domainHomeImageBase: container-registry.oracle.com/middleware/weblogic:12.2.1.4 # Location of the WebLogic "domain home in image" Docker image sample in the # `https://github.com/oracle/docker-images.git` project. @@ -140,15 +159,24 @@ domainHomeImageBase: container-registry.oracle.com/middleware/weblogic:12.2.1.3 # which uses WDT, instead of WLST, to generate the domain configuration. domainHomeImageBuildPath: ./docker-images/OracleWebLogic/samples/12213-domain-home-in-image -# Uncomment and edit value(s) below to specify the maximum amount of -# compute resources allowed, and minimum amount of compute resources -# required for each server pod. -# These are optional. +# Uncomment to customize the WebLogic Deploy Tool (WDT) version used by the WDT +# "domain home in image" Docker image sample in the Docker images project. See +# "domainHomeImageBuildPath". Set to "LATEST" to use the latest version. +# wdtVersion: LATEST + +# Resource request for each server pod (Memory and CPU). This is minimum amount of compute +# resources required for each server pod. Edit value(s) below as per pod sizing requirements. +# These are optional. +# Please refer to the kubernetes documentation on Managing Compute +# Resources for Containers for details. +serverPodMemoryRequest: "768Mi" +serverPodCpuRequest: "250m" + +# Uncomment and edit value(s) below to specify the maximum amount of compute resources allowed +# for each server pod. +# These are optional. # Please refer to the kubernetes documentation on Managing Compute # Resources for Containers for details. -# -# serverPodMemoryRequest: "64Mi" -# serverPodCpuRequest: "250m" # serverPodMemoryLimit: "1Gi" # serverPodCpuLimit: "1000m" @@ -156,4 +184,4 @@ domainHomeImageBuildPath: ./docker-images/OracleWebLogic/samples/12213-domain-ho istioEnabled: false # istioReadinessPort specifies the WebLogic NAP port for use by the readiness probe -istioReadinessPort: 8888 \ No newline at end of file +istioReadinessPort: 8888 diff --git a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-in-image/create-domain.sh b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-in-image/create-domain.sh index 228a96b4420..249a5142850 100755 --- a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-in-image/create-domain.sh +++ b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-in-image/create-domain.sh @@ -25,7 +25,7 @@ source ${scriptDir}/../../common/utility.sh source ${scriptDir}/../../common/validate.sh function usage { - echo usage: ${script} -o dir -i file -u username -p password [-k] [-e] [-v] [-h] + echo usage: ${script} -o dir -i file -u username -p password [-s] [-k] [-e] [-v] [-h] echo " -i Parameter inputs file, must be specified." echo " -o Output directory for the generated properties and YAML files, must be specified." echo " -u Username used in building the Docker image for WebLogic domain in image." @@ -34,6 +34,7 @@ function usage { echo " -v Validate the existence of persistentVolumeClaim, optional." echo " -k Keep what has been previously from cloned https://github.com/oracle/docker-images.git, optional. " echo " If not specified, this script will always remove existing project directory and clone again." + echo " -s Skip the domain image build, optional. " echo " -h Help" exit $1 } @@ -44,7 +45,8 @@ function usage { doValidation=false executeIt=false cloneIt=true -while getopts "evhki:o:u:p:" opt; do +skipImageBuild=false +while getopts "evhksi:o:u:p:" opt; do case $opt in i) valuesInputFile="${OPTARG}" ;; @@ -60,6 +62,8 @@ while getopts "evhki:o:u:p:" opt; do ;; k) cloneIt=false; ;; + s) skipImageBuild=true; + ;; h) usage 0 ;; *) usage 1 @@ -171,8 +175,13 @@ function getDockerSample { # # Function to build docker image and create WebLogic domain home -# +# Image build is skipped when -s option is specified OR image is not available +# e.g. If -s option is specified script will skip the image build only when +# image is available else build the image +# If -s option is NOT specified script will ALWAYS build the image function createDomainHome { + + if [ "${skipImageBuild}" = false ] || [ -z "$(docker images $image | grep -v TAG)" ]; then dockerDir=${domainHomeImageBuildPath} dockerPropsDir=${dockerDir}/properties cp ${domainPropertiesOutput} ${dockerPropsDir}/docker-build @@ -194,6 +203,9 @@ function createDomainHome { sed -i -e "s|\(FROM \).*|\1 ${domainHomeImageBase}|g" ${dockerDir}/Dockerfile fi + # Set WDT_VERSION in case dockerDir references a WDT sample + # (wdtVersion comes from the inputs file) + export WDT_VERSION="${WDT_VERSION:-${wdtVersion:-1.9.1}}" bash ${dockerDir}/build.sh if [ "$?" != "0" ]; then @@ -205,6 +217,12 @@ function createDomainHome { echo "" echo "Create domain ${domainName} successfully." + + else + echo "" + echo "Skipping domain image build " + fi + } # diff --git a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-in-image/properties-template.properties b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-in-image/properties-template.properties index e6df4a4ea32..a33e8d236fd 100644 --- a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-in-image/properties-template.properties +++ b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-in-image/properties-template.properties @@ -1,8 +1,11 @@ DOMAIN_NAME=%DOMAIN_NAME% +SSL_ENABLED=%SSL_ENABLED% ADMIN_PORT=%ADMIN_PORT% +ADMIN_SERVER_SSL_PORT=%ADMIN_SERVER_SSL_PORT% ADMIN_NAME=%ADMIN_SERVER_NAME% ADMIN_HOST=wlsadmin MANAGED_SERVER_PORT=%MANAGED_SERVER_PORT% +MANAGED_SERVER_SSL_PORT=%MANAGED_SERVER_SSL_PORT% MANAGED_SERVER_NAME_BASE=%MANAGED_SERVER_NAME_BASE% CONFIGURED_MANAGED_SERVER_COUNT=%CONFIGURED_MANAGED_SERVER_COUNT% CLUSTER_NAME=%CLUSTER_NAME% diff --git a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/create-domain-inputs.yaml b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/create-domain-inputs.yaml index 139c2fcfb62..ab646d315a5 100644 --- a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/create-domain-inputs.yaml +++ b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/create-domain-inputs.yaml @@ -38,11 +38,11 @@ managedServerNameBase: managed-server managedServerPort: 8001 # WebLogic Server Docker image. -# The operator requires WebLogic Server 12.2.1.3.0 with patch 29135930 applied. +# The operator requires WebLogic Server 12.2.1.3.0 with patch 29135930 applied or 12.2.1.4.0. # The WebLogic Docker image, `weblogic:12.2.1.3`, has all the necessary patches applied. # Refer to [WebLogic Docker images](../../../../../site/weblogic-docker-images.md) for details on how # to obtain or create the image. -image: container-registry.oracle.com/middleware/weblogic:12.2.1.3 +image: container-registry.oracle.com/middleware/weblogic:12.2.1.4 # Image pull policy # Legal values are "IfNotPresent", "Always", or "Never" @@ -64,10 +64,17 @@ weblogicCredentialsSecretName: domain1-weblogic-credentials # The default is true. includeServerOutInPodLog: true -# The in-pod location for domain log, server logs, server out, and node manager log files -# If not specified, the value is derived from the domainUID as /shared/logs/ +# The in-pod location for domain log, server logs, server out, Node Manager log, and +# HTTP access log files. If not specified, the value is derived from the domainUID as +# /shared/logs/. logHome: /shared/logs/domain1 +# Set this value to 'false' to have HTTP access log files written to the directory +# configured in the WebLogic domain home. +# The default is 'true', which means HTTP access log files will be written to +# the logHome directory. +httpAccessLogInLogHome: true + # An (optional) in-pod location for data storage of default and custom file stores. # If not specified or the value is either not set or empty (e.g. dataHome: "") then the # data storage directories are determined from the WebLogic domain home configuration. @@ -138,16 +145,22 @@ createDomainScriptName: create-domain-job.sh # Kubernetes config map, which in turn is mounted to the `createDomainScriptsMountPath`, # so that the Kubernetes pod can use the scripts and supporting files to create a domain home. createDomainFilesDir: wlst + +# Resource request for each server pod (Memory and CPU). This is minimum amount of compute +# resources required for each server pod. Edit value(s) below as per pod sizing requirements. +# These are optional +# Please refer to the kubernetes documentation on Managing Compute +# Resources for Containers for details. +# +serverPodMemoryRequest: "768Mi" +serverPodCpuRequest: "250m" -# Uncomment and edit value(s) below to specify the maximum amount of -# compute resources allowed, and minimum amount of compute resources -# required for each server pod. +# Uncomment and edit value(s) below to specify the maximum amount of compute resources allowed +# for each server pod. # These are optional. # Please refer to the kubernetes documentation on Managing Compute # Resources for Containers for details. # -# serverPodMemoryRequest: "64Mi" -# serverPodCpuRequest: "250m" # serverPodMemoryLimit: "1Gi" # serverPodCpuLimit: "1000m" @@ -156,3 +169,6 @@ istioEnabled: false # istioReadinessPort specifies the WebLogic NAP port for use by the readiness probe istioReadinessPort: 8888 + + + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/create-domain-job-template.yaml b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/create-domain-job-template.yaml index 5e955b91348..d153af7717f 100644 --- a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/create-domain-job-template.yaml +++ b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/create-domain-job-template.yaml @@ -12,7 +12,6 @@ spec: annotations: sidecar.istio.io/inject: "false" labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: %DOMAIN_UID% weblogic.domainName: %DOMAIN_NAME% app: %DOMAIN_UID%-create-weblogic-sample-domain-job diff --git a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/create-domain.sh b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/create-domain.sh index 6b1d2e01e1e..2648be55509 100755 --- a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/create-domain.sh +++ b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/create-domain.sh @@ -166,7 +166,7 @@ function createDomainConfigmap { fail "The configmap ${cmName} was not created" fi - kubectl label configmap ${cmName} -n $namespace weblogic.resourceVersion=domain-v2 weblogic.domainUID=$domainUID weblogic.domainName=$domainName + kubectl label configmap ${cmName} -n $namespace weblogic.domainUID=$domainUID weblogic.domainName=$domainName rm -rf $externalFilesTmpDir } diff --git a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/delete-domain-job-template.yaml b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/delete-domain-job-template.yaml index 255fb93c5f6..46c8a4f52cf 100644 --- a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/delete-domain-job-template.yaml +++ b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/delete-domain-job-template.yaml @@ -7,7 +7,6 @@ metadata: name: %DOMAIN_UID%-delete-weblogic-sample-domain-job-cm namespace: %NAMESPACE% labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: %DOMAIN_UID% weblogic.domainName: %DOMAIN_NAME% data: @@ -30,7 +29,6 @@ spec: annotations: sidecar.istio.io/inject: "false" labels: - weblogic.resourceVersion: domain-v2 weblogic.domainUID: %DOMAIN_UID% weblogic.domainName: %DOMAIN_NAME% app: %DOMAIN_UID%-delete-weblogic-sample-domain-job diff --git a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/wdt/create-domain-script.sh b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/wdt/create-domain-script.sh index 0f660adb4a6..0d0890e9885 100755 --- a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/wdt/create-domain-script.sh +++ b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/wdt/create-domain-script.sh @@ -45,7 +45,7 @@ # default: weblogic-deploy.zip # # WDT_INSTALL_ZIP_URL URL for downloading WDT install zip -# default: https://github.com/oracle/weblogic-deploy-tooling/releases/download/weblogic-deploy-tooling-1.7.0/$WDT_INSTALL_ZIP_FILE +# default: https://github.com/oracle/weblogic-deploy-tooling/releases/download/weblogic-deploy-tooling-1.9.1/$WDT_INSTALL_ZIP_FILE # # https_proxy Proxy for downloading WDT_INSTALL_ZIP_URL. # default: "http://www-proxy-hqdc.us.oracle.com:80" @@ -60,7 +60,7 @@ # of WDT log files. # default: /shared/wdt # WDT_VERSION WDT version to download. -# default: 1.7.0 +# default: 1.9.1 # # DOMAIN_HOME_DIR Target location for generated domain. # @@ -74,7 +74,7 @@ WDT_MODEL_FILE=${WDT_MODEL_FILE:-"$SCRIPTPATH/wdt_model.yaml"} WDT_VAR_FILE=${WDT_VAR_FILE:-"$SCRIPTPATH/create-domain-inputs.yaml"} WDT_DIR=${WDT_DIR:-/shared/wdt} -WDT_VERSION=${WDT_VERSION:-1.7.1} +WDT_VERSION=${WDT_VERSION:-1.9.1} WDT_INSTALL_ZIP_FILE="${WDT_INSTALL_ZIP_FILE:-weblogic-deploy.zip}" WDT_INSTALL_ZIP_URL=${WDT_INSTALL_ZIP_URL:-"https://github.com/oracle/weblogic-deploy-tooling/releases/download/weblogic-deploy-tooling-$WDT_VERSION/$WDT_INSTALL_ZIP_FILE"} diff --git a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/wlst/istio-fix-domain.py b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/wlst/istio-fix-domain.py index 6fe6bf411ec..d58758968ff 100644 --- a/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/wlst/istio-fix-domain.py +++ b/kubernetes/samples/scripts/create-weblogic-domain/domain-home-on-pv/wlst/istio-fix-domain.py @@ -46,3 +46,4 @@ def toDNS1123Legal(address): closeDomain() print 'Domain Updated for Istio' print 'Done' + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/manually-create-domain/domain.yaml b/kubernetes/samples/scripts/create-weblogic-domain/manually-create-domain/domain.yaml index 73fa200d9c5..ae6c90635b1 100644 --- a/kubernetes/samples/scripts/create-weblogic-domain/manually-create-domain/domain.yaml +++ b/kubernetes/samples/scripts/create-weblogic-domain/manually-create-domain/domain.yaml @@ -1,10 +1,10 @@ -# Copyright (c) 2017, 2019, Oracle Corporation and/or its affiliates. All rights reserved. +# Copyright (c) 2017, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # # This is an example of how to define a Domain resource. Please read through the comments which explain # what updates are needed. # -apiVersion: "weblogic.oracle/v7" +apiVersion: "weblogic.oracle/v8" kind: Domain metadata: # Update this with the `domainUID` of your domain: @@ -12,7 +12,6 @@ metadata: # Update this with the namespace your domain will run in: namespace: weblogic labels: - weblogic.resourceVersion: domain-v2 # Update this with the `domainUID` of your domain: weblogic.domainUID: domain1 @@ -21,8 +20,8 @@ spec: # Note that this might be in the image itself or in a mounted volume or network storage. domainHome: /u01/oracle/user_projects/domains/domain1 - # If the domain home is inside the Docker image, set this to `true`, otherwise set `false`: - domainHomeInImage: true + # Domain home source type. Legal values are Image, PersistentVolume, or FromModel + domainHomeSourceType: Image # Update this with the name of the Docker image that will be used to run your domain: image: "my-domain1-image:1.0" @@ -66,7 +65,10 @@ spec: - name: JAVA_OPTIONS value: "-Dweblogic.StdoutDebugEnabled=false" - name: USER_MEM_ARGS - value: "-Xms64m -Xmx256m " + value: "-Xms256m -Xmx512m -Djava.security.egd=file:/dev/./urandom " + requests: + cpu: "250m" + memory: "768Mi" # If you are storing your domain on a persistent volume (as opposed to inside the Docker image), # then uncomment this section and provide the PVC details and mount path here (standard images @@ -117,4 +119,4 @@ spec: replicas: 2 # The number of managed servers to start for any unlisted clusters - # replicas: 1 \ No newline at end of file + # replicas: 1 diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/README.md b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/README.md new file mode 100644 index 00000000000..838b9c7d6ab --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/README.md @@ -0,0 +1,15 @@ +# Model in Image Sample + +This sample demonstrates the WebLogic Kubernetes Operator "Model in Image" feature. Model in Image allows you to supply a Weblogic Deploy Tool (WDT) model that the operator automatically expands into a full domain home during runtime. This eliminates the need to pre-create a WebLogic domain home prior to deploying your domain resource. + +# References + +- Sample doc: + - Location in documentation menu: `Samples -> Simple Samples -> Domains -> Model in Image`. + - [source](../../../../../docs-source/content/samples/simple/domains/model-in-image/_index.md) + - [latest public](https://oracle.github.io/weblogic-kubernetes-operator/samples/simple/domains/model-in-image) + +- User doc: + - Location in documentation menu: `User Guide -> Manage WebLogic Domains -> Model in Image`. + - [source](../../../../../docs-source/content/userguide/managing-domains/model-in-image/_index.md) + - [latest public](https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/model-in-image) diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/META-INF/MANIFEST.MF b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..8a636006c23 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: 1.8.0_201 (Oracle Corporation) + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/META-INF/application.xml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/META-INF/application.xml new file mode 100644 index 00000000000..284b448c7d8 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/META-INF/application.xml @@ -0,0 +1,11 @@ + + + JSP 2.0 Expression Language Example + JSP 2.0 Expression Language Example + + + myapp_war + myapp_war + + + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/META-INF/weblogic-application.xml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/META-INF/weblogic-application.xml new file mode 100644 index 00000000000..a9506565fe8 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/META-INF/weblogic-application.xml @@ -0,0 +1,3 @@ + + + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/web.xml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/web.xml new file mode 100644 index 00000000000..c2dcf6163b6 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/web.xml @@ -0,0 +1,3 @@ + + + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/weblogic.xml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/weblogic.xml new file mode 100644 index 00000000000..ea44151f8d3 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/weblogic.xml @@ -0,0 +1,12 @@ + + + + + 15 + 60 + + + 1 + true + + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/myapp_war/index.jsp b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/myapp_war/index.jsp new file mode 100644 index 00000000000..700a6234cef --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/applications/myapp-v1/myapp_war/index.jsp @@ -0,0 +1,56 @@ +<%-- Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. --%> +<%-- Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. --%> +<%@ page import="javax.naming.InitialContext" %> +<%@ page import="javax.management.*" %> +<%@ page import="java.io.*" %> +<% + InitialContext ic = null; + try { + ic = new InitialContext(); + + String srName=System.getProperty("weblogic.Name"); + String domainUID=System.getenv("DOMAIN_UID"); + String domainName=System.getenv("CUSTOM_DOMAIN_NAME"); + + out.println("

    ");
    +    out.println("*****************************************************************");
    +    out.println();
    +    out.println("Hello World! This is version 'v1' of the mii-sample JSP web-app.");
    +    out.println();
    +    out.println("Welcome to WebLogic server '" + srName + "'!");
    +    out.println();
    +    out.println(" domain UID  = '" + domainUID +"'");
    +    out.println(" domain name = '" + domainName +"'");
    +    out.println();
    +
    +    MBeanServer mbs = (MBeanServer)ic.lookup("java:comp/env/jmx/runtime");
    +
    +    // display the current server's cluster name
    +    Set clusterRuntimes = mbs.queryMBeans(new ObjectName("*:Type=ClusterRuntime,*"), null);
    +    out.println("Found " + clusterRuntimes.size() + " local cluster runtime" + (String)((clusterRuntimes.size()!=1)?"s:":":"));
    +    for (ObjectInstance clusterRuntime : clusterRuntimes) {
    +       String cName = (String)mbs.getAttribute(clusterRuntime.getObjectName(), "Name");
    +       out.println("  Cluster '" + cName + "'");
    +    }
    +    out.println();
    +
    +    // display local data sources
    +    ObjectName jdbcRuntime = new ObjectName("com.bea:ServerRuntime=" + srName + ",Name=" + srName + ",Type=JDBCServiceRuntime");
    +    ObjectName[] dataSources = (ObjectName[])mbs.getAttribute(jdbcRuntime, "JDBCDataSourceRuntimeMBeans");
    +    out.println("Found " + dataSources.length + " local data source" + (String)((dataSources.length!=1)?"s:":":"));
    +    for (ObjectName dataSource : dataSources) {
    +       String dsName  = (String)mbs.getAttribute(dataSource, "Name");
    +       String dsState = (String)mbs.getAttribute(dataSource, "State");
    +       out.println("  Datasource '" + dsName + "': State='" + dsState +"'");
    +    }
    +    out.println();
    +
    +    out.println("*****************************************************************");
    +
    +  } catch (Throwable t) {
    +    t.printStackTrace(new PrintStream(response.getOutputStream()));
    +  } finally {
    +    out.println("
    "); + if (ic != null) ic.close(); + } +%> diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/config/amimemappings.properties b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v1/wlsdeploy/config/amimemappings.properties new file mode 100644 index 00000000000..e69de29bb2d diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/META-INF/MANIFEST.MF b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..8a636006c23 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: 1.8.0_201 (Oracle Corporation) + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/META-INF/application.xml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/META-INF/application.xml new file mode 100644 index 00000000000..284b448c7d8 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/META-INF/application.xml @@ -0,0 +1,11 @@ + + + JSP 2.0 Expression Language Example + JSP 2.0 Expression Language Example + + + myapp_war + myapp_war + + + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/META-INF/weblogic-application.xml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/META-INF/weblogic-application.xml new file mode 100644 index 00000000000..a9506565fe8 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/META-INF/weblogic-application.xml @@ -0,0 +1,3 @@ + + + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/web.xml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/web.xml new file mode 100644 index 00000000000..c2dcf6163b6 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/web.xml @@ -0,0 +1,3 @@ + + + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/weblogic.xml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/weblogic.xml new file mode 100644 index 00000000000..ea44151f8d3 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/myapp_war/WEB-INF/weblogic.xml @@ -0,0 +1,12 @@ + + + + + 15 + 60 + + + 1 + true + + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/myapp_war/index.jsp b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/myapp_war/index.jsp new file mode 100644 index 00000000000..700a6234cef --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v1/myapp_war/index.jsp @@ -0,0 +1,56 @@ +<%-- Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. --%> +<%-- Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. --%> +<%@ page import="javax.naming.InitialContext" %> +<%@ page import="javax.management.*" %> +<%@ page import="java.io.*" %> +<% + InitialContext ic = null; + try { + ic = new InitialContext(); + + String srName=System.getProperty("weblogic.Name"); + String domainUID=System.getenv("DOMAIN_UID"); + String domainName=System.getenv("CUSTOM_DOMAIN_NAME"); + + out.println("
    ");
    +    out.println("*****************************************************************");
    +    out.println();
    +    out.println("Hello World! This is version 'v1' of the mii-sample JSP web-app.");
    +    out.println();
    +    out.println("Welcome to WebLogic server '" + srName + "'!");
    +    out.println();
    +    out.println(" domain UID  = '" + domainUID +"'");
    +    out.println(" domain name = '" + domainName +"'");
    +    out.println();
    +
    +    MBeanServer mbs = (MBeanServer)ic.lookup("java:comp/env/jmx/runtime");
    +
    +    // display the current server's cluster name
    +    Set clusterRuntimes = mbs.queryMBeans(new ObjectName("*:Type=ClusterRuntime,*"), null);
    +    out.println("Found " + clusterRuntimes.size() + " local cluster runtime" + (String)((clusterRuntimes.size()!=1)?"s:":":"));
    +    for (ObjectInstance clusterRuntime : clusterRuntimes) {
    +       String cName = (String)mbs.getAttribute(clusterRuntime.getObjectName(), "Name");
    +       out.println("  Cluster '" + cName + "'");
    +    }
    +    out.println();
    +
    +    // display local data sources
    +    ObjectName jdbcRuntime = new ObjectName("com.bea:ServerRuntime=" + srName + ",Name=" + srName + ",Type=JDBCServiceRuntime");
    +    ObjectName[] dataSources = (ObjectName[])mbs.getAttribute(jdbcRuntime, "JDBCDataSourceRuntimeMBeans");
    +    out.println("Found " + dataSources.length + " local data source" + (String)((dataSources.length!=1)?"s:":":"));
    +    for (ObjectName dataSource : dataSources) {
    +       String dsName  = (String)mbs.getAttribute(dataSource, "Name");
    +       String dsState = (String)mbs.getAttribute(dataSource, "State");
    +       out.println("  Datasource '" + dsName + "': State='" + dsState +"'");
    +    }
    +    out.println();
    +
    +    out.println("*****************************************************************");
    +
    +  } catch (Throwable t) {
    +    t.printStackTrace(new PrintStream(response.getOutputStream()));
    +  } finally {
    +    out.println("
    "); + if (ic != null) ic.close(); + } +%> diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/META-INF/MANIFEST.MF b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..8a636006c23 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: 1.8.0_201 (Oracle Corporation) + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/META-INF/application.xml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/META-INF/application.xml new file mode 100644 index 00000000000..284b448c7d8 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/META-INF/application.xml @@ -0,0 +1,11 @@ + + + JSP 2.0 Expression Language Example + JSP 2.0 Expression Language Example + + + myapp_war + myapp_war + + + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/META-INF/weblogic-application.xml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/META-INF/weblogic-application.xml new file mode 100644 index 00000000000..a9506565fe8 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/META-INF/weblogic-application.xml @@ -0,0 +1,3 @@ + + + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/myapp_war/WEB-INF/web.xml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/myapp_war/WEB-INF/web.xml new file mode 100644 index 00000000000..c2dcf6163b6 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/myapp_war/WEB-INF/web.xml @@ -0,0 +1,3 @@ + + + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/myapp_war/WEB-INF/weblogic.xml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/myapp_war/WEB-INF/weblogic.xml new file mode 100644 index 00000000000..ea44151f8d3 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/myapp_war/WEB-INF/weblogic.xml @@ -0,0 +1,12 @@ + + + + + 15 + 60 + + + 1 + true + + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/myapp_war/index.jsp b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/myapp_war/index.jsp new file mode 100644 index 00000000000..475fbf28a60 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/applications/myapp-v2/myapp_war/index.jsp @@ -0,0 +1,56 @@ +<%-- Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. --%> +<%-- Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. --%> +<%@ page import="javax.naming.InitialContext" %> +<%@ page import="javax.management.*" %> +<%@ page import="java.io.*" %> +<% + InitialContext ic = null; + try { + ic = new InitialContext(); + + String srName=System.getProperty("weblogic.Name"); + String domainUID=System.getenv("DOMAIN_UID"); + String domainName=System.getenv("CUSTOM_DOMAIN_NAME"); + + out.println("
    ");
    +    out.println("*****************************************************************");
    +    out.println();
    +    out.println("Hello World! This is version 'v2' of the mii-sample JSP web-app.");
    +    out.println();
    +    out.println("Welcome to WebLogic server '" + srName + "'!");
    +    out.println();
    +    out.println(" domain UID  = '" + domainUID +"'");
    +    out.println(" domain name = '" + domainName +"'");
    +    out.println();
    +
    +    MBeanServer mbs = (MBeanServer)ic.lookup("java:comp/env/jmx/runtime");
    +
    +    // display the current server's cluster name
    +    Set clusterRuntimes = mbs.queryMBeans(new ObjectName("*:Type=ClusterRuntime,*"), null);
    +    out.println("Found " + clusterRuntimes.size() + " local cluster runtime" + (String)((clusterRuntimes.size()!=1)?"s:":":"));
    +    for (ObjectInstance clusterRuntime : clusterRuntimes) {
    +       String cName = (String)mbs.getAttribute(clusterRuntime.getObjectName(), "Name");
    +       out.println("  Cluster '" + cName + "'");
    +    }
    +    out.println();
    +
    +    // display local data sources
    +    ObjectName jdbcRuntime = new ObjectName("com.bea:ServerRuntime=" + srName + ",Name=" + srName + ",Type=JDBCServiceRuntime");
    +    ObjectName[] dataSources = (ObjectName[])mbs.getAttribute(jdbcRuntime, "JDBCDataSourceRuntimeMBeans");
    +    out.println("Found " + dataSources.length + " local data source" + (String)((dataSources.length!=1)?"s:":":"));
    +    for (ObjectName dataSource : dataSources) {
    +       String dsName  = (String)mbs.getAttribute(dataSource, "Name");
    +       String dsState = (String)mbs.getAttribute(dataSource, "State");
    +       out.println("  Datasource '" + dsName + "': State='" + dsState +"'");
    +    }
    +    out.println();
    +
    +    out.println("*****************************************************************");
    +
    +  } catch (Throwable t) {
    +    t.printStackTrace(new PrintStream(response.getOutputStream()));
    +  } finally {
    +    out.println("
    "); + if (ic != null) ic.close(); + } +%> diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/config/amimemappings.properties b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/archives/archive-v2/wlsdeploy/config/amimemappings.properties new file mode 100644 index 00000000000..e69de29bb2d diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-initial-d1-JRF-v1.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-initial-d1-JRF-v1.yaml new file mode 100644 index 00000000000..03c248d5911 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-initial-d1-JRF-v1.yaml @@ -0,0 +1,153 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. +# +# This is an example of how to define a Domain resource. +# +apiVersion: "weblogic.oracle/v8" +kind: Domain +metadata: + name: sample-domain1 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain1 + +spec: + # Set to 'FromModel' to indicate 'Model in Image'. + domainHomeSourceType: FromModel + + # The WebLogic Domain Home, this must be a location within + # the image for 'Model in Image' domains. + domainHome: /u01/domains/sample-domain1 + + # The WebLogic Server Docker image that the Operator uses to start the domain + image: "model-in-image:JRF-v1" + + # Defaults to "Always" if image tag (version) is ':latest' + imagePullPolicy: "IfNotPresent" + + # Identify which Secret contains the credentials for pulling an image + #imagePullSecrets: + #- name: regsecret + + # Identify which Secret contains the WebLogic Admin credentials, + # the secret must contain 'username' and 'password' fields. + webLogicCredentialsSecret: + name: sample-domain1-weblogic-credentials + + # Whether to include the WebLogic Server stdout in the pod's stdout, default is true + includeServerOutInPodLog: true + + # Whether to enable overriding your log file location, see also 'logHome' + #logHomeEnabled: false + + # The location for domain log, server logs, server out, and Node Manager log files + # see also 'logHomeEnabled', 'volumes', and 'volumeMounts'. + #logHome: /shared/logs/sample-domain1 + + # Set which WebLogic Servers the Operator will start + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server, and clustered servers up to their replica count. + serverStartPolicy: "IF_NEEDED" + + # Settings for all server pods in the domain including the introspector job pod + serverPod: + # Optional new or overridden environment variables for the domain's pods + # - This sample uses CUSTOM_DOMAIN_NAME in its image model file + # to set the Weblogic domain name + env: + - name: CUSTOM_DOMAIN_NAME + value: "domain1" + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx1024m " + resources: + requests: + cpu: "500m" + memory: "1280Mi" + + # Optional volumes and mounts for the domain's pods. See also 'logHome'. + #volumes: + #- name: weblogic-domain-storage-volume + # persistentVolumeClaim: + # claimName: sample-domain1-weblogic-sample-pvc + #volumeMounts: + #- mountPath: /shared + # name: weblogic-domain-storage-volume + + # The desired behavior for starting the domain's administration server. + adminServer: + # The serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + # Setup a Kubernetes node port for the administration server default channel + #adminService: + # channels: + # - channelName: default + # nodePort: 30701 + serverPod: + # Optional new or overridden environment variables for the admin pods + env: + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms512m -Xmx1024m " + + # The number of managed servers to start for unlisted clusters + replicas: 1 + + # The desired behavior for starting a specific cluster's member servers + clusters: + - clusterName: cluster-1 + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: 2 + + # Change the restartVersion to force the introspector job to rerun + # and apply any new model configuration, to also force a subsequent + # roll of your domain's WebLogic Server pods. + restartVersion: '1' + + configuration: + + # Settings for domainHomeSourceType 'FromModel' + model: + # Valid model domain types are 'WLS', 'JRF', and 'RestrictedJRF', default is 'WLS' + domainType: "JRF" + + # Optional configmap for additional models and variable files + #configMap: sample-domain1-wdt-config-map + + # All 'FromModel' domains require a runtimeEncryptionSecret with a 'password' field + runtimeEncryptionSecret: sample-domain1-runtime-encryption-secret + + # Secrets that are referenced by model yaml macros + # (the model yaml in the optional configMap or in the image) + secrets: + #- sample-domain1-datasource-secret + - sample-domain1-rcu-access + + # Increase the introspector job active timeout value for JRF use cases + introspectorJobActiveDeadlineSeconds: 600 + + opss: + + # Name of secret with walletPassword for extracting the wallet, used for JRF domains + walletPasswordSecret: sample-domain1-opss-wallet-password-secret + + # Name of secret with walletFile containing base64 encoded opss wallet, used for JRF domains + #walletFileSecret: sample-domain1-opss-walletfile-secret diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-update1-d1-JRF-v1-ds.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-update1-d1-JRF-v1-ds.yaml new file mode 100644 index 00000000000..971f8559771 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-update1-d1-JRF-v1-ds.yaml @@ -0,0 +1,153 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. +# +# This is an example of how to define a Domain resource. +# +apiVersion: "weblogic.oracle/v8" +kind: Domain +metadata: + name: sample-domain1 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain1 + +spec: + # Set to 'FromModel' to indicate 'Model in Image'. + domainHomeSourceType: FromModel + + # The WebLogic Domain Home, this must be a location within + # the image for 'Model in Image' domains. + domainHome: /u01/domains/sample-domain1 + + # The WebLogic Server Docker image that the Operator uses to start the domain + image: "model-in-image:JRF-v1" + + # Defaults to "Always" if image tag (version) is ':latest' + imagePullPolicy: "IfNotPresent" + + # Identify which Secret contains the credentials for pulling an image + #imagePullSecrets: + #- name: regsecret + + # Identify which Secret contains the WebLogic Admin credentials, + # the secret must contain 'username' and 'password' fields. + webLogicCredentialsSecret: + name: sample-domain1-weblogic-credentials + + # Whether to include the WebLogic Server stdout in the pod's stdout, default is true + includeServerOutInPodLog: true + + # Whether to enable overriding your log file location, see also 'logHome' + #logHomeEnabled: false + + # The location for domain log, server logs, server out, and Node Manager log files + # see also 'logHomeEnabled', 'volumes', and 'volumeMounts'. + #logHome: /shared/logs/sample-domain1 + + # Set which WebLogic Servers the Operator will start + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server, and clustered servers up to their replica count. + serverStartPolicy: "IF_NEEDED" + + # Settings for all server pods in the domain including the introspector job pod + serverPod: + # Optional new or overridden environment variables for the domain's pods + # - This sample uses CUSTOM_DOMAIN_NAME in its image model file + # to set the Weblogic domain name + env: + - name: CUSTOM_DOMAIN_NAME + value: "domain1" + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx1024m " + resources: + requests: + cpu: "500m" + memory: "1280Mi" + + # Optional volumes and mounts for the domain's pods. See also 'logHome'. + #volumes: + #- name: weblogic-domain-storage-volume + # persistentVolumeClaim: + # claimName: sample-domain1-weblogic-sample-pvc + #volumeMounts: + #- mountPath: /shared + # name: weblogic-domain-storage-volume + + # The desired behavior for starting the domain's administration server. + adminServer: + # The serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + # Setup a Kubernetes node port for the administration server default channel + #adminService: + # channels: + # - channelName: default + # nodePort: 30701 + serverPod: + # Optional new or overridden environment variables for the admin pods + env: + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms512m -Xmx1024m " + + # The number of managed servers to start for unlisted clusters + replicas: 1 + + # The desired behavior for starting a specific cluster's member servers + clusters: + - clusterName: cluster-1 + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: 2 + + # Change the restartVersion to force the introspector job to rerun + # and apply any new model configuration, to also force a subsequent + # roll of your domain's WebLogic Server pods. + restartVersion: '1' + + configuration: + + # Settings for domainHomeSourceType 'FromModel' + model: + # Valid model domain types are 'WLS', 'JRF', and 'RestrictedJRF', default is 'WLS' + domainType: "JRF" + + # Optional configmap for additional models and variable files + configMap: sample-domain1-wdt-config-map + + # All 'FromModel' domains require a runtimeEncryptionSecret with a 'password' field + runtimeEncryptionSecret: sample-domain1-runtime-encryption-secret + + # Secrets that are referenced by model yaml macros + # (the model yaml in the optional configMap or in the image) + secrets: + - sample-domain1-datasource-secret + - sample-domain1-rcu-access + + # Increase the introspector job active timeout value for JRF use cases + introspectorJobActiveDeadlineSeconds: 600 + + opss: + + # Name of secret with walletPassword for extracting the wallet, used for JRF domains + walletPasswordSecret: sample-domain1-opss-wallet-password-secret + + # Name of secret with walletFile containing base64 encoded opss wallet, used for JRF domains + #walletFileSecret: sample-domain1-opss-walletfile-secret diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-update2-d2-JRF-v1-ds.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-update2-d2-JRF-v1-ds.yaml new file mode 100644 index 00000000000..f777164ce52 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-update2-d2-JRF-v1-ds.yaml @@ -0,0 +1,153 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. +# +# This is an example of how to define a Domain resource. +# +apiVersion: "weblogic.oracle/v8" +kind: Domain +metadata: + name: sample-domain2 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain2 + +spec: + # Set to 'FromModel' to indicate 'Model in Image'. + domainHomeSourceType: FromModel + + # The WebLogic Domain Home, this must be a location within + # the image for 'Model in Image' domains. + domainHome: /u01/domains/sample-domain2 + + # The WebLogic Server Docker image that the Operator uses to start the domain + image: "model-in-image:JRF-v1" + + # Defaults to "Always" if image tag (version) is ':latest' + imagePullPolicy: "IfNotPresent" + + # Identify which Secret contains the credentials for pulling an image + #imagePullSecrets: + #- name: regsecret + + # Identify which Secret contains the WebLogic Admin credentials, + # the secret must contain 'username' and 'password' fields. + webLogicCredentialsSecret: + name: sample-domain2-weblogic-credentials + + # Whether to include the WebLogic Server stdout in the pod's stdout, default is true + includeServerOutInPodLog: true + + # Whether to enable overriding your log file location, see also 'logHome' + #logHomeEnabled: false + + # The location for domain log, server logs, server out, and Node Manager log files + # see also 'logHomeEnabled', 'volumes', and 'volumeMounts'. + #logHome: /shared/logs/sample-domain2 + + # Set which WebLogic Servers the Operator will start + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server, and clustered servers up to their replica count. + serverStartPolicy: "IF_NEEDED" + + # Settings for all server pods in the domain including the introspector job pod + serverPod: + # Optional new or overridden environment variables for the domain's pods + # - This sample uses CUSTOM_DOMAIN_NAME in its image model file + # to set the Weblogic domain name + env: + - name: CUSTOM_DOMAIN_NAME + value: "domain2" + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx1024m " + resources: + requests: + cpu: "500m" + memory: "1280Mi" + + # Optional volumes and mounts for the domain's pods. See also 'logHome'. + #volumes: + #- name: weblogic-domain-storage-volume + # persistentVolumeClaim: + # claimName: sample-domain2-weblogic-sample-pvc + #volumeMounts: + #- mountPath: /shared + # name: weblogic-domain-storage-volume + + # The desired behavior for starting the domain's administration server. + adminServer: + # The serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + # Setup a Kubernetes node port for the administration server default channel + #adminService: + # channels: + # - channelName: default + # nodePort: 30701 + serverPod: + # Optional new or overridden environment variables for the admin pods + env: + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms512m -Xmx1024m " + + # The number of managed servers to start for unlisted clusters + replicas: 1 + + # The desired behavior for starting a specific cluster's member servers + clusters: + - clusterName: cluster-1 + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: 2 + + # Change the restartVersion to force the introspector job to rerun + # and apply any new model configuration, to also force a subsequent + # roll of your domain's WebLogic Server pods. + restartVersion: '1' + + configuration: + + # Settings for domainHomeSourceType 'FromModel' + model: + # Valid model domain types are 'WLS', 'JRF', and 'RestrictedJRF', default is 'WLS' + domainType: "JRF" + + # Optional configmap for additional models and variable files + configMap: sample-domain2-wdt-config-map + + # All 'FromModel' domains require a runtimeEncryptionSecret with a 'password' field + runtimeEncryptionSecret: sample-domain2-runtime-encryption-secret + + # Secrets that are referenced by model yaml macros + # (the model yaml in the optional configMap or in the image) + secrets: + - sample-domain2-datasource-secret + - sample-domain2-rcu-access + + # Increase the introspector job active timeout value for JRF use cases + introspectorJobActiveDeadlineSeconds: 600 + + opss: + + # Name of secret with walletPassword for extracting the wallet, used for JRF domains + walletPasswordSecret: sample-domain2-opss-wallet-password-secret + + # Name of secret with walletFile containing base64 encoded opss wallet, used for JRF domains + #walletFileSecret: sample-domain2-opss-walletfile-secret diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-update3-d1-JRF-v2-ds.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-update3-d1-JRF-v2-ds.yaml new file mode 100644 index 00000000000..beb2628fc5b --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/JRF/mii-update3-d1-JRF-v2-ds.yaml @@ -0,0 +1,153 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. +# +# This is an example of how to define a Domain resource. +# +apiVersion: "weblogic.oracle/v8" +kind: Domain +metadata: + name: sample-domain1 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain1 + +spec: + # Set to 'FromModel' to indicate 'Model in Image'. + domainHomeSourceType: FromModel + + # The WebLogic Domain Home, this must be a location within + # the image for 'Model in Image' domains. + domainHome: /u01/domains/sample-domain1 + + # The WebLogic Server Docker image that the Operator uses to start the domain + image: "model-in-image:JRF-v2" + + # Defaults to "Always" if image tag (version) is ':latest' + imagePullPolicy: "IfNotPresent" + + # Identify which Secret contains the credentials for pulling an image + #imagePullSecrets: + #- name: regsecret + + # Identify which Secret contains the WebLogic Admin credentials, + # the secret must contain 'username' and 'password' fields. + webLogicCredentialsSecret: + name: sample-domain1-weblogic-credentials + + # Whether to include the WebLogic Server stdout in the pod's stdout, default is true + includeServerOutInPodLog: true + + # Whether to enable overriding your log file location, see also 'logHome' + #logHomeEnabled: false + + # The location for domain log, server logs, server out, and Node Manager log files + # see also 'logHomeEnabled', 'volumes', and 'volumeMounts'. + #logHome: /shared/logs/sample-domain1 + + # Set which WebLogic Servers the Operator will start + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server, and clustered servers up to their replica count. + serverStartPolicy: "IF_NEEDED" + + # Settings for all server pods in the domain including the introspector job pod + serverPod: + # Optional new or overridden environment variables for the domain's pods + # - This sample uses CUSTOM_DOMAIN_NAME in its image model file + # to set the Weblogic domain name + env: + - name: CUSTOM_DOMAIN_NAME + value: "domain1" + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx1024m " + resources: + requests: + cpu: "500m" + memory: "1280Mi" + + # Optional volumes and mounts for the domain's pods. See also 'logHome'. + #volumes: + #- name: weblogic-domain-storage-volume + # persistentVolumeClaim: + # claimName: sample-domain1-weblogic-sample-pvc + #volumeMounts: + #- mountPath: /shared + # name: weblogic-domain-storage-volume + + # The desired behavior for starting the domain's administration server. + adminServer: + # The serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + # Setup a Kubernetes node port for the administration server default channel + #adminService: + # channels: + # - channelName: default + # nodePort: 30701 + serverPod: + # Optional new or overridden environment variables for the admin pods + env: + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms512m -Xmx1024m " + + # The number of managed servers to start for unlisted clusters + replicas: 1 + + # The desired behavior for starting a specific cluster's member servers + clusters: + - clusterName: cluster-1 + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: 2 + + # Change the restartVersion to force the introspector job to rerun + # and apply any new model configuration, to also force a subsequent + # roll of your domain's WebLogic Server pods. + restartVersion: '1' + + configuration: + + # Settings for domainHomeSourceType 'FromModel' + model: + # Valid model domain types are 'WLS', 'JRF', and 'RestrictedJRF', default is 'WLS' + domainType: "JRF" + + # Optional configmap for additional models and variable files + configMap: sample-domain1-wdt-config-map + + # All 'FromModel' domains require a runtimeEncryptionSecret with a 'password' field + runtimeEncryptionSecret: sample-domain1-runtime-encryption-secret + + # Secrets that are referenced by model yaml macros + # (the model yaml in the optional configMap or in the image) + secrets: + - sample-domain1-datasource-secret + - sample-domain1-rcu-access + + # Increase the introspector job active timeout value for JRF use cases + introspectorJobActiveDeadlineSeconds: 600 + + opss: + + # Name of secret with walletPassword for extracting the wallet, used for JRF domains + walletPasswordSecret: sample-domain1-opss-wallet-password-secret + + # Name of secret with walletFile containing base64 encoded opss wallet, used for JRF domains + #walletFileSecret: sample-domain1-opss-walletfile-secret diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-initial-d1-WLS-v1.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-initial-d1-WLS-v1.yaml new file mode 100644 index 00000000000..cd80b2be7a2 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-initial-d1-WLS-v1.yaml @@ -0,0 +1,136 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. +# +# This is an example of how to define a Domain resource. +# +apiVersion: "weblogic.oracle/v8" +kind: Domain +metadata: + name: sample-domain1 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain1 + +spec: + # Set to 'FromModel' to indicate 'Model in Image'. + domainHomeSourceType: FromModel + + # The WebLogic Domain Home, this must be a location within + # the image for 'Model in Image' domains. + domainHome: /u01/domains/sample-domain1 + + # The WebLogic Server Docker image that the Operator uses to start the domain + image: "model-in-image:WLS-v1" + + # Defaults to "Always" if image tag (version) is ':latest' + imagePullPolicy: "IfNotPresent" + + # Identify which Secret contains the credentials for pulling an image + #imagePullSecrets: + #- name: regsecret + + # Identify which Secret contains the WebLogic Admin credentials, + # the secret must contain 'username' and 'password' fields. + webLogicCredentialsSecret: + name: sample-domain1-weblogic-credentials + + # Whether to include the WebLogic Server stdout in the pod's stdout, default is true + includeServerOutInPodLog: true + + # Whether to enable overriding your log file location, see also 'logHome' + #logHomeEnabled: false + + # The location for domain log, server logs, server out, and Node Manager log files + # see also 'logHomeEnabled', 'volumes', and 'volumeMounts'. + #logHome: /shared/logs/sample-domain1 + + # Set which WebLogic Servers the Operator will start + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server, and clustered servers up to their replica count. + serverStartPolicy: "IF_NEEDED" + + # Settings for all server pods in the domain including the introspector job pod + serverPod: + # Optional new or overridden environment variables for the domain's pods + # - This sample uses CUSTOM_DOMAIN_NAME in its image model file + # to set the Weblogic domain name + env: + - name: CUSTOM_DOMAIN_NAME + value: "domain1" + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx512m " + resources: + requests: + cpu: "250m" + memory: "768Mi" + + # Optional volumes and mounts for the domain's pods. See also 'logHome'. + #volumes: + #- name: weblogic-domain-storage-volume + # persistentVolumeClaim: + # claimName: sample-domain1-weblogic-sample-pvc + #volumeMounts: + #- mountPath: /shared + # name: weblogic-domain-storage-volume + + # The desired behavior for starting the domain's administration server. + adminServer: + # The serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + # Setup a Kubernetes node port for the administration server default channel + #adminService: + # channels: + # - channelName: default + # nodePort: 30701 + + # The number of managed servers to start for unlisted clusters + replicas: 1 + + # The desired behavior for starting a specific cluster's member servers + clusters: + - clusterName: cluster-1 + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: 2 + + # Change the restartVersion to force the introspector job to rerun + # and apply any new model configuration, to also force a subsequent + # roll of your domain's WebLogic Server pods. + restartVersion: '1' + + configuration: + + # Settings for domainHomeSourceType 'FromModel' + model: + # Valid model domain types are 'WLS', 'JRF', and 'RestrictedJRF', default is 'WLS' + domainType: "WLS" + + # Optional configmap for additional models and variable files + #configMap: sample-domain1-wdt-config-map + + # All 'FromModel' domains require a runtimeEncryptionSecret with a 'password' field + runtimeEncryptionSecret: sample-domain1-runtime-encryption-secret + + # Secrets that are referenced by model yaml macros + # (the model yaml in the optional configMap or in the image) + #secrets: + #- sample-domain1-datasource-secret diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-update1-d1-WLS-v1-ds.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-update1-d1-WLS-v1-ds.yaml new file mode 100644 index 00000000000..f8ab98b5c92 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-update1-d1-WLS-v1-ds.yaml @@ -0,0 +1,136 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. +# +# This is an example of how to define a Domain resource. +# +apiVersion: "weblogic.oracle/v8" +kind: Domain +metadata: + name: sample-domain1 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain1 + +spec: + # Set to 'FromModel' to indicate 'Model in Image'. + domainHomeSourceType: FromModel + + # The WebLogic Domain Home, this must be a location within + # the image for 'Model in Image' domains. + domainHome: /u01/domains/sample-domain1 + + # The WebLogic Server Docker image that the Operator uses to start the domain + image: "model-in-image:WLS-v1" + + # Defaults to "Always" if image tag (version) is ':latest' + imagePullPolicy: "IfNotPresent" + + # Identify which Secret contains the credentials for pulling an image + #imagePullSecrets: + #- name: regsecret + + # Identify which Secret contains the WebLogic Admin credentials, + # the secret must contain 'username' and 'password' fields. + webLogicCredentialsSecret: + name: sample-domain1-weblogic-credentials + + # Whether to include the WebLogic Server stdout in the pod's stdout, default is true + includeServerOutInPodLog: true + + # Whether to enable overriding your log file location, see also 'logHome' + #logHomeEnabled: false + + # The location for domain log, server logs, server out, and Node Manager log files + # see also 'logHomeEnabled', 'volumes', and 'volumeMounts'. + #logHome: /shared/logs/sample-domain1 + + # Set which WebLogic Servers the Operator will start + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server, and clustered servers up to their replica count. + serverStartPolicy: "IF_NEEDED" + + # Settings for all server pods in the domain including the introspector job pod + serverPod: + # Optional new or overridden environment variables for the domain's pods + # - This sample uses CUSTOM_DOMAIN_NAME in its image model file + # to set the Weblogic domain name + env: + - name: CUSTOM_DOMAIN_NAME + value: "domain1" + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx512m " + resources: + requests: + cpu: "250m" + memory: "768Mi" + + # Optional volumes and mounts for the domain's pods. See also 'logHome'. + #volumes: + #- name: weblogic-domain-storage-volume + # persistentVolumeClaim: + # claimName: sample-domain1-weblogic-sample-pvc + #volumeMounts: + #- mountPath: /shared + # name: weblogic-domain-storage-volume + + # The desired behavior for starting the domain's administration server. + adminServer: + # The serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + # Setup a Kubernetes node port for the administration server default channel + #adminService: + # channels: + # - channelName: default + # nodePort: 30701 + + # The number of managed servers to start for unlisted clusters + replicas: 1 + + # The desired behavior for starting a specific cluster's member servers + clusters: + - clusterName: cluster-1 + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: 2 + + # Change the restartVersion to force the introspector job to rerun + # and apply any new model configuration, to also force a subsequent + # roll of your domain's WebLogic Server pods. + restartVersion: '1' + + configuration: + + # Settings for domainHomeSourceType 'FromModel' + model: + # Valid model domain types are 'WLS', 'JRF', and 'RestrictedJRF', default is 'WLS' + domainType: "WLS" + + # Optional configmap for additional models and variable files + configMap: sample-domain1-wdt-config-map + + # All 'FromModel' domains require a runtimeEncryptionSecret with a 'password' field + runtimeEncryptionSecret: sample-domain1-runtime-encryption-secret + + # Secrets that are referenced by model yaml macros + # (the model yaml in the optional configMap or in the image) + secrets: + - sample-domain1-datasource-secret diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-update2-d2-WLS-v1-ds.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-update2-d2-WLS-v1-ds.yaml new file mode 100644 index 00000000000..309c0e5bf11 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-update2-d2-WLS-v1-ds.yaml @@ -0,0 +1,136 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. +# +# This is an example of how to define a Domain resource. +# +apiVersion: "weblogic.oracle/v8" +kind: Domain +metadata: + name: sample-domain2 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain2 + +spec: + # Set to 'FromModel' to indicate 'Model in Image'. + domainHomeSourceType: FromModel + + # The WebLogic Domain Home, this must be a location within + # the image for 'Model in Image' domains. + domainHome: /u01/domains/sample-domain2 + + # The WebLogic Server Docker image that the Operator uses to start the domain + image: "model-in-image:WLS-v1" + + # Defaults to "Always" if image tag (version) is ':latest' + imagePullPolicy: "IfNotPresent" + + # Identify which Secret contains the credentials for pulling an image + #imagePullSecrets: + #- name: regsecret + + # Identify which Secret contains the WebLogic Admin credentials, + # the secret must contain 'username' and 'password' fields. + webLogicCredentialsSecret: + name: sample-domain2-weblogic-credentials + + # Whether to include the WebLogic Server stdout in the pod's stdout, default is true + includeServerOutInPodLog: true + + # Whether to enable overriding your log file location, see also 'logHome' + #logHomeEnabled: false + + # The location for domain log, server logs, server out, and Node Manager log files + # see also 'logHomeEnabled', 'volumes', and 'volumeMounts'. + #logHome: /shared/logs/sample-domain2 + + # Set which WebLogic Servers the Operator will start + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server, and clustered servers up to their replica count. + serverStartPolicy: "IF_NEEDED" + + # Settings for all server pods in the domain including the introspector job pod + serverPod: + # Optional new or overridden environment variables for the domain's pods + # - This sample uses CUSTOM_DOMAIN_NAME in its image model file + # to set the Weblogic domain name + env: + - name: CUSTOM_DOMAIN_NAME + value: "domain2" + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx512m " + resources: + requests: + cpu: "250m" + memory: "768Mi" + + # Optional volumes and mounts for the domain's pods. See also 'logHome'. + #volumes: + #- name: weblogic-domain-storage-volume + # persistentVolumeClaim: + # claimName: sample-domain2-weblogic-sample-pvc + #volumeMounts: + #- mountPath: /shared + # name: weblogic-domain-storage-volume + + # The desired behavior for starting the domain's administration server. + adminServer: + # The serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + # Setup a Kubernetes node port for the administration server default channel + #adminService: + # channels: + # - channelName: default + # nodePort: 30701 + + # The number of managed servers to start for unlisted clusters + replicas: 1 + + # The desired behavior for starting a specific cluster's member servers + clusters: + - clusterName: cluster-1 + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: 2 + + # Change the restartVersion to force the introspector job to rerun + # and apply any new model configuration, to also force a subsequent + # roll of your domain's WebLogic Server pods. + restartVersion: '1' + + configuration: + + # Settings for domainHomeSourceType 'FromModel' + model: + # Valid model domain types are 'WLS', 'JRF', and 'RestrictedJRF', default is 'WLS' + domainType: "WLS" + + # Optional configmap for additional models and variable files + configMap: sample-domain2-wdt-config-map + + # All 'FromModel' domains require a runtimeEncryptionSecret with a 'password' field + runtimeEncryptionSecret: sample-domain2-runtime-encryption-secret + + # Secrets that are referenced by model yaml macros + # (the model yaml in the optional configMap or in the image) + secrets: + - sample-domain2-datasource-secret diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-update3-d1-WLS-v2-ds.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-update3-d1-WLS-v2-ds.yaml new file mode 100644 index 00000000000..6ad4f4b858d --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/domain-resources/WLS/mii-update3-d1-WLS-v2-ds.yaml @@ -0,0 +1,136 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. +# +# This is an example of how to define a Domain resource. +# +apiVersion: "weblogic.oracle/v8" +kind: Domain +metadata: + name: sample-domain1 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain1 + +spec: + # Set to 'FromModel' to indicate 'Model in Image'. + domainHomeSourceType: FromModel + + # The WebLogic Domain Home, this must be a location within + # the image for 'Model in Image' domains. + domainHome: /u01/domains/sample-domain1 + + # The WebLogic Server Docker image that the Operator uses to start the domain + image: "model-in-image:WLS-v2" + + # Defaults to "Always" if image tag (version) is ':latest' + imagePullPolicy: "IfNotPresent" + + # Identify which Secret contains the credentials for pulling an image + #imagePullSecrets: + #- name: regsecret + + # Identify which Secret contains the WebLogic Admin credentials, + # the secret must contain 'username' and 'password' fields. + webLogicCredentialsSecret: + name: sample-domain1-weblogic-credentials + + # Whether to include the WebLogic Server stdout in the pod's stdout, default is true + includeServerOutInPodLog: true + + # Whether to enable overriding your log file location, see also 'logHome' + #logHomeEnabled: false + + # The location for domain log, server logs, server out, and Node Manager log files + # see also 'logHomeEnabled', 'volumes', and 'volumeMounts'. + #logHome: /shared/logs/sample-domain1 + + # Set which WebLogic Servers the Operator will start + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server, and clustered servers up to their replica count. + serverStartPolicy: "IF_NEEDED" + + # Settings for all server pods in the domain including the introspector job pod + serverPod: + # Optional new or overridden environment variables for the domain's pods + # - This sample uses CUSTOM_DOMAIN_NAME in its image model file + # to set the Weblogic domain name + env: + - name: CUSTOM_DOMAIN_NAME + value: "domain1" + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx512m " + resources: + requests: + cpu: "250m" + memory: "768Mi" + + # Optional volumes and mounts for the domain's pods. See also 'logHome'. + #volumes: + #- name: weblogic-domain-storage-volume + # persistentVolumeClaim: + # claimName: sample-domain1-weblogic-sample-pvc + #volumeMounts: + #- mountPath: /shared + # name: weblogic-domain-storage-volume + + # The desired behavior for starting the domain's administration server. + adminServer: + # The serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + # Setup a Kubernetes node port for the administration server default channel + #adminService: + # channels: + # - channelName: default + # nodePort: 30701 + + # The number of managed servers to start for unlisted clusters + replicas: 1 + + # The desired behavior for starting a specific cluster's member servers + clusters: + - clusterName: cluster-1 + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: 2 + + # Change the restartVersion to force the introspector job to rerun + # and apply any new model configuration, to also force a subsequent + # roll of your domain's WebLogic Server pods. + restartVersion: '1' + + configuration: + + # Settings for domainHomeSourceType 'FromModel' + model: + # Valid model domain types are 'WLS', 'JRF', and 'RestrictedJRF', default is 'WLS' + domainType: "WLS" + + # Optional configmap for additional models and variable files + configMap: sample-domain1-wdt-config-map + + # All 'FromModel' domains require a runtimeEncryptionSecret with a 'password' field + runtimeEncryptionSecret: sample-domain1-runtime-encryption-secret + + # Secrets that are referenced by model yaml macros + # (the model yaml in the optional configMap or in the image) + secrets: + - sample-domain1-datasource-secret diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/ingresses/traefik-ingress-sample-domain1-admin-server.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/ingresses/traefik-ingress-sample-domain1-admin-server.yaml new file mode 100644 index 00000000000..7bf433554db --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/ingresses/traefik-ingress-sample-domain1-admin-server.yaml @@ -0,0 +1,21 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +apiVersion: networking.k8s.io/v1beta1 +kind: Ingress +metadata: + name: traefik-ingress-sample-domain1-admin-server + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain1 + annotations: + kubernetes.io/ingress.class: traefik +spec: + rules: + - host: + http: + paths: + - path: /console + backend: + serviceName: sample-domain1-admin-server + servicePort: 7001 diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/ingresses/traefik-ingress-sample-domain1-cluster-cluster-1.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/ingresses/traefik-ingress-sample-domain1-cluster-cluster-1.yaml new file mode 100644 index 00000000000..4d3aa3f87ec --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/ingresses/traefik-ingress-sample-domain1-cluster-cluster-1.yaml @@ -0,0 +1,44 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# +# This is a Traefik ingress for service 'sample-domain1-cluster-cluster-1'. +# +# Sample curl access: +# +# Using 'localhost': +# curl -s -S -m 10 -H 'host: sample-domain1-cluster-cluster-1.mii-sample.org' \ +# http://localhost:30305/myapp_war/index.jsp +# - or - +# Using 'machine host': +# curl -s -S -m 10 -H 'host: sample-domain1-cluster-cluster-1.mii-sample.org' \ +# http://$(hostname).$(dnsdomainname):30305/myapp_war/index.jsp +# - or - +# Using 'kubernetes cluster host': +# curl -s -S -m 10 -H 'host: sample-domain1-cluster-cluster-1.mii-sample.org' \ +# http://$(kubectl cluster-info | grep KubeDNS | sed 's;^.*//;;' | sed 's;:.*$;;'):30305/myapp_war/index.jsp +# +# If Traefik is unavailable and your admin server pod is running, try 'kubectl exec': +# +# kubectl exec -n sample-domain1-ns sample-domain1-admin-server -- bash -c \ +# "curl -s -S -m 10 http://sample-domain1-cluster-cluster-1:8001/myapp_war/index.jsp" +# + +apiVersion: networking.k8s.io/v1beta1 +kind: Ingress +metadata: + name: traefik-ingress-sample-domain1-cluster-cluster-1 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain1 + annotations: + kubernetes.io/ingress.class: traefik +spec: + rules: + - host: sample-domain1-cluster-cluster-1.mii-sample.org + http: + paths: + - path: + backend: + serviceName: sample-domain1-cluster-cluster-1 + servicePort: 8001 diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/ingresses/traefik-ingress-sample-domain2-cluster-cluster-1.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/ingresses/traefik-ingress-sample-domain2-cluster-cluster-1.yaml new file mode 100644 index 00000000000..56ae5311a24 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/ingresses/traefik-ingress-sample-domain2-cluster-cluster-1.yaml @@ -0,0 +1,44 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# +# This is a Traefik ingress for service 'sample-domain2-cluster-cluster-1'. +# +# Sample curl access: +# +# Using 'localhost': +# curl -s -S -m 10 -H 'host: sample-domain2-cluster-cluster-1.mii-sample.org' \ +# http://localhost:30305/myapp_war/index.jsp +# - or - +# Using 'machine host': +# curl -s -S -m 10 -H 'host: sample-domain2-cluster-cluster-1.mii-sample.org' \ +# http://$(hostname).$(dnsdomainname):30305/myapp_war/index.jsp +# - or - +# Using 'kubernetes cluster host': +# curl -s -S -m 10 -H 'host: sample-domain2-cluster-cluster-1.mii-sample.org' \ +# http://$(kubectl cluster-info | grep KubeDNS | sed 's;^.*//;;' | sed 's;:.*$;;'):30305/myapp_war/index.jsp +# +# If Traefik is unavailable and your admin server pod is running, try 'kubectl exec': +# +# kubectl exec -n sample-domain1-ns sample-domain2-admin-server -- bash -c \ +# "curl -s -S -m 10 http://sample-domain2-cluster-cluster-1:8001/myapp_war/index.jsp" +# + +apiVersion: networking.k8s.io/v1beta1 +kind: Ingress +metadata: + name: traefik-ingress-sample-domain2-cluster-cluster-1 + namespace: sample-domain1-ns + labels: + weblogic.domainUID: sample-domain2 + annotations: + kubernetes.io/ingress.class: traefik +spec: + rules: + - host: sample-domain2-cluster-cluster-1.mii-sample.org + http: + paths: + - path: + backend: + serviceName: sample-domain2-cluster-cluster-1 + servicePort: 8001 diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-configmaps/datasource/model.20.datasource.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-configmaps/datasource/model.20.datasource.yaml new file mode 100644 index 00000000000..858dc414ef7 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-configmaps/datasource/model.20.datasource.yaml @@ -0,0 +1,30 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +resources: + JDBCSystemResource: + mynewdatasource: + Target: 'cluster-1' + JdbcResource: + JDBCDataSourceParams: + JNDIName: [ + jdbc/mydatasource1, + jdbc/mydatasource2 + ] + GlobalTransactionsProtocol: TwoPhaseCommit + JDBCDriverParams: + DriverName: oracle.jdbc.xa.client.OracleXADataSource + URL: '@@SECRET:@@ENV:DOMAIN_UID@@-datasource-secret:url@@' + PasswordEncrypted: '@@SECRET:@@ENV:DOMAIN_UID@@-datasource-secret:password@@' + Properties: + user: + Value: 'sys as sysdba' + oracle.net.CONNECT_TIMEOUT: + Value: 5000 + oracle.jdbc.ReadTimeout: + Value: 30000 + JDBCConnectionPoolParams: + InitialCapacity: 0 + MaxCapacity: 1 + TestTableName: SQL ISVALID + TestConnectionsOnReserve: true diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v1/model.10.properties b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v1/model.10.properties new file mode 100644 index 00000000000..e3124517429 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v1/model.10.properties @@ -0,0 +1,4 @@ +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +UNUSED_PROPERTY=8001 diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v1/model.10.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v1/model.10.yaml new file mode 100644 index 00000000000..e54bcafe7d7 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v1/model.10.yaml @@ -0,0 +1,39 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +domainInfo: + AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' + AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' + ServerStartMode: 'prod' + RCUDbInfo: + rcu_prefix: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_prefix@@' + rcu_schema_password: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_schema_password@@' + rcu_db_conn_string: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_db_conn_string@@' + +topology: + AdminServerName: 'admin-server' + Name: '@@ENV:CUSTOM_DOMAIN_NAME@@' + Cluster: + 'cluster-1': + Server: + 'admin-server': + ListenPort: 7001 + 'managed-server1-c1': + Cluster: 'cluster-1' + ListenPort: 8001 + 'managed-server2-c1': + Cluster: 'cluster-1' + ListenPort: 8001 + 'managed-server3-c1': + Cluster: 'cluster-1' + ListenPort: 8001 + 'managed-server4-c1': + Cluster: 'cluster-1' + ListenPort: 8001 + +appDeployments: + Application: + myapp: + SourcePath: 'wlsdeploy/applications/myapp-v1' + ModuleType: ear + Target: 'cluster-1' diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v2/model.10.properties b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v2/model.10.properties new file mode 100644 index 00000000000..e3124517429 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v2/model.10.properties @@ -0,0 +1,4 @@ +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +UNUSED_PROPERTY=8001 diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v2/model.10.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v2/model.10.yaml new file mode 100644 index 00000000000..34db3ecc016 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__JRF-v2/model.10.yaml @@ -0,0 +1,39 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +domainInfo: + AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' + AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' + ServerStartMode: 'prod' + RCUDbInfo: + rcu_prefix: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_prefix@@' + rcu_schema_password: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_schema_password@@' + rcu_db_conn_string: '@@SECRET:@@ENV:DOMAIN_UID@@-rcu-access:rcu_db_conn_string@@' + +topology: + AdminServerName: 'admin-server' + Name: '@@ENV:CUSTOM_DOMAIN_NAME@@' + Cluster: + 'cluster-1': + Server: + 'admin-server': + ListenPort: 7001 + 'managed-server1-c1': + Cluster: 'cluster-1' + ListenPort: 8001 + 'managed-server2-c1': + Cluster: 'cluster-1' + ListenPort: 8001 + 'managed-server3-c1': + Cluster: 'cluster-1' + ListenPort: 8001 + 'managed-server4-c1': + Cluster: 'cluster-1' + ListenPort: 8001 + +appDeployments: + Application: + myapp: + SourcePath: 'wlsdeploy/applications/myapp-v2' + ModuleType: ear + Target: 'cluster-1' diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v1/model.10.properties b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v1/model.10.properties new file mode 100644 index 00000000000..b8e4d475b78 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v1/model.10.properties @@ -0,0 +1,4 @@ +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +CLUSTER_SIZE=5 diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v1/model.10.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v1/model.10.yaml new file mode 100644 index 00000000000..a8c8e4a3a0b --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v1/model.10.yaml @@ -0,0 +1,34 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +domainInfo: + AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' + AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' + ServerStartMode: 'prod' + +topology: + Name: '@@ENV:CUSTOM_DOMAIN_NAME@@' + AdminServerName: 'admin-server' + Cluster: + 'cluster-1': + DynamicServers: + ServerTemplate: 'cluster-1-template' + ServerNamePrefix: 'managed-server' + DynamicClusterSize: '@@PROP:CLUSTER_SIZE@@' + MaxDynamicClusterSize: '@@PROP:CLUSTER_SIZE@@' + MinDynamicClusterSize: '0' + CalculatedListenPorts: false + Server: + 'admin-server': + ListenPort: 7001 + ServerTemplate: + 'cluster-1-template': + Cluster: 'cluster-1' + ListenPort: 8001 + +appDeployments: + Application: + myapp: + SourcePath: 'wlsdeploy/applications/myapp-v1' + ModuleType: ear + Target: 'cluster-1' diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v2/model.10.properties b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v2/model.10.properties new file mode 100644 index 00000000000..b8e4d475b78 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v2/model.10.properties @@ -0,0 +1,4 @@ +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +CLUSTER_SIZE=5 diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v2/model.10.yaml b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v2/model.10.yaml new file mode 100644 index 00000000000..c697d2d05df --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v2/model.10.yaml @@ -0,0 +1,34 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +domainInfo: + AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' + AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' + ServerStartMode: 'prod' + +topology: + Name: '@@ENV:CUSTOM_DOMAIN_NAME@@' + AdminServerName: 'admin-server' + Cluster: + 'cluster-1': + DynamicServers: + ServerTemplate: 'cluster-1-template' + ServerNamePrefix: 'managed-server' + DynamicClusterSize: '@@PROP:CLUSTER_SIZE@@' + MaxDynamicClusterSize: '@@PROP:CLUSTER_SIZE@@' + MinDynamicClusterSize: '0' + CalculatedListenPorts: false + Server: + 'admin-server': + ListenPort: 7001 + ServerTemplate: + 'cluster-1-template': + Cluster: 'cluster-1' + ListenPort: 8001 + +appDeployments: + Application: + myapp: + SourcePath: 'wlsdeploy/applications/myapp-v2' + ModuleType: ear + Target: 'cluster-1' diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/create-configmap.sh b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/create-configmap.sh new file mode 100755 index 00000000000..ed14a9f35a4 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/create-configmap.sh @@ -0,0 +1,120 @@ +# !/bin/sh +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +function usage() { + + cat << EOF + + This is a helper script for creating and labeling a Kubernetes configmap. + The configmap is labeled with the specified domain-uid. + + Usage: + + $(basename $0) -c configmapname \\ + [-n mynamespace] \\ + [-d mydomainuid] \\ + [-f filename_or_dir] [-f filename_or_dir] ... + + -d : Defaults to 'sample-domain1'. + + -n : Defaults to 'sample-domain1-ns' otherwise. + + -c : Name of configmap. Required. + + -f : File or directory location. Can be specified + more than once. Key will be the file-name(s), + value will be file contents. Required. + + -dry kubectl : Show the kubectl commands (prefixed with 'dryun:') + but do not perform them. + + -dry yaml : Show the yaml (prefixed with 'dryun:') + but do not execute it. + +EOF +} + +set -e +set -o pipefail + +DOMAIN_UID="sample-domain1" +DOMAIN_NAMESPACE="sample-domain1-ns" +CONFIGMAP_NAME="" +FILENAMES="" +DRY_RUN="" + +while [ ! "$1" = "" ]; do + if [ ! "$1" = "-?" ] && [ "$2" = "" ]; then + echo "Syntax Error. Pass '-?' for help." + exit 1 + fi + case "$1" in + -c) CONFIGMAP_NAME="${2}" ;; + -n) DOMAIN_NAMESPACE="${2}" ;; + -d) DOMAIN_UID="${2}" ;; + -f) FILENAMES="${FILENAMES}--from-file=${2} " ;; + -dry) DRY_RUN="${2}" + case "$DRY_RUN" in + kubectl|yaml) ;; + *) echo "Error: Syntax Error. Pass '-?' for usage." + exit 1 + ;; + esac + ;; + -?) usage ; exit 1 ;; + *) echo "Syntax Error. Pass '-?' for help." ; exit 1 ;; + esac + shift + shift +done + +if [ -z "$CONFIGMAP_NAME" ]; then + echo "Error: Missing '-c' argument. Pass '-?' for help." + exit 1 +fi + +if [ -z "$FILENAMES" ]; then + echo "Error: Missing '-f' argument. Pass '-?' for help." + exit 1 +fi + +set -eu + +if [ "$DRY_RUN" = "kubectl" ]; then + +cat << EOF +dryrun:kubectl -n $DOMAIN_NAMESPACE delete configmap $CONFIGMAP_NAME --ignore-not-found +dryrun:kubectl -n $DOMAIN_NAMESPACE create configmap $CONFIGMAP_NAME $FILENAMES +dryrun:kubectl -n $DOMAIN_NAMESPACE label configmap $CONFIGMAP_NAME weblogic.domainUID=$DOMAIN_UID +EOF + +elif [ "$DRY_RUN" = "yaml" ]; then + + echo "dryrun:---" + echo "dryrun:" + + # don't change indent of the sed append commands - the spaces are significant + # (we use an ancient form of sed append to stay compatible with old bash on mac) + kubectl -n $DOMAIN_NAMESPACE \ + create configmap $CONFIGMAP_NAME $FILENAMES \ + --dry-run -o yaml \ + \ + | sed -e '/ name:/a\ + labels:' \ + | sed -e '/labels:/a\ + weblogic.domainUID:' \ + | sed "s/domainUID:/domainUID: $DOMAIN_UID/" \ + | grep -v creationTimestamp \ + | sed "s/^/dryrun:/" + +else + + set -x + + kubectl -n $DOMAIN_NAMESPACE delete configmap $CONFIGMAP_NAME --ignore-not-found + kubectl -n $DOMAIN_NAMESPACE create configmap $CONFIGMAP_NAME $FILENAMES + kubectl -n $DOMAIN_NAMESPACE label configmap $CONFIGMAP_NAME weblogic.domainUID=$DOMAIN_UID + +fi + diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/create-secret.sh b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/create-secret.sh new file mode 100755 index 00000000000..188ad0cd091 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/create-secret.sh @@ -0,0 +1,138 @@ +# !/bin/sh +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +function usage() { + + cat << EOF + + This is a helper script for creating and labeling a Kubernetes secret. + The secret is labeled with the specified domain-uid. + + Usage: + + $(basename $0) [-n mynamespace] [-d mydomainuid] \\ + -s mysecretname [-l key1=val1] [-l key2=val2] [-f key=fileloc ]... + + -d : Defaults to 'sample-domain1' otherwise. + + -n : Defaults to 'sample-domain1-ns' otherwise. + + -s : Name of secret. Required. + + -l : Secret 'literal' key/value pair, for example + '-l password=abc123'. Can be specified more than once. + + -f : Secret 'file-name' key/file pair, for example + '-l walletFile=./ewallet.p12'. + Can be specified more than once. + + -dry kubectl : Show the kubectl commands (prefixed with 'dryun:') + but do not perform them. + + -dry yaml : Show the yaml (prefixed with 'dryun:') but do not + execute it. + + -? : This help. + + Note: Spaces are not supported in the '-f' or '-l' parameters. + +EOF +} + +set -e +set -o pipefail + +DOMAIN_UID="sample-domain1" +NAMESPACE="sample-domain1-ns" +SECRET_NAME="" +LITERALS="" +FILENAMES="" +DRY_RUN="false" + +while [ ! "${1:-}" = "" ]; do + if [ ! "$1" = "-?" ] && [ "${2:-}" = "" ]; then + echo "Syntax Error. Pass '-?' for usage." + exit 1 + fi + case "$1" in + -s) SECRET_NAME="${2}" ;; + -n) NAMESPACE="${2}" ;; + -d) DOMAIN_UID="${2}" ;; + -l) LITERALS="${LITERALS} --from-literal=${2}" ;; + -f) FILENAMES="${FILENAMES} --from-file=${2}" ;; + -dry) DRY_RUN="${2}" + case "$DRY_RUN" in + kubectl|yaml) ;; + *) echo "Error: Syntax Error. Pass '-?' for usage." + exit 1 + ;; + esac + ;; + -?) usage ; exit 1 ;; + *) echo "Syntax Error. Pass '-?' for usage." ; exit 1 ;; + esac + shift + shift +done + +if [ -z "$SECRET_NAME" ]; then + echo "Error: Syntax Error. Must specify '-s'. Pass '-?' for usage." + exit 1 +fi + +if [ -z "${LITERALS}${FILENAMES}" ]; then + echo "Error: Syntax Error. Must specify at least one '-l' or '-f'. Pass '-?' for usage." + exit +fi + +set -eu + +if [ "$DRY_RUN" = "kubectl" ]; then + +cat << EOF +dryrun: +dryrun:echo "@@ Info: Setting up secret '$SECRET_NAME'." +dryrun: +dryrun:kubectl -n $NAMESPACE delete secret \\ +dryrun: $SECRET_NAME \\ +dryrun: --ignore-not-found +dryrun:kubectl -n $NAMESPACE create secret generic \\ +dryrun: $SECRET_NAME \\ +dryrun: $LITERALS $FILENAMES +dryrun:kubectl -n $NAMESPACE label secret \\ +dryrun: $SECRET_NAME \\ +dryrun: weblogic.domainUID=$DOMAIN_UID +dryrun: +EOF + +elif [ "$DRY_RUN" = "yaml" ]; then + + echo "dryrun:---" + echo "dryrun:" + + # don't change indent of the sed '/a' commands - the spaces are significant + # (we use an old form of sed append to stay compatible with old bash on mac) + + kubectl -n $NAMESPACE \ + \ + create secret generic \ + $SECRET_NAME $LITERALS $FILENAMES \ + --dry-run -o yaml \ + \ + | sed -e '/ name:/a\ + labels:' \ + | sed -e '/labels:/a\ + weblogic.domainUID:' \ + | sed "s/domainUID:/domainUID: $DOMAIN_UID/" \ + | grep -v creationTimestamp \ + | sed "s/^/dryrun:/" + +else + + kubectl -n $NAMESPACE delete secret $SECRET_NAME --ignore-not-found + kubectl -n $NAMESPACE create secret generic $SECRET_NAME $LITERALS $FILENAMES + kubectl -n $NAMESPACE label secret $SECRET_NAME weblogic.domainUID=$DOMAIN_UID + +fi diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/opss-wallet.sh b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/opss-wallet.sh new file mode 100755 index 00000000000..a16d8f70f2f --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/opss-wallet.sh @@ -0,0 +1,153 @@ +#!/bin/bash +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# +# This is a helper script for JRF type domains that can save an OPSS key +# wallet from a running domain's introspector configmap to a file, and/or +# restore an OPSS key wallet file to a Kubernetes secret for use by a +# domain that you're about to run. +# +# For command line details, pass '-?' or see 'usage_exit()' below. +# + +set -e +set -o pipefail + +usage_exit() { +cat << EOF + + Usage: + + $(basename $0) -s [-d domain-uid] [-n namespace] \\ + [-wf wallet-file-name] + + $(basename $0) -r [-d domain-uid] [-n namespace] \\ + [-wf wallet-file-name] [-ws wallet-file-secret] + + $(basename $0) -r -s [-d domain-uid] [-n namespace] \\ + [-wf wallet-file-name] [-ws wallet-file-secret] + + Save an OPSS key wallet from a running JRF domain's introspector + configmap to a file, and/or restore an OPSS key wallet file + to a Kubernetes secret for use by a domain that you're about to run. + + Parameters: + + -d Domain UID. Default 'sample-domain1'. + + -n Kubernetes namespace. Default 'sample-domain1-ns'. + + -s Save an OPSS wallet file from an introspector + configmap to a file. (See also '-wf'.) + Default is 'DOMAIN_UID-opss-walletfile-secret'. + + -r Restore an OPSS wallet file to a Kubernetes secret. + (See also '-wf' and '-ws'). + + -wf Name of OPSS wallet file on local file system. + Default is './ewallet.p12'. + + -ws Name of Kubernetes secret to create from the + wallet file. This must match the + 'configuration.opss.walletFileSecret' + configured in your domain resource. + Ignored if '-r' not specified. + Default is 'DOMAIN_UID-opss-walletfile-secret'. + + -? Output this help message. + + Examples: + + Save an OPSS key wallet from a running domain to file './ewallet.p12': + $(basename $0) -s + + Restore the OPSS key wallet from file './ewallet.p12' to secret + 'sample-domain1-opss-walletfile-secret' for use by a domain + you're about to run: + $(basename $0) -r + +EOF + + exit 0 +} + +SCRIPTDIR="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" +echo "@@ Info: Running '$(basename "$0")'." + +DOMAIN_UID="sample-domain1" +DOMAIN_NAMESPACE="sample-domain1-ns" +WALLET_FILE="ewallet.p12" +WALLET_SECRET="" + +syntax_error_exit() { + echo "@@ Syntax error: Use '-?' for usage." + exit 1 +} + +SAVE_WALLET=0 +RESTORE_WALLET=0 + +while [ ! "$1" = "" ]; do + case "$1" in + -n) [ -z "$2" ] && syntax_error_exit + DOMAIN_NAMESPACE="${2}" + shift + ;; + -d) [ -z "$2" ] && syntax_error_exit + DOMAIN_UID="${2}" + shift + ;; + -s) SAVE_WALLET=1 + ;; + -r) RESTORE_WALLET=1 + ;; + -ws) [ -z "$2" ] && syntax_error_exit + WALLET_SECRET="${2}" + shift + ;; + -wf) [ -z "$2" ] && syntax_error_exit + WALLET_FILE="${2}" + shift + ;; + -?) usage_exit + ;; + *) syntax_error_exit + ;; + esac + shift +done + +[ ${SAVE_WALLET} -eq 0 ] && [ ${RESTORE_WALLET} -eq 0 ] && syntax_error_exit + +WALLET_SECRET=${WALLET_SECRET:-$DOMAIN_UID-opss-walletfile-secret} + +set -eu + +if [ ${SAVE_WALLET} -eq 1 ] ; then + echo "@@ Info: Saving wallet from from configmap '${DOMAIN_UID}-weblogic-domain-introspect-cm' in namespace '${DOMAIN_NAMESPACE}' to file '${WALLET_FILE}'." + kubectl -n ${DOMAIN_NAMESPACE} \ + get configmap ${DOMAIN_UID}-weblogic-domain-introspect-cm \ + -o jsonpath='{.data.ewallet\.p12}' \ + > ${WALLET_FILE} +fi + +if [ ! -f "$WALLET_FILE" ]; then + echo "@@ Error: Wallet file '$WALLET_FILE' not found." + exit 1 +fi + +FILESIZE=$(du -k "$WALLET_FILE" | cut -f1) +if [ $FILESIZE = 0 ]; then + echo "@@ Error: Wallet file '$WALLET_FILE' is empty. Is this a JRF domain? The wallet file will be empty for a non-RCU/non-JRF domain." + exit 1 +fi + +if [ ${RESTORE_WALLET} -eq 1 ] ; then + echo "@@ Info: Creating secret '${WALLET_SECRET}' in namespace '${DOMAIN_NAMESPACE}' for wallet file '${WALLET_FILE}', domain uid '${DOMAIN_UID}'." + $SCRIPTDIR/create-secret.sh \ + -n ${DOMAIN_NAMESPACE} \ + -d ${DOMAIN_UID} \ + -s ${WALLET_SECRET} \ + -f walletFile=${WALLET_FILE} +fi diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/patch-restart-version.sh b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/patch-restart-version.sh new file mode 100755 index 00000000000..e0bfa054860 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/patch-restart-version.sh @@ -0,0 +1,83 @@ +# !/bin/sh +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +function usage() { + + cat << EOF + + This is a helper script for changing the 'spec.restartVersion' field + of a deployed domain. This change will cause the operator to initiate + a rolling restart of the resource's WebLogic pods if the pods are + already running. + + Usage: + + $(basename $0) [-n mynamespace] [-d mydomainuid] + + -d : Default is 'sample-domain1'. + + -n : Default is 'sample-domain1-ns'. + + -? : This help. + +EOF +} + +set -e + +DOMAIN_UID="sample-domain1" +DOMAIN_NAMESPACE="sample-domain1-ns" + +while [ ! "$1" = "" ]; do + if [ ! "$1" = "-?" ] && [ "$2" = "" ]; then + echo "Syntax Error. Pass '-?' for usage." + exit 1 + fi + case "$1" in + -n) DOMAIN_NAMESPACE="${2}" + ;; + -d) DOMAIN_UID="${2}" + ;; + -?) usage + exit 1 + ;; + *) echo "Syntax Error. Pass '-?' for usage." + exit 1 + ;; + esac + shift + shift +done + +set -eu +set -o pipefail + +currentRV=`kubectl -n ${DOMAIN_NAMESPACE} get domain ${DOMAIN_UID} -o=jsonpath='{.spec.restartVersion}'` + +nextRV=$((currentRV + 1)) + +echo "@@ Info: Patching domain '${DOMAIN_UID}' in namespace '${DOMAIN_NAMESPACE}' from restartVersion='${currentRV}' to restartVersion='${nextRV}'." + +kubectl -n ${DOMAIN_NAMESPACE} patch domain ${DOMAIN_UID} --type='json' \ + -p='[{"op": "replace", "path": "/spec/restartVersion", "value": "'${nextRV}'" }]' + +cat << EOF +@@ +@@ Info: Domain '${DOMAIN_UID}' in namespace '${DOMAIN_NAMESPACE}' successfully patched with restartVersion '${nextRV}'!" + + To wait until pods reach the new restart version and/or to get their status: + + kubectl get pods -n ${DOMAIN_NAMESPACE} --watch + # (ctrl-c once all pods are running and ready) + + -or- + + utils/wl-pod-wait.sh -n $DOMAIN_NAMESPACE -d $DOMAIN_UID -p 3 + + Expect the operator to restart the domain's pods until all of them + have label 'weblogic.domainRestartVersion="$nextRV"." + +@@ Done. +EOF diff --git a/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/wl-pod-wait.sh b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/wl-pod-wait.sh new file mode 100755 index 00000000000..6d255f6bec3 --- /dev/null +++ b/kubernetes/samples/scripts/create-weblogic-domain/model-in-image/utils/wl-pod-wait.sh @@ -0,0 +1,374 @@ +#!/bin/bash +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# +# This is a utility script that waits until a domain's pods have all exited, +# or waits until a domain's pods have all reached the ready state plus have +# have the same domain restart version and image as the pod's domain resource. +# +# See 'usage()' below for details. +# + +set -eu +set -o pipefail + +timeout_secs_def=1000 + +function usage() { + + cat << EOF + + Usage: + + $(basename $0) [-n mynamespace] [-d mydomainuid] \\ + [-p expected_pod_count] \\ + [-t timeout_secs] \\ + [-q] + + Exits non-zero if 'timeout_secs' is reached before 'pod_count' is reached. + + Parameters: + + -d : Defaults to 'sample-domain1'. + + -n : Defaults to 'sample-domain1-ns'. + + pod_count > 0 : Wait until exactly 'pod_count' WebLogic Server pods for + a domain all (a) are ready, (b) have the same + 'domainRestartVersion' label value as the + current domain resource's 'spec.restartVersion, and + (c) have the same image as the current domain + resource's image. + + pod_count = 0 : Wait until there are no running WebLogic Server pods + for a domain. The default. + + -t : Timeout in seconds. Defaults to '$timeout_secs_def'. + + -q : Quiet mode. Show only a count of wl pods that + have reached the desired criteria. + + -? : This help. + +EOF +} + +DOMAIN_UID="sample-domain1" +DOMAIN_NAMESPACE="sample-domain1-ns" + +expected=0 + +timeout_secs=$timeout_secs_def + +syntax_error=false +verbose=true +report_interval=120 + +while [ ! "${1:-}" = "" ]; do + if [ ! "$1" = "-?" ] && [ ! "$1" = "-q" ] && [ "${2:-}" = "" ]; then + syntax_error=true + break + fi + case "$1" in + -n) DOMAIN_NAMESPACE="${2}" + ;; + -d) DOMAIN_UID="${2}" + ;; + -t) timeout_secs="$2" + case "$2" in + ''|*[!0-9]*) syntax_error=true ;; + esac + ;; + -p) expected="$2" + case "$2" in + ''|*[!0-9]*) syntax_error=true ;; + esac + ;; + -q) verbose=false + report_interval=30 + shift + continue + ;; + -?) usage + exit 0 + ;; + *) syntax_error=true + break + ;; + esac + shift + shift +done + +if [ "$syntax_error" = "true" ]; then + echo "@@ Error: Syntax error when calling $(basename $0). Pass '-?' for usage." + exit 1 +fi + +function timestamp() { + date --utc '+%Y-%m-%dT%H:%M:%S' +} + +function tempfile() { + mktemp /tmp/$(basename "$0").$PPID.$(timestamp).XXXXXX +} + + +# prints a formatted table from the data in file $1, this assumes: +# - delimiter is 'space' +# - all rows have same number of columns +# - first row is column headers +function print_table() { + file=$1 + + rm -f $tmpfiletab + + # first, get the column widths and number of columns + # we don't use arrays since this needs to work in Mac's ancient bash + local coltot=0 + cat $file | while read line; do + local colcur=0 + for token in $line; do + colcur=$((colcur + 1)) + curvar=colwidth$colcur + eval "local $curvar=\$((${#token} > ${!curvar:-0} ? ${#token} : ${!curvar:-0}))" + echo "local $curvar=${!curvar}" >> $tmpfiletab + done + echo "local coltot=$colcur" >> $tmpfiletab + done + + source $tmpfiletab + + # now build the printfexp and separator + local colcur=1 + local printfexp="" + local separator="" + while [ $colcur -le $coltot ]; do + local curvar=colwidth$colcur + local width=$(( ${!curvar} )) + + printfexp="${printfexp}%-$((width))s " + + local pos=0 + while [ $pos -lt $width ]; do + separator="$separator-" + pos=$((pos + 1)) + done + separator="$separator " + + colcur=$((colcur+1)) + done + printfexp="${printfexp}\n" + + # now print the table + local row=1 + cat $file | while read line; do + printf "$printfexp" $line + if [ $row -eq 1 ]; then + printf "$printfexp" $separator + fi + row=$((row + 1)) + done +} + +tmpfileorig=$(tempfile) +tmpfilecur=$(tempfile) +tmpfiletmp=$(tempfile) +tmpfiletab=$(tempfile) + +trap "rm -f $tmpfileorig $tmpfilecur $tmpfiletmp $tmpfiletab" EXIT + +cur_pods=0 +reported=0 +last_pod_count_secs=$SECONDS +origRV="--not-known--" +origImage="--not-known--" + +# col_headers must line up with the jpath +col_headers="NAME VERSION IMAGE READY PHASE" + +# be careful! if changing jpath, then it must +# correspond with the regex below and col_headers above + +jpath='' +jpath+='{range .items[*]}' + jpath+='{" name="}' + jpath+='{";"}{.metadata.name}{";"}' + jpath+='{" domainRestartVersion="}' + jpath+='{";"}{.metadata.labels.weblogic\.domainRestartVersion}{";"}' + jpath+='{" image="}' + jpath+='{";"}{.status.containerStatuses[?(@.name=="weblogic-server")].image}{";"}' + jpath+='{" ready="}' + jpath+='{";"}{.status.containerStatuses[?(@.name=="weblogic-server")].ready}{";"}' + jpath+='{" phase="}' + jpath+='{";"}{.status.phase}{";"}' + jpath+='{"\n"}' +jpath+='{end}' + +# Loop until we reach the desired pod count for pods at the desired restart version, or +# until we reach the timeout. + +while [ 1 -eq 1 ]; do + + # + # Get the current domain resource's spec.restartVersion. If this fails, then + # assume the domain resource isn't deployed and that the restartVersion is "". + # + + set +e + currentRV=$(kubectl -n ${DOMAIN_NAMESPACE} get domain ${DOMAIN_UID} -o=jsonpath='{.spec.restartVersion}' 2>&1) + if [ $? -ne 0 ]; then + if [ $expected -ne 0 ]; then + echo "@@ Error: Could not obtain 'spec.restartVersion' from '${DOMAIN_UID}' in namespace '${DOMAIN_NAMESPACE}'. Is your domain resource deployed?" + exit 1 + else + currentRV='' + fi + fi + + currentImage=$(kubectl -n ${DOMAIN_NAMESPACE} get domain ${DOMAIN_UID} -o=jsonpath='{.spec.image}' 2>&1) + if [ $? -ne 0 ]; then + if [ $expected -ne 0 ]; then + echo "@@ Error: Could not obtain 'spec.image' from '${DOMAIN_UID}' in namespace '${DOMAIN_NAMESPACE}'. Is your domain resource deployed?" + exit 1 + else + currentImage='' + fi + fi + set -e + + # + # Force new reporting for the rare case where domain resource RV or + # image changed since we last reported. + # + + if [ ! "$origRV" = "$currentRV" ] || [ ! "$origImage" = "$currentImage" ]; then + [ "$reported" = "1" ] && echo + reported=0 + origRV="$currentRV" + origImage="$currentImage" + fi + + # + # If 'expected' = 0, get the current number of pods regardless of their + # restart version, image, or ready state. + # + # If "expected != 0" get the number of ready pods with the current domain + # resource restart version and image. + # + # (Note that grep returns non-zero if it doesn't find anything (sigh), + # so we disable error checking and cross-fingers...) + # + + if [ "$expected" = "0" ]; then + + cur_pods=$( kubectl -n ${DOMAIN_NAMESPACE} get pods \ + -l weblogic.serverName,weblogic.domainUID="${DOMAIN_UID}" \ + -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' \ + | wc -l ) + + lead_string="Waiting up to $timeout_secs seconds for there to be no (0) WebLogic Server pods that match the following criteria:" + criteria="namespace='$DOMAIN_NAMESPACE' domainUID='$DOMAIN_UID'" + + else + + regex="domainRestartVersion=;$currentRV;" + regex+=" image=;$currentImage;" + regex+=" ready=;true;" + + set +e # disable error checks as grep returns non-zero when it finds nothing (sigh) + cur_pods=$( kubectl -n ${DOMAIN_NAMESPACE} get pods \ + -l weblogic.serverName,weblogic.domainUID="${DOMAIN_UID}" \ + -o=jsonpath="$jpath" \ + | grep "$regex" | wc -l ) + set -e + + lead_string="Waiting up to $timeout_secs seconds for exactly '$expected' WebLogic Server pods to reach the following criteria:" + criteria="ready='true' image='$currentImage' domainRestartVersion='$currentRV' namespace='$DOMAIN_NAMESPACE' domainUID='$DOMAIN_UID'" + + fi + + # + # Report the current state to stdout. Exit 0 if we've reached our + # goal, exit non-zero if we've reached our time-out. + # + + + if [ "$verbose" = "false" ]; then + if [ $reported -eq 0 ]; then + echo "@@ [$(timestamp)][seconds=$SECONDS] Info: $lead_string" + for criterion in $criteria; do + echo "@@ [$(timestamp)][seconds=$SECONDS] Info: $criterion" + done + echo -n "@@ [$(timestamp)][seconds=$SECONDS] Info: Current pods that match the above criteria =" + echo -n " $cur_pods" + reported=1 + last_pod_count_secs=$SECONDS + + elif [ $((SECONDS - last_pod_count_secs)) -gt $report_interval ] \ + || [ $cur_pods -eq $expected ]; then + echo -n " $cur_pods" + last_pod_count_secs=$SECONDS + + fi + else + + kubectl -n ${DOMAIN_NAMESPACE} get pods \ + -l weblogic.domainUID="${DOMAIN_UID}" \ + -o=jsonpath="$jpath" > $tmpfilecur + + set +e + diff -q $tmpfilecur $tmpfileorig 2>&1 > /dev/null + diff_res=$? + set -e + if [ ! $diff_res -eq 0 ] \ + || [ $((SECONDS - last_pod_count_secs)) -gt $report_interval ] \ + || [ $cur_pods -eq $expected ]; then + + if [ $reported -eq 0 ]; then + echo + echo "@@ [$(timestamp)][seconds=$SECONDS] Info: $lead_string" + for criterion in $criteria; do + echo "@@ [$(timestamp)][seconds=$SECONDS] Info: $criterion" + done + echo + reported=1 + fi + + echo "@@ [$(timestamp)][seconds=$SECONDS] Info: '$cur_pods' WebLogic Server pods currently match all criteria, expecting '$expected'." + echo "@@ [$(timestamp)][seconds=$SECONDS] Info: Introspector and WebLogic Server pods with same namespace and domain-uid:" + echo + + # print results as a table + # - first strip out the var= and replace with "val". + # - note that the quotes are necessary so that 'print_table' + # doesn't get confused by col entries that are missing values + echo $col_headers > $tmpfiletmp + cat $tmpfilecur | sed "s|[^ ]*=;\([^;]*\);|'\1'|g" >> $tmpfiletmp + print_table $tmpfiletmp + echo + + cp $tmpfilecur $tmpfileorig + last_pod_count_secs=$SECONDS + fi + fi + + if [ $cur_pods -eq $expected ]; then + if [ ! "$verbose" = "true" ]; then + echo ". " + else + echo + fi + echo "@@ [$(timestamp)][seconds=$SECONDS] Info: Success!" + exit 0 + fi + + if [ $SECONDS -ge $timeout_secs ]; then + echo + echo "@@ [$(timestamp)][seconds=$SECONDS] Error: Timeout after waiting more than $timeout_secs seconds." + exit 1 + fi + + sleep 1 +done diff --git a/kubernetes/samples/scripts/delete-domain/delete-weblogic-domain-resources.sh b/kubernetes/samples/scripts/delete-domain/delete-weblogic-domain-resources.sh index d5f84042011..afe0c6631c9 100755 --- a/kubernetes/samples/scripts/delete-domain/delete-weblogic-domain-resources.sh +++ b/kubernetes/samples/scripts/delete-domain/delete-weblogic-domain-resources.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright (c) 2018, 2019, Oracle Corporation and/or its affiliates. All rights reserved. +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # # Description: diff --git a/kubernetes/samples/scripts/elasticsearch-and-kibana/elasticsearch_and_kibana.yaml b/kubernetes/samples/scripts/elasticsearch-and-kibana/elasticsearch_and_kibana.yaml index 5288bcec233..a5909ed8241 100644 --- a/kubernetes/samples/scripts/elasticsearch-and-kibana/elasticsearch_and_kibana.yaml +++ b/kubernetes/samples/scripts/elasticsearch-and-kibana/elasticsearch_and_kibana.yaml @@ -24,7 +24,7 @@ # kubectl delete -f kubernetes/samples/scripts/elasticsearch_and_kibana.yaml --- -apiVersion: apps/v1beta1 +apiVersion: apps/v1 kind: Deployment metadata: namespace: "default" @@ -78,7 +78,7 @@ spec: app: "elasticsearch" --- -apiVersion: "apps/v1beta1" +apiVersion: "apps/v1" kind: "Deployment" metadata: namespace: "default" diff --git a/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesDebugEnabledTestBase.java b/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesDebugEnabledTestBase.java index 30a601f0e99..81277eceb18 100644 --- a/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesDebugEnabledTestBase.java +++ b/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesDebugEnabledTestBase.java @@ -3,7 +3,7 @@ package oracle.kubernetes.operator.create; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Deployment; +import io.kubernetes.client.openapi.models.V1Deployment; import io.kubernetes.client.openapi.models.V1Service; import oracle.kubernetes.operator.utils.OperatorYamlFactory; @@ -30,8 +30,8 @@ protected V1Service getExpectedExternalWeblogicOperatorService() { } @Override - public ExtensionsV1beta1Deployment getExpectedWeblogicOperatorDeployment() { - ExtensionsV1beta1Deployment expected = super.getExpectedWeblogicOperatorDeployment(); + public V1Deployment getExpectedWeblogicOperatorDeployment() { + V1Deployment expected = super.getExpectedWeblogicOperatorDeployment(); expectRemoteDebug(expected.getSpec().getTemplate().getSpec().getContainers().get(0), "n"); return expected; } diff --git a/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesOptionalFeaturesDisabledTestBase.java b/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesOptionalFeaturesDisabledTestBase.java index 0c858a12e23..f629f496df5 100644 --- a/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesOptionalFeaturesDisabledTestBase.java +++ b/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesOptionalFeaturesDisabledTestBase.java @@ -3,7 +3,7 @@ package oracle.kubernetes.operator.create; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Deployment; +import io.kubernetes.client.openapi.models.V1Deployment; import io.kubernetes.client.openapi.models.V1Service; import oracle.kubernetes.operator.utils.OperatorYamlFactory; @@ -20,8 +20,8 @@ protected static void defineOperatorYamlFactory(OperatorYamlFactory factory) thr } @Override - protected ExtensionsV1beta1Deployment getExpectedWeblogicOperatorDeployment() { - ExtensionsV1beta1Deployment expected = super.getExpectedWeblogicOperatorDeployment(); + protected V1Deployment getExpectedWeblogicOperatorDeployment() { + V1Deployment expected = super.getExpectedWeblogicOperatorDeployment(); expectProbes(expected.getSpec().getTemplate().getSpec().getContainers().get(0)); return expected; } diff --git a/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesOptionalFeaturesEnabledTestBase.java b/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesOptionalFeaturesEnabledTestBase.java index 2ea160f209a..b4017bff54e 100644 --- a/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesOptionalFeaturesEnabledTestBase.java +++ b/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesOptionalFeaturesEnabledTestBase.java @@ -3,8 +3,8 @@ package oracle.kubernetes.operator.create; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Deployment; import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1Deployment; import io.kubernetes.client.openapi.models.V1Service; import oracle.kubernetes.operator.utils.OperatorYamlFactory; @@ -51,8 +51,8 @@ protected V1Service getExpectedExternalWeblogicOperatorService() { } @Override - public ExtensionsV1beta1Deployment getExpectedWeblogicOperatorDeployment() { - ExtensionsV1beta1Deployment expected = super.getExpectedWeblogicOperatorDeployment(); + public V1Deployment getExpectedWeblogicOperatorDeployment() { + V1Deployment expected = super.getExpectedWeblogicOperatorDeployment(); V1Container operatorContainer = expected.getSpec().getTemplate().getSpec().getContainers().get(0); operatorContainer.addVolumeMountsItem( diff --git a/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesTestBase.java b/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesTestBase.java index 8eb043c0780..a2c4fad1515 100644 --- a/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesTestBase.java +++ b/kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesTestBase.java @@ -4,11 +4,11 @@ package oracle.kubernetes.operator.create; import io.kubernetes.client.custom.Quantity; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Deployment; import io.kubernetes.client.openapi.models.V1ClusterRole; import io.kubernetes.client.openapi.models.V1ClusterRoleBinding; import io.kubernetes.client.openapi.models.V1ConfigMap; import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1Deployment; import io.kubernetes.client.openapi.models.V1LabelSelector; import io.kubernetes.client.openapi.models.V1Namespace; import io.kubernetes.client.openapi.models.V1Probe; @@ -30,8 +30,6 @@ import static java.util.Collections.singletonList; import static oracle.kubernetes.operator.LabelConstants.APP_LABEL; import static oracle.kubernetes.operator.LabelConstants.OPERATORNAME_LABEL; -import static oracle.kubernetes.operator.LabelConstants.RESOURCE_VERSION_LABEL; -import static oracle.kubernetes.operator.VersionConstants.OPERATOR_V2; import static oracle.kubernetes.operator.utils.KubernetesArtifactUtils.newClusterRole; import static oracle.kubernetes.operator.utils.KubernetesArtifactUtils.newClusterRoleBinding; import static oracle.kubernetes.operator.utils.KubernetesArtifactUtils.newClusterRoleRef; @@ -105,7 +103,6 @@ private V1ConfigMap getExpectedWeblogicOperatorConfigMap() { newObjectMeta() .name("weblogic-operator-cm") .namespace(getInputs().getNamespace()) - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .putDataItem("dedicated", getInputs().getDedicated()) .putDataItem("serviceaccount", getInputs().getServiceAccount()) @@ -137,7 +134,6 @@ private V1Secret getExpectedWeblogicOperatorSecrets() { newObjectMeta() .name("weblogic-operator-secrets") .namespace(getInputs().getNamespace()) - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .type("Opaque"); if (expectExternalCredentials()) { @@ -164,29 +160,26 @@ public void generatesCorrect_operatorDeployment() { yamlEqualTo(getExpectedWeblogicOperatorDeployment())); } - private ExtensionsV1beta1Deployment getActualWeblogicOperatorDeployment() { + private V1Deployment getActualWeblogicOperatorDeployment() { return getGeneratedFiles().getOperatorDeployment(); } - protected ExtensionsV1beta1Deployment getExpectedWeblogicOperatorDeployment() { + protected V1Deployment getExpectedWeblogicOperatorDeployment() { return newDeployment() .metadata( newObjectMeta() .name("weblogic-operator") .namespace(getInputs().getNamespace()) - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .spec( newDeploymentSpec() .selector(new V1LabelSelector() - .putMatchLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putMatchLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .replicas(1) .template( newPodTemplateSpec() .metadata( newObjectMeta() - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace()) .putLabelsItem(APP_LABEL, "weblogic-operator")) .spec( @@ -311,7 +304,6 @@ V1Service getExpectedExternalWeblogicOperatorService( newObjectMeta() .name("external-weblogic-operator-svc") .namespace(getInputs().getNamespace()) - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .spec(spec); } @@ -333,7 +325,6 @@ private V1Service getExpectedInternalWeblogicOperatorService() { newObjectMeta() .name("internal-weblogic-operator-svc") .namespace(getInputs().getNamespace()) - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .spec( newServiceSpec() @@ -357,7 +348,6 @@ private V1Namespace getExpectedWeblogicOperatorNamespace() { .metadata( newObjectMeta() .name(getInputs().getNamespace()) - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())); } @@ -378,7 +368,6 @@ private V1ServiceAccount getExpectedWeblogicOperatorServiceAccount() { newObjectMeta() .name(getInputs().getServiceAccount()) .namespace(getInputs().getNamespace()) - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())); } @@ -398,7 +387,6 @@ private V1ClusterRole getExpectedWeblogicOperatorClusterRole() { .metadata( newObjectMeta() .name(getInputs().getNamespace() + "-weblogic-operator-clusterrole-general") - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .addRulesItem( newPolicyRule() @@ -447,7 +435,6 @@ private V1ClusterRole getExpectedWeblogicOperatorClusterRoleNonResource() { .metadata( newObjectMeta() .name(getInputs().getNamespace() + "-weblogic-operator-clusterrole-nonresource") - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .addRulesItem(newPolicyRule().addNonResourceURLsItem("/version/*").addVerbsItem("get")); } @@ -463,7 +450,6 @@ public void generatesCorrect_operatorRoleBinding() { .name( getInputs().getNamespace() + "-weblogic-operator-clusterrolebinding-general") - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .addSubjectsItem( newSubject() @@ -495,7 +481,6 @@ private V1ClusterRoleBinding getExpectedOperatorRoleBindingNonResource() { .name( getInputs().getNamespace() + "-weblogic-operator-clusterrolebinding-nonresource") - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .addSubjectsItem( newSubject() @@ -522,7 +507,6 @@ private V1ClusterRoleBinding getExpectedOperatorRoleBindingDiscovery() { newObjectMeta() .name( getInputs().getNamespace() + "-weblogic-operator-clusterrolebinding-discovery") - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .addSubjectsItem( newSubject() @@ -550,7 +534,6 @@ private V1ClusterRoleBinding getExpectedOperatorRoleBindingAuthDelegator() { .name( getInputs().getNamespace() + "-weblogic-operator-clusterrolebinding-auth-delegator") - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .addSubjectsItem( newSubject() @@ -576,7 +559,6 @@ private V1ClusterRole getExpectedWeblogicOperatorNamespaceRole() { .metadata( newObjectMeta() .name(getInputs().getNamespace() + "-weblogic-operator-clusterrole-namespace") - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .addRulesItem( newPolicyRule() @@ -644,7 +626,6 @@ private V1RoleBinding getExpectedWeblogicOperatorRoleBinding(String namespace) { newObjectMeta() .name("weblogic-operator-rolebinding-namespace") .namespace(namespace) - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .addSubjectsItem( newSubject() @@ -664,7 +645,6 @@ private V1RoleBinding getExpectedWeblogicOperatorRoleBinding() { newObjectMeta() .name("weblogic-operator-rolebinding") .namespace(getInputs().getNamespace()) - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .addSubjectsItem( newSubject() @@ -691,7 +671,6 @@ private V1Role getExpectedWeblogicOperatorRole() { newObjectMeta() .name("weblogic-operator-role") .namespace(getInputs().getNamespace()) - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .addRulesItem( newPolicyRule() @@ -740,7 +719,6 @@ protected V1Service getExpectedExternalOperatorService( newObjectMeta() .name("external-weblogic-operator-svc") .namespace(inputs.getNamespace()) - .putLabelsItem(RESOURCE_VERSION_LABEL, OPERATOR_V2) .putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace())) .spec(spec); } diff --git a/kubernetes/src/test/java/oracle/kubernetes/operator/utils/GeneratedOperatorObjects.java b/kubernetes/src/test/java/oracle/kubernetes/operator/utils/GeneratedOperatorObjects.java index 8e89aee43ca..d238298bfc8 100644 --- a/kubernetes/src/test/java/oracle/kubernetes/operator/utils/GeneratedOperatorObjects.java +++ b/kubernetes/src/test/java/oracle/kubernetes/operator/utils/GeneratedOperatorObjects.java @@ -3,10 +3,10 @@ package oracle.kubernetes.operator.utils; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Deployment; import io.kubernetes.client.openapi.models.V1ClusterRole; import io.kubernetes.client.openapi.models.V1ClusterRoleBinding; import io.kubernetes.client.openapi.models.V1ConfigMap; +import io.kubernetes.client.openapi.models.V1Deployment; import io.kubernetes.client.openapi.models.V1Namespace; import io.kubernetes.client.openapi.models.V1Role; import io.kubernetes.client.openapi.models.V1RoleBinding; @@ -46,7 +46,7 @@ public V1Namespace getOperatorNamespace() { return securityYaml.getOperatorNamespace(); } - public ExtensionsV1beta1Deployment getOperatorDeployment() { + public V1Deployment getOperatorDeployment() { return operatorYaml.getOperatorDeployment(); } diff --git a/kubernetes/src/test/java/oracle/kubernetes/operator/utils/KubernetesArtifactUtils.java b/kubernetes/src/test/java/oracle/kubernetes/operator/utils/KubernetesArtifactUtils.java index 9dd670e31d9..f3bd18cfc69 100644 --- a/kubernetes/src/test/java/oracle/kubernetes/operator/utils/KubernetesArtifactUtils.java +++ b/kubernetes/src/test/java/oracle/kubernetes/operator/utils/KubernetesArtifactUtils.java @@ -16,14 +16,14 @@ import io.kubernetes.client.custom.IntOrString; import io.kubernetes.client.custom.Quantity; import io.kubernetes.client.openapi.models.ApiregistrationV1beta1ServiceReference; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Deployment; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1DeploymentSpec; import io.kubernetes.client.openapi.models.V1ClusterRole; import io.kubernetes.client.openapi.models.V1ClusterRoleBinding; import io.kubernetes.client.openapi.models.V1ConfigMap; import io.kubernetes.client.openapi.models.V1ConfigMapVolumeSource; import io.kubernetes.client.openapi.models.V1Container; import io.kubernetes.client.openapi.models.V1ContainerPort; +import io.kubernetes.client.openapi.models.V1Deployment; +import io.kubernetes.client.openapi.models.V1DeploymentSpec; import io.kubernetes.client.openapi.models.V1EmptyDirVolumeSource; import io.kubernetes.client.openapi.models.V1EnvVar; import io.kubernetes.client.openapi.models.V1EnvVarSource; @@ -124,8 +124,8 @@ public static Domain newDomain() { * Create deployment. * @return deployment */ - public static ExtensionsV1beta1Deployment newDeployment() { - return (new ExtensionsV1beta1Deployment()) + public static V1Deployment newDeployment() { + return (new V1Deployment()) .apiVersion(API_VERSION_APPS_V1) .kind(KIND_DEPLOYMENT); } @@ -248,8 +248,8 @@ public static V1ObjectMeta newObjectMeta() { return new V1ObjectMeta(); } - public static ExtensionsV1beta1DeploymentSpec newDeploymentSpec() { - return new ExtensionsV1beta1DeploymentSpec(); + public static V1DeploymentSpec newDeploymentSpec() { + return new V1DeploymentSpec(); } public static V1JobSpec newJobSpec() { diff --git a/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedApacheYaml.java b/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedApacheYaml.java index f0b3c75b4b6..a307182c512 100644 --- a/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedApacheYaml.java +++ b/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedApacheYaml.java @@ -5,7 +5,7 @@ import java.nio.file.Path; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Deployment; +import io.kubernetes.client.openapi.models.V1Deployment; import io.kubernetes.client.openapi.models.V1Service; import io.kubernetes.client.openapi.models.V1ServiceAccount; @@ -28,7 +28,7 @@ public V1ServiceAccount getApacheServiceAccount() { return getServiceAccounts().find(getApacheName()); } - public ExtensionsV1beta1Deployment getApacheDeployment() { + public V1Deployment getApacheDeployment() { return getDeployments().find(getApacheName()); } diff --git a/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedKubernetesYaml.java b/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedKubernetesYaml.java index c346b91988e..8b9a2d76cfc 100644 --- a/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedKubernetesYaml.java +++ b/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedKubernetesYaml.java @@ -8,11 +8,11 @@ import java.util.List; import java.util.Map; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Deployment; import io.kubernetes.client.openapi.models.NetworkingV1beta1Ingress; import io.kubernetes.client.openapi.models.V1ClusterRole; import io.kubernetes.client.openapi.models.V1ClusterRoleBinding; import io.kubernetes.client.openapi.models.V1ConfigMap; +import io.kubernetes.client.openapi.models.V1Deployment; import io.kubernetes.client.openapi.models.V1Job; import io.kubernetes.client.openapi.models.V1Namespace; import io.kubernetes.client.openapi.models.V1ObjectMeta; @@ -150,8 +150,8 @@ TypeHandler getClusterRoleBindings() { return (TypeHandler) getHandler(KIND_CLUSTER_ROLE_BINDING); } - TypeHandler getDeployments() { - return (TypeHandler) getHandler(KIND_DEPLOYMENT); + TypeHandler getDeployments() { + return (TypeHandler) getHandler(KIND_DEPLOYMENT); } TypeHandler getDomains() { @@ -384,13 +384,13 @@ protected V1ObjectMeta getMetadata(V1ClusterRoleBinding instance) { } } - private static class DeploymentHandler extends TypeHandler { + private static class DeploymentHandler extends TypeHandler { private DeploymentHandler() { - super(ExtensionsV1beta1Deployment.class); + super(V1Deployment.class); } @Override - protected V1ObjectMeta getMetadata(ExtensionsV1beta1Deployment instance) { + protected V1ObjectMeta getMetadata(V1Deployment instance) { return instance.getMetadata(); } } diff --git a/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedTraefikYaml.java b/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedTraefikYaml.java index 633aae7b1c8..6c4c16c96c4 100644 --- a/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedTraefikYaml.java +++ b/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedTraefikYaml.java @@ -5,8 +5,8 @@ import java.nio.file.Path; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Deployment; import io.kubernetes.client.openapi.models.V1ConfigMap; +import io.kubernetes.client.openapi.models.V1Deployment; import io.kubernetes.client.openapi.models.V1Service; import io.kubernetes.client.openapi.models.V1ServiceAccount; import oracle.kubernetes.operator.helpers.LegalNames; @@ -34,7 +34,7 @@ public V1ServiceAccount getTraefikServiceAccount() { return getServiceAccounts().find(getTraefikScope()); } - public ExtensionsV1beta1Deployment getTraefikDeployment() { + public V1Deployment getTraefikDeployment() { return getDeployments().find(getTraefikScope()); } diff --git a/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedVoyagerOperatorYaml.java b/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedVoyagerOperatorYaml.java index b54ad0440c4..95a4ffb492f 100644 --- a/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedVoyagerOperatorYaml.java +++ b/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedVoyagerOperatorYaml.java @@ -5,7 +5,7 @@ import java.nio.file.Path; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Deployment; +import io.kubernetes.client.openapi.models.V1Deployment; import io.kubernetes.client.openapi.models.V1Secret; import io.kubernetes.client.openapi.models.V1Service; import io.kubernetes.client.openapi.models.V1beta1APIService; @@ -25,7 +25,7 @@ public ParsedVoyagerOperatorYaml(YamlReader factory, DomainValues inputs) throws this.inputs = inputs; } - public ExtensionsV1beta1Deployment getVoyagerOperatorDeployment() { + public V1Deployment getVoyagerOperatorDeployment() { return getDeployments().find(getVoyagerOperatorName()); } diff --git a/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedWeblogicOperatorYaml.java b/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedWeblogicOperatorYaml.java index 891b46e2669..6506bc89f8c 100644 --- a/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedWeblogicOperatorYaml.java +++ b/kubernetes/src/test/java/oracle/kubernetes/operator/utils/ParsedWeblogicOperatorYaml.java @@ -5,8 +5,8 @@ import java.nio.file.Path; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Deployment; import io.kubernetes.client.openapi.models.V1ConfigMap; +import io.kubernetes.client.openapi.models.V1Deployment; import io.kubernetes.client.openapi.models.V1Secret; import io.kubernetes.client.openapi.models.V1Service; @@ -35,7 +35,7 @@ public V1Secret getOperatorSecrets() { return getSecrets().find("weblogic-operator-secrets"); } - public ExtensionsV1beta1Deployment getOperatorDeployment() { + public V1Deployment getOperatorDeployment() { return getDeployments().find("weblogic-operator"); } diff --git a/new-integration-tests/pom.xml b/new-integration-tests/pom.xml index 8dbceb9234f..f2d8fbd51d1 100644 --- a/new-integration-tests/pom.xml +++ b/new-integration-tests/pom.xml @@ -7,7 +7,7 @@ oracle.kubernetes operator-parent - 2.6.0 + 3.0.0 new-integration-tests @@ -18,8 +18,9 @@ false - latest latest + https://github.com/oracle/weblogic-deploy-tooling/releases/latest + https://github.com/oracle/weblogic-image-tool/releases/latest **/It* ${basedir}/../${aggregate.report.dir} @@ -134,7 +135,8 @@ <%1$tm-%1$td-%1$tY %1$tH:%1$tM:%1$tS> <%4$s> <%2$s> <%5$s%6$s>%n ${wdt.version} - ${wit.version} + ${wdt.download.url} + ${wit.download.url} false diff --git a/new-integration-tests/src/test/java/oracle/weblogic/domain/Configuration.java b/new-integration-tests/src/test/java/oracle/weblogic/domain/Configuration.java index 906be21e6c1..d71ee02550a 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/domain/Configuration.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/domain/Configuration.java @@ -3,6 +3,9 @@ package oracle.weblogic.domain; +import java.util.ArrayList; +import java.util.List; + import io.swagger.annotations.ApiModelProperty; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; @@ -10,9 +13,149 @@ public class Configuration { + @ApiModelProperty("Model in image model files and properties.") + private Model model; + + @ApiModelProperty("Configuration for OPSS security.") + private Opss opss; + + @ApiModelProperty( + "A list of names of the secrets for WebLogic configuration overrides or model. If this field is specified" + + " it overrides the value of spec.configOverrideSecrets.") + private List secrets; + + @ApiModelProperty( + "The name of the config map for WebLogic configuration overrides. If this field is specified" + + " it overrides the value of spec.configOverrides.") + private String overridesConfigMap; + + @ApiModelProperty( + "The introspector job timeout value in seconds. If this field is specified" + + " it overrides the Operator's config map data.introspectorJobActiveDeadlineSeconds value.") + private Long introspectorJobActiveDeadlineSeconds; + + @ApiModelProperty( + "Determines how updated configuration overrides are distributed to already running WebLogic servers " + + "following introspection when the domainHomeSourceType is PersistentVolume or Image. Configuration overrides " + + "are generated during introspection from secrets, the overrideConfigMap field, and WebLogic domain topology. " + + "Legal values are DYNAMIC (the default) and ON_RESTART. See also introspectVersion.") + private String overrideDistributionStrategy; + @ApiModelProperty("Istio service mesh integration") private Istio istio; + public Configuration model(Model model) { + this.model = model; + return this; + } + + public Model model() { + return model; + } + + public Model getModel() { + return model; + } + + public void setModel(Model model) { + this.model = model; + } + + public Configuration opss(Opss opss) { + this.opss = opss; + return this; + } + + public Opss opss() { + return this.opss; + } + + public Opss getOpss() { + return opss; + } + + public void setOpss(Opss opss) { + this.opss = opss; + } + + public Configuration secrets(List secrets) { + this.secrets = secrets; + return this; + } + + public List secrets() { + return secrets; + } + + public Configuration overrideDistributionStrategy(String overrideDistributionStrategy) { + this.overrideDistributionStrategy = overrideDistributionStrategy; + return this; + } + + public String getOverrideDistributionStrategy() { + return overrideDistributionStrategy; + } + + public void setOverrideDistributionStrategy(String overrideDistributionStrategy) { + this.overrideDistributionStrategy = overrideDistributionStrategy; + } + + /** + * Adds item to secrets list. + * @param secretsItem Secret + * @return this + */ + public Configuration addSecretsItem(String secretsItem) { + if (secrets == null) { + secrets = new ArrayList<>(); + } + secrets.add(secretsItem); + return this; + } + + public List getSecrets() { + return secrets; + } + + public void setSecrets(List secrets) { + this.secrets = secrets; + } + + public Configuration overridesConfigMap(String overridesConfigMap) { + this.overridesConfigMap = overridesConfigMap; + return this; + } + + public String overridesConfigMap() { + return this.overridesConfigMap; + } + + public String getOverridesConfigMap() { + return overridesConfigMap; + } + + public void setOverridesConfigMap(String overridesConfigMap) { + this.overridesConfigMap = overridesConfigMap; + } + + public Configuration introspectorJobActiveDeadlineSeconds( + Long introspectorJobActiveDeadlineSeconds) { + this.introspectorJobActiveDeadlineSeconds = introspectorJobActiveDeadlineSeconds; + return this; + } + + public Long introspectorJobActiveDeadlineSeconds() { + return this.introspectorJobActiveDeadlineSeconds; + } + + public Long getIntrospectorJobActiveDeadlineSeconds() { + return introspectorJobActiveDeadlineSeconds; + } + + public void setIntrospectorJobActiveDeadlineSeconds(Long introspectorJobActiveDeadlineSeconds) { + this.introspectorJobActiveDeadlineSeconds = introspectorJobActiveDeadlineSeconds; + } + public Configuration istio(Istio istio) { this.istio = istio; return this; @@ -34,6 +177,11 @@ public void setIstio(Istio istio) { public String toString() { ToStringBuilder builder = new ToStringBuilder(this) + .append("model", model) + .append("opss", opss) + .append("secrets", secrets) + .append("overridesConfigMap", overridesConfigMap) + .append("introspectorJobActiveDeadlineSeconds", introspectorJobActiveDeadlineSeconds) .append("istio", istio); return builder.toString(); @@ -43,6 +191,11 @@ public String toString() { public int hashCode() { HashCodeBuilder builder = new HashCodeBuilder() + .append(model) + .append(opss) + .append(secrets) + .append(overridesConfigMap) + .append(introspectorJobActiveDeadlineSeconds) .append(istio); return builder.toHashCode(); @@ -60,8 +213,13 @@ public boolean equals(Object other) { Configuration rhs = (Configuration) other; EqualsBuilder builder = new EqualsBuilder() + .append(model, rhs.model) + .append(opss, rhs.opss) + .append(secrets, rhs.secrets) + .append(overridesConfigMap, rhs.overridesConfigMap) + .append(introspectorJobActiveDeadlineSeconds, rhs.introspectorJobActiveDeadlineSeconds) .append(istio, rhs.istio); return builder.isEquals(); } -} \ No newline at end of file +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/domain/DomainSpec.java b/new-integration-tests/src/test/java/oracle/weblogic/domain/DomainSpec.java index ada48734380..3dea8f9d9e1 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/domain/DomainSpec.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/domain/DomainSpec.java @@ -28,8 +28,9 @@ public class DomainSpec { @ApiModelProperty( "The folder for the WebLogic Domain. Not required." - + " Defaults to /shared/domains/domains/ if domainHomeInImage is false." - + " Defaults to /u01/oracle/user_projects/domains/ if domainHomeInImage is true.") + + " Defaults to /shared/domains/domains/ if domainHomeSourceType is PersistentVolume." + + " Defaults to /u01/oracle/user_projects/domains/ if domainHomeSourceType is Image." + + " Defaults to /u01/domains/ if domainHomeSourceType is FromModel.") private String domainHome; @ApiModelProperty( @@ -50,7 +51,7 @@ public class DomainSpec { @ApiModelProperty( "Specified whether the log home folder is enabled. Not required. " - + "Defaults to true if domainHomeInImage is false; false, otherwise.") + + "Defaults to true if domainHomeSourceType is PersistentVolume; false, otherwise.") private Boolean logHomeEnabled; @ApiModelProperty( @@ -64,7 +65,7 @@ public class DomainSpec { private Boolean includeServerOutInPodLog; @ApiModelProperty( - "The WebLogic Docker image; required when domainHomeInImage is true; " + "The WebLogic Docker image; required when domainHomeSourceType is Image or FromModel; " + "otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4.") private String image; @@ -83,21 +84,42 @@ public class DomainSpec { allowableValues = "range[0,infinity]") private Integer replicas; + @Deprecated @ApiModelProperty( - "True indicates that the domain home file system is contained in the Docker image" + "Deprecated. Use domainHomeSourceType instead. Ignored if domainHomeSourceType is specified." + + " True indicates that the domain home file system is contained in the Docker image" + " specified by the image field. False indicates that the domain home file system is located" + " on a persistent volume.") private Boolean domainHomeInImage; - @ApiModelProperty("Properties affecting the WebLogic domain configuration.") + @ApiModelProperty( + "Domain home file system source type: Legal values: Image, PersistentVolume, FromModel." + + " Image indicates that the domain home file system is contained in the Docker image" + + " specified by the image field. PersistentVolume indicates that the domain home file system is located" + + " on a persistent volume. FromModel indicates that the domain home file system will be created" + + " and managed by the operator based on a WDT domain model." + + " If this field is specified it overrides the value of domainHomeInImage. If both fields are" + + " unspecified then domainHomeSourceType defaults to Image.") + private String domainHomeSourceType; + + @ApiModelProperty( + "If present, every time this value is updated, the operator will start introspect domain job") + private String introspectVersion; + + @ApiModelProperty("Models and overrides affecting the WebLogic domain configuration.") private Configuration configuration; + @Deprecated @ApiModelProperty( - "The name of the config map for optional WebLogic configuration overrides.") + "Deprecated. Use configuration.overridesConfigMap instead." + + " Ignored if configuration.overridesConfigMap is specified." + + " The name of the config map for optional WebLogic configuration overrides.") private String configOverrides; + @Deprecated @ApiModelProperty( - "A list of names of the secrets for optional WebLogic configuration overrides.") + "Deprecated. Use configuration.secrets instead. Ignored if configuration.secrets is specified." + + " A list of names of the secrets for optional WebLogic configuration overrides.") private List configOverrideSecrets = new ArrayList<>(); @ApiModelProperty("Configuration for the Administration Server.") @@ -109,6 +131,9 @@ public class DomainSpec { @ApiModelProperty("Configuration for the clusters.") private List clusters = new ArrayList<>(); + @ApiModelProperty("Experimental feature configurations.") + private Experimental experimental; + @ApiModelProperty("Configuration affecting server pods.") private ServerPod serverPod; @@ -360,6 +385,40 @@ public void setDomainHomeInImage(Boolean domainHomeInImage) { this.domainHomeInImage = domainHomeInImage; } + public DomainSpec domainHomeSourceType(String domainHomeSourceType) { + this.domainHomeSourceType = domainHomeSourceType; + return this; + } + + public String domainHomeSourceType() { + return domainHomeSourceType; + } + + public String getDomainHomeSourceType() { + return domainHomeSourceType; + } + + public void setDomainHomeSourceType(String domainHomeSourceType) { + this.domainHomeSourceType = domainHomeSourceType; + } + + public DomainSpec introspectVersion(String introspectVersion) { + this.introspectVersion = introspectVersion; + return this; + } + + public String introspectVersion() { + return introspectVersion; + } + + public String getIntrospectVersion() { + return introspectVersion; + } + + public void setIntrospectVersion(String introspectVersion) { + this.introspectVersion = introspectVersion; + } + public DomainSpec configuration(Configuration configuration) { this.configuration = configuration; return this; @@ -501,6 +560,23 @@ public void setClusters(List clusters) { this.clusters = clusters; } + public DomainSpec experimental(Experimental experimental) { + this.experimental = experimental; + return this; + } + + public Experimental experimental() { + return experimental; + } + + public Experimental getExperimental() { + return experimental; + } + + public void setExperimental(Experimental experimental) { + this.experimental = experimental; + } + public DomainSpec serverPod(ServerPod serverPod) { this.serverPod = serverPod; return this; @@ -586,12 +662,15 @@ public String toString() { .append("imagePullSecrets", imagePullSecrets) .append("replicas", replicas) .append("domainHomeInImage", domainHomeInImage) + .append("domainHomeSourceType", domainHomeSourceType) + .append("introspectVersion", introspectVersion) .append("configuration", configuration) .append("configOverrides", configOverrides) .append("configOverrideSecrets", configOverrideSecrets) .append("adminServer", adminServer) .append("managedServers", managedServers) .append("clusters", clusters) + .append("experimental", experimental) .append("serverStartState", serverStartState) .append("serverPod", serverPod) .append("serverService", serverService) @@ -617,12 +696,15 @@ public int hashCode() { .append(imagePullSecrets) .append(replicas) .append(domainHomeInImage) + .append(domainHomeSourceType) + .append(introspectVersion) .append(configuration) .append(configOverrides) .append(configOverrideSecrets) .append(adminServer) .append(managedServers) .append(clusters) + .append(experimental) .append(serverPod) .append(serverService) .append(serverStartState) @@ -656,12 +738,15 @@ public boolean equals(Object other) { .append(imagePullSecrets, rhs.imagePullSecrets) .append(replicas, rhs.replicas) .append(domainHomeInImage, rhs.domainHomeInImage) + .append(domainHomeSourceType, rhs.domainHomeSourceType) + .append(introspectVersion, rhs.introspectVersion) .append(configuration, rhs.configuration) .append(configOverrides, rhs.configOverrides) .append(configOverrideSecrets, rhs.configOverrideSecrets) .append(adminServer, rhs.adminServer) .append(managedServers, rhs.managedServers) .append(clusters, rhs.clusters) + .append(experimental, rhs.experimental) .append(serverPod, rhs.serverPod) .append(serverService, rhs.serverService) .append(serverStartState, rhs.serverStartState) diff --git a/new-integration-tests/src/test/java/oracle/weblogic/domain/Experimental.java b/new-integration-tests/src/test/java/oracle/weblogic/domain/Experimental.java new file mode 100644 index 00000000000..d4397cda9fc --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/domain/Experimental.java @@ -0,0 +1,61 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.domain; + +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; + +public class Experimental { + + @ApiModelProperty("Istio service mesh integration configuration.") + private Istio istio; + + public Experimental istio(Istio istio) { + this.istio = istio; + return this; + } + + public Istio istio() { + return this.istio; + } + + public Istio getIstio() { + return istio; + } + + public void setIstio(Istio istio) { + this.istio = istio; + } + + @Override + public String toString() { + ToStringBuilder builder = new ToStringBuilder(this).append("istio", istio); + + return builder.toString(); + } + + @Override + public int hashCode() { + HashCodeBuilder builder = new HashCodeBuilder().append(istio); + + return builder.toHashCode(); + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + + if (other == null || getClass() != other.getClass()) { + return false; + } + Experimental rhs = (Experimental) other; + EqualsBuilder builder = new EqualsBuilder().append(istio, rhs.istio); + + return builder.isEquals(); + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/domain/Istio.java b/new-integration-tests/src/test/java/oracle/weblogic/domain/Istio.java index 79f414c63de..d33ad5ccb7d 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/domain/Istio.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/domain/Istio.java @@ -63,7 +63,6 @@ public String toString() { @Override public int hashCode() { HashCodeBuilder builder = new HashCodeBuilder().append(enabled).append(readinessPort); - return builder.toHashCode(); } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/domain/Model.java b/new-integration-tests/src/test/java/oracle/weblogic/domain/Model.java new file mode 100644 index 00000000000..b7978bac278 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/domain/Model.java @@ -0,0 +1,113 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.domain; + +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; + +public class Model { + + @ApiModelProperty( + value = "WDT domain type: Legal values: WLS, RestrictedJRF, JRF. Defaults to WLS.", + allowableValues = "WLS, RestrictedJRF, JRF") + private String domainType; + + @ApiModelProperty("WDT config map name.") + private String configMap; + + @ApiModelProperty( + "Runtime encryption secret. Required when domainHomeSourceType is set to FromModel.") + private String runtimeEncryptionSecret; + + public Model domainType(String domainType) { + this.domainType = domainType; + return this; + } + + public String domainType() { + return domainType; + } + + public String getDomainType() { + return domainType; + } + + public void setDomainType(String domainType) { + this.domainType = domainType; + } + + public Model configMap(String configMap) { + this.configMap = configMap; + return this; + } + + public String configMap() { + return configMap; + } + + public String getConfigMap() { + return configMap; + } + + public void setConfigMap(String configMap) { + this.configMap = configMap; + } + + public Model runtimeEncryptionSecret(String runtimeEncryptionSecret) { + this.runtimeEncryptionSecret = runtimeEncryptionSecret; + return this; + } + + public String runtimeEncryptionSecret() { + return runtimeEncryptionSecret; + } + + public String getRuntimeEncryptionSecret() { + return runtimeEncryptionSecret; + } + + public void setRuntimeEncryptionSecret(String runtimeEncryptionSecret) { + this.runtimeEncryptionSecret = runtimeEncryptionSecret; + } + + @Override + public String toString() { + ToStringBuilder builder = + new ToStringBuilder(this) + .append("domainType", domainType) + .append("configMap", configMap) + .append("runtimeEncryptionSecret", runtimeEncryptionSecret); + + return builder.toString(); + } + + @Override + public int hashCode() { + HashCodeBuilder builder = + new HashCodeBuilder().append(domainType).append(configMap).append(runtimeEncryptionSecret); + + return builder.toHashCode(); + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + + if (other == null || getClass() != other.getClass()) { + return false; + } + Model rhs = (Model) other; + EqualsBuilder builder = + new EqualsBuilder() + .append(domainType, rhs.domainType) + .append(configMap, rhs.configMap) + .append(runtimeEncryptionSecret, rhs.runtimeEncryptionSecret); + + return builder.isEquals(); + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/domain/Opss.java b/new-integration-tests/src/test/java/oracle/weblogic/domain/Opss.java new file mode 100644 index 00000000000..de01abe235c --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/domain/Opss.java @@ -0,0 +1,88 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.domain; + +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; + +public class Opss { + + @ApiModelProperty("Secret containing the OPSS key wallet file.") + private String walletFileSecret; + + @ApiModelProperty("Secret containing OPSS key passphrase.") + private String walletPasswordSecret; + + public Opss walletFileSecret(String walletFileSecret) { + this.walletFileSecret = walletFileSecret; + return this; + } + + public String walletFileSecret() { + return this.walletFileSecret; + } + + public String getWalletFileSecret() { + return walletFileSecret; + } + + public void setWalletFileSecret(String walletFileSecret) { + this.walletFileSecret = walletFileSecret; + } + + public Opss walletPasswordSecret(String walletPasswordSecret) { + this.walletPasswordSecret = walletPasswordSecret; + return this; + } + + public String walletPasswordSecret() { + return this.walletPasswordSecret; + } + + public String getWalletPasswordSecret() { + return walletPasswordSecret; + } + + public void setWalletPasswordSecret(String walletPasswordSecret) { + this.walletPasswordSecret = walletPasswordSecret; + } + + @Override + public String toString() { + ToStringBuilder builder = + new ToStringBuilder(this) + .append("walletFileSecret", walletFileSecret) + .append("walletPasswordSecret", walletPasswordSecret); + + return builder.toString(); + } + + @Override + public int hashCode() { + HashCodeBuilder builder = + new HashCodeBuilder().append(walletFileSecret).append(walletPasswordSecret); + + return builder.toHashCode(); + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + + if (other == null || getClass() != other.getClass()) { + return false; + } + Opss rhs = (Opss) other; + EqualsBuilder builder = + new EqualsBuilder() + .append(walletFileSecret, rhs.walletFileSecret) + .append(walletPasswordSecret, rhs.walletPasswordSecret); + + return builder.isEquals(); + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItCoherenceTests.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItCoherenceTests.java new file mode 100644 index 00000000000..8afc97dc2f1 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItCoherenceTests.java @@ -0,0 +1,395 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.io.IOException; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1SecretReference; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.annotations.tags.MustNotRunInParallel; +import oracle.weblogic.kubernetes.annotations.tags.Slow; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.ExecResult; +import oracle.weblogic.kubernetes.utils.FileUtils; +import org.awaitility.core.ConditionFactory; +import org.joda.time.DateTime; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.APP_DIR; +import static oracle.weblogic.kubernetes.actions.TestActions.createDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.deleteDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.execCommand; +import static oracle.weblogic.kubernetes.actions.TestActions.getPodIP; +import static oracle.weblogic.kubernetes.actions.TestActions.patchDomainResourceWithNewRestartVersion; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.verifyRollingRestartOccurred; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createImageAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.dockerLoginAndPushImageToRegistry; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.getPodCreationTime; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +// Test to create a WebLogic domain with Coherence, build the Coherence proxy client program +// which load and verify the cache. +@DisplayName("Test to create a WebLogic domain with Coherence and verify the use of Coherence cache service") +@IntegrationTest +class ItCoherenceTests { + + // constants for Coherence + private static final String PROXY_CLIENT_APP_NAME = "coherence-proxy-client"; + private static final String PROXY_SERVER_APP_NAME = "coherence-proxy-server"; + private static final String APP_LOC_ON_HOST = APP_DIR + "/" + PROXY_CLIENT_APP_NAME; + private static final String APP_LOC_IN_POD = "/u01/oracle/apps/" + PROXY_CLIENT_APP_NAME; + private static final String PROXY_CLIENT_SCRIPT = "buildRunProxyClient.sh"; + private static final String OP_CACHE_LOAD = "load"; + private static final String OP_CACHE_VALIDATE = "validate"; + private static final String PROXY_PORT = "9000"; + + // constants for creating domain image using model in image + private static final String COHERENCE_MODEL_FILE = "coherence-wdt-config.yaml"; + private static final String COHERENCE_MODEL_PROP = "coherence-wdt-config.properties"; + private static final String COHERENCE_IMAGE_NAME = "coherence-image"; + + private static String domainUid = "coh-domain1"; + private static String clusterName = "cluster-1"; + private static String adminServerPodName = domainUid + "-admin-server"; + private static String managedServerPrefix = domainUid + "-managed-server"; + private static String containerName = "weblogic-server"; + private static int replicaCount = 2; + + private static String opNamespace = null; + private static String domainNamespace = null; + private static ConditionFactory withStandardRetryPolicy = null; + private static Map secretNameMap; + private static LoggingFacade logger = null; + + /** + * Install Operator. + * + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + * JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void init(@Namespaces(2) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + // get a new unique opNamespace + logger.info("Assigning a unique namespace for Operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + opNamespace = namespaces.get(0); + + // get a new unique domainNamespace + logger.info("Assigning a unique namespace for Domain"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domainNamespace = namespaces.get(1); + + // install and verify operator + installAndVerifyOperator(opNamespace, domainNamespace); + } + + // This method is needed in this test class, since the cleanup util + // won't cleanup the images. + @AfterAll + void tearDown() { + // Delete domain custom resource + logger.info("Delete domain custom resource in namespace {0}", domainNamespace); + assertDoesNotThrow(() -> deleteDomainCustomResource(domainUid, domainNamespace), + "deleteDomainCustomResource failed with ApiException"); + logger.info("Deleted Domain Custom Resource " + domainUid + " from " + domainNamespace); + } + + /** + * Create a WebLogic domain with a Coherence cluster and deploying it using WDT + * Test rolling restart of Coherence managed servers and verify + * that data are not lost during a domain restart. + */ + @Test + @DisplayName("Create domain with a Coherence cluster using WDT and test rolling restart") + @Slow + @MustNotRunInParallel + public void testCohernceServerRollingRestart() { + final String successMarker = "CACHE-SUCCESS"; + + // create a DomainHomeInImage image using WebLogic Image Tool + String domImage = createAndVerifyDomainImage(); + + // create and verify a WebLogic domain with a Coherence cluster + createAndVerifyDomain(domImage); + + // build the Coherence proxy client program in the server pods + // which load and verify the cache + copyCohProxyClientAppToPods(); + + // run the Coherence proxy client to load the cache + String serverName = managedServerPrefix + "1"; + final ExecResult execResult1 = assertDoesNotThrow( + () -> runCoherenceProxyClient(serverName, OP_CACHE_LOAD), + String.format("Failed to call Coherence proxy client in pod %s, namespace %s", + serverName, domainNamespace)); + + assertAll("Check that the cache loaded successfully", + () -> assertTrue(execResult1.exitValue() == 0, "Failed to load the cache"), + () -> assertTrue(execResult1.stdout().contains(successMarker), "Failed to load the cache") + ); + + logger.info("Coherence proxy client {0} returns {1} \n ", + OP_CACHE_LOAD, execResult1.stdout()); + + // patch domain to rolling restart it by change restartVersion + rollingRestartDomainAndVerify(); + + // build the Coherence proxy client program in the server pods + // which load and verify the cache + copyCohProxyClientAppToPods(); + + // run the Coherence proxy client to verify the cache contents + final ExecResult execResult2 = assertDoesNotThrow( + () -> runCoherenceProxyClient(serverName, OP_CACHE_VALIDATE), + String.format("Failed to call Coherence proxy client in pod %s, namespace %s", + serverName, domainNamespace)); + + assertAll("Check that the cache loaded successfully", + () -> assertTrue(execResult1.exitValue() == 0, "Failed to validate the cache"), + () -> assertTrue(execResult2.stdout().contains(successMarker), "Failed to validate the cache") + ); + + logger.info("Coherence proxy client {0} returns {1}", + OP_CACHE_VALIDATE, execResult2.stdout()); + + logger.info("Coherence Server restarted in rolling fashion"); + } + + private void copyCohProxyClientAppToPods() { + List dirsToMake = new ArrayList(); + dirsToMake.add(APP_LOC_IN_POD + "/src/main/java/cohapp"); + dirsToMake.add(APP_LOC_IN_POD + "/src/main/resources"); + + // copy the shell script file and all Coherence app files over to the managed server pods + for (int i = 1; i < replicaCount; i++) { + String serverName = managedServerPrefix + i; + assertDoesNotThrow( + () -> FileUtils.makeDirectories(domainNamespace, serverName, + null, true, dirsToMake), + String.format("Failed to create dir %s in pod %s in namespace %s ", + dirsToMake.toString(), serverName, domainNamespace)); + logger.info("Failed to create dir {0} in Pod {1} in namespace {2} ", + dirsToMake.toString(), serverName, domainNamespace); + + assertDoesNotThrow( + () -> FileUtils.copyFolderToPod(domainNamespace, serverName, + containerName, Paths.get(APP_LOC_ON_HOST), Paths.get(APP_LOC_IN_POD)), + String.format("Failed to copy file %s to pod %s in namespace %s and located at %s ", + APP_LOC_ON_HOST, serverName, domainNamespace, APP_LOC_IN_POD)); + logger.info("File {0} copied to {1} to Pod {2} in namespace {3} ", + APP_LOC_ON_HOST, APP_LOC_IN_POD, serverName, domainNamespace); + } + } + + private ExecResult runCoherenceProxyClient(String serverName, String cacheOp + ) throws IOException, ApiException, InterruptedException { + + // build the proxy client in the pod and run the proxy test. + final String coherenceScriptPathInPod = APP_LOC_IN_POD + "/" + PROXY_CLIENT_SCRIPT; + + String serverPodIP = assertDoesNotThrow( + () -> getPodIP(domainNamespace, "", serverName), + String.format("Get pod IP address failed with ApiException for %s in namespace %s", + serverName, domainNamespace)); + logger.info("Admin Pod IP {0} ", serverPodIP); + + + StringBuffer coherenceProxyClientCmd = new StringBuffer("chmod +x -R "); + coherenceProxyClientCmd + .append(APP_LOC_IN_POD) + .append(" && sh ") + .append(coherenceScriptPathInPod) + .append(" ") + .append(APP_LOC_IN_POD) + .append(" ") + .append(cacheOp) + .append(" ") + .append(serverPodIP) + .append(" ") + .append(PROXY_PORT); + + logger.info("Command to exec script file: " + coherenceProxyClientCmd); + + ExecResult execResult = + execCommand(domainNamespace, serverName, containerName, true, + "/bin/sh", "-c", coherenceProxyClientCmd.toString()); + + logger.info("Coherence proxy client returns {0}", execResult.stdout()); + + return execResult; + } + + private static String createAndVerifyDomainImage() { + // create image with model files + logger.info("Create image with model file and verify"); + String domImage = createImageAndVerify( + COHERENCE_IMAGE_NAME, COHERENCE_MODEL_FILE, + PROXY_SERVER_APP_NAME, COHERENCE_MODEL_PROP, domainUid); + + // docker login and push image to docker registry if necessary + dockerLoginAndPushImageToRegistry(domImage); + + // create docker registry secret to pull the image from registry + logger.info("Create docker registry secret in namespace {0}", domainNamespace); + assertDoesNotThrow(() -> createDockerRegistrySecret(domainNamespace), + String.format("create Docker Registry Secret failed for %s", REPO_SECRET_NAME)); + + return domImage; + } + + private static void createAndVerifyDomain(String domImage) { + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword(adminSecretName, domainNamespace, + "weblogic", "welcome1"), + String.format("create secret for admin credentials failed for %s", adminSecretName)); + + // create encryption secret + logger.info("Create encryption secret"); + String encryptionSecretName = "encryptionsecret"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword(encryptionSecretName, domainNamespace, + "weblogicenc", "weblogicenc"), + String.format("create encryption secret failed for %s", encryptionSecretName)); + + // create domain and verify + logger.info("Create model in image domain {0} in namespace {1} using docker image {2}", + domainUid, domainNamespace, domImage); + createDomainCrAndVerify(adminSecretName, domImage); + + // check that admin service exists in the domain namespace + logger.info("Checking that admin service {0} exists in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check that admin server pod is ready + logger.info("Checking that admin server pod {0} is ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check for managed server pods existence in the domain namespace + for (int i = 1; i <= replicaCount; i++) { + String managedServerPodName = managedServerPrefix + i; + + // check that the managed server service exists in the domain namespace + logger.info("Checking that managed server service {0} exists in namespace {1}", + managedServerPodName, domainNamespace); + checkServiceExists(managedServerPodName, domainNamespace); + + // check that the managed server pod is ready + logger.info("Checking that managed server pod {0} is ready in namespace {1}", + managedServerPodName, domainNamespace); + checkPodReady(managedServerPodName, domainUid, domainNamespace); + } + } + + private static void createDomainCrAndVerify(String adminSecretName, String domImage) { + // create the domain CR + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domainNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("Image") + .image(domImage) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(REPO_SECRET_NAME)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domainNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)))) + .addClustersItem(new Cluster() + .clusterName(clusterName) + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .model(new Model() + .domainType("WLS")) + .introspectorJobActiveDeadlineSeconds(300L))); + + logger.info("Create domain custom resource for domainUid {0} in namespace {1}", + domainUid, domainNamespace); + boolean domCreated = assertDoesNotThrow(() -> createDomainCustomResource(domain), + String.format("Create domain custom resource failed with ApiException for %s in namespace %s", + domainUid, domainNamespace)); + assertTrue(domCreated, String.format("Create domain custom resource failed with ApiException " + + "for %s in namespace %s", domainUid, domainNamespace)); + } + + private void rollingRestartDomainAndVerify() { + LinkedHashMap pods = new LinkedHashMap<>(); + // get the creation time of the server pods before patching + DateTime adminPodCreationTime = getPodCreationTime(domainNamespace, adminServerPodName); + pods.put(adminServerPodName, adminPodCreationTime); + for (int i = 1; i <= replicaCount; i++) { + pods.put(managedServerPrefix + i, getPodCreationTime(domainNamespace, managedServerPrefix + i)); + } + + String newRestartVersion = patchDomainResourceWithNewRestartVersion(domainUid, domainNamespace); + logger.info("New restart version : {0}", newRestartVersion); + + assertTrue(assertDoesNotThrow( + () -> (verifyRollingRestartOccurred(pods, 1, domainNamespace)), + "More than one pod was restarted at same time"), "Rolling restart failed"); + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItConfigDistributionStrategy.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItConfigDistributionStrategy.java new file mode 100644 index 00000000000..3ea6fa50ce5 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItConfigDistributionStrategy.java @@ -0,0 +1,1066 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; + +import io.kubernetes.client.custom.V1Patch; +import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimVolumeSource; +import io.kubernetes.client.openapi.models.V1Secret; +import io.kubernetes.client.openapi.models.V1SecretList; +import io.kubernetes.client.openapi.models.V1SecretReference; +import io.kubernetes.client.openapi.models.V1Service; +import io.kubernetes.client.openapi.models.V1Volume; +import io.kubernetes.client.openapi.models.V1VolumeMount; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.OracleHttpClient; +import org.awaitility.core.ConditionFactory; +import org.joda.time.DateTime; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import static io.kubernetes.client.util.Yaml.dump; +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.KIND_REPO; +import static oracle.weblogic.kubernetes.TestConstants.OCR_EMAIL; +import static oracle.weblogic.kubernetes.TestConstants.OCR_PASSWORD; +import static oracle.weblogic.kubernetes.TestConstants.OCR_REGISTRY; +import static oracle.weblogic.kubernetes.TestConstants.OCR_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.OCR_USERNAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.APP_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_NAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_TAG; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WORK_DIR; +import static oracle.weblogic.kubernetes.actions.TestActions.createSecret; +import static oracle.weblogic.kubernetes.actions.TestActions.deleteConfigMap; +import static oracle.weblogic.kubernetes.actions.TestActions.deleteSecret; +import static oracle.weblogic.kubernetes.actions.TestActions.getNextIntrospectVersion; +import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; +import static oracle.weblogic.kubernetes.actions.TestActions.listServices; +import static oracle.weblogic.kubernetes.actions.TestActions.shutdownDomain; +import static oracle.weblogic.kubernetes.actions.TestActions.startDomain; +import static oracle.weblogic.kubernetes.actions.impl.Domain.patchDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.listConfigMaps; +import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.listSecrets; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.podStateNotChanged; +import static oracle.weblogic.kubernetes.utils.BuildApplication.buildApplication; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodDoesNotExist; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createConfigMapForDomainCreation; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createConfigMapFromFiles; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainJob; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createPV; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createPVC; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.getPodCreationTime; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.DeployUtil.deployUsingWlst; +import static oracle.weblogic.kubernetes.utils.MySQLDBUtils.createMySQLDB; +import static oracle.weblogic.kubernetes.utils.TestUtils.getNextFreePort; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static oracle.weblogic.kubernetes.utils.WLSTUtils.executeWLSTScript; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Tests related to overrideDistributionStrategy attribute. + */ +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@DisplayName("Verify the overrideDistributionStrategy applies the overrides accordingly to the value set") +@IntegrationTest +public class ItConfigDistributionStrategy { + + private static String opNamespace = null; + private static String domainNamespace = null; + + private static String image = WLS_BASE_IMAGE_NAME + ":" + WLS_BASE_IMAGE_TAG; + private static boolean isUseSecret = true; + + final String domainUid = "mydomain"; + final String clusterName = "mycluster"; + final String adminServerName = "admin-server"; + final String adminServerPodName = domainUid + "-" + adminServerName; + final String managedServerNameBase = "ms-"; + final int managedServerPort = 8001; + int t3ChannelPort; + final String pvName = domainUid + "-pv"; // name of the persistent volume + final String pvcName = domainUid + "-pvc"; // name of the persistent volume claim + final String wlSecretName = "weblogic-credentials"; + final String managedServerPodNamePrefix = domainUid + "-" + managedServerNameBase; + int replicaCount = 2; + + static Path clusterViewAppPath; + String overridecm = "configoverride-cm"; + LinkedHashMap podTimestamps; + + static int mysqlDBPort1; + static int mysqlDBPort2; + static String dsUrl1; + static String dsUrl2; + + String dsName0 = "JdbcTestDataSource-0"; + String dsName1 = "JdbcTestDataSource-1"; + String dsSecret = domainUid.concat("-mysql-secret"); + + // create standard, reusable retry/backoff policy + private static final ConditionFactory withStandardRetryPolicy + = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(15, MINUTES).await(); + private static LoggingFacade logger = null; + + /** + * Assigns unique namespaces for operator and domains. + * Pulls WebLogic image if running tests in Kind cluster. + * Installs operator. + * Creates 2 MySQL database instances. + * Creates and starts WebLogic domain containing 2 instances in dynamic cluser. + * Creates 2 JDBC data sources targeted to cluster. + * Deploys clusterview application to cluster and admin targets. + * + * @param namespaces injected by JUnit + */ + @BeforeAll + public void initAll(@Namespaces(2) List namespaces) { + logger = getLogger(); + + logger.info("Assign a unique namespace for operator"); + assertNotNull(namespaces.get(0), "Namespace is null"); + opNamespace = namespaces.get(0); + logger.info("Assign a unique namespace for domain namspace"); + assertNotNull(namespaces.get(1), "Namespace is null"); + domainNamespace = namespaces.get(1); + + // install operator and verify its running in ready state + installAndVerifyOperator(opNamespace, domainNamespace); + + //determine if the tests are running in Kind cluster. if true use images from Kind registry + if (KIND_REPO != null) { + String kindRepoImage = KIND_REPO + image.substring(TestConstants.OCR_REGISTRY.length() + 1); + logger.info("Using image {0}", kindRepoImage); + image = kindRepoImage; + isUseSecret = false; + } else { + // create pull secrets for WebLogic image when running in non Kind Kubernetes cluster + createOCRRepoSecret(domainNamespace); + } + + //start two MySQL database instances + createMySQLDB("mysqldb-1", "root", "root123", 0, domainNamespace, null); + mysqlDBPort1 = getMySQLNodePort(domainNamespace, "mysqldb-1"); + createMySQLDB("mysqldb-2", "root", "root456", 0, domainNamespace, null); + mysqlDBPort2 = getMySQLNodePort(domainNamespace, "mysqldb-2"); + + dsUrl1 = "jdbc:mysql://" + K8S_NODEPORT_HOST + ":" + mysqlDBPort1; + dsUrl2 = "jdbc:mysql://" + K8S_NODEPORT_HOST + ":" + mysqlDBPort2; + + // build the clusterview application + Path distDir = buildApplication(Paths.get(APP_DIR, "clusterview"), + null, null, "dist", domainNamespace); + clusterViewAppPath = Paths.get(distDir.toString(), "clusterview.war"); + assertTrue(clusterViewAppPath.toFile().exists(), "Application archive is not available"); + + //create and start WebLogic domain + createDomain(); + //create a jdbc resource targeted to cluster + createJdbcDataSource(dsName0, "root", "root123", mysqlDBPort1); + createJdbcDataSource(dsName1, "root", "root123", mysqlDBPort1); + //deploy application to view server configuration + deployApplication(clusterName + "," + adminServerName); + + } + + /** + * Verify the default config before starting any test. + */ + @BeforeEach + public void beforeEach() { + //check configuration values before override + verifyConfigXMLOverride(false); + verifyResourceJDBC0Override(false); + } + + /** + * Delete the overrides and restart domain to get clean state. + */ + @AfterEach + public void afterEach() { + deleteConfigMap(overridecm, domainNamespace); + String patchStr + = "[" + + "{\"op\": \"remove\", \"path\": \"/spec/configuration/overridesConfigMap\"}" + + "]"; + logger.info("Updating domain configuration using patch string: {0}", patchStr); + V1Patch patch = new V1Patch(patchStr); + patchDomainCustomResource(domainUid, domainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH); + restartDomain(); + + logger.info("Getting node port for default channel"); + int serviceNodePort = assertDoesNotThrow(() + -> getServiceNodePort(domainNamespace, adminServerPodName + "-external", "default"), + "Getting admin server node port failed"); + + logger.info("Getting the list of servers using the listServers"); + String baseUri = "http://" + K8S_NODEPORT_HOST + ":" + serviceNodePort + "/clusterview/"; + String serverListUri = "ClusterViewServlet?listServers=true"; + for (int i = 0; i < 5; i++) { + assertDoesNotThrow(() -> TimeUnit.SECONDS.sleep(30)); + HttpResponse response = assertDoesNotThrow(() -> OracleHttpClient.get(baseUri + serverListUri, true)); + assertEquals(200, response.statusCode(), "Status code not equals to 200"); + } + } + + /** + * Test server configuration and JDBC datasource configurations are overridden dynamically when + * /spec/configuration/overrideDistributionStrategy: field is not set. By default it should be DYNAMIC. + * + *

    Test sets the /spec/configuration/overridesConfigMap and with new configuration for config.xml and datasources. + * + *

    Verifies after introspector runs the server configuration and JDBC datasource configurations are updated + * as expected. + */ + @Order(1) + @Test + @DisplayName("Test overrideDistributionStrategy set to DEFAULT") + public void testDefaultOverride() { + + //store the pod creation timestamps + storePodCreationTimestamps(); + + List overrideFiles = new ArrayList<>(); + overrideFiles.add( + Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/jdbc-JdbcTestDataSource-0.xml")); + overrideFiles.add(Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/config.xml")); + overrideFiles.add(Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/version.txt")); + + //create config override map + createConfigMapFromFiles(overridecm, overrideFiles, domainNamespace); + + String introspectVersion = assertDoesNotThrow(() -> getNextIntrospectVersion(domainUid, domainNamespace)); + + logger.info("patch the domain resource with overridesConfigMap and introspectVersion"); + String patchStr + = "[" + + "{\"op\": \"add\", \"path\": \"/spec/configuration/overridesConfigMap\", \"value\": \"" + overridecm + "\"}," + + "{\"op\": \"add\", \"path\": \"/spec/introspectVersion\", \"value\": \"" + introspectVersion + "\"}" + + "]"; + logger.info("Updating domain configuration using patch string: {0}", patchStr); + V1Patch patch = new V1Patch(patchStr); + assertTrue(patchDomainCustomResource(domainUid, domainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH), + "Failed to patch domain"); + + verifyIntrospectorRuns(); + verifyPodsStateNotChanged(); + + //wait until config is updated upto 5 minutes + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for server configuration to be updated" + + "(elapsed time {0} ms, remaining time {1} ms)", + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(configUpdated("9999999")); + + verifyConfigXMLOverride(true); + verifyResourceJDBC0Override(true); + } + + /** + * Test server configuration and JDBC datasource configurations are updated from previous overrides when underlying + * override files are changed, configmap is recreated with new files with same name and introspector rerun. + * a. Test sets the /spec/configuration/overridesConfigMap with configuration for config.xml and datasources. + * b. Verifies after introspector runs the server configuration and JDBC datasource configurations are updated + * as expected. + * c. Recreate the same configmap with modified config.xml and recreates the map. + * d. Reruns the introspector and verifies that the new configuration is applied as per the new config.xml override + * file. + */ + @Order(2) + @Test + @DisplayName("Test new overrides are applied as per the files in recreated configmap") + public void testModifiedOverrideContent() { + + //store the pod creation timestamps + storePodCreationTimestamps(); + + //create first set of override + List overrideFiles = new ArrayList<>(); + overrideFiles.add(Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/config.xml")); + overrideFiles.add( + Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/jdbc-JdbcTestDataSource-0.xml")); + overrideFiles.add(Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/version.txt")); + + //create config override map + createConfigMapFromFiles(overridecm, overrideFiles, domainNamespace); + + String introspectVersion = assertDoesNotThrow(() -> getNextIntrospectVersion(domainUid, domainNamespace)); + + logger.info("patch the domain resource with overridesConfigMap and introspectVersion"); + String patchStr + = "[" + + "{\"op\": \"add\", \"path\": \"/spec/configuration/overridesConfigMap\", \"value\": \"" + overridecm + "\"}," + + "{\"op\": \"replace\", \"path\": \"/spec/introspectVersion\", \"value\": \"" + introspectVersion + "\"}" + + "]"; + logger.info("Updating domain configuration using patch string: {0}", patchStr); + V1Patch patch = new V1Patch(patchStr); + assertTrue(patchDomainCustomResource(domainUid, domainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH), + "Failed to patch domain"); + + verifyIntrospectorRuns(); + verifyPodsStateNotChanged(); + + //wait until config is updated upto 5 minutes + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for server configuration to be updated" + + "(elapsed time {0} ms, remaining time {1} ms)", + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(configUpdated("9999999")); + + verifyConfigXMLOverride(true); + verifyResourceJDBC0Override(true); + + logger.info("Deleting the old override configmap {0}", overridecm); + deleteConfigMap(overridecm, domainNamespace); + + withStandardRetryPolicy.conditionEvaluationListener( + condition -> logger.info("Waiting for configmap {0} to be deleted. Elapsed time{1}, remaining time {2}", + overridecm, condition.getElapsedTimeInMS(), condition.getRemainingTimeInMS())).until(() -> { + return listConfigMaps(domainNamespace).getItems().stream().noneMatch((cm) + -> (cm.getMetadata().getName().equals(overridecm))); + }); + + + Path srcOverrideFile = Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/config1.xml"); + Path dstOverrideFile = Paths.get(WORK_DIR, "config.xml"); + assertDoesNotThrow(() -> Files.copy(srcOverrideFile, dstOverrideFile, StandardCopyOption.REPLACE_EXISTING)); + + overrideFiles = new ArrayList<>(); + overrideFiles.add(dstOverrideFile); + overrideFiles.add( + Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/jdbc-JdbcTestDataSource-0.xml")); + overrideFiles.add(Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/version.txt")); + + //recreate config override map with new content + logger.info("Recreating configmap {0} with new override files {1}", overridecm, overrideFiles); + createConfigMapFromFiles(overridecm, overrideFiles, domainNamespace); + + introspectVersion = assertDoesNotThrow(() -> getNextIntrospectVersion(domainUid, domainNamespace)); + + logger.info("patch the domain resource with overridesConfigMap and introspectVersion"); + patchStr + = "[" + + "{\"op\": \"replace\", \"path\": \"/spec/introspectVersion\", \"value\": \"" + introspectVersion + "\"}" + + "]"; + logger.info("Updating domain configuration using patch string: {0}", patchStr); + patch = new V1Patch(patchStr); + assertTrue(patchDomainCustomResource(domainUid, domainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH), + "Failed to patch domain"); + + verifyIntrospectorRuns(); + verifyPodsStateNotChanged(); + + //wait until config is updated upto 5 minutes + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for server configuration to be updated" + + "(elapsed time {0} ms, remaining time {1} ms)", + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(configUpdated("88888888")); + + verifyResourceJDBC0Override(true); + + } + + /** + * Test server configuration and datasource configurations are dynamically overridden when + * /spec/configuration/overrideDistributionStrategy is set to DYNAMIC. + * + *

    Test sets the above field to DYNAMIC and overrides the /spec/configuration/overridesConfigMap + * with new configuration. + * + *

    Verifies after introspector runs and the server configuration and JDBC datasource configurations are + * updated as expected. + */ + @Order(3) + @Test + @DisplayName("Test overrideDistributionStrategy value DYNAMIC") + public void testDynamicOverride() { + + //patching the domain with /spec/configuration/overrideDistributionStrategy: DYNAMIC + String patchStr = "[" + + "{\"op\": \"add\", \"path\": \"/spec/configuration/overrideDistributionStrategy\", " + + "\"value\": \"DYNAMIC\"}" + + "]"; + logger.info("Updating domain configuration using patch string: {0}", patchStr); + V1Patch patch = new V1Patch(patchStr); + assertTrue(patchDomainCustomResource(domainUid, domainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH), + "Failed to patch domain"); + + //TODO: - does changing overrideDistributionStrategy needs restart of server pods? + restartDomain(); // if above is a bug, remove this after the above bug is fixed + + //store the pod creation timestamps + storePodCreationTimestamps(); + + List overrideFiles = new ArrayList<>(); + overrideFiles.add( + Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/jdbc-JdbcTestDataSource-0.xml")); + overrideFiles.add(Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/config.xml")); + overrideFiles.add(Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/version.txt")); + + //create config override map + createConfigMapFromFiles(overridecm, overrideFiles, domainNamespace); + + String introspectVersion = assertDoesNotThrow(() -> getNextIntrospectVersion(domainUid, domainNamespace)); + + logger.info("patch the domain resource with overridesConfigMap, secrets , cluster and introspectVersion"); + patchStr + = "[" + + "{\"op\": \"add\", \"path\": \"/spec/configuration/overridesConfigMap\", \"value\": \"" + overridecm + "\"}," + + "{\"op\": \"replace\", \"path\": \"/spec/introspectVersion\", \"value\": \"" + introspectVersion + "\"}" + + "]"; + logger.info("Updating domain configuration using patch string: {0}", patchStr); + patch = new V1Patch(patchStr); + assertTrue(patchDomainCustomResource(domainUid, domainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH), + "Failed to patch domain"); + + verifyIntrospectorRuns(); + verifyPodsStateNotChanged(); + + //wait until config is updated upto 5 minutes + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for server configuration to be updated" + + "(elapsed time {0} ms, remaining time {1} ms)", + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(configUpdated("9999999")); + + verifyConfigXMLOverride(true); + verifyResourceJDBC0Override(true); + + patchStr + = "[" + + "{\"op\": \"remove\", \"path\": \"/spec/configuration/overrideDistributionStrategy\"}" + + "]"; + logger.info("Updating domain configuration using patch string: {0}", patchStr); + patch = new V1Patch(patchStr); + assertTrue(patchDomainCustomResource(domainUid, domainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH), + "Failed to patch domain"); + } + + /** + * Test server configuration and JDBC datasource configurations are overridden on restart of pods when + * /spec/configuration/overrideDistributionStrategy is set to ON_RESTART. + * + *

    Test sets the above field to ON_RESTART and overrides the /spec/configuration/overridesConfigMap and + * /spec/configuration/secrets with new configuration and new secrets. + * + *

    Verifies after introspector runs the server configuration and JDBC datasource configurations are not + * updated. Verifies the overrides are applied only after a domain restart. + */ + @Order(4) + @Test + @DisplayName("Test overrideDistributionStrategy value ON_RESTART") + public void testOnRestartOverride() { + + //patching the domain with /spec/configuration/overrideDistributionStrategy: ON_RESTART + String patchStr = "[" + + "{\"op\": \"add\", \"path\": \"/spec/configuration/overrideDistributionStrategy\", " + + "\"value\": \"ON_RESTART\"}" + + "]"; + logger.info("Updating domain configuration using patch string: {0}", patchStr); + V1Patch patch = new V1Patch(patchStr); + assertTrue(patchDomainCustomResource(domainUid, domainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH), + "Failed to patch domain"); + + //TODO: - does changing overrideDistributionStrategy needs restart of server pods? + restartDomain(); // if above is a bug, remove this after the above bug is fixed + + //store the pod creation timestamps + storePodCreationTimestamps(); + + logger.info("Creating secrets for JDBC datasource overrides"); + //create new secrets for jdbc datasource + Map secretMap = new HashMap<>(); + secretMap.put("dbusername", "root"); + secretMap.put("dbpassword", "root456"); + + boolean secretCreated = assertDoesNotThrow(() -> createSecret(new V1Secret() + .metadata(new V1ObjectMeta() + .name(dsSecret) + .namespace(domainNamespace)) + .stringData(secretMap)), "Creating secret for datasource failed."); + assertTrue(secretCreated, String.format("creating secret failed %s", dsSecret)); + + //copy the template datasource file for override after replacing JDBC_URL with new datasource url + Path srcDsOverrideFile = Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/jdbc-JdbcTestDataSource-1.xml"); + Path dstDsOverrideFile = Paths.get(WORK_DIR, "jdbc-JdbcTestDataSource-1.xml"); + String tempString = assertDoesNotThrow(() + -> Files.readString(srcDsOverrideFile).replaceAll("JDBC_URL", dsUrl2)); + assertDoesNotThrow(() + -> Files.write(dstDsOverrideFile, tempString.getBytes(StandardCharsets.UTF_8))); + + List overrideFiles = new ArrayList<>(); + overrideFiles.add(dstDsOverrideFile); + overrideFiles.add(Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/config.xml")); + overrideFiles.add(Paths.get(RESOURCE_DIR, "configfiles/configoverridesset1/version.txt")); + + //create config override map + createConfigMapFromFiles(overridecm, overrideFiles, domainNamespace); + + String introspectVersion = assertDoesNotThrow(() -> getNextIntrospectVersion(domainUid, domainNamespace)); + + //patch the domain resource with overridesConfigMap, secrets and introspectVersion + patchStr + = "[" + + "{\"op\": \"add\", \"path\": \"/spec/configuration/overridesConfigMap\", \"value\": \"" + overridecm + "\"}," + + "{\"op\": \"add\", \"path\": \"/spec/configuration/secrets\", \"value\": [\"" + dsSecret + "\"] }," + + "{\"op\": \"replace\", \"path\": \"/spec/introspectVersion\", \"value\": \"" + introspectVersion + "\"}" + + "]"; + logger.info("Updating domain configuration using patch string: {0}", patchStr); + patch = new V1Patch(patchStr); + assertTrue(patchDomainCustomResource(domainUid, domainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH), + "Failed to patch domain"); + + verifyIntrospectorRuns(); + verifyPodsStateNotChanged(); + + try { + //wait for a minute to see if the overrides are not applied + TimeUnit.MINUTES.sleep(1); + } catch (InterruptedException ex) { + //ignore + } + + //verify the overrides are not applied + verifyConfigXMLOverride(false); + verifyResourceJDBC0Override(false); + + //restart domain for the distributionstrategy to take effect + restartDomain(); + + //verify on restart the overrides are applied + verifyConfigXMLOverride(true); + verifyResourceJDBC1Override(true); + + //cleanup secret + deleteSecret(dsSecret, domainNamespace); + patchStr + = "[" + + "{\"op\": \"remove\", \"path\": \"/spec/configuration/overrideDistributionStrategy\"}," + + "{\"op\": \"remove\", \"path\": \"/spec/configuration/secrets\"}" + + "]"; + logger.info("Updating domain configuration using patch string: {0}", patchStr); + patch = new V1Patch(patchStr); + assertTrue(patchDomainCustomResource(domainUid, domainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH), + "Failed to patch domain"); + } + + /** + * Test patching the domain with values for /spec/configuration/overrideDistributionStrategy field anything other than + * DYNAMIC or ON_RESTART fails. + * + *

    Test tries to set the above field to RESTART and asserts the patching fails. + */ + @Order(5) + @Test + @DisplayName("Test invalid overrideDistributionStrategy value RESTART") + public void testOverrideNegative() { + + //patching the domain with /spec/configuration/overrideDistributionStrategy: RESTART + String patchStr = "[" + + "{\"op\": \"add\", \"path\": \"/spec/configuration/overrideDistributionStrategy\", " + + "\"value\": \"RESTART\"}" + + "]"; + logger.info("Updating domain configuration using patch string: {0}", patchStr); + V1Patch patch = new V1Patch(patchStr); + assertFalse(patchDomainCustomResource(domainUid, domainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH), + "Patch domain with invalid overrideDistributionStrategy succeeded."); + + //verify the overrides are not applied and original configuration is still effective + verifyConfigXMLOverride(false); + } + + private Callable configUpdated(String maxMessageSize) { + logger.info("Getting node port for default channel"); + int serviceNodePort = assertDoesNotThrow(() + -> getServiceNodePort(domainNamespace, adminServerPodName + + "-external", + "default"), + "Getting admin server node port failed"); + + //verify server attribute MaxMessageSize + String appURI = "/clusterview/ConfigServlet?" + + "attributeTest=true&" + + "serverType=adminserver&" + + "serverName=" + adminServerName; + String url = "http://" + K8S_NODEPORT_HOST + ":" + serviceNodePort + appURI; + + return (() + -> { + HttpResponse response = assertDoesNotThrow(() -> OracleHttpClient.get(url, true)); + assertEquals(200, response.statusCode(), "Status code not equals to 200"); + return response.body().contains("MaxMessageSize=".concat(maxMessageSize)); + }); + } + + private void verifyConfigXMLOverride(boolean configUpdated) { + + int port = getServiceNodePort(domainNamespace, adminServerPodName + "-external", "default"); + String baseUri = "http://" + K8S_NODEPORT_HOST + ":" + port + "/clusterview/"; + + //verify server attribute MaxMessageSize to be equal to 9999999 + String configUri = "ConfigServlet?" + + "attributeTest=true" + + "&serverType=adminserver" + + "&serverName=" + adminServerName; + HttpResponse response = assertDoesNotThrow(() -> OracleHttpClient.get(baseUri + configUri, true)); + + assertEquals(200, response.statusCode(), "Status code not equals to 200"); + if (configUpdated) { + assertTrue(response.body().contains("MaxMessageSize=9999999"), "Didn't get MaxMessageSize=9999999"); + } else { + assertTrue(response.body().contains("MaxMessageSize=10000000"), "Didn't get MaxMessageSize=10000000"); + } + + } + + //use the http client and access the clusterview application to get server configuration + //and JDBC datasource configuration. + private void verifyResourceJDBC0Override(boolean configUpdated) { + + // get admin server node port and construct a base url for clusterview app + int port = getServiceNodePort(domainNamespace, adminServerPodName + "-external", "default"); + String baseUri = "http://" + K8S_NODEPORT_HOST + ":" + port + "/clusterview/ConfigServlet?"; + + //verify datasource attributes of JdbcTestDataSource-0 + String appURI = "resTest=true&resName=" + dsName0; + String dsOverrideTestUrl = baseUri + appURI; + HttpResponse response = assertDoesNotThrow(() -> OracleHttpClient.get(dsOverrideTestUrl, true)); + + assertEquals(200, response.statusCode(), "Status code not equals to 200"); + if (configUpdated) { + assertTrue(response.body().contains("getMaxCapacity:12"), "Did get getMaxCapacity:12"); + assertTrue(response.body().contains("getInitialCapacity:2"), "Did get getInitialCapacity:2"); + } else { + assertTrue(response.body().contains("getMaxCapacity:15"), "Did get getMaxCapacity:15"); + assertTrue(response.body().contains("getInitialCapacity:1"), "Did get getInitialCapacity:1"); + } + + //test connection pool in all managed servers of dynamic cluster + for (int i = 1; i <= replicaCount; i++) { + appURI = "dsTest=true&dsName=" + dsName0 + "&" + "serverName=" + managedServerNameBase + i; + String dsConnectionPoolTestUrl = baseUri + appURI; + response = assertDoesNotThrow(() -> OracleHttpClient.get(dsConnectionPoolTestUrl, true)); + assertEquals(200, response.statusCode(), "Status code not equals to 200"); + assertTrue(response.body().contains("Connection successful"), "Didn't get Connection successful"); + } + } + + //use the http client and access the clusterview application to get server configuration + //and JDBC datasource configuration. + private void verifyResourceJDBC1Override(boolean configUpdated) { + + // get admin server node port and construct a base url for clusterview app + int port = getServiceNodePort(domainNamespace, adminServerPodName + "-external", "default"); + String baseUri = "http://" + K8S_NODEPORT_HOST + ":" + port + "/clusterview/ConfigServlet?"; + + //verify datasource attributes of JdbcTestDataSource-0 + String appURI = "resTest=true&resName=" + dsName1; + String dsOverrideTestUrl = baseUri + appURI; + HttpResponse response = assertDoesNotThrow(() -> OracleHttpClient.get(dsOverrideTestUrl, true)); + + assertEquals(200, response.statusCode(), "Status code not equals to 200"); + if (configUpdated) { + assertTrue(response.body().contains("getMaxCapacity:10"), "Did get getMaxCapacity:10"); + assertTrue(response.body().contains("getInitialCapacity:4"), "Did get getInitialCapacity:4"); + assertTrue(response.body().contains("Url:" + dsUrl2), "Didn't get Url:" + dsUrl2); + } else { + assertTrue(response.body().contains("getMaxCapacity:15"), "Did get getMaxCapacity:15"); + assertTrue(response.body().contains("getInitialCapacity:1"), "Did get getInitialCapacity:1"); + assertTrue(response.body().contains("Url:" + dsUrl1), "Didn't get Url:" + dsUrl1); + } + + //test connection pool in all managed servers of dynamic cluster + for (int i = 1; i <= replicaCount; i++) { + appURI = "dsTest=true&dsName=" + dsName1 + "&" + "serverName=" + managedServerNameBase + i; + String dsConnectionPoolTestUrl = baseUri + appURI; + response = assertDoesNotThrow(() -> OracleHttpClient.get(dsConnectionPoolTestUrl, true)); + assertEquals(200, response.statusCode(), "Status code not equals to 200"); + assertTrue(response.body().contains("Connection successful"), "Didn't get Connection successful"); + } + } + + //store pod creation timestamps for podstate check + private void storePodCreationTimestamps() { + // get the pod creation time stamps + podTimestamps = new LinkedHashMap<>(); + // get the creation time of the admin server pod before patching + DateTime adminPodCreationTime = getPodCreationTime(domainNamespace, adminServerPodName); + podTimestamps.put(adminServerPodName, adminPodCreationTime); + // get the creation time of the managed server pods before patching + for (int i = 1; i <= replicaCount; i++) { + podTimestamps.put(managedServerPodNamePrefix + i, + getPodCreationTime(domainNamespace, managedServerPodNamePrefix + i)); + } + } + + //check if the pods are restarted by comparing the pod creationtimestamp. + private void verifyPodsStateNotChanged() { + logger.info("Verifying the WebLogic server pod states are not changed"); + for (Map.Entry entry : podTimestamps.entrySet()) { + String podName = (String) entry.getKey(); + DateTime creationTimestamp = (DateTime) entry.getValue(); + assertTrue(podStateNotChanged(podName, domainUid, domainNamespace, + creationTimestamp), "Pod is restarted"); + } + } + + //verify the introspector pod is created and run + private void verifyIntrospectorRuns() { + //verify the introspector pod is created and runs + logger.info("Verifying introspector pod is created, runs and deleted"); + String introspectPodName = domainUid + "-" + "introspect-domain-job"; + checkPodExists(introspectPodName, domainUid, domainNamespace); + checkPodDoesNotExist(introspectPodName, domainUid, domainNamespace); + } + + //create a standard WebLogic domain. + private void createDomain() { + + // create WebLogic domain credential secret + createSecretWithUsernamePassword(wlSecretName, domainNamespace, + ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT); + + createPV(pvName, domainUid, this.getClass().getSimpleName()); + createPVC(pvName, pvcName, domainUid, domainNamespace); + + t3ChannelPort = getNextFreePort(31500, 32767); + + // create a temporary WebLogic domain property file + File domainPropertiesFile = assertDoesNotThrow(() + -> File.createTempFile("domain", ".properties"), + "Failed to create domain properties file"); + Properties p = new Properties(); + p.setProperty("domain_path", "/shared/domains"); + p.setProperty("domain_name", domainUid); + p.setProperty("cluster_name", clusterName); + p.setProperty("admin_server_name", adminServerName); + p.setProperty("managed_server_port", Integer.toString(managedServerPort)); + p.setProperty("admin_server_port", "7001"); + p.setProperty("admin_username", ADMIN_USERNAME_DEFAULT); + p.setProperty("admin_password", ADMIN_PASSWORD_DEFAULT); + p.setProperty("admin_t3_public_address", K8S_NODEPORT_HOST); + p.setProperty("admin_t3_channel_port", Integer.toString(t3ChannelPort)); + p.setProperty("number_of_ms", "2"); + p.setProperty("managed_server_name_base", managedServerNameBase); + p.setProperty("domain_logs", "/shared/logs"); + p.setProperty("production_mode_enabled", "true"); + assertDoesNotThrow(() + -> p.store(new FileOutputStream(domainPropertiesFile), "domain properties file"), + "Failed to write domain properties file"); + + // WLST script for creating domain + Path wlstScript = Paths.get(RESOURCE_DIR, "python-scripts", "wlst-create-domain-onpv.py"); + + // create configmap and domain on persistent volume using the WLST script and property file + createDomainOnPVUsingWlst(wlstScript, domainPropertiesFile.toPath(), + pvName, pvcName, domainNamespace); + + // create a domain custom resource configuration object + logger.info("Creating domain custom resource"); + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domainNamespace)) + .spec(new DomainSpec() + .configuration(new Configuration() + .overrideDistributionStrategy("DYNAMIC")) + .domainUid(domainUid) + .domainHome("/shared/domains/" + domainUid) // point to domain home in pv + .domainHomeSourceType("PersistentVolume") // set the domain home source type as pv + .image(image) + .imagePullPolicy("IfNotPresent") + .imagePullSecrets(isUseSecret ? Arrays.asList( + new V1LocalObjectReference() + .name(OCR_SECRET_NAME)) + : null) + .webLogicCredentialsSecret(new V1SecretReference() + .name(wlSecretName) + .namespace(domainNamespace)) + .includeServerOutInPodLog(true) + .logHomeEnabled(Boolean.TRUE) + .logHome("/shared/logs/" + domainUid) + .dataHome("") + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() //serverpod + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.debug.DebugSituationalConfig=true")) + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.debug.DebugSituationalConfigDumpXml=true")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom ")) + .addVolumesItem(new V1Volume() + .name(pvName) + .persistentVolumeClaim(new V1PersistentVolumeClaimVolumeSource() + .claimName(pvcName))) + .addVolumeMountsItem(new V1VolumeMount() + .mountPath("/shared") + .name(pvName))) + .adminServer(new AdminServer() //admin server + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)) + .addChannelsItem(new Channel() + .channelName("T3Channel") + .nodePort(t3ChannelPort)))) + .addClustersItem(new Cluster() //cluster + .clusterName(clusterName) + .replicas(replicaCount) + .serverStartState("RUNNING"))); + + // verify the domain custom resource is created + createDomainAndVerify(domain, domainNamespace); + + // verify the admin server service created + checkServiceExists(adminServerPodName, domainNamespace); + + // verify admin server pod is ready + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // verify managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Checking managed server service {0} is created in namespace {1}", + managedServerPodNamePrefix + i, domainNamespace); + checkServiceExists(managedServerPodNamePrefix + i, domainNamespace); + } + + // verify managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Waiting for managed server pod {0} to be ready in namespace {1}", + managedServerPodNamePrefix + i, domainNamespace); + checkPodReady(managedServerPodNamePrefix + i, domainUid, domainNamespace); + } + } + + //deploy application clusterview.war to domain + private void deployApplication(String targets) { + logger.info("Getting node port for T3 channel"); + int t3channelNodePort = assertDoesNotThrow(() + -> getServiceNodePort(domainNamespace, adminServerPodName + "-external", "t3channel"), + "Getting admin server t3channel node port failed"); + assertNotEquals(-1, t3ChannelPort, "admin server t3channelport is not valid"); + + //deploy application + logger.info("Deploying webapp {0} to domain", clusterViewAppPath); + deployUsingWlst(K8S_NODEPORT_HOST, Integer.toString(t3channelNodePort), + ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT, targets, clusterViewAppPath, + domainNamespace); + } + + //restart pods by manipulating the serverStartPolicy to NEVER and IF_NEEDED + private void restartDomain() { + logger.info("Restarting domain {0}", domainNamespace); + shutdownDomain(domainUid, domainNamespace); + + logger.info("Checking for admin server pod shutdown"); + checkPodDoesNotExist(adminServerPodName, domainUid, domainNamespace); + logger.info("Checking managed server pods were shutdown"); + for (int i = 1; i <= replicaCount; i++) { + checkPodDoesNotExist(managedServerPodNamePrefix + i, domainUid, domainNamespace); + } + + startDomain(domainUid, domainNamespace); + //make sure that the introspector runs on a cold start + verifyIntrospectorRuns(); + + + // verify the admin server service created + checkServiceExists(adminServerPodName, domainNamespace); + + logger.info("Checking for admin server pod readiness"); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // verify managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Checking managed server service {0} is created in namespace {1}", + managedServerPodNamePrefix + i, domainNamespace); + checkServiceExists(managedServerPodNamePrefix + i, domainNamespace); + } + + logger.info("Checking for managed servers pod readiness"); + for (int i = 1; i <= replicaCount; i++) { + checkPodReady(managedServerPodNamePrefix + i, domainUid, domainNamespace); + } + } + + //create a JDBC datasource targeted to cluster. + private void createJdbcDataSource(String dsName, String user, String password, int mySQLNodePort) { + + try { + String jdbcDsUrl = "jdbc:mysql://" + K8S_NODEPORT_HOST + ":" + mySQLNodePort; + + // create a temporary WebLogic domain property file + File domainPropertiesFile = File.createTempFile("domain", "properties"); + Properties p = new Properties(); + p.setProperty("admin_host", K8S_NODEPORT_HOST); + p.setProperty("admin_port", Integer.toString(t3ChannelPort)); + p.setProperty("admin_username", ADMIN_USERNAME_DEFAULT); + p.setProperty("admin_password", ADMIN_PASSWORD_DEFAULT); + p.setProperty("dsName", dsName); + p.setProperty("dsUrl", jdbcDsUrl); + p.setProperty("dsDriver", "com.mysql.cj.jdbc.Driver"); + p.setProperty("dsUser", user); + p.setProperty("dsPassword", password); + p.setProperty("dsTarget", clusterName); + p.store(new FileOutputStream(domainPropertiesFile), "domain properties file"); + + // WLST script for creating jdbc datasource + Path wlstScript = Paths.get(RESOURCE_DIR, "python-scripts", "create-jdbc-resource.py"); + executeWLSTScript(wlstScript, domainPropertiesFile.toPath(), domainNamespace); + } catch (IOException ex) { + logger.severe(ex.getMessage()); + } + } + + /** + * Create a WebLogic domain on a persistent volume by doing the following. Create a configmap containing WLST script + * and property file. Create a Kubernetes job to create domain on persistent volume. + * + * @param wlstScriptFile python script to create domain + * @param domainPropertiesFile properties file containing domain configuration + * @param pvName name of the persistent volume to create domain in + * @param pvcName name of the persistent volume claim + * @param namespace name of the domain namespace in which the job is created + */ + private void createDomainOnPVUsingWlst(Path wlstScriptFile, Path domainPropertiesFile, + String pvName, String pvcName, String namespace) { + logger.info("Preparing to run create domain job using WLST"); + + List domainScriptFiles = new ArrayList<>(); + domainScriptFiles.add(wlstScriptFile); + domainScriptFiles.add(domainPropertiesFile); + + logger.info("Creating a config map to hold domain creation scripts"); + String domainScriptConfigMapName = "create-domain-scripts-cm"; + + assertDoesNotThrow( + () -> createConfigMapForDomainCreation( + domainScriptConfigMapName, domainScriptFiles, namespace, this.getClass().getSimpleName()), + "Create configmap for domain creation failed"); + + // create a V1Container with specific scripts and properties for creating domain + V1Container jobCreationContainer = new V1Container() + .addCommandItem("/bin/sh") + .addArgsItem("/u01/oracle/oracle_common/common/bin/wlst.sh") + .addArgsItem("/u01/weblogic/" + wlstScriptFile.getFileName()) //wlst.sh + // script + .addArgsItem("-skipWLSModuleScanning") + .addArgsItem("-loadProperties") + .addArgsItem("/u01/weblogic/" + domainPropertiesFile.getFileName()); + //domain property file + + logger.info("Running a Kubernetes job to create the domain"); + createDomainJob(image, isUseSecret, pvName, pvcName, domainScriptConfigMapName, + namespace, jobCreationContainer); + } + + /** + * Create secret for docker credentials. + * + * @param namespace name of the namespace in which to create secret + */ + private static void createOCRRepoSecret(String namespace) { + boolean secretExists = false; + V1SecretList listSecrets = listSecrets(namespace); + if (null != listSecrets) { + for (V1Secret item : listSecrets.getItems()) { + if (item.getMetadata().getName().equals(OCR_SECRET_NAME)) { + secretExists = true; + break; + } + } + } + if (!secretExists) { + createDockerRegistrySecret(OCR_USERNAME, OCR_PASSWORD, + OCR_EMAIL, OCR_REGISTRY, OCR_SECRET_NAME, namespace); + } + } + + private static Integer getMySQLNodePort(String namespace, String dbName) { + logger.info(dump(Kubernetes.listServices(namespace))); + List services = listServices(namespace).getItems(); + for (V1Service service : services) { + if (service.getMetadata().getName().startsWith(dbName)) { + return service.getSpec().getPorts().get(0).getNodePort(); + } + } + return -1; + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItCrossDomainTransaction.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItCrossDomainTransaction.java new file mode 100644 index 00000000000..0c658dda9d0 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItCrossDomainTransaction.java @@ -0,0 +1,386 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1SecretReference; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.annotations.tags.MustNotRunInParallel; +import oracle.weblogic.kubernetes.annotations.tags.Slow; +import oracle.weblogic.kubernetes.assertions.TestAssertions; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.BuildApplication; +import oracle.weblogic.kubernetes.utils.ExecResult; +import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.RESULTS_ROOT; +import static oracle.weblogic.kubernetes.actions.ActionConstants.APP_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.MODEL_DIR; +import static oracle.weblogic.kubernetes.actions.TestActions.createDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.domainExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createImageAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.dockerLoginAndPushImageToRegistry; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.ExecCommand.exec; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@DisplayName("Verify cross domain transaction is successful") +@IntegrationTest +public class ItCrossDomainTransaction { + + private static final String WDT_MODEL_FILE_DOMAIN1 = "model-crossdomaintransaction-domain1.yaml"; + private static final String WDT_MODEL_FILE_DOMAIN2 = "model-crossdomaintransaction-domain2.yaml"; + + private static final String WDT_MODEL_DOMAIN1_PROPS = "model-crossdomaintransaction-domain1.properties"; + private static final String WDT_MODEL_DOMAIN2_PROPS = "model-crossdomaintransaction-domain2.properties"; + private static final String WDT_IMAGE_NAME1 = "domain1-cdxaction-wdt-image"; + private static final String WDT_IMAGE_NAME2 = "domain2-cdxaction-wdt-image"; + private static final String WDT_APP_NAME = "txforward"; + private static final String PROPS_TEMP_DIR = RESULTS_ROOT + "/crossdomaintransactiontemp"; + + private static HelmParams opHelmParams = null; + private static String opNamespace = null; + private static String operatorImage = null; + private static String domain1Namespace = null; + private static String domain2Namespace = null; + private static ConditionFactory withStandardRetryPolicy = null; + private static String dockerConfigJson = ""; + private String domainUid1 = "domain1"; + private String domainUid2 = "domain2"; + private static Map secretNameMap; + private final String domain1AdminServerPodName = domainUid1 + "-admin-server"; + private final String domain1ManagedServerPrefix = domainUid1 + "-managed-server"; + private final String domain2ManagedServerPrefix = domainUid2 + "-managed-server"; + private static LoggingFacade logger = null; + + /** + * Install Operator. + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + * JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void initAll(@Namespaces(3) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + // get a new unique opNamespace + logger.info("Creating unique namespace for Operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + opNamespace = namespaces.get(0); + + logger.info("Creating unique namespace for Domain"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domain1Namespace = namespaces.get(1); + + logger.info("Creating unique namespace for Domain"); + assertNotNull(namespaces.get(2), "Namespace list is null"); + domain2Namespace = namespaces.get(2); + + // Now that we got the namespaces for both the domains, we need to update the model properties + // file with the namespaces. For cross domain transaction to work, we need to have the externalDNSName + // set in the config file. Cannot set this after the domain is up since a server restart is + // required for this to take effect. So, copying the property file to RESULT_ROOT and updating the + // property file + updatePropertyFile(); + + // install and verify operator + installAndVerifyOperator(opNamespace, domain1Namespace, domain2Namespace); + + } + + private static void updatePropertyFile() { + //create a temporary directory to copy and update the properties file + Path target = Paths.get(PROPS_TEMP_DIR); + Path source1 = Paths.get(MODEL_DIR, WDT_MODEL_DOMAIN1_PROPS); + Path source2 = Paths.get(MODEL_DIR, WDT_MODEL_DOMAIN2_PROPS); + logger.info("Copy the properties file to the above area so that we can add namespace property"); + assertDoesNotThrow(() -> { + Files.createDirectories(target); + Files.copy(source1, target.resolve(source1.getFileName()), StandardCopyOption.REPLACE_EXISTING); + Files.copy(source2, target.resolve(source2.getFileName()), StandardCopyOption.REPLACE_EXISTING); + }); + + assertDoesNotThrow(() -> { + addNamespaceToPropertyFile(WDT_MODEL_DOMAIN1_PROPS, domain1Namespace); + String.format("Failed to update %s with namespace %s", + WDT_MODEL_DOMAIN1_PROPS, domain1Namespace); + }); + assertDoesNotThrow(() -> { + addNamespaceToPropertyFile(WDT_MODEL_DOMAIN2_PROPS, domain2Namespace); + String.format("Failed to update %s with namespace %s", + WDT_MODEL_DOMAIN2_PROPS, domain2Namespace); + }); + + } + + private static void addNamespaceToPropertyFile(String propFileName, String domainNamespace) throws IOException { + FileInputStream in = new FileInputStream(PROPS_TEMP_DIR + "/" + propFileName); + Properties props = new Properties(); + props.load(in); + in.close(); + + FileOutputStream out = new FileOutputStream(PROPS_TEMP_DIR + "/" + propFileName); + props.setProperty("NAMESPACE", domainNamespace); + props.store(out, null); + out.close(); + } + + /* + * This test verifies cross domain transaction is successful. domain in image using wdt is used + * to create 2 domains in different namespaces. An app is deployed to both the domains and the servlet + * is invoked which starts a transaction that spans both domains. + */ + @Test + @DisplayName("Check cross domain transaction works") + @Slow + @MustNotRunInParallel + public void testCrossDomainTransaction() { + + //build application archive + + Path distDir = BuildApplication.buildApplication(Paths.get(APP_DIR, "txforward"), null, null, + "build", domain1Namespace); + logger.info("distDir is {0}", distDir.toString()); + assertTrue(Paths.get(distDir.toString(), + "txforward.ear").toFile().exists(), + "Application archive is not available"); + String appSource = distDir.toString() + "/txforward.ear"; + logger.info("Application is in {0}", appSource); + + // create admin credential secret for domain1 + logger.info("Create admin credential secret for domain1"); + String domain1AdminSecretName = domainUid1 + "-weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + domain1AdminSecretName, domain1Namespace, ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT), + String.format("createSecret %s failed for %s", domain1AdminSecretName, domainUid1)); + + // create admin credential secret for domain2 + logger.info("Create admin credential secret for domain2"); + String domain2AdminSecretName = domainUid2 + "-weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + domain2AdminSecretName, domain2Namespace, ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT), + String.format("createSecret %s failed for %s", domain2AdminSecretName, domainUid2)); + + logger.info("Creating image with model file and verify"); + String domain1Image = createImageAndVerify( + WDT_IMAGE_NAME1, WDT_MODEL_FILE_DOMAIN1, appSource, WDT_MODEL_DOMAIN1_PROPS, PROPS_TEMP_DIR, domainUid1); + logger.info("Created {0} image", domain1Image); + + // docker login and push image to docker registry if necessary + dockerLoginAndPushImageToRegistry(domain1Image); + + logger.info("Creating image with model file and verify"); + String domain2Image = createImageAndVerify( + WDT_IMAGE_NAME2, WDT_MODEL_FILE_DOMAIN2, appSource, WDT_MODEL_DOMAIN2_PROPS, PROPS_TEMP_DIR, domainUid2); + logger.info("Created {0} image", domain2Image); + + // docker login and push image to docker registry if necessary + dockerLoginAndPushImageToRegistry(domain2Image); + + //create domain1 + createDomain(domainUid1, domain1Namespace, domain1AdminSecretName, domain1Image); + //create domain2 + createDomain(domainUid2, domain2Namespace, domain2AdminSecretName, domain2Image); + + logger.info("Getting admin server external service node port"); + int adminServiceNodePort = assertDoesNotThrow( + () -> getServiceNodePort(domain1Namespace, domain1AdminServerPodName + "-external", "default"), + "Getting admin server node port failed"); + + String curlRequest = String.format("curl -v --show-error --noproxy '*' " + + "http://%s:%s/TxForward/TxForward?urls=t3://%s.%s:7001,t3://%s1.%s:8001,t3://%s1.%s:8001,t3://%s2.%s:8001", + K8S_NODEPORT_HOST, adminServiceNodePort, domain1AdminServerPodName, domain1Namespace, + domain1ManagedServerPrefix, domain1Namespace, domain2ManagedServerPrefix,domain2Namespace, + domain2ManagedServerPrefix, domain2Namespace); + + ExecResult result = null; + logger.info("curl command {0}", curlRequest); + result = assertDoesNotThrow( + () -> exec(curlRequest, true)); + if (result.exitValue() == 0) { + logger.info("\n HTTP response is \n " + result.stdout()); + logger.info("curl command returned {0}", result.toString()); + assertTrue(result.stdout().contains("Status=Committed"), "crossDomainTransaction failed"); + } + + } + + private void createDomain(String domainUid, String domainNamespace, String adminSecretName, + String domainImage) { + // admin/managed server name here should match with model yaml in WDT_MODEL_FILE + final String adminServerPodName = domainUid + "-admin-server"; + final String managedServerPrefix = domainUid + "-managed-server"; + final int replicaCount = 2; + + // Create the repo secret to pull the image + createDockerRegistrySecret(domainNamespace); + + // create the domain CR + createDomainResource(domainUid, domainNamespace, adminSecretName, REPO_SECRET_NAME, + replicaCount, domainImage); + + // wait for the domain to exist + logger.info("Check for domain custom resource in namespace {0}", domainNamespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for domain {0} to be created in namespace {1} " + + "(elapsed time {2}ms, remaining time {3}ms)", + domainUid, + domainNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(domainExists(domainUid, DOMAIN_VERSION, domainNamespace)); + + + // check admin server pod exists + logger.info("Check for admin server pod {0} existence in namespace {1}", + adminServerPodName, domainNamespace); + checkPodExists(adminServerPodName, domainUid, domainNamespace); + + // check managed server pods exist + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check for managed server pod {0} existence in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkPodExists(managedServerPrefix + i, domainUid, domainNamespace); + } + + // check admin server pod is ready + logger.info("Wait for admin server pod {0} to be ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Wait for managed server pod {0} to be ready in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkPodReady(managedServerPrefix + i, domainUid, domainNamespace); + } + + logger.info("Check admin service {0} is created in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check managed server service {0} is created in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkServiceExists(managedServerPrefix + i, domainNamespace); + } + + logger.info("Getting node port"); + int serviceNodePort = assertDoesNotThrow(() -> getServiceNodePort(domainNamespace, + adminServerPodName + "-external", "default"), + "Getting admin server node port failed"); + + logger.info("Validating WebLogic admin server access by login to console"); + boolean loginSuccessful = assertDoesNotThrow(() -> { + return TestAssertions.adminNodePortAccessible(serviceNodePort, ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT); + }, "Access to admin server node port failed"); + assertTrue(loginSuccessful, "Console login validation failed"); + + } + + private void createDomainResource(String domainUid, String domNamespace, String adminSecretName, + String repoSecretName, int replicaCount, String domainImage) { + logger.info("Image to be used is {0}", domainImage); + // create the domain CR + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("Image") + .image(domainImage) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)))) + .addClustersItem(new Cluster() + .clusterName("cluster-1") + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .model(new Model() + .domainType("WLS")) + .introspectorJobActiveDeadlineSeconds(300L))); + + logger.info("Create domain custom resource for domainUid {0} in namespace {1}", + domainUid, domNamespace); + boolean domCreated = assertDoesNotThrow(() -> createDomainCustomResource(domain), + String.format("Create domain custom resource failed with ApiException for %s in namespace %s", + domainUid, domNamespace)); + assertTrue(domCreated, String.format("Create domain custom resource failed with ApiException " + + "for %s in namespace %s", domainUid, domNamespace)); + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItDomainInImageWdt.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItDomainInImageWdt.java index bae1031b781..5648b8733c1 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItDomainInImageWdt.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItDomainInImageWdt.java @@ -14,8 +14,10 @@ import oracle.weblogic.domain.AdminService; import oracle.weblogic.domain.Channel; import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; import oracle.weblogic.domain.Domain; import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; import oracle.weblogic.domain.ServerPod; import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; import oracle.weblogic.kubernetes.annotations.IntegrationTest; @@ -23,7 +25,7 @@ import oracle.weblogic.kubernetes.annotations.tags.MustNotRunInParallel; import oracle.weblogic.kubernetes.annotations.tags.Slow; import oracle.weblogic.kubernetes.assertions.TestAssertions; -import oracle.weblogic.kubernetes.extensions.LoggedTest; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import org.awaitility.core.ConditionFactory; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -49,6 +51,7 @@ import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.awaitility.Awaitility.with; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -57,7 +60,7 @@ // Test to create model in image domain and verify the domain started successfully @DisplayName("Test to create domain in image domain using wdt and start the domain") @IntegrationTest -class ItDomainInImageWdt implements LoggedTest { +class ItDomainInImageWdt { private static HelmParams opHelmParams = null; private static String opNamespace = null; @@ -67,6 +70,7 @@ class ItDomainInImageWdt implements LoggedTest { private static String dockerConfigJson = ""; private String domainUid = "domain1"; private static Map secretNameMap; + private static LoggingFacade logger = null; /** * Install Operator. @@ -75,6 +79,7 @@ class ItDomainInImageWdt implements LoggedTest { */ @BeforeAll public static void initAll(@Namespaces(2) List namespaces) { + logger = getLogger(); // create standard, reusable retry/backoff policy withStandardRetryPolicy = with().pollDelay(2, SECONDS) .and().with().pollInterval(10, SECONDS) @@ -205,7 +210,7 @@ private void createDomainResource(String domainUid, String domNamespace, String .namespace(domNamespace)) .spec(new DomainSpec() .domainUid(domainUid) - .domainHomeInImage(true) + .domainHomeSourceType("Image") .image(WDT_BASIC_IMAGE_NAME + ":" + WDT_BASIC_IMAGE_TAG) .addImagePullSecretsItem(new V1LocalObjectReference() .name(repoSecretName)) @@ -230,7 +235,11 @@ private void createDomainResource(String domainUid, String domNamespace, String .addClustersItem(new Cluster() .clusterName("cluster-1") .replicas(replicaCount) - .serverStartState("RUNNING"))); + .serverStartState("RUNNING")) + .configuration(new Configuration() + .model(new Model() + .domainType("WLS")) + .introspectorJobActiveDeadlineSeconds(300L))); logger.info("Create domain custom resource for domainUid {0} in namespace {1}", domainUid, domNamespace); diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItDomainInPV.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItDomainInPV.java index 0613c86600e..a28d51eedfd 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItDomainInPV.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItDomainInPV.java @@ -7,7 +7,6 @@ import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -17,30 +16,12 @@ import java.util.Map; import java.util.Properties; -import io.kubernetes.client.custom.Quantity; -import io.kubernetes.client.openapi.ApiException; -import io.kubernetes.client.openapi.models.V1ConfigMap; -import io.kubernetes.client.openapi.models.V1ConfigMapVolumeSource; import io.kubernetes.client.openapi.models.V1Container; -import io.kubernetes.client.openapi.models.V1ContainerPort; import io.kubernetes.client.openapi.models.V1EnvVar; -import io.kubernetes.client.openapi.models.V1HostPathVolumeSource; -import io.kubernetes.client.openapi.models.V1Job; -import io.kubernetes.client.openapi.models.V1JobCondition; -import io.kubernetes.client.openapi.models.V1JobSpec; import io.kubernetes.client.openapi.models.V1LocalObjectReference; import io.kubernetes.client.openapi.models.V1ObjectMeta; -import io.kubernetes.client.openapi.models.V1PersistentVolume; -import io.kubernetes.client.openapi.models.V1PersistentVolumeClaim; -import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimSpec; import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimVolumeSource; -import io.kubernetes.client.openapi.models.V1PersistentVolumeSpec; -import io.kubernetes.client.openapi.models.V1Pod; -import io.kubernetes.client.openapi.models.V1PodSpec; -import io.kubernetes.client.openapi.models.V1PodTemplateSpec; -import io.kubernetes.client.openapi.models.V1ResourceRequirements; import io.kubernetes.client.openapi.models.V1SecretReference; -import io.kubernetes.client.openapi.models.V1SecurityContext; import io.kubernetes.client.openapi.models.V1Volume; import io.kubernetes.client.openapi.models.V1VolumeMount; import oracle.weblogic.domain.AdminServer; @@ -53,13 +34,10 @@ import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; import oracle.weblogic.kubernetes.annotations.IntegrationTest; import oracle.weblogic.kubernetes.annotations.Namespaces; -import oracle.weblogic.kubernetes.extensions.LoggedTest; -import oracle.weblogic.kubernetes.utils.CommonTestUtils; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import oracle.weblogic.kubernetes.utils.DeployUtil; import oracle.weblogic.kubernetes.utils.ExecResult; import oracle.weblogic.kubernetes.utils.OracleHttpClient; -import org.apache.commons.io.FileUtils; -import org.awaitility.core.ConditionFactory; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.BeforeAll; @@ -69,8 +47,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; -import static java.util.concurrent.TimeUnit.MINUTES; -import static java.util.concurrent.TimeUnit.SECONDS; import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; @@ -81,43 +57,38 @@ import static oracle.weblogic.kubernetes.TestConstants.OCR_REGISTRY; import static oracle.weblogic.kubernetes.TestConstants.OCR_SECRET_NAME; import static oracle.weblogic.kubernetes.TestConstants.OCR_USERNAME; -import static oracle.weblogic.kubernetes.TestConstants.PV_ROOT; import static oracle.weblogic.kubernetes.actions.ActionConstants.ITTESTS_DIR; import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; import static oracle.weblogic.kubernetes.actions.ActionConstants.WDT_VERSION; import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_NAME; import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_TAG; -import static oracle.weblogic.kubernetes.actions.TestActions.createConfigMap; -import static oracle.weblogic.kubernetes.actions.TestActions.createNamespacedJob; -import static oracle.weblogic.kubernetes.actions.TestActions.createPersistentVolume; -import static oracle.weblogic.kubernetes.actions.TestActions.createPersistentVolumeClaim; import static oracle.weblogic.kubernetes.actions.TestActions.execCommand; import static oracle.weblogic.kubernetes.actions.TestActions.getContainerRestartCount; -import static oracle.weblogic.kubernetes.actions.TestActions.getJob; -import static oracle.weblogic.kubernetes.actions.TestActions.getPodLog; import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; -import static oracle.weblogic.kubernetes.actions.TestActions.listPods; import static oracle.weblogic.kubernetes.actions.TestActions.uninstallNginx; import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.copyFileToPod; import static oracle.weblogic.kubernetes.assertions.TestAssertions.adminNodePortAccessible; -import static oracle.weblogic.kubernetes.assertions.TestAssertions.jobCompleted; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createConfigMapForDomainCreation; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainJob; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createIngressForDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createPV; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createPVC; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyNginx; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; import static oracle.weblogic.kubernetes.utils.TestUtils.callWebAppAndCheckForServerNameInResponse; import static oracle.weblogic.kubernetes.utils.TestUtils.getNextFreePort; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.assertj.core.api.Assertions.assertThat; -import static org.awaitility.Awaitility.with; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; /** * Tests to create domain in persistent volume using WLST and WDT. @@ -125,7 +96,7 @@ @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @DisplayName("Verify the WebLogic server pods can run with domain created in persistent volume") @IntegrationTest -public class ItDomainInPV implements LoggedTest { +public class ItDomainInPV { private static String opNamespace = null; private static String wlstDomainNamespace = null; @@ -142,13 +113,9 @@ public class ItDomainInPV implements LoggedTest { private final String wlSecretName = "weblogic-credentials"; private boolean previousTestSuccessful = false; private String wdtCurlRequest = null; - private List wdtDomainManagedServers = new ArrayList<>(); + private final List wdtDomainManagedServers = new ArrayList<>(); - // create standard, reusable retry/backoff policy - private static final ConditionFactory withStandardRetryPolicy - = with().pollDelay(2, SECONDS) - .and().with().pollInterval(10, SECONDS) - .atMost(5, MINUTES).await(); + private static LoggingFacade logger = null; /** * Assigns unique namespaces for operator and domains. @@ -159,7 +126,7 @@ public class ItDomainInPV implements LoggedTest { */ @BeforeAll public static void initAll(@Namespaces(4) List namespaces) { - + logger = getLogger(); logger.info("Assign a unique namespace for operator"); assertNotNull(namespaces.get(0), "Namespace is null"); opNamespace = namespaces.get(0); @@ -173,16 +140,15 @@ public static void initAll(@Namespaces(4) List namespaces) { assertNotNull(namespaces.get(3), "Namespace is null"); nginxNamespace = namespaces.get(3); - // install operator and verify its running in ready state installAndVerifyOperator(opNamespace, wdtDomainNamespace, wlstDomainNamespace); - // get a free node port for NGINX - nodeportshttp = getNextFreePort(30305, 30405); - int nodeportshttps = getNextFreePort(30443, 30543); - // install and verify NGINX - nginxHelmParams = installAndVerifyNginx(nginxNamespace, nodeportshttp, nodeportshttps); + nginxHelmParams = installAndVerifyNginx(nginxNamespace, 0, 0); + String nginxServiceName = nginxHelmParams.getReleaseName() + "-nginx-ingress-controller"; + logger.info("NGINX service name: {0}", nginxServiceName); + nodeportshttp = getServiceNodePort(nginxNamespace, nginxServiceName, "http"); + logger.info("NGINX http node port: {0}", nodeportshttp); //determine if the tests are running in Kind cluster. if true use images from Kind registry if (KIND_REPO != null) { @@ -224,9 +190,7 @@ public void testDomainInPvUsingWdt() { createSecretWithUsernamePassword(wlSecretName, wdtDomainNamespace, ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT); - // create persistent volume and persistent volume claim for domain - // these resources should be labeled with domainUid for cleanup after testing - createPV(pvName, wdtDomainUid); + createPV(pvName, wdtDomainUid, this.getClass().getSimpleName()); createPVC(pvName, pvcName, wdtDomainUid, wdtDomainNamespace); // create a temporary WebLogic domain property file as a input for WDT model file @@ -269,7 +233,7 @@ public void testDomainInPvUsingWdt() { .spec(new DomainSpec() //spec .domainUid(wdtDomainUid) .domainHome("/shared/domains/" + wdtDomainUid) // point to domain home in pv - .domainHomeInImage(false) // set the domain home source type as pv + .domainHomeSourceType("PersistentVolume") // set the domain home source type as pv .image(image) .imagePullPolicy("IfNotPresent") .imagePullSecrets(isUseSecret ? Arrays.asList( @@ -376,7 +340,7 @@ public void testDomainInPvUsingWdt() { logger.info("Accessing the sample app through NGINX load balancer"); wdtCurlRequest = String.format("curl --silent --show-error --noproxy '*' " + "-H 'host: %s' http://%s:%s/testwebapp/index.jsp", - wdtDomainUid + "." + clusterName + ".test", K8S_NODEPORT_HOST, nodeportshttp); + wdtDomainUid + "." + wdtDomainNamespace + "." + clusterName + ".test", K8S_NODEPORT_HOST, nodeportshttp); for (int i = 1; i <= replicaCount; i++) { wdtDomainManagedServers.add(wdtDomainUid + "-" + wdtManagedServerNameBase + i); } @@ -483,7 +447,7 @@ public void testDomainInPvUsingWlst() { final int managedServerPort = 8001; String managedServerPodNamePrefix = domainUid + "-" + managedServerNameBase; final int replicaCount = 2; - final int t3ChannelPort = getNextFreePort(30000, 32767); // the port range has to be between 30,000 to 32,767 + final int t3ChannelPort = getNextFreePort(31101, 32767); final String pvName = domainUid + "-pv"; // name of the persistent volume final String pvcName = domainUid + "-pvc"; // name of the persistent volume claim @@ -499,7 +463,7 @@ public void testDomainInPvUsingWlst() { // create persistent volume and persistent volume claim for domain // these resources should be labeled with domainUid for cleanup after testing - createPV(pvName, domainUid); + createPV(pvName, domainUid, this.getClass().getSimpleName()); createPVC(pvName, pvcName, domainUid, wlstDomainNamespace); // create a temporary WebLogic domain property file @@ -543,7 +507,7 @@ public void testDomainInPvUsingWlst() { .spec(new DomainSpec() .domainUid(domainUid) .domainHome("/shared/domains/" + domainUid) // point to domain home in pv - .domainHomeInImage(false) // set the domain home source type as pv + .domainHomeSourceType("PersistentVolume") // set the domain home source type as pv .image(image) .imagePullPolicy("IfNotPresent") .imagePullSecrets(isUseSecret ? Arrays.asList( @@ -650,7 +614,7 @@ public void testDomainInPvUsingWlst() { logger.info("Accessing the sample app through NGINX load balancer"); String curlRequest = String.format("curl --silent --show-error --noproxy '*' " + "-H 'host: %s' http://%s:%s/testwebapp/index.jsp", - domainUid + "." + clusterName + ".test", K8S_NODEPORT_HOST, nodeportshttp); + domainUid + "." + wlstDomainNamespace + "." + clusterName + ".test", K8S_NODEPORT_HOST, nodeportshttp); List managedServers = new ArrayList<>(); for (int i = 1; i <= replicaCount; i++) { managedServers.add(domainUid + "-" + managedServerNameBase + i); @@ -699,7 +663,8 @@ private void createDomainOnPVUsingWlst(Path wlstScriptFile, Path domainPropertie logger.info("Creating a config map to hold domain creation scripts"); String domainScriptConfigMapName = "create-domain-scripts-cm"; assertDoesNotThrow( - () -> createConfigMapForDomainCreation(domainScriptConfigMapName, domainScriptFiles, namespace), + () -> createConfigMapForDomainCreation( + domainScriptConfigMapName, domainScriptFiles, namespace, this.getClass().getSimpleName()), "Create configmap for domain creation failed"); // create a V1Container with specific scripts and properties for creating domain @@ -712,7 +677,8 @@ private void createDomainOnPVUsingWlst(Path wlstScriptFile, Path domainPropertie .addArgsItem("/u01/weblogic/" + domainPropertiesFile.getFileName()); //domain property file logger.info("Running a Kubernetes job to create the domain"); - createDomainJob(pvName, pvcName, domainScriptConfigMapName, namespace, jobCreationContainer); + createDomainJob(image, isUseSecret, pvName, pvcName, domainScriptConfigMapName, + namespace, jobCreationContainer); } @@ -742,7 +708,8 @@ private void createDomainOnPVUsingWdt(Path domainCreationScriptFile, Path modelF logger.info("Creating a config map to hold domain creation scripts"); String domainScriptConfigMapName = "create-domain-scripts-cm"; assertDoesNotThrow( - () -> createConfigMapForDomainCreation(domainScriptConfigMapName, domainScriptFiles, namespace), + () -> createConfigMapForDomainCreation( + domainScriptConfigMapName, domainScriptFiles, namespace, this.getClass().getSimpleName()), "Create configmap for domain creation failed"); // create a V1Container with specific scripts and properties for creating domain @@ -763,227 +730,18 @@ private void createDomainOnPVUsingWdt(Path domainCreationScriptFile, Path modelF .value("/shared/domains/" + domainUid)); // domain location logger.info("Running a Kubernetes job to create the domain"); - createDomainJob(pvName, pvcName, domainScriptConfigMapName, namespace, jobCreationContainer); + createDomainJob(image, isUseSecret, pvName, pvcName, domainScriptConfigMapName, + namespace, jobCreationContainer); } - /** - * Create configmap containing domain creation scripts. - * - * @param configMapName name of the configmap to create - * @param files files to add in configmap - * @param namespace name of the namespace in which to create configmap - * @throws IOException when reading the domain script files fail - * @throws ApiException if create configmap fails - */ - private void createConfigMapForDomainCreation(String configMapName, List files, String namespace) - throws ApiException, IOException { - logger.info("Creating configmap {0}", configMapName); - - Path domainScriptsDir = Files.createDirectories( - Paths.get(TestConstants.LOGS_DIR, this.getClass().getSimpleName(), namespace)); - - // add domain creation scripts and properties files to the configmap - Map data = new HashMap<>(); - for (Path file : files) { - logger.info("Adding file {0} in configmap", file); - data.put(file.getFileName().toString(), Files.readString(file)); - logger.info("Making a copy of file {0} to {1} for diagnostic purposes", file, - domainScriptsDir.resolve(file.getFileName())); - Files.copy(file, domainScriptsDir.resolve(file.getFileName())); - } - V1ObjectMeta meta = new V1ObjectMeta() - .name(configMapName) - .namespace(namespace); - V1ConfigMap configMap = new V1ConfigMap() - .data(data) - .metadata(meta); - - boolean cmCreated = assertDoesNotThrow(() -> createConfigMap(configMap), - String.format("Failed to create configmap %s with files %s", configMapName, files)); - assertTrue(cmCreated, String.format("Failed while creating ConfigMap %s", configMapName)); - } - - /** - * Create a job to create a domain in persistent volume. - * - * @param pvName name of the persistent volume to create domain in - * @param pvcName name of the persistent volume claim - * @param domainScriptCM configmap holding domain creation script files - * @param namespace name of the domain namespace in which the job is created - * @param jobContainer V1Container with job commands to create domain - */ - private void createDomainJob(String pvName, - String pvcName, String domainScriptCM, String namespace, V1Container jobContainer) { - logger.info("Running Kubernetes job to create domain"); - - V1Job jobBody = new V1Job() - .metadata( - new V1ObjectMeta() - .name("create-domain-onpv-job-" + pvName) // name of the create domain job - .namespace(namespace)) - .spec(new V1JobSpec() - .backoffLimit(0) // try only once - .template(new V1PodTemplateSpec() - .spec(new V1PodSpec() - .restartPolicy("Never") - .initContainers(Arrays.asList(new V1Container() - .name("fix-pvc-owner") // change the ownership of the pv to opc:opc - .image(image) - .addCommandItem("/bin/sh") - .addArgsItem("-c") - .addArgsItem("chown -R 1000:1000 /shared") - .volumeMounts(Arrays.asList( - new V1VolumeMount() - .name(pvName) - .mountPath("/shared"))) - .securityContext(new V1SecurityContext() - .runAsGroup(0L) - .runAsUser(0L)))) - .containers(Arrays.asList(jobContainer // container containing WLST or WDT details - .name("create-weblogic-domain-onpv-container") - .image(image) - .imagePullPolicy("Always") - .ports(Arrays.asList(new V1ContainerPort() - .containerPort(7001))) - .volumeMounts(Arrays.asList( - new V1VolumeMount() - .name("create-weblogic-domain-job-cm-volume") // domain creation scripts volume - .mountPath("/u01/weblogic"), // availble under /u01/weblogic inside pod - new V1VolumeMount() - .name(pvName) // location to write domain - .mountPath("/shared"))))) // mounted under /shared inside pod - .volumes(Arrays.asList( - new V1Volume() - .name(pvName) - .persistentVolumeClaim( - new V1PersistentVolumeClaimVolumeSource() - .claimName(pvcName)), - new V1Volume() - .name("create-weblogic-domain-job-cm-volume") - .configMap( - new V1ConfigMapVolumeSource() - .name(domainScriptCM)))) //config map containing domain scripts - .imagePullSecrets(isUseSecret ? Arrays.asList( - new V1LocalObjectReference() - .name(OCR_SECRET_NAME)) - : null)))); - String jobName = assertDoesNotThrow(() - -> createNamespacedJob(jobBody), "Failed to create Job"); - - logger.info("Checking if the domain creation job {0} completed in namespace {1}", - jobName, namespace); - withStandardRetryPolicy - .conditionEvaluationListener( - condition -> logger.info("Waiting for job {0} to be completed in namespace {1} " - + "(elapsed time {2} ms, remaining time {3} ms)", - jobName, - namespace, - condition.getElapsedTimeInMS(), - condition.getRemainingTimeInMS())) - .until(jobCompleted(jobName, null, namespace)); - - // check job status and fail test if the job failed to create domain - V1Job job = assertDoesNotThrow(() -> getJob(jobName, namespace), - "Getting the job failed"); - if (job != null) { - V1JobCondition jobCondition = job.getStatus().getConditions().stream().filter( - v1JobCondition -> "Failed".equalsIgnoreCase(v1JobCondition.getType())) - .findAny() - .orElse(null); - if (jobCondition != null) { - logger.severe("Job {0} failed to create domain", jobName); - List pods = assertDoesNotThrow(() -> listPods( - namespace, "job-name=" + jobName).getItems(), - "Listing pods failed"); - if (!pods.isEmpty()) { - String podLog = assertDoesNotThrow(() -> getPodLog(pods.get(0).getMetadata().getName(), namespace), - "Failed to get pod log"); - logger.severe(podLog); - fail("Domain create job failed"); - } - } - } - - } - - /** - * Create a persistent volume. - * - * @param pvName name of the persistent volume to create - * @param domainUid domain UID - * @throws IOException when creating pv path fails - */ - private void createPV(String pvName, String domainUid) { - logger.info("creating persistent volume"); - - Path pvHostPath = null; - try { - pvHostPath = Files.createDirectories(Paths.get( - PV_ROOT, this.getClass().getSimpleName(), pvName)); - logger.info("Creating PV directory host path {0}", pvHostPath); - FileUtils.deleteDirectory(pvHostPath.toFile()); - Files.createDirectories(pvHostPath); - } catch (IOException ioex) { - logger.severe(ioex.getMessage()); - fail("Create persistent volume host path failed"); - } - - V1PersistentVolume v1pv = new V1PersistentVolume() - .spec(new V1PersistentVolumeSpec() - .addAccessModesItem("ReadWriteMany") - .storageClassName("weblogic-domain-storage-class") - .volumeMode("Filesystem") - .putCapacityItem("storage", Quantity.fromString("5Gi")) - .persistentVolumeReclaimPolicy("Recycle") - .accessModes(Arrays.asList("ReadWriteMany")) - .hostPath(new V1HostPathVolumeSource() - .path(pvHostPath.toString()))) - .metadata(new V1ObjectMeta() - .name(pvName) - .putLabelsItem("weblogic.resourceVersion", "domain-v2") - .putLabelsItem("weblogic.domainUid", domainUid)); - boolean success = assertDoesNotThrow(() -> createPersistentVolume(v1pv), - "Failed to create persistent volume"); - assertTrue(success, "PersistentVolume creation failed"); - } - - /** - * Create a persistent volume claim. - * - * @param pvName name of the persistent volume - * @param pvcName name of the persistent volume to create - * @param domainUid UID of the WebLogic domain - * @param namespace name of the namespace in which to create the persistent volume claim - */ - private void createPVC(String pvName, String pvcName, String domainUid, String namespace) { - logger.info("creating persistent volume claim"); - - V1PersistentVolumeClaim v1pvc = new V1PersistentVolumeClaim() - .spec(new V1PersistentVolumeClaimSpec() - .addAccessModesItem("ReadWriteMany") - .storageClassName("weblogic-domain-storage-class") - .volumeName(pvName) - .resources(new V1ResourceRequirements() - .putRequestsItem("storage", Quantity.fromString("5Gi")))) - .metadata(new V1ObjectMeta() - .name(pvcName) - .namespace(namespace) - .putLabelsItem("weblogic.resourceVersion", "domain-v2") - .putLabelsItem("weblogic.domainUid", domainUid)); - - boolean success = assertDoesNotThrow(() -> createPersistentVolumeClaim(v1pvc), - "Failed to create persistent volume claim"); - assertTrue(success, "PersistentVolumeClaim creation failed"); - } - /** * Create secret for docker credentials. * * @param namespace name of the namespace in which to create secret */ private void createOCRRepoSecret(String namespace) { - CommonTestUtils.createDockerRegistrySecret(OCR_USERNAME, OCR_PASSWORD, + createDockerRegistrySecret(OCR_USERNAME, OCR_PASSWORD, OCR_EMAIL, OCR_REGISTRY, OCR_SECRET_NAME, namespace); } @@ -991,12 +749,12 @@ private File createScriptToKillServer() throws IOException { File killServerScript = File.createTempFile("killserver", ".sh"); //deletes the file when VM terminates killServerScript.deleteOnExit(); - FileWriter fw = new FileWriter(killServerScript); - fw.write("#!/bin/bash\n"); - fw.write("kill -9 `jps | grep Server | awk '{print $1}'`"); - fw.close(); + try (FileWriter fw = new FileWriter(killServerScript)) { + fw.write("#!/bin/bash\n"); + fw.write("kill -9 `jps | grep Server | awk '{print $1}'`"); + } killServerScript.setExecutable(true, false); return killServerScript; } -} \ No newline at end of file +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIntrospectVersion.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIntrospectVersion.java new file mode 100644 index 00000000000..3cb1dd07bc6 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIntrospectVersion.java @@ -0,0 +1,815 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.io.File; +import java.io.FileOutputStream; +import java.net.http.HttpResponse; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; + +import io.kubernetes.client.custom.V1Patch; +import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimVolumeSource; +import io.kubernetes.client.openapi.models.V1Secret; +import io.kubernetes.client.openapi.models.V1SecretList; +import io.kubernetes.client.openapi.models.V1SecretReference; +import io.kubernetes.client.openapi.models.V1Volume; +import io.kubernetes.client.openapi.models.V1VolumeMount; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.BuildApplication; +import oracle.weblogic.kubernetes.utils.OracleHttpClient; +import org.awaitility.core.ConditionEvaluationListener; +import org.awaitility.core.ConditionFactory; +import org.awaitility.core.EvaluatedCondition; +import org.joda.time.DateTime; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.KIND_REPO; +import static oracle.weblogic.kubernetes.TestConstants.OCR_EMAIL; +import static oracle.weblogic.kubernetes.TestConstants.OCR_PASSWORD; +import static oracle.weblogic.kubernetes.TestConstants.OCR_REGISTRY; +import static oracle.weblogic.kubernetes.TestConstants.OCR_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.OCR_USERNAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.APP_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.ITTESTS_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_NAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_TAG; +import static oracle.weblogic.kubernetes.actions.TestActions.getDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.getNextIntrospectVersion; +import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; +import static oracle.weblogic.kubernetes.actions.TestActions.getServicePort; +import static oracle.weblogic.kubernetes.actions.TestActions.patchDomainResourceWithNewIntrospectVersion; +import static oracle.weblogic.kubernetes.actions.TestActions.uninstallNginx; +import static oracle.weblogic.kubernetes.actions.impl.Domain.patchDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.listSecrets; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.podStateNotChanged; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.verifyRollingRestartOccurred; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodDoesNotExist; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createConfigMapForDomainCreation; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainJob; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createIngressForDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createPV; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createPVC; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.getPodCreationTime; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyNginx; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.DeployUtil.deployUsingWlst; +import static oracle.weblogic.kubernetes.utils.TestUtils.getNextFreePort; +import static oracle.weblogic.kubernetes.utils.TestUtils.verifyClusterMemberCommunication; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static oracle.weblogic.kubernetes.utils.WLSTUtils.executeWLSTScript; +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Tests related to introspectVersion attribute. + */ +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@DisplayName("Verify the introspectVersion runs the introspector") +@IntegrationTest +public class ItIntrospectVersion { + + private static String opNamespace = null; + private static String introDomainNamespace = null; + + private static String nginxNamespace = null; + private static int nodeportshttp; + private static HelmParams nginxHelmParams = null; + + private static String image = WLS_BASE_IMAGE_NAME + ":" + WLS_BASE_IMAGE_TAG; + private static boolean isUseSecret = true; + + private final String wlSecretName = "weblogic-credentials"; + + // create standard, reusable retry/backoff policy + private static final ConditionFactory withStandardRetryPolicy + = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + private static Path clusterViewAppPath; + private static LoggingFacade logger = null; + + /** + * Assigns unique namespaces for operator and domains. + * Pull WebLogic image if running tests in Kind cluster. + * Installs operator. + * + * @param namespaces injected by JUnit + */ + @BeforeAll + public static void initAll(@Namespaces(3) List namespaces) { + logger = getLogger(); + logger.info("Assign a unique namespace for operator"); + assertNotNull(namespaces.get(0), "Namespace is null"); + opNamespace = namespaces.get(0); + logger.info("Assign a unique namespace for Introspect Version WebLogic domain"); + assertNotNull(namespaces.get(1), "Namespace is null"); + introDomainNamespace = namespaces.get(1); + logger.info("Assign a unique namespace for NGINX"); + assertNotNull(namespaces.get(2), "Namespace is null"); + nginxNamespace = namespaces.get(2); + + // install operator and verify its running in ready state + installAndVerifyOperator(opNamespace, introDomainNamespace); + + // get a free node port for NGINX + nodeportshttp = getNextFreePort(30305, 30405); + int nodeportshttps = getNextFreePort(30443, 30543); + + // install and verify NGINX + nginxHelmParams = installAndVerifyNginx(nginxNamespace, nodeportshttp, nodeportshttps); + + //determine if the tests are running in Kind cluster. if true use images from Kind registry + if (KIND_REPO != null) { + String kindRepoImage = KIND_REPO + image.substring(TestConstants.OCR_REGISTRY.length() + 1); + logger.info("Using image {0}", kindRepoImage); + image = kindRepoImage; + isUseSecret = false; + } else { + // create pull secrets for WebLogic image when running in non Kind Kubernetes cluster + createOCRRepoSecret(introDomainNamespace); + } + + // build the clusterview application + Path distDir = BuildApplication.buildApplication(Paths.get(APP_DIR, "clusterview"), null, null, + "dist", introDomainNamespace); + assertTrue(Paths.get(distDir.toString(), + "clusterview.war").toFile().exists(), + "Application archive is not available"); + clusterViewAppPath = Paths.get(distDir.toString(), "clusterview.war"); + + } + + + /** + * Test domain status gets updated when introspectVersion attribute is added under domain.spec. + * Test Creates a domain in persistent volume using WLST. + * Updates the cluster configuration; cluster size using online WLST. + * Patches the domain custom resource with introSpectVersion. + * Verifies the introspector runs and the cluster maximum replica is updated + * under domain status. + * Verifies that the new pod comes up and sample application deployment works. + */ + @Order(1) + @Test + @DisplayName("Test introSpectVersion starting a introspector and updating domain status") + public void testDomainIntrospectVersionNotRolling() { + + final String domainUid = "mydomain"; + final String clusterName = "mycluster"; + + final String adminServerName = "admin-server"; + final String adminServerPodName = domainUid + "-" + adminServerName; + + final String managedServerNameBase = "ms-"; + String managedServerPodNamePrefix = domainUid + "-" + managedServerNameBase; + final int managedServerPort = 8001; + + int replicaCount = 2; + + // in general the node port range has to be between 30,000 to 32,767 + // to avoid port conflict because of the delay in using it, the port here + // starts with 30100 + final int t3ChannelPort = getNextFreePort(30100, 32767); + + final String pvName = domainUid + "-pv"; // name of the persistent volume + final String pvcName = domainUid + "-pvc"; // name of the persistent volume claim + + // create WebLogic domain credential secret + createSecretWithUsernamePassword(wlSecretName, introDomainNamespace, + ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT); + + // create persistent volume and persistent volume claim for domain + // these resources should be labeled with domainUid for cleanup after testing + createPV(pvName, domainUid, this.getClass().getSimpleName()); + createPVC(pvName, pvcName, domainUid, introDomainNamespace); + + // create a temporary WebLogic domain property file + File domainPropertiesFile = assertDoesNotThrow(() -> + File.createTempFile("domain", "properties"), + "Failed to create domain properties file"); + Properties p = new Properties(); + p.setProperty("domain_path", "/shared/domains"); + p.setProperty("domain_name", domainUid); + p.setProperty("cluster_name", clusterName); + p.setProperty("admin_server_name", adminServerName); + p.setProperty("managed_server_port", Integer.toString(managedServerPort)); + p.setProperty("admin_server_port", "7001"); + p.setProperty("admin_username", ADMIN_USERNAME_DEFAULT); + p.setProperty("admin_password", ADMIN_PASSWORD_DEFAULT); + p.setProperty("admin_t3_public_address", K8S_NODEPORT_HOST); + p.setProperty("admin_t3_channel_port", Integer.toString(t3ChannelPort)); + p.setProperty("number_of_ms", "2"); + p.setProperty("managed_server_name_base", managedServerNameBase); + p.setProperty("domain_logs", "/shared/logs"); + p.setProperty("production_mode_enabled", "true"); + assertDoesNotThrow(() -> + p.store(new FileOutputStream(domainPropertiesFile), "domain properties file"), + "Failed to write domain properties file"); + + // WLST script for creating domain + Path wlstScript = Paths.get(RESOURCE_DIR, "python-scripts", "wlst-create-domain-onpv.py"); + + // create configmap and domain on persistent volume using the WLST script and property file + createDomainOnPVUsingWlst(wlstScript, domainPropertiesFile.toPath(), + pvName, pvcName, introDomainNamespace); + + // create a domain custom resource configuration object + logger.info("Creating domain custom resource"); + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(introDomainNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHome("/shared/domains/" + domainUid) // point to domain home in pv + .domainHomeSourceType("PersistentVolume") // set the domain home source type as pv + .image(image) + .imagePullPolicy("IfNotPresent") + .imagePullSecrets(isUseSecret ? Arrays.asList( + new V1LocalObjectReference() + .name(OCR_SECRET_NAME)) + : null) + .webLogicCredentialsSecret(new V1SecretReference() + .name(wlSecretName) + .namespace(introDomainNamespace)) + .includeServerOutInPodLog(true) + .logHomeEnabled(Boolean.TRUE) + .logHome("/shared/logs/" + domainUid) + .dataHome("") + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() //serverpod + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom ")) + .addVolumesItem(new V1Volume() + .name(pvName) + .persistentVolumeClaim(new V1PersistentVolumeClaimVolumeSource() + .claimName(pvcName))) + .addVolumeMountsItem(new V1VolumeMount() + .mountPath("/shared") + .name(pvName))) + .adminServer(new AdminServer() //admin server + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)) + .addChannelsItem(new Channel() + .channelName("T3Channel") + .nodePort(t3ChannelPort)))) + .addClustersItem(new Cluster() //cluster + .clusterName(clusterName) + .replicas(replicaCount) + .serverStartState("RUNNING"))); + + // verify the domain custom resource is created + createDomainAndVerify(domain, introDomainNamespace); + + // verify the admin server service created + checkServiceExists(adminServerPodName, introDomainNamespace); + + // verify admin server pod is ready + checkPodReady(adminServerPodName, domainUid, introDomainNamespace); + + // verify managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Checking managed server service {0} is created in namespace {1}", + managedServerPodNamePrefix + i, introDomainNamespace); + checkServiceExists(managedServerPodNamePrefix + i, introDomainNamespace); + } + + // verify managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Waiting for managed server pod {0} to be ready in namespace {1}", + managedServerPodNamePrefix + i, introDomainNamespace); + checkPodReady(managedServerPodNamePrefix + i, domainUid, introDomainNamespace); + } + + // get the pod creation time stamps + LinkedHashMap pods = new LinkedHashMap<>(); + // get the creation time of the admin server pod before patching + DateTime adminPodCreationTime = getPodCreationTime(introDomainNamespace, adminServerPodName); + pods.put(adminServerPodName, adminPodCreationTime); + // get the creation time of the managed server pods before patching + for (int i = 1; i <= replicaCount; i++) { + pods.put(managedServerPodNamePrefix + i, + getPodCreationTime(introDomainNamespace, managedServerPodNamePrefix + i)); + } + + logger.info("change the cluster size to 3 and verify the introspector runs and updates the domain status"); + // create a temporary WebLogic WLST property file + File wlstPropertiesFile = assertDoesNotThrow(() -> File.createTempFile("wlst", "properties"), + "Creating WLST properties file failed"); + Properties p1 = new Properties(); + p1.setProperty("admin_host", K8S_NODEPORT_HOST); + p1.setProperty("admin_port", Integer.toString(t3ChannelPort)); + p1.setProperty("admin_username", ADMIN_USERNAME_DEFAULT); + p1.setProperty("admin_password", ADMIN_PASSWORD_DEFAULT); + p1.setProperty("cluster_name", clusterName); + p1.setProperty("max_cluster_size", Integer.toString(3)); + p1.setProperty("test_name", "change_server_count"); + assertDoesNotThrow(() -> p1.store(new FileOutputStream(wlstPropertiesFile), "wlst properties file"), + "Failed to write the WLST properties to file"); + + // change the server count of the cluster by running online WLST + Path configScript = Paths.get(RESOURCE_DIR, "python-scripts", "introspect_version_script.py"); + executeWLSTScript(configScript, wlstPropertiesFile.toPath(), introDomainNamespace); + + // patch the domain to increase the replicas of the cluster and add introspectVersion field + String introspectVersion = assertDoesNotThrow(() -> getNextIntrospectVersion(domainUid, introDomainNamespace)); + String patchStr = + "[" + + "{\"op\": \"replace\", \"path\": \"/spec/clusters/0/replicas\", \"value\": 3}," + + "{\"op\": \"add\", \"path\": \"/spec/introspectVersion\", \"value\": \"" + introspectVersion + "\"}" + + "]"; + + logger.info("Updating replicas in cluster {0} using patch string: {1}", clusterName, patchStr); + V1Patch patch = new V1Patch(patchStr); + assertTrue(patchDomainCustomResource(domainUid, introDomainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH), + "Failed to patch domain"); + + //verify the introspector pod is created and runs + logger.info("Verifying introspector pod is created, runs and deleted"); + String introspectPodName = domainUid + "-" + "introspect-domain-job"; + checkPodExists(introspectPodName, domainUid, introDomainNamespace); + checkPodDoesNotExist(introspectPodName, domainUid, introDomainNamespace); + + //verify the maximum cluster size is updated to expected value + withStandardRetryPolicy.conditionEvaluationListener(new ConditionEvaluationListener() { + @Override + public void conditionEvaluated(EvaluatedCondition condition) { + logger.info("Waiting for Domain.status.clusters.{0}.maximumReplicas to be {1}", + clusterName, 3); + } + }) + .until((Callable) () -> { + Domain res = getDomainCustomResource(domainUid, introDomainNamespace); + return (res.getStatus().getClusters().get(0).getMaximumReplicas() == 3); + } + ); + + // verify the 3rd server pod comes up + checkServiceExists(managedServerPodNamePrefix + 3, introDomainNamespace); + checkPodReady(managedServerPodNamePrefix + 3, domainUid, introDomainNamespace); + + // verify existing managed server services are not affected + for (int i = 1; i <= replicaCount; i++) { + logger.info("Checking managed server service {0} is created in namespace {1}", + managedServerPodNamePrefix + i, introDomainNamespace); + checkServiceExists(managedServerPodNamePrefix + i, introDomainNamespace); + } + + // verify existing managed server pods are not affected + for (int i = 1; i <= replicaCount; i++) { + logger.info("Waiting for managed server pod {0} to be ready in namespace {1}", + managedServerPodNamePrefix + i, introDomainNamespace); + checkPodReady(managedServerPodNamePrefix + i, domainUid, introDomainNamespace); + } + + // verify existing pods are not restarted + podStateNotChanged(adminServerPodName, domainUid, introDomainNamespace, adminPodCreationTime); + for (int i = 1; i <= replicaCount; i++) { + podStateNotChanged(managedServerPodNamePrefix + i, + domainUid, introDomainNamespace, pods.get(i)); + } + + //create ingress controller + Map clusterNameMsPortMap = new HashMap<>(); + clusterNameMsPortMap.put(clusterName, managedServerPort); + logger.info("Creating ingress for domain {0} in namespace {1}", domainUid, introDomainNamespace); + createIngressForDomainAndVerify(domainUid, introDomainNamespace, clusterNameMsPortMap); + + // deploy application and verify all servers functions normally + logger.info("Getting node port for T3 channel"); + int t3channelNodePort = assertDoesNotThrow(() + -> getServiceNodePort(introDomainNamespace, adminServerPodName + "-external", "t3channel"), + "Getting admin server t3channel node port failed"); + assertNotEquals(-1, t3ChannelPort, "admin server t3channelport is not valid"); + + //deploy application + Path archivePath = Paths.get(ITTESTS_DIR, "../src/integration-tests/apps/testwebapp.war"); + logger.info("Deploying webapp to domain {0}", archivePath); + deployUsingWlst(K8S_NODEPORT_HOST, Integer.toString(t3channelNodePort), + ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT, clusterName + "," + adminServerName, archivePath, + introDomainNamespace); + + logger.info("Getting node port for default channel"); + int serviceNodePort = assertDoesNotThrow(() + -> getServiceNodePort(introDomainNamespace, adminServerPodName + "-external", "default"), + "Getting admin server node port failed"); + + //access application from admin server + String url = "http://" + K8S_NODEPORT_HOST + ":" + serviceNodePort + "/testwebapp/index.jsp"; + assertEquals(200, + assertDoesNotThrow(() -> OracleHttpClient.get(url, true), + "Accessing sample application on admin server failed") + .statusCode(), "Status code not equals to 200"); + + + //deploy clusterview application + logger.info("Deploying clusterview app {0} to cluster {1}", + clusterViewAppPath, clusterName); + deployUsingWlst(K8S_NODEPORT_HOST, Integer.toString(t3channelNodePort), + ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT, adminServerName + "," + clusterName, clusterViewAppPath, + introDomainNamespace); + + logger.info("Getting the list of servers using the listServers"); + String baseUri = "http://" + K8S_NODEPORT_HOST + ":" + serviceNodePort + "/clusterview/"; + String serverListUri = "ClusterViewServlet?listServers=true"; + for (int i = 0; i < 5; i++) { + assertDoesNotThrow(() -> TimeUnit.SECONDS.sleep(30)); + HttpResponse response = assertDoesNotThrow(() -> OracleHttpClient.get(baseUri + serverListUri, true)); + assertEquals(200, response.statusCode(), "Status code not equals to 200"); + } + + //access application in managed servers through NGINX load balancer + logger.info("Accessing the clusterview app through NGINX load balancer"); + String curlRequest = String.format("curl --silent --show-error --noproxy '*' " + + "-H 'host: %s' http://%s:%s/clusterview/ClusterViewServlet", + domainUid + "." + introDomainNamespace + "." + clusterName + ".test", K8S_NODEPORT_HOST, nodeportshttp); + List managedServers = new ArrayList<>(); + for (int i = 1; i <= replicaCount + 1; i++) { + managedServers.add(managedServerNameBase + i); + } + assertThat(verifyClusterMemberCommunication(curlRequest, managedServers, 20)) + .as("Verify all managed servers can see each other") + .withFailMessage("managed servers cannot see other") + .isTrue(); + + } + + /** + * Test server pods are rolling restarted and updated when domain is patched + * with introSpectVersion when non dynamic changes are made. + * Updates the admin server listen port using online WLST. + * Patches the domain custom resource with introSpectVersion. + * Verifies the introspector runs and pods are restated in a rolling fashion. + * Verifies the new admin port of the admin server in services. + * Verifies accessing sample application in admin server works. + */ + @Order(2) + @Test + @DisplayName("Test introspectVersion rolling server pods when admin server port is changed") + public void testDomainIntrospectVersionRolling() { + + final String domainUid = "mydomain"; + final String clusterName = "mycluster"; + + final String adminServerName = "admin-server"; + final String adminServerPodName = domainUid + "-" + adminServerName; + + final String managedServerNameBase = "ms-"; + String managedServerPodNamePrefix = domainUid + "-" + managedServerNameBase; + + final int replicaCount = 3; + final int newAdminPort = 7005; + + // get the pod creation time stamps + LinkedHashMap pods = new LinkedHashMap<>(); + // get the creation time of the admin server pod before patching + DateTime adminPodCreationTime = getPodCreationTime(introDomainNamespace, adminServerPodName); + pods.put(adminServerPodName, adminPodCreationTime); + // get the creation time of the managed server pods before patching + for (int i = 1; i <= replicaCount; i++) { + pods.put(managedServerPodNamePrefix + i, + getPodCreationTime(introDomainNamespace, managedServerPodNamePrefix + i)); + } + + logger.info("Getting node port for default channel"); + int adminServerT3Port = assertDoesNotThrow(() + -> getServiceNodePort(introDomainNamespace, adminServerPodName + "-external", "t3channel"), + "Getting admin server node port failed"); + + // create a temporary WebLogic WLST property file + File wlstPropertiesFile = assertDoesNotThrow(() -> File.createTempFile("wlst", "properties"), + "Creating WLST properties file failed"); + Properties p = new Properties(); + p.setProperty("admin_host", K8S_NODEPORT_HOST); + p.setProperty("admin_port", Integer.toString(adminServerT3Port)); + p.setProperty("admin_username", ADMIN_USERNAME_DEFAULT); + p.setProperty("admin_password", ADMIN_PASSWORD_DEFAULT); + p.setProperty("cluster_name", clusterName); + p.setProperty("new_admin_port", Integer.toString(newAdminPort)); + p.setProperty("test_name", "change_admin_port"); + assertDoesNotThrow(() -> p.store(new FileOutputStream(wlstPropertiesFile), "wlst properties file"), + "Failed to write the WLST properties to file"); + + // change the admin server port to a different value to force pod restart + logger.info("changing the admin server port to a different value to force pod restart"); + Path configScript = Paths.get(RESOURCE_DIR, "python-scripts", "introspect_version_script.py"); + executeWLSTScript(configScript, wlstPropertiesFile.toPath(), introDomainNamespace); + + assertTrue(assertDoesNotThrow(() -> + patchDomainResourceWithNewIntrospectVersion(domainUid, introDomainNamespace), + "Patch domain with new IntrospectVersion threw ApiException"), + "Failed to patch domain with new IntrospectVersion"); + + //verify the introspector pod is created and runs + String introspectPodName = domainUid + "-" + "introspect-domain-job"; + + checkPodExists(introspectPodName, domainUid, introDomainNamespace); + checkPodDoesNotExist(introspectPodName, domainUid, introDomainNamespace); + + //verify the pods are restarted + verifyRollingRestartOccurred(pods, 1, introDomainNamespace); + + // verify the admin server service created + checkServiceExists(adminServerPodName, introDomainNamespace); + + // verify admin server pod is ready + checkPodReady(adminServerPodName, domainUid, introDomainNamespace); + + // verify managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Checking managed server service {0} is created in namespace {1}", + managedServerPodNamePrefix + i, introDomainNamespace); + checkServiceExists(managedServerPodNamePrefix + i, introDomainNamespace); + } + + // verify managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Waiting for managed server pod {0} to be ready in namespace {1}", + managedServerPodNamePrefix + i, introDomainNamespace); + checkPodReady(managedServerPodNamePrefix + i, domainUid, introDomainNamespace); + } + + // verify the admin port is changed to newAdminPort + assertEquals(newAdminPort, assertDoesNotThrow(() + -> getServicePort(introDomainNamespace, adminServerPodName + "-external", "default"), + "Getting admin server port failed"), + "Updated admin server port is not equal to expected value"); + + logger.info("Getting node port for default channel"); + int adminServerNodePort = assertDoesNotThrow(() + -> getServiceNodePort(introDomainNamespace, adminServerPodName + "-external", "default"), + "Getting admin server node port failed"); + + //access application from admin server to validate the new port + String url = "http://" + K8S_NODEPORT_HOST + ":" + adminServerNodePort + "/testwebapp/index.jsp"; + assertEquals(200, + assertDoesNotThrow(() -> OracleHttpClient.get(url, true), + "Accessing sample application on admin server failed") + .statusCode(), "Status code not equals to 200"); + + logger.info("Getting the list of servers using the listServers"); + String baseUri = "http://" + K8S_NODEPORT_HOST + ":" + adminServerNodePort + "/clusterview/"; + String serverListUri = "ClusterViewServlet?listServers=true"; + for (int i = 0; i < 5; i++) { + assertDoesNotThrow(() -> TimeUnit.SECONDS.sleep(30)); + HttpResponse response = assertDoesNotThrow(() -> OracleHttpClient.get(baseUri + serverListUri, true)); + assertEquals(200, response.statusCode(), "Status code not equals to 200"); + } + + //access application in managed servers through NGINX load balancer + logger.info("Accessing the clusterview app through NGINX load balancer"); + String curlRequest = String.format("curl --silent --show-error --noproxy '*' " + + "-H 'host: %s' http://%s:%s/clusterview/ClusterViewServlet", + domainUid + "." + introDomainNamespace + "." + clusterName + ".test", K8S_NODEPORT_HOST, nodeportshttp); + List managedServers = new ArrayList<>(); + for (int i = 1; i <= replicaCount; i++) { + managedServers.add(managedServerNameBase + i); + } + assertThat(verifyClusterMemberCommunication(curlRequest, managedServers, 20)) + .as("Verify all managed servers can see each other") + .withFailMessage("managed servers cannot see other") + .isTrue(); + + } + + /** + * Test brings up a new cluster and verifies it can successfully start by doing the following. + * a. Creates new WebLogic static cluster using WLST. + * b. Patch the Domain Resource with cluster + * c. Update the introspectVersion version + * d. Verifies the servers in the new WebLogic cluster comes up without affecting any of the running servers on + * pre-existing WebLogic cluster. + */ + @Order(3) + @Test + @DisplayName("Test new cluster creation on demand using WLST and introspection") + public void testCreateNewCluster() { + + final String domainUid = "mydomain"; + final String clusterName = "cl2"; + + final String adminServerName = "admin-server"; + final String adminServerPodName = domainUid + "-" + adminServerName; + + final String managedServerNameBase = "cl2-ms-"; + String managedServerPodNamePrefix = domainUid + "-" + managedServerNameBase; + + final int replicaCount = 2; + + logger.info("Getting node port for default channel"); + int adminServerT3Port = getServiceNodePort(introDomainNamespace, adminServerPodName + "-external", "t3channel"); + + // create a temporary WebLogic WLST property file + File wlstPropertiesFile = assertDoesNotThrow(() -> File.createTempFile("wlst", "properties"), + "Creating WLST properties file failed"); + Properties p = new Properties(); + p.setProperty("admin_host", K8S_NODEPORT_HOST); + p.setProperty("admin_port", Integer.toString(adminServerT3Port)); + p.setProperty("admin_username", ADMIN_USERNAME_DEFAULT); + p.setProperty("admin_password", ADMIN_PASSWORD_DEFAULT); + p.setProperty("test_name", "create_cluster"); + p.setProperty("cluster_name", clusterName); + p.setProperty("server_prefix", managedServerNameBase); + p.setProperty("server_count", "3"); + assertDoesNotThrow(() -> p.store(new FileOutputStream(wlstPropertiesFile), "wlst properties file"), + "Failed to write the WLST properties to file"); + + // changet the admin server port to a different value to force pod restart + Path configScript = Paths.get(RESOURCE_DIR, "python-scripts", "introspect_version_script.py"); + executeWLSTScript(configScript, wlstPropertiesFile.toPath(), introDomainNamespace); + + String introspectVersion = assertDoesNotThrow(() -> getNextIntrospectVersion(domainUid, introDomainNamespace)); + + logger.info("patch the domain resource with new cluster and introspectVersion"); + String patchStr + = "[" + + "{\"op\": \"add\",\"path\": \"/spec/clusters/-\", \"value\": " + + " {\"clusterName\" : \"" + clusterName + "\", \"replicas\": 2, \"serverStartState\": \"RUNNING\"}" + + "}," + + "{\"op\": \"replace\", \"path\": \"/spec/introspectVersion\", \"value\": \"" + introspectVersion + "\"}" + + "]"; + logger.info("Updating domain configuration using patch string: {0}\n", patchStr); + V1Patch patch = new V1Patch(patchStr); + assertTrue(patchDomainCustomResource(domainUid, introDomainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH), + "Failed to patch domain"); + + //verify the introspector pod is created and runs + String introspectPodName = domainUid + "-" + "introspect-domain-job"; + + checkPodExists(introspectPodName, domainUid, introDomainNamespace); + checkPodDoesNotExist(introspectPodName, domainUid, introDomainNamespace); + + // verify new cluster managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Checking managed server service {0} is created in namespace {1}", + managedServerPodNamePrefix + i, introDomainNamespace); + checkServiceExists(managedServerPodNamePrefix + i, introDomainNamespace); + } + + // verify new cluster managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Waiting for managed server pod {0} to be ready in namespace {1}", + managedServerPodNamePrefix + i, introDomainNamespace); + checkPodReady(managedServerPodNamePrefix + i, domainUid, introDomainNamespace); + } + + logger.info("Getting the list of servers using the listServers"); + String baseUri = "http://" + K8S_NODEPORT_HOST + ":" + adminServerT3Port + "/clusterview/"; + String serverListUri = "ClusterViewServlet?listServers=true"; + HttpResponse response = null; + for (int i = 0; i < 5; i++) { + assertDoesNotThrow(() -> TimeUnit.SECONDS.sleep(30)); + response = assertDoesNotThrow(() -> OracleHttpClient.get(baseUri + serverListUri, true)); + assertEquals(200, response.statusCode(), "Status code not equals to 200"); + } + + // verify managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Checking {0} health", managedServerNameBase + i); + assertTrue(response.body().contains(managedServerNameBase + i + ":HEALTH_OK"), + "Didn't get " + managedServerNameBase + i + ":HEALTH_OK"); + } + + } + + + /** + * Create a WebLogic domain on a persistent volume by doing the following. + * Create a configmap containing WLST script and property file. + * Create a Kubernetes job to create domain on persistent volume. + * + * @param wlstScriptFile python script to create domain + * @param domainPropertiesFile properties file containing domain configuration + * @param pvName name of the persistent volume to create domain in + * @param pvcName name of the persistent volume claim + * @param namespace name of the domain namespace in which the job is created + */ + private void createDomainOnPVUsingWlst(Path wlstScriptFile, Path domainPropertiesFile, + String pvName, String pvcName, String namespace) { + logger.info("Preparing to run create domain job using WLST"); + + List domainScriptFiles = new ArrayList<>(); + domainScriptFiles.add(wlstScriptFile); + domainScriptFiles.add(domainPropertiesFile); + + logger.info("Creating a config map to hold domain creation scripts"); + String domainScriptConfigMapName = "create-domain-scripts-cm"; + assertDoesNotThrow( + () -> createConfigMapForDomainCreation( + domainScriptConfigMapName, domainScriptFiles, namespace, this.getClass().getSimpleName()), + "Create configmap for domain creation failed"); + + // create a V1Container with specific scripts and properties for creating domain + V1Container jobCreationContainer = new V1Container() + .addCommandItem("/bin/sh") + .addArgsItem("/u01/oracle/oracle_common/common/bin/wlst.sh") + .addArgsItem("/u01/weblogic/" + wlstScriptFile.getFileName()) //wlst.sh script + .addArgsItem("-skipWLSModuleScanning") + .addArgsItem("-loadProperties") + .addArgsItem("/u01/weblogic/" + domainPropertiesFile.getFileName()); //domain property file + + logger.info("Running a Kubernetes job to create the domain"); + createDomainJob(image, isUseSecret, pvName, pvcName, domainScriptConfigMapName, + namespace, jobCreationContainer); + + } + + /** + * Create secret for docker credentials. + * + * @param namespace name of the namespace in which to create secret + */ + private static void createOCRRepoSecret(String namespace) { + boolean secretExists = false; + V1SecretList listSecrets = listSecrets(namespace); + if (null != listSecrets) { + for (V1Secret item : listSecrets.getItems()) { + if (item.getMetadata().getName().equals(OCR_SECRET_NAME)) { + secretExists = true; + break; + } + } + } + if (!secretExists) { + createDockerRegistrySecret(OCR_USERNAME, OCR_PASSWORD, + OCR_EMAIL, OCR_REGISTRY, OCR_SECRET_NAME, namespace); + } + } + + + /** + * Uninstall Nginx. + * The cleanup framework does not uninstall Nginx release. + * Do it here for now. + */ + @AfterAll + public void tearDownAll() { + // uninstall NGINX release + if (nginxHelmParams != null) { + assertThat(uninstallNginx(nginxHelmParams)) + .as("Test uninstallNginx returns true") + .withFailMessage("uninstallNginx() did not return true") + .isTrue(); + } + } + +} \ No newline at end of file diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioCrossDomainTransaction.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioCrossDomainTransaction.java new file mode 100644 index 00000000000..b626939b4fd --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioCrossDomainTransaction.java @@ -0,0 +1,404 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1SecretReference; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Istio; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.BuildApplication; +import oracle.weblogic.kubernetes.utils.ExecResult; +import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.RESULTS_ROOT; +import static oracle.weblogic.kubernetes.actions.ActionConstants.APP_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.MODEL_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; +import static oracle.weblogic.kubernetes.actions.TestActions.addLabelsToNamespace; +import static oracle.weblogic.kubernetes.actions.TestActions.createDomainCustomResource; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.domainExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkAppUsingHostHeader; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createImageAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.dockerLoginAndPushImageToRegistry; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.generateFileFromTemplate; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.ExecCommand.exec; +import static oracle.weblogic.kubernetes.utils.IstioUtils.deployHttpIstioGatewayAndVirtualservice; +import static oracle.weblogic.kubernetes.utils.IstioUtils.getIstioHttpIngressPort; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@DisplayName("Verify cross domain transaction with istio enabled is successful") +@IntegrationTest +public class ItIstioCrossDomainTransaction { + + private static final String WDT_MODEL_FILE_DOMAIN1 = "model-crossdomaintransaction-domain1.yaml"; + private static final String WDT_MODEL_FILE_DOMAIN2 = "model-crossdomaintransaction-domain2.yaml"; + + private static final String WDT_MODEL_DOMAIN1_PROPS = "model-crossdomaintransaction-domain1.properties"; + private static final String WDT_MODEL_DOMAIN2_PROPS = "model-crossdomaintransaction-domain2.properties"; + private static final String WDT_IMAGE_NAME1 = "domain1-wdt-image"; + private static final String WDT_IMAGE_NAME2 = "domain2-wdt-image"; + private static final String WDT_APP_NAME = "txforward"; + private static final String PROPS_TEMP_DIR = RESULTS_ROOT + "/istiocrossdomaintransactiontemp"; + + private static HelmParams opHelmParams = null; + private static String opNamespace = null; + private static String operatorImage = null; + private static String domain1Namespace = null; + private static String domain2Namespace = null; + private static ConditionFactory withStandardRetryPolicy = null; + private static String dockerConfigJson = ""; + private String domainUid1 = "domain1"; + private String domainUid2 = "domain2"; + private static Map secretNameMap; + private final String domain1AdminServerPodName = domainUid1 + "-admin-server"; + private final String domain1ManagedServerPrefix = domainUid1 + "-managed-server"; + private final String domain2ManagedServerPrefix = domainUid2 + "-managed-server"; + private String clusterName = "cluster-1"; + private static LoggingFacade logger = null; + + /** + * Install Operator. + * @param namespaces injected by JUnit + */ + @BeforeAll + public static void initAll(@Namespaces(3) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + // get a new unique opNamespace + logger.info("Assigning unique namespace for Operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + opNamespace = namespaces.get(0); + + logger.info("Assigning unique namespace for Domain"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domain1Namespace = namespaces.get(1); + + logger.info("Assigning unique namespace for Domain"); + assertNotNull(namespaces.get(2), "Namespace list is null"); + domain2Namespace = namespaces.get(2); + + // Now that we got the namespaces for both the domains, we need to update the model properties + // file with the namespaces. for cross domain transaction to work, we need to have the externalDNSName + // set in the config file. Cannot set this after the domain is up since a server restart is + // required for this to take effect. So, copying the property file to RESULT_ROOT and updating the + // property file + updatePropertyFile(); + + // Label the domain/operator namespace with istio-injection=enabled + Map labelMap = new HashMap(); + labelMap.put("istio-injection", "enabled"); + + assertDoesNotThrow(() -> addLabelsToNamespace(domain1Namespace,labelMap)); + assertDoesNotThrow(() -> addLabelsToNamespace(domain2Namespace,labelMap)); + assertDoesNotThrow(() -> addLabelsToNamespace(opNamespace,labelMap)); + + // install and verify operator + installAndVerifyOperator(opNamespace, domain1Namespace, domain2Namespace); + + } + + private static void updatePropertyFile() { + //create a temporary directory to copy and update the properties file + Path target = Paths.get(PROPS_TEMP_DIR); + Path source1 = Paths.get(MODEL_DIR, WDT_MODEL_DOMAIN1_PROPS); + Path source2 = Paths.get(MODEL_DIR, WDT_MODEL_DOMAIN2_PROPS); + logger.info("Copy the properties file to the above area so that we can add namespace property"); + assertDoesNotThrow(() -> { + Files.createDirectories(target); + Files.copy(source1, target.resolve(source1.getFileName()), StandardCopyOption.REPLACE_EXISTING); + Files.copy(source2, target.resolve(source2.getFileName()), StandardCopyOption.REPLACE_EXISTING); + }); + + assertDoesNotThrow(() -> { + addNamespaceToPropertyFile(WDT_MODEL_DOMAIN1_PROPS, domain1Namespace); + String.format("Failed to update %s with namespace %s", + WDT_MODEL_DOMAIN1_PROPS, domain1Namespace); + }); + assertDoesNotThrow(() -> { + addNamespaceToPropertyFile(WDT_MODEL_DOMAIN2_PROPS, domain2Namespace); + String.format("Failed to update %s with namespace %s", + WDT_MODEL_DOMAIN2_PROPS, domain2Namespace); + }); + + } + + private static void addNamespaceToPropertyFile(String propFileName, String domainNamespace) throws IOException { + FileInputStream in = new FileInputStream(PROPS_TEMP_DIR + "/" + propFileName); + Properties props = new Properties(); + props.load(in); + in.close(); + + FileOutputStream out = new FileOutputStream(PROPS_TEMP_DIR + "/" + propFileName); + props.setProperty("NAMESPACE", domainNamespace); + props.store(out, null); + out.close(); + } + + /* + * This test verifies cross domain transaction is successful. domain in image using wdt is used + * to create 2 domains in different namespaces. An app is deployed to both the domains and the servlet + * is invoked which starts a transaction that spans both domains. + * The application consists of a servlet front-end and a remote object that defines a method to register + * a simple javax.transaction.Synchronization object. When the servlet is invoked, a global transaction + * is started, and the specified list of server URLs is used to look up the remote object and register + * a Synchronization object on each server. Finally, the transaction is committed. If the server + * listen-addresses are resolvable between the transaction participants, then the transaction should + * complete successfully. + */ + @Test + @DisplayName("Check cross domain transaction with istio works") + public void testIstioCrossDomainTransaction() { + + //build application archive + Path distDir = BuildApplication.buildApplication(Paths.get(APP_DIR, "txforward"), null, null, + "build", domain1Namespace); + logger.info("distDir is {0}", distDir.toString()); + assertTrue(Paths.get(distDir.toString(), + "txforward.ear").toFile().exists(), + "Application archive is not available"); + String appSource = distDir.toString() + "/txforward.ear"; + logger.info("Application is in {0}", appSource); + + // create admin credential secret for domain1 + logger.info("Create admin credential secret for domain1"); + String domain1AdminSecretName = domainUid1 + "-weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + domain1AdminSecretName, domain1Namespace, ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT), + String.format("createSecret %s failed for %s", domain1AdminSecretName, domainUid1)); + + // create admin credential secret for domain2 + logger.info("Create admin credential secret for domain2"); + String domain2AdminSecretName = domainUid2 + "-weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + domain2AdminSecretName, domain2Namespace, ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT), + String.format("createSecret %s failed for %s", domain2AdminSecretName, domainUid2)); + + logger.info("Creating image with model file and verify"); + String domain1Image = createImageAndVerify( + WDT_IMAGE_NAME1, WDT_MODEL_FILE_DOMAIN1, appSource, WDT_MODEL_DOMAIN1_PROPS, PROPS_TEMP_DIR, domainUid1); + logger.info("Created {0} image", domain1Image); + + // docker login and push image to docker registry if necessary + dockerLoginAndPushImageToRegistry(domain1Image); + + logger.info("Creating image with model file and verify"); + String domain2Image = createImageAndVerify( + WDT_IMAGE_NAME2, WDT_MODEL_FILE_DOMAIN2, appSource, WDT_MODEL_DOMAIN2_PROPS, PROPS_TEMP_DIR, domainUid2); + logger.info("Created {0} image", domain2Image); + + // docker login and push image to docker registry if necessary + dockerLoginAndPushImageToRegistry(domain2Image); + + //create domain1 + createDomain(domainUid1, domain1Namespace, domain1AdminSecretName, domain1Image); + //create domain2 + createDomain(domainUid2, domain2Namespace, domain2AdminSecretName, domain2Image); + + String clusterService = domainUid1 + "-cluster-" + clusterName + "." + domain1Namespace + ".svc.cluster.local"; + + Map templateMap = new HashMap(); + templateMap.put("NAMESPACE", domain1Namespace); + templateMap.put("ADMIN_SERVICE",domain1AdminServerPodName); + templateMap.put("CLUSTER_SERVICE", clusterService); + + Path svcYamlSrc = Paths.get(RESOURCE_DIR, "istio", "istio-cdt-http-template-service.yaml"); + Path svcYmlTarget = assertDoesNotThrow( + () -> generateFileFromTemplate(svcYamlSrc.toString(), + "istiocrossdomaintransactiontemp/istio-cdt-http-service.yaml", templateMap)); + logger.info("Generated Http VS/Gateway file path is {0}", svcYmlTarget); + + boolean deployRes = deployHttpIstioGatewayAndVirtualservice(svcYmlTarget); + assertTrue(deployRes, "Could not deploy Http Istio Gateway/VirtualService"); + + int istioIngressPort = getIstioHttpIngressPort(); + logger.info("Istio Ingress Port is {0}", istioIngressPort); + + logger.info("Validating WebLogic admin server access by login to console"); + + String consoleUrl = "http://" + K8S_NODEPORT_HOST + ":" + istioIngressPort + "/console/login/LoginForm.jsp"; + boolean checkConsole = + checkAppUsingHostHeader(consoleUrl, "domain1-" + domain1Namespace + ".org"); + assertTrue(checkConsole, "Failed to access WebLogic console on domain1"); + logger.info("WebLogic console on domain1 is accessible"); + + //+ "-H 'host:domain1-" + domain1Namespace + ".org' " + String curlRequest = String.format("curl -v --show-error --noproxy '*' " + + "-H 'host:domain1-" + domain1Namespace + ".org' " + + "http://%s:%s/TxForward/TxForward?urls=t3://%s.%s:7001,t3://%s1.%s:8001,t3://%s1.%s:8001,t3://%s2.%s:8001", + K8S_NODEPORT_HOST, istioIngressPort, domain1AdminServerPodName, domain1Namespace, + domain1ManagedServerPrefix, domain1Namespace, domain2ManagedServerPrefix,domain2Namespace, + domain2ManagedServerPrefix, domain2Namespace); + + ExecResult result = null; + logger.info("curl command {0}", curlRequest); + result = assertDoesNotThrow( + () -> exec(curlRequest, true)); + logger.info("curl result {0}", result.exitValue()); + assertTrue((result.exitValue() == 0), "curl command failed"); + if (result.exitValue() == 0) { + logger.info("\n HTTP response is \n " + result.stdout()); + logger.info("curl command returned {0}", result.toString()); + assertTrue(result.stdout().contains("Status=Committed"), "crossDomainTransaction failed"); + } + + } + + private void createDomain(String domainUid, String domainNamespace, String adminSecretName, + String domainImage) { + // admin/managed server name here should match with model yaml in WDT_MODEL_FILE + final String adminServerPodName = domainUid + "-admin-server"; + final String managedServerPrefix = domainUid + "-managed-server"; + final int replicaCount = 2; + + // Create the repo secret to pull the image + createDockerRegistrySecret(domainNamespace); + + // create the domain CR + createDomainResource(domainUid, domainNamespace, adminSecretName, REPO_SECRET_NAME, + replicaCount, domainImage); + + // wait for the domain to exist + logger.info("Check for domain custom resource in namespace {0}", domainNamespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for domain {0} to be created in namespace {1} " + + "(elapsed time {2}ms, remaining time {3}ms)", + domainUid, + domainNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(domainExists(domainUid, DOMAIN_VERSION, domainNamespace)); + + logger.info("Check admin service {0} is created in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check admin server pod is ready + logger.info("Wait for admin server pod {0} to be ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check managed server service {0} is created in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkServiceExists(managedServerPrefix + i, domainNamespace); + } + + // check managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Wait for managed server pod {0} to be ready in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkPodReady(managedServerPrefix + i, domainUid, domainNamespace); + } + + } + + private void createDomainResource(String domainUid, String domNamespace, String adminSecretName, + String repoSecretName, int replicaCount, String domainImage) { + // create the domain CR + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("Image") + .image(domainImage) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false -Dweblogic.debug.DebugConnection=true " + + "-Dweblogic.debug.DebugRouting=true -Dweblogic.debug.DebugMessaging=true " + + "-Dweblogic.kernel.debug=true -Dweblogic.log.LoggerSeverity=Debug " + + "-Dweblogic.log.LogSeverity=Debug -Dweblogic.StdoutDebugEnabled=true " + + "-Dweblogic.log.StdoutSeverity=Debug")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING")) + .addClustersItem(new Cluster() + .clusterName("cluster-1") + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .istio(new Istio() + .enabled(Boolean.TRUE) + .readinessPort(8888)) + .model(new Model() + .domainType("WLS")) + .introspectorJobActiveDeadlineSeconds(300L))); + + logger.info("Create domain custom resource for domainUid {0} in namespace {1}", + domainUid, domNamespace); + boolean domCreated = assertDoesNotThrow(() -> createDomainCustomResource(domain), + String.format("Create domain custom resource failed with ApiException for %s in namespace %s", + domainUid, domNamespace)); + assertTrue(domCreated, String.format("Create domain custom resource failed with ApiException " + + "for %s in namespace %s", domainUid, domNamespace)); + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioDomainInImage.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioDomainInImage.java new file mode 100644 index 00000000000..fa09a630bde --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioDomainInImage.java @@ -0,0 +1,288 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1SecretReference; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Istio; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.annotations.tags.Slow; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.DeployUtil; +import oracle.weblogic.kubernetes.utils.ExecResult; +import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.WDT_BASIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.WDT_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.actions.ActionConstants.ITTESTS_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; +import static oracle.weblogic.kubernetes.actions.TestActions.addLabelsToNamespace; +import static oracle.weblogic.kubernetes.actions.TestActions.createDomainCustomResource; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.domainExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkAppUsingHostHeader; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.generateFileFromTemplate; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.IstioUtils.deployHttpIstioGatewayAndVirtualservice; +import static oracle.weblogic.kubernetes.utils.IstioUtils.deployIstioDestinationRule; +import static oracle.weblogic.kubernetes.utils.IstioUtils.getIstioHttpIngressPort; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@DisplayName("Verify istio enabled WebLogic domain in domainhome-in-image model") +@IntegrationTest +class ItIstioDomainInImage { + + private static HelmParams opHelmParams = null; + private static String opNamespace = null; + private static String operatorImage = null; + private static String domainNamespace = null; + private static ConditionFactory withStandardRetryPolicy = null; + private static String dockerConfigJson = ""; + private final String domainUid = "istio-dii-wdt"; + private final String clusterName = "cluster-1"; // do not modify + private final String adminServerName = "admin-server"; // do not modify + private final String adminServerPodName = domainUid + "-" + adminServerName; + + private static Map secretNameMap; + private static LoggingFacade logger = null; + + /** + * Install Operator. + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void initAll(@Namespaces(2) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + // get a new unique opNamespace + logger.info("Assigning unique namespace for Operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + opNamespace = namespaces.get(0); + + logger.info("Assigning unique namespace for Domain"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domainNamespace = namespaces.get(1); + + // Label the domain/operator namespace with istio-injection=enabled + + Map labelMap = new HashMap(); + labelMap.put("istio-injection", "enabled"); + + assertDoesNotThrow(() -> addLabelsToNamespace(domainNamespace,labelMap)); + assertDoesNotThrow(() -> addLabelsToNamespace(opNamespace,labelMap)); + + // install and verify operator + installAndVerifyOperator(opNamespace, domainNamespace); + + } + + /** + * Create a domain using domainhome-in-image model using wdt. + * Add istio configuration with default readinessPort + * Do not add any AdminService under AdminServer configuration + * Deploy istio gateways and virtual service + * Verify server pods are in ready state and services are created. + * Verify login to WebLogic console is successful thru istio ingress http port. + * Deploy a web application thru istio http ingress port using REST api + * Access web application thru istio http ingress port using curl + */ + @Test + @DisplayName("Create WebLogic domainhome-in-image with istio") + @Slow + public void testIstioDomainHomeInImage() { + final String managedServerPrefix = domainUid + "-managed-server"; + final int replicaCount = 2; + + // Create the repo secret to pull the image + createDockerRegistrySecret(domainNamespace); + + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + createSecretWithUsernamePassword(adminSecretName, domainNamespace, ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT); + + // create the domain CR + createDomainResource(domainUid, domainNamespace, adminSecretName, REPO_SECRET_NAME, + replicaCount); + + // wait for the domain to exist + logger.info("Check for domain custom resource in namespace {0}", domainNamespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for domain {0} to be created in namespace {1} " + + "(elapsed time {2}ms, remaining time {3}ms)", + domainUid, + domainNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(domainExists(domainUid, DOMAIN_VERSION, domainNamespace)); + + // check admin server service is created + logger.info("Check admin service {0} is created in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check admin server pod is ready + logger.info("Wait for admin server pod {0} to be ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check managed service {0} is created in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkServiceExists(managedServerPrefix + i, domainNamespace); + } + + // check managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Wait for managed pod {0} to be ready in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkPodReady(managedServerPrefix + i, domainUid, domainNamespace); + } + + String clusterService = domainUid + "-cluster-" + clusterName + "." + domainNamespace + ".svc.cluster.local"; + + Map templateMap = new HashMap(); + templateMap.put("NAMESPACE", domainNamespace); + templateMap.put("DUID", domainUid); + templateMap.put("ADMIN_SERVICE",adminServerPodName); + templateMap.put("CLUSTER_SERVICE", clusterService); + + Path srcHttpFile = Paths.get(RESOURCE_DIR, "istio", "istio-http-template.yaml"); + Path targetHttpFile = assertDoesNotThrow( + () -> generateFileFromTemplate(srcHttpFile.toString(), "istio-http.yaml", templateMap)); + logger.info("Generated Http VS/Gateway file path is {0}", targetHttpFile); + + boolean deployRes = assertDoesNotThrow( + () -> deployHttpIstioGatewayAndVirtualservice(targetHttpFile)); + assertTrue(deployRes, "Failed to deploy Http Istio Gateway/VirtualService"); + + Path srcDrFile = Paths.get(RESOURCE_DIR, "istio", "istio-dr-template.yaml"); + Path targetDrFile = assertDoesNotThrow( + () -> generateFileFromTemplate(srcDrFile.toString(), "istio-dr.yaml", templateMap)); + logger.info("Generated DestinationRule file path is {0}", targetDrFile); + + deployRes = assertDoesNotThrow( + () -> deployIstioDestinationRule(targetDrFile)); + assertTrue(deployRes, "Failed to deploy Istio DestinationRule"); + + int istioIngressPort = getIstioHttpIngressPort(); + logger.info("Istio Ingress Port is {0}", istioIngressPort); + + String consoleUrl = "http://" + K8S_NODEPORT_HOST + ":" + istioIngressPort + "/console/login/LoginForm.jsp"; + boolean checkConsole = + checkAppUsingHostHeader(consoleUrl, domainNamespace + ".org"); + assertTrue(checkConsole, "Failed to access WebLogic console"); + logger.info("WebLogic console is accessible"); + + Path archivePath = Paths.get(ITTESTS_DIR, "../src/integration-tests/apps/testwebapp.war"); + ExecResult result = null; + result = DeployUtil.deployUsingRest(K8S_NODEPORT_HOST, + String.valueOf(istioIngressPort), + ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT, + clusterName, archivePath, domainNamespace + ".org", "testwebapp"); + assertNotNull(result, "Application deployment failed"); + logger.info("Application deployment returned {0}", result.toString()); + assertEquals("202", result.stdout(), "Deployment didn't return HTTP status code 202"); + + String url = "http://" + K8S_NODEPORT_HOST + ":" + istioIngressPort + "/testwebapp/index.jsp"; + logger.info("Application Access URL {0}", url); + boolean checkApp = checkAppUsingHostHeader(url, domainNamespace + ".org"); + assertTrue(checkApp, "Failed to access WebLogic application"); + } + + private void createDomainResource(String domainUid, String domNamespace, String adminSecretName, + String repoSecretName, int replicaCount) { + // In case of istio "default" channel can not be exposed through nodeport. + // No AdminService on domain resource. + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("Image") + .image(WDT_BASIC_IMAGE_NAME + ":" + WDT_BASIC_IMAGE_TAG) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING")) + .addClustersItem(new Cluster() + .clusterName(clusterName) + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .istio(new Istio() + .enabled(Boolean.TRUE) + .readinessPort(8888)) + .model(new Model() + .domainType("WLS")) + .introspectorJobActiveDeadlineSeconds(300L))); + + logger.info("Create domain custom resource for domainUid {0} in namespace {1}", + domainUid, domNamespace); + boolean domCreated = assertDoesNotThrow(() -> createDomainCustomResource(domain), + String.format("Create domain custom resource failed with ApiException for %s in namespace %s", + domainUid, domNamespace)); + assertTrue(domCreated, String.format("Create domain custom resource failed with ApiException " + + "for %s in namespace %s", domainUid, domNamespace)); + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioDomainInPV.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioDomainInPV.java new file mode 100644 index 00000000000..587c4708936 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioDomainInPV.java @@ -0,0 +1,503 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.io.File; +import java.io.FileOutputStream; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import io.kubernetes.client.openapi.models.V1ConfigMapVolumeSource; +import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1ContainerPort; +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1Job; +import io.kubernetes.client.openapi.models.V1JobCondition; +import io.kubernetes.client.openapi.models.V1JobSpec; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimVolumeSource; +import io.kubernetes.client.openapi.models.V1Pod; +import io.kubernetes.client.openapi.models.V1PodSpec; +import io.kubernetes.client.openapi.models.V1PodTemplateSpec; +import io.kubernetes.client.openapi.models.V1SecretReference; +import io.kubernetes.client.openapi.models.V1SecurityContext; +import io.kubernetes.client.openapi.models.V1Volume; +import io.kubernetes.client.openapi.models.V1VolumeMount; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Istio; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.CommonTestUtils; +import oracle.weblogic.kubernetes.utils.DeployUtil; +import oracle.weblogic.kubernetes.utils.ExecResult; +import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.KIND_REPO; +import static oracle.weblogic.kubernetes.TestConstants.OCR_EMAIL; +import static oracle.weblogic.kubernetes.TestConstants.OCR_PASSWORD; +import static oracle.weblogic.kubernetes.TestConstants.OCR_REGISTRY; +import static oracle.weblogic.kubernetes.TestConstants.OCR_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.OCR_USERNAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.ITTESTS_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_NAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_TAG; +import static oracle.weblogic.kubernetes.actions.TestActions.addLabelsToNamespace; +import static oracle.weblogic.kubernetes.actions.TestActions.createNamespacedJob; +import static oracle.weblogic.kubernetes.actions.TestActions.getJob; +import static oracle.weblogic.kubernetes.actions.TestActions.getPodLog; +import static oracle.weblogic.kubernetes.actions.TestActions.listPods; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.jobCompleted; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkAppUsingHostHeader; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.generateFileFromTemplate; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.IstioUtils.deployHttpIstioGatewayAndVirtualservice; +import static oracle.weblogic.kubernetes.utils.IstioUtils.getIstioHttpIngressPort; +import static oracle.weblogic.kubernetes.utils.TestUtils.getNextFreePort; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +/** + * Tests to create domain in persistent volume using WLST. + */ +@DisplayName("Verify istio enabled WebLogic domain in domainhome-on-pv model") +@IntegrationTest +public class ItIstioDomainInPV { + + private static String opNamespace = null; + private static String domainNamespace = null; + + private static String image = WLS_BASE_IMAGE_NAME + ":" + WLS_BASE_IMAGE_TAG; + private static boolean isUseSecret = true; + + private final String wlSecretName = "weblogic-credentials"; + private final String domainUid = "istio-div"; + private final String clusterName = "mycluster"; + private final String adminServerName = "admin-server"; + private final String adminServerPodName = domainUid + "-" + adminServerName; + private static LoggingFacade logger = null; + + // create standard, reusable retry/backoff policy + private static final ConditionFactory withStandardRetryPolicy + = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + + /** + * Assigns unique namespaces for operator and domains. + * Pull WebLogic image if running tests in Kind cluster. + * Installs operator. + * + * @param namespaces injected by JUnit + */ + @BeforeAll + public static void initAll(@Namespaces(2) List namespaces) { + + logger = getLogger(); + logger.info("Assign a unique namespace for operator"); + assertNotNull(namespaces.get(0), "Namespace is null"); + opNamespace = namespaces.get(0); + + logger.info("Assign a unique namespace for WebLogic domain"); + assertNotNull(namespaces.get(1), "Namespace is null"); + domainNamespace = namespaces.get(1); + + // Label the operator/domain namespace with istio-injection=enabled + Map labelMap = new HashMap(); + labelMap.put("istio-injection", "enabled"); + + assertDoesNotThrow(() -> addLabelsToNamespace(domainNamespace,labelMap)); + assertDoesNotThrow(() -> addLabelsToNamespace(opNamespace,labelMap)); + + // install operator and verify its running in ready state + installAndVerifyOperator(opNamespace, domainNamespace); + + //determine if the tests are running in Kind cluster. if true use images from Kind registry + if (KIND_REPO != null) { + String kindRepoImage = KIND_REPO + image.substring(TestConstants.OCR_REGISTRY.length() + 1); + logger.info("Using image {0}", kindRepoImage); + image = kindRepoImage; + isUseSecret = false; + } + } + + /** + * Create a WebLogic domain using WLST in a persistent volume. + * Add istio configuration. + * Deploy istio gateways and virtual service. + * Verify domain pods runs in ready state and services are created. + * Verify login to WebLogic console is successful thru istio ingress Port. + */ + @Test + @DisplayName("Create WebLogic domain in PV with Istio") + public void testIstioDomainHomeInPv() { + + final String managedServerNameBase = "wlst-ms-"; + String managedServerPodNamePrefix = domainUid + "-" + managedServerNameBase; + final int replicaCount = 2; + final int t3ChannelPort = getNextFreePort(31000, 32767); + + final String pvName = domainUid + "-pv"; // name of the persistent volume + final String pvcName = domainUid + "-pvc"; // name of the persistent volume claim + + // create pull secrets for WebLogic image when running in non Kind Kubernetes cluster + if (isUseSecret) { + createOCRRepoSecret(domainNamespace); + } + + + // create WebLogic domain credential secret + createSecretWithUsernamePassword(wlSecretName, domainNamespace, + ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT); + + // create persistent volume and persistent volume claim for domain + // these resources should be labeled with domainUid for cleanup after test + CommonTestUtils.createPV(pvName, domainUid, this.getClass().getSimpleName()); + CommonTestUtils.createPVC(pvName, pvcName, domainUid, domainNamespace); + + // create a temporary WebLogic domain property file + File domainPropertiesFile = assertDoesNotThrow(() -> + File.createTempFile("domain", "properties"), + "Failed to create domain properties file"); + Properties p = new Properties(); + p.setProperty("domain_path", "/shared/domains"); + p.setProperty("domain_name", domainUid); + p.setProperty("domain_uid", domainUid); + p.setProperty("cluster_name", clusterName); + p.setProperty("admin_server_name", adminServerName); + p.setProperty("managed_server_port", "8001"); + p.setProperty("admin_server_port", "7001"); + p.setProperty("admin_username", ADMIN_USERNAME_DEFAULT); + p.setProperty("admin_password", ADMIN_PASSWORD_DEFAULT); + p.setProperty("admin_t3_public_address", K8S_NODEPORT_HOST); + p.setProperty("admin_t3_channel_port", Integer.toString(t3ChannelPort)); + p.setProperty("number_of_ms", "4"); + p.setProperty("managed_server_name_base", managedServerNameBase); + p.setProperty("domain_logs", "/shared/logs"); + p.setProperty("production_mode_enabled", "true"); + assertDoesNotThrow(() -> + p.store(new FileOutputStream(domainPropertiesFile), "wlst properties file"), + "Failed to write domain properties file"); + + // WLST script for creating domain + Path wlstScript = Paths.get(RESOURCE_DIR, "python-scripts", "wlst-create-istio-domain-onpv.py"); + + // create configmap and domain on persistent volume using the WLST script and property file + createDomainOnPVUsingWlst(wlstScript, domainPropertiesFile.toPath(), + pvName, pvcName, domainNamespace); + + // Enable istio in domain custom resource configuration object. + // Add T3Channel Service with port assigned to Istio TCP ingress port. + logger.info("Creating domain custom resource"); + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domainNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHome("/shared/domains/" + domainUid) + .domainHomeSourceType("PersistentVolume") + .image(image) + .imagePullPolicy("IfNotPresent") + .imagePullSecrets(isUseSecret ? Arrays.asList( + new V1LocalObjectReference() + .name(OCR_SECRET_NAME)) + : null) + .webLogicCredentialsSecret(new V1SecretReference() + .name(wlSecretName) + .namespace(domainNamespace)) + .includeServerOutInPodLog(true) + .logHomeEnabled(Boolean.TRUE) + .logHome("/shared/logs/" + domainUid) + .dataHome("") + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() //serverpod + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom ")) + .addVolumesItem(new V1Volume() + .name(pvName) + .persistentVolumeClaim(new V1PersistentVolumeClaimVolumeSource() + .claimName(pvcName))) + .addVolumeMountsItem(new V1VolumeMount() + .mountPath("/shared") + .name(pvName))) + .adminServer(new AdminServer() //admin server + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("T3Channel") + .nodePort(t3ChannelPort)))) + .addClustersItem(new Cluster() //cluster + .clusterName(clusterName) + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .istio(new Istio() + .enabled(Boolean.TRUE) + .readinessPort(8888)))); + + // verify the domain custom resource is created + createDomainAndVerify(domain, domainNamespace); + + // verify the admin server service created + checkServiceExists(adminServerPodName, domainNamespace); + + // verify admin server pod is ready + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // verify managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Checking managed service {0} is created in namespace {1}", + managedServerPodNamePrefix + i, domainNamespace); + checkServiceExists(managedServerPodNamePrefix + i, domainNamespace); + } + + // verify managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Waiting for managed pod {0} to be ready in namespace {1}", + managedServerPodNamePrefix + i, domainNamespace); + checkPodReady(managedServerPodNamePrefix + i, domainUid, domainNamespace); + } + + String clusterService = domainUid + "-cluster-" + clusterName + "." + domainNamespace + ".svc.cluster.local"; + + Map templateMap = new HashMap(); + templateMap.put("NAMESPACE", domainNamespace); + templateMap.put("DUID", domainUid); + templateMap.put("ADMIN_SERVICE",adminServerPodName); + templateMap.put("CLUSTER_SERVICE", clusterService); + + Path srcHttpFile = Paths.get(RESOURCE_DIR, "istio", "istio-http-template.yaml"); + Path targetHttpFile = assertDoesNotThrow( + () -> generateFileFromTemplate(srcHttpFile.toString(), "istio-http.yaml", templateMap)); + logger.info("Generated Http VS/Gateway file path is {0}", targetHttpFile); + + boolean deployRes = assertDoesNotThrow( + () -> deployHttpIstioGatewayAndVirtualservice(targetHttpFile)); + assertTrue(deployRes, "Failed to deploy Http Istio Gateway/VirtualService"); + + int istioIngressPort = getIstioHttpIngressPort(); + logger.info("Istio http ingress Port is {0}", istioIngressPort); + + String consoleUrl = "http://" + K8S_NODEPORT_HOST + ":" + istioIngressPort + "/console/login/LoginForm.jsp"; + boolean checkConsole = + checkAppUsingHostHeader(consoleUrl, domainNamespace + ".org"); + assertTrue(checkConsole, "Failed to access WebLogic console"); + logger.info("WebLogic console is accessible"); + + Path archivePath = Paths.get(ITTESTS_DIR, "../src/integration-tests/apps/testwebapp.war"); + ExecResult result = null; + result = DeployUtil.deployUsingRest(K8S_NODEPORT_HOST, + String.valueOf(istioIngressPort), + ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT, + clusterName, archivePath, domainNamespace + ".org", "testwebapp"); + assertNotNull(result, "Application deployment failed"); + logger.info("Application deployment returned {0}", result.toString()); + assertEquals("202", result.stdout(), "Application deployed successfully"); + + String url = "http://" + K8S_NODEPORT_HOST + ":" + istioIngressPort + "/testwebapp/index.jsp"; + logger.info("Application Access URL {0}", url); + boolean checkApp = checkAppUsingHostHeader(url, domainNamespace + ".org"); + assertTrue(checkApp, "Failed to access WebLogic application"); + + } + + /** + * Create a WebLogic domain on a persistent volume by doing the following. + * Create a configmap containing WLST script and property file. + * Create a Kubernetes job to create domain on persistent volume. + * + * @param wlstScriptFile python script to create domain + * @param domainPropertiesFile properties file containing domain configuration + * @param pvName name of the persistent volume to create domain in + * @param pvcName name of the persistent volume claim + * @param namespace name of the domain namespace in which the job is created + */ + private void createDomainOnPVUsingWlst(Path wlstScriptFile, Path domainPropertiesFile, + String pvName, String pvcName, String namespace) { + logger.info("Preparing to run create domain job using WLST"); + + List domainScriptFiles = new ArrayList<>(); + domainScriptFiles.add(wlstScriptFile); + domainScriptFiles.add(domainPropertiesFile); + + logger.info("Creating a config map to hold domain creation scripts"); + String domainScriptConfigMapName = "create-domain-scripts-cm"; + assertDoesNotThrow( + () -> CommonTestUtils.createConfigMapForDomainCreation(domainScriptConfigMapName, domainScriptFiles, + namespace, this.getClass().getSimpleName()), + "Create configmap for domain creation failed"); + + // create a V1Container with specific scripts and properties for creating domain + V1Container jobCreationContainer = new V1Container() + .addCommandItem("/bin/sh") + .addArgsItem("/u01/oracle/oracle_common/common/bin/wlst.sh") + .addArgsItem("/u01/weblogic/" + wlstScriptFile.getFileName()) //wlst.sh script + .addArgsItem("-skipWLSModuleScanning") + .addArgsItem("-loadProperties") + .addArgsItem("/u01/weblogic/" + domainPropertiesFile.getFileName()); //domain property file + + logger.info("Running a Kubernetes job to create the domain"); + createDomainJob(pvName, pvcName, domainScriptConfigMapName, namespace, jobCreationContainer); + + } + + /** + * Create a job to create a domain in persistent volume. + * + * @param pvName name of the persistent volume to create domain in + * @param pvcName name of the persistent volume claim + * @param domainScriptCM configmap holding domain creation script files + * @param namespace name of the domain namespace in which the job is created + * @param jobContainer V1Container with job commands to create domain + */ + private void createDomainJob(String pvName, + String pvcName, String domainScriptCM, String namespace, V1Container jobContainer) { + logger.info("Running Kubernetes job to create domain"); + Map annotMap = new HashMap(); + annotMap.put("sidecar.istio.io/inject", "false"); + + V1Job jobBody = new V1Job() + .metadata( + new V1ObjectMeta() + .name("create-domain-onpv-job-" + pvName) // name of the create domain job + .namespace(namespace)) + .spec(new V1JobSpec() + .backoffLimit(0) // try only once + .template(new V1PodTemplateSpec() + .metadata(new V1ObjectMeta() + .annotations(annotMap)) + .spec(new V1PodSpec() + .restartPolicy("Never") + .initContainers(Arrays.asList(new V1Container() + .name("fix-pvc-owner") // change the ownership of the pv to opc:opc + .image(image) + .addCommandItem("/bin/sh") + .addArgsItem("-c") + .addArgsItem("chown -R 1000:1000 /shared") + .volumeMounts(Arrays.asList( + new V1VolumeMount() + .name(pvName) + .mountPath("/shared"))) + .securityContext(new V1SecurityContext() + .runAsGroup(0L) + .runAsUser(0L)))) + .containers(Arrays.asList(jobContainer // container containing WLST or WDT details + .name("create-weblogic-domain-onpv-container") + .image(image) + .imagePullPolicy("Always") + .ports(Arrays.asList(new V1ContainerPort() + .containerPort(7001))) + .volumeMounts(Arrays.asList( + new V1VolumeMount() + .name("create-weblogic-domain-job-cm-volume") // domain creation scripts volume + .mountPath("/u01/weblogic"), // availble under /u01/weblogic inside pod + new V1VolumeMount() + .name(pvName) // location to write domain + .mountPath("/shared"))))) // mounted under /shared inside pod + .volumes(Arrays.asList( + new V1Volume() + .name(pvName) + .persistentVolumeClaim( + new V1PersistentVolumeClaimVolumeSource() + .claimName(pvcName)), + new V1Volume() + .name("create-weblogic-domain-job-cm-volume") + .configMap( + new V1ConfigMapVolumeSource() + .name(domainScriptCM)))) //config map containing domain scripts + .imagePullSecrets(isUseSecret ? Arrays.asList( + new V1LocalObjectReference() + .name(OCR_SECRET_NAME)) + : null)))); + String jobName = assertDoesNotThrow(() + -> createNamespacedJob(jobBody), "Failed to create Job"); + + logger.info("Checking if the domain creation job {0} completed in namespace {1}", + jobName, namespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for job {0} to be completed in namespace {1} " + + "(elapsed time {2} ms, remaining time {3} ms)", + jobName, + namespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(jobCompleted(jobName, null, namespace)); + + // check job status and fail test if the job failed to create domain + V1Job job = assertDoesNotThrow(() -> getJob(jobName, namespace), + "Getting the job failed"); + if (job != null) { + V1JobCondition jobCondition = job.getStatus().getConditions().stream().filter( + v1JobCondition -> "Failed".equalsIgnoreCase(v1JobCondition.getType())) + .findAny() + .orElse(null); + if (jobCondition != null) { + logger.severe("Job {0} failed to create domain", jobName); + List pods = assertDoesNotThrow(() + -> listPods(namespace, "job-name=" + jobName).getItems(), + "Listing pods failed"); + if (!pods.isEmpty()) { + String podLog = assertDoesNotThrow(() -> getPodLog(pods.get(0).getMetadata().getName(), namespace), + "Failed to get pod log"); + logger.severe(podLog); + fail("Domain create job failed"); + } + } + } + + } + + /** + * Create secret for docker credentials. + * + * @param namespace name of the namespace in which to create secret + */ + private void createOCRRepoSecret(String namespace) { + CommonTestUtils.createDockerRegistrySecret(OCR_USERNAME, OCR_PASSWORD, + OCR_EMAIL, OCR_REGISTRY, OCR_SECRET_NAME, namespace); + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioMiiDomain.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioMiiDomain.java new file mode 100644 index 00000000000..d16c83b909a --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioMiiDomain.java @@ -0,0 +1,295 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1SecretReference; +import io.kubernetes.client.openapi.models.V1ServiceAccount; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Istio; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.DeployUtil; +import oracle.weblogic.kubernetes.utils.ExecResult; +import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.ITTESTS_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; +import static oracle.weblogic.kubernetes.actions.TestActions.addLabelsToNamespace; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkAppUsingHostHeader; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.generateFileFromTemplate; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.IstioUtils.deployHttpIstioGatewayAndVirtualservice; +import static oracle.weblogic.kubernetes.utils.IstioUtils.deployIstioDestinationRule; +import static oracle.weblogic.kubernetes.utils.IstioUtils.getIstioHttpIngressPort; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@DisplayName("Test istio enabled WebLogic Domain in mii model") +@IntegrationTest +class ItIstioMiiDomain { + + private static HelmParams opHelmParams = null; + private static V1ServiceAccount serviceAccount = null; + private String serviceAccountName = null; + private static String opNamespace = null; + private static String operatorImage = null; + private static String domainNamespace = null; + private static ConditionFactory withStandardRetryPolicy = null; + private static ConditionFactory withQuickRetryPolicy = null; + private static String dockerConfigJson = ""; + + private String domainUid = "istio-mii"; + private final String clusterName = "cluster-1"; // do not modify + private final String adminServerName = "admin-server"; // do not modify + private String miiImage = null; + private static LoggingFacade logger = null; + + private static Map secretNameMap; + + /** + * Install Operator. + * @param namespaces list of namespaces created by the IntegrationTestWatcher + */ + @BeforeAll + public static void initAll(@Namespaces(2) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(6, MINUTES).await(); + + // get a new unique opNamespace + logger.info("Assign unique namespace for Operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + opNamespace = namespaces.get(0); + + logger.info("Assign unique namespace for Domain"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domainNamespace = namespaces.get(1); + + // Label the domain/operator namespace with istio-injection=enabled + Map labelMap = new HashMap(); + labelMap.put("istio-injection", "enabled"); + assertDoesNotThrow(() -> addLabelsToNamespace(domainNamespace,labelMap)); + assertDoesNotThrow(() -> addLabelsToNamespace(opNamespace,labelMap)); + + // install and verify operator + installAndVerifyOperator(opNamespace, domainNamespace); + } + + /** + * Create a domain using model-in-image model. + * Add istio configuration with default readinessPort. + * Do not add any AdminService under AdminServer configuration. + * Deploy istio gateways and virtual service. + * Verify server pods are in ready state and services are created. + * Verify login to WebLogic console is successful thru istio ingress port. + * Deploy a web application thru istio http ingress port using REST api. + * Access web application thru istio http ingress port using curl. + */ + @Test + @DisplayName("Create WebLogic Domain with mii model with istio") + public void testIstioModelInImage() { + final String adminServerPodName = domainUid + "-admin-server"; + final String managedServerPrefix = domainUid + "-managed-server"; + final int replicaCount = 2; + + // Create the repo secret to pull the image + assertDoesNotThrow(() -> createDockerRegistrySecret(domainNamespace), + String.format("createSecret failed for %s", REPO_SECRET_NAME)); + + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + adminSecretName, + domainNamespace, + "weblogic", + "welcome1"), + String.format("createSecret failed for %s", adminSecretName)); + + // create encryption secret + logger.info("Create encryption secret"); + String encryptionSecretName = "encryptionsecret"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + encryptionSecretName, + domainNamespace, + "weblogicenc", + "weblogicenc"), + String.format("createSecret failed for %s", encryptionSecretName)); + + // create the domain object + Domain domain = createDomainResource(domainUid, + domainNamespace, + adminSecretName, + REPO_SECRET_NAME, + encryptionSecretName, + replicaCount, + MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG); + + // create model in image domain + createDomainAndVerify(domain, domainNamespace); + + logger.info("Check admin service {0} is created in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check admin server pod is ready + logger.info("Wait for admin server pod {0} to be ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check managed service {0} is created in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkServiceExists(managedServerPrefix + i, domainNamespace); + } + + // check managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Wait for managed pod {0} to be ready in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkPodReady(managedServerPrefix + i, domainUid, domainNamespace); + } + + String clusterService = domainUid + "-cluster-" + clusterName + "." + domainNamespace + ".svc.cluster.local"; + + Map templateMap = new HashMap(); + templateMap.put("NAMESPACE", domainNamespace); + templateMap.put("DUID", domainUid); + templateMap.put("ADMIN_SERVICE",adminServerPodName); + templateMap.put("CLUSTER_SERVICE", clusterService); + + Path srcHttpFile = Paths.get(RESOURCE_DIR, "istio", "istio-http-template.yaml"); + Path targetHttpFile = assertDoesNotThrow( + () -> generateFileFromTemplate(srcHttpFile.toString(), "istio-http.yaml", templateMap)); + logger.info("Generated Http VS/Gateway file path is {0}", targetHttpFile); + + boolean deployRes = assertDoesNotThrow( + () -> deployHttpIstioGatewayAndVirtualservice(targetHttpFile)); + assertTrue(deployRes, "Failed to deploy Http Istio Gateway/VirtualService"); + + Path srcDrFile = Paths.get(RESOURCE_DIR, "istio", "istio-dr-template.yaml"); + Path targetDrFile = assertDoesNotThrow( + () -> generateFileFromTemplate(srcDrFile.toString(), "istio-dr.yaml", templateMap)); + logger.info("Generated DestinationRule file path is {0}", targetDrFile); + + deployRes = assertDoesNotThrow( + () -> deployIstioDestinationRule(targetDrFile)); + assertTrue(deployRes, "Failed to deploy Istio DestinationRule"); + + int istioIngressPort = getIstioHttpIngressPort(); + logger.info("Istio Ingress Port is {0}", istioIngressPort); + + String consoleUrl = "http://" + K8S_NODEPORT_HOST + ":" + istioIngressPort + "/console/login/LoginForm.jsp"; + boolean checkConsole = + checkAppUsingHostHeader(consoleUrl, domainNamespace + ".org"); + assertTrue(checkConsole, "Failed to access WebLogic console"); + logger.info("WebLogic console is accessible"); + + + Path archivePath = Paths.get(ITTESTS_DIR, "../src/integration-tests/apps/testwebapp.war"); + ExecResult result = null; + result = DeployUtil.deployUsingRest(K8S_NODEPORT_HOST, + String.valueOf(istioIngressPort), + ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT, + clusterName, archivePath, domainNamespace + ".org", "testwebapp"); + assertNotNull(result, "Application deployment failed"); + logger.info("Application deployment returned {0}", result.toString()); + assertEquals("202", result.stdout(), "Deployment didn't return HTTP status code 202"); + + String url = "http://" + K8S_NODEPORT_HOST + ":" + istioIngressPort + "/testwebapp/index.jsp"; + logger.info("Application Access URL {0}", url); + boolean checkApp = checkAppUsingHostHeader(url, domainNamespace + ".org"); + assertTrue(checkApp, "Failed to access WebLogic application"); + } + + private Domain createDomainResource(String domainUid, String domNamespace, + String adminSecretName, String repoSecretName, + String encryptionSecretName, int replicaCount, String miiImage) { + + // create the domain CR + return new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("FromModel") + .image(miiImage) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING")) + .addClustersItem(new Cluster() + .clusterName(clusterName) + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .istio(new Istio() + .enabled(Boolean.TRUE) + .readinessPort(8888)) + .model(new Model() + .domainType("WLS") + .runtimeEncryptionSecret(encryptionSecretName)) + .introspectorJobActiveDeadlineSeconds(300L))); + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioTwoDomainsInImage.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioTwoDomainsInImage.java new file mode 100644 index 00000000000..96d0d3464a3 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItIstioTwoDomainsInImage.java @@ -0,0 +1,366 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1SecretReference; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Istio; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.annotations.tags.Slow; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.DeployUtil; +import oracle.weblogic.kubernetes.utils.ExecResult; +import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.WDT_BASIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.WDT_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.actions.ActionConstants.ITTESTS_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; +import static oracle.weblogic.kubernetes.actions.TestActions.addLabelsToNamespace; +import static oracle.weblogic.kubernetes.actions.TestActions.createDomainCustomResource; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.domainExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkAppUsingHostHeader; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.generateFileFromTemplate; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.IstioUtils.deployHttpIstioGatewayAndVirtualservice; +import static oracle.weblogic.kubernetes.utils.IstioUtils.deployIstioDestinationRule; +import static oracle.weblogic.kubernetes.utils.IstioUtils.getIstioHttpIngressPort; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@DisplayName("Test to create two WebLogic domains in domainhome-in-image model with istio configuration") +@IntegrationTest +class ItIstioTwoDomainsInImage { + + private static HelmParams opHelmParams = null; + private static String opNamespace = null; + private static String operatorImage = null; + private static String domainNamespace1 = null; + private static String domainNamespace2 = null; + private static ConditionFactory withStandardRetryPolicy = null; + private static String dockerConfigJson = ""; + private final String clusterName = "cluster-1"; // do not modify + private final String adminServerName = "admin-server"; // do not modify + private final String domainUid1 = "istio-dii-wdt-1"; + private final String domainUid2 = "istio-dii-wdt-2"; + private final String adminServerPodName1 = domainUid1 + "-" + adminServerName; + private final String adminServerPodName2 = domainUid2 + "-" + adminServerName; + + private static Map secretNameMap; + private static LoggingFacade logger = null; + + /** + * Install Operator. + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void initAll(@Namespaces(3) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + // get a new unique opNamespace + logger.info("Assigning unique namespace for Operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + opNamespace = namespaces.get(0); + + logger.info("Assigning unique namespace for domain1"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domainNamespace1 = namespaces.get(1); + + logger.info("Assigning unique namespace for domain2"); + assertNotNull(namespaces.get(2), "Namespace list is null"); + domainNamespace2 = namespaces.get(2); + + // Label the domain/operator namespace with istio-injection=enabled + Map labelMap = new HashMap(); + labelMap.put("istio-injection", "enabled"); + + assertDoesNotThrow(() -> addLabelsToNamespace(domainNamespace1,labelMap)); + assertDoesNotThrow(() -> addLabelsToNamespace(domainNamespace2,labelMap)); + assertDoesNotThrow(() -> addLabelsToNamespace(opNamespace,labelMap)); + + logger.info("Namespaces [{0}, {1}, {2}] labeled with istio-injection", + opNamespace, domainNamespace1, domainNamespace2); + + // install and verify operator + installAndVerifyOperator(opNamespace, domainNamespace1,domainNamespace2); + } + + /** + * Create two domains using domainhome-in-image model. + * Add istio configuration with default readinessPort. + * Deploy istio gateway and virtual service on each domain namespaces. + * Add host information to gateway and virtual service configurations. + * Put the namespace.org as host configuration + * Verify server pods are in ready state and services are created + * Verify login to WebLogic console on domain1 through istio ingress http + * port by passing host information in HTTP header. + * Deploy a web application to domain1 through istio ingress http port + * using host information in HTTP header. + * Access web application through istio http ingress port using host + * information in HTTP header. + * Repeat the same steps for domain2. + */ + @Test + @DisplayName("Two WebLogic domainhome-in-image with single istio ingress") + @Slow + public void testIstioTwoDomainsWithSingleIngress() { + final String managedServerPrefix1 = domainUid1 + "-managed-server"; + final String managedServerPrefix2 = domainUid2 + "-managed-server"; + final int replicaCount = 2; + + // Create the repo secret to pull the image + createDockerRegistrySecret(domainNamespace1); + createDockerRegistrySecret(domainNamespace2); + + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName1 = "weblogic-credentials-1"; + createSecretWithUsernamePassword(adminSecretName1, domainNamespace1, + ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT); + + String adminSecretName2 = "weblogic-credentials-2"; + createSecretWithUsernamePassword(adminSecretName2, domainNamespace2, + ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT); + + // create the domain CR(s) + createDomainResource(domainUid1, domainNamespace1, adminSecretName1, REPO_SECRET_NAME, + replicaCount); + createDomainResource(domainUid2, domainNamespace2, adminSecretName2, REPO_SECRET_NAME, + replicaCount); + + logger.info("Check for domain custom resource in namespace {0}", domainNamespace1); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for domain {0} to be created in namespace {1} " + + "(elapsed time {2}ms, remaining time {3}ms)", + domainUid1, + domainNamespace1, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(domainExists(domainUid1, DOMAIN_VERSION, domainNamespace1)); + + logger.info("Check for domain custom resource in namespace {0}", domainNamespace2); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for domain {0} to be created in namespace {1} " + + "(elapsed time {2}ms, remaining time {3}ms)", + domainUid2, + domainNamespace2, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(domainExists(domainUid2, DOMAIN_VERSION, domainNamespace2)); + + // check admin services are created + logger.info("Check admin service {0} is created in namespace {1}", + adminServerPodName1, domainNamespace1); + checkServiceExists(adminServerPodName1, domainNamespace1); + logger.info("Check admin service {0} is created in namespace {1}", + adminServerPodName2, domainNamespace2); + checkServiceExists(adminServerPodName2, domainNamespace2); + + // check admin server pods are ready + logger.info("Wait for admin server pod {0} to be ready in namespace {1}", + adminServerPodName1, domainNamespace1); + checkPodReady(adminServerPodName1, domainUid1, domainNamespace1); + logger.info("Wait for admin server pod {0} to be ready in namespace {1}", + adminServerPodName2, domainNamespace2); + checkPodReady(adminServerPodName2, domainUid2, domainNamespace2); + + // check managed server services are created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check managedserver service {0} is created in namespace {1}", + managedServerPrefix1 + i, domainNamespace1); + checkServiceExists(managedServerPrefix1 + i, domainNamespace1); + logger.info("Check managedserver service {0} is created in namespace {1}", + managedServerPrefix2 + i, domainNamespace2); + checkServiceExists(managedServerPrefix2 + i, domainNamespace2); + } + + // check managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Wait for managed pod {0} to be ready in namespace {1}", + managedServerPrefix1 + i, domainNamespace1); + checkPodReady(managedServerPrefix1 + i, domainUid1, domainNamespace1); + logger.info("Wait for managed pod {0} to be ready in namespace {1}", + managedServerPrefix2 + i, domainNamespace2); + checkPodReady(managedServerPrefix2 + i, domainUid2, domainNamespace2); + } + + String clusterService1 = domainUid1 + "-cluster-" + clusterName + "." + domainNamespace1 + ".svc.cluster.local"; + Map templateMap = new HashMap(); + templateMap.put("NAMESPACE", domainNamespace1); + templateMap.put("DUID", domainUid1); + templateMap.put("ADMIN_SERVICE",adminServerPodName1); + templateMap.put("CLUSTER_SERVICE", clusterService1); + + Path srcHttpFile = Paths.get(RESOURCE_DIR, "istio", "istio-http-template.yaml"); + Path targetHttpFile = assertDoesNotThrow( + () -> generateFileFromTemplate(srcHttpFile.toString(), "istio-http1.yaml", templateMap)); + logger.info("Generated Http VS/Gateway file path is {0} for domain1", targetHttpFile); + boolean deployRes = assertDoesNotThrow( + () -> deployHttpIstioGatewayAndVirtualservice(targetHttpFile)); + assertTrue(deployRes, "Failed to deploy Http Istio Gateway/VirtualService"); + + Path srcDrFile = Paths.get(RESOURCE_DIR, "istio", "istio-dr-template.yaml"); + Path targetDrFile = assertDoesNotThrow( + () -> generateFileFromTemplate(srcDrFile.toString(), "istio-dr1.yaml", templateMap)); + logger.info("Generated DestinationRule file path is {0}", targetDrFile); + + deployRes = assertDoesNotThrow( + () -> deployIstioDestinationRule(targetDrFile)); + assertTrue(deployRes, "Failed to deploy Istio DestinationRule"); + String clusterService2 = domainUid2 + "-cluster-" + clusterName + "." + domainNamespace2 + ".svc.cluster.local"; + templateMap.put("NAMESPACE", domainNamespace2); + templateMap.put("DUID", domainUid2); + templateMap.put("ADMIN_SERVICE",adminServerPodName2); + templateMap.put("CLUSTER_SERVICE", clusterService2); + + Path targetHttpFile2 = assertDoesNotThrow( + () -> generateFileFromTemplate(srcHttpFile.toString(), "istio-http2.yaml", templateMap)); + logger.info("Generated Http VS/Gateway file path is {0} for domain2", targetHttpFile); + deployRes = assertDoesNotThrow( + () -> deployHttpIstioGatewayAndVirtualservice(targetHttpFile2)); + assertTrue(deployRes, "Failed to deploy Http Istio Gateway/VirtualService"); + + Path targetDrFile2 = assertDoesNotThrow( + () -> generateFileFromTemplate(srcDrFile.toString(), "istio-dr2.yaml", templateMap)); + logger.info("Generated DestinationRule file path is {0}", targetDrFile); + + deployRes = assertDoesNotThrow( + () -> deployIstioDestinationRule(targetDrFile2)); + assertTrue(deployRes, "Failed to deploy Istio DestinationRule"); + + int istioIngressPort = getIstioHttpIngressPort(); + logger.info("Istio Ingress Port is {0}", istioIngressPort); + + String consoleUrl = "http://" + K8S_NODEPORT_HOST + ":" + istioIngressPort + "/console/login/LoginForm.jsp"; + boolean checkConsole = + checkAppUsingHostHeader(consoleUrl, domainNamespace1 + ".org"); + assertTrue(checkConsole, "Failed to access WebLogic console on domain1"); + logger.info("WebLogic console on domain1 is accessible"); + Path archivePath = Paths.get(ITTESTS_DIR, "../src/integration-tests/apps/testwebapp.war"); + ExecResult result = null; + result = DeployUtil.deployUsingRest(K8S_NODEPORT_HOST, + String.valueOf(istioIngressPort), + ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT, + clusterName, archivePath, domainNamespace1 + ".org", "testwebapp"); + assertNotNull(result, "Application deployment failed on domain1"); + logger.info("Application deployment on domain1 returned {0}", result.toString()); + assertEquals("202", result.stdout(), "Deployment didn't return HTTP status code 202"); + + String url = "http://" + K8S_NODEPORT_HOST + ":" + istioIngressPort + "/testwebapp/index.jsp"; + logger.info("Application Access URL {0}", url); + boolean checkApp = checkAppUsingHostHeader(url, domainNamespace1 + ".org"); + assertTrue(checkApp, "Failed to access WebLogic application on domain1"); + + checkConsole = checkAppUsingHostHeader(consoleUrl, domainNamespace2 + ".org"); + assertTrue(checkConsole, "Failed to access domain2 WebLogic console"); + logger.info("WebLogic console on domain2 is accessible"); + result = DeployUtil.deployUsingRest(K8S_NODEPORT_HOST, + String.valueOf(istioIngressPort), + ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT, + clusterName, archivePath, domainNamespace2 + ".org", "testwebapp"); + assertNotNull(result, "Application deployment on domain2 failed"); + logger.info("Application deployment on domain2 returned {0}", result.toString()); + assertEquals("202", result.stdout(), "Deployment didn't return HTTP status code 202"); + + logger.info("Application Access URL {0}", url); + checkApp = checkAppUsingHostHeader(url, domainNamespace2 + ".org"); + assertTrue(checkApp, "Failed to access WebLogic application on domain2"); + + } + + private void createDomainResource(String domainUid, String domNamespace, String adminSecretName, + String repoSecretName, int replicaCount) { + // In case of istio "default" channel can not be exposed through nodeport. + // No AdminService on domain resource. + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("Image") + .image(WDT_BASIC_IMAGE_NAME + ":" + WDT_BASIC_IMAGE_TAG) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING")) + .addClustersItem(new Cluster() + .clusterName(clusterName) + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .istio(new Istio() + .enabled(Boolean.TRUE) + .readinessPort(8888)) + .model(new Model() + .domainType("WLS")) + .introspectorJobActiveDeadlineSeconds(300L))); + + logger.info("Create domain custom resource for domainUid {0} in namespace {1}", + domainUid, domNamespace); + boolean domCreated = assertDoesNotThrow(() -> createDomainCustomResource(domain), + String.format("Create domain custom resource failed with ApiException for %s in namespace %s", + domainUid, domNamespace)); + assertTrue(domCreated, String.format("Create domain custom resource failed with ApiException " + + "for %s in namespace %s", domainUid, domNamespace)); + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItJrfDomainInPV.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItJrfDomainInPV.java new file mode 100644 index 00000000000..51ed81badff --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItJrfDomainInPV.java @@ -0,0 +1,348 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.io.File; +import java.io.FileOutputStream; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; + +import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimVolumeSource; +import io.kubernetes.client.openapi.models.V1SecretReference; +import io.kubernetes.client.openapi.models.V1Volume; +import io.kubernetes.client.openapi.models.V1VolumeMount; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.CommonTestUtils; +import oracle.weblogic.kubernetes.utils.DbUtils; +import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.DB_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.DB_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.JRF_BASE_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.JRF_BASE_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.KIND_REPO; +import static oracle.weblogic.kubernetes.TestConstants.OCR_EMAIL; +import static oracle.weblogic.kubernetes.TestConstants.OCR_PASSWORD; +import static oracle.weblogic.kubernetes.TestConstants.OCR_REGISTRY; +import static oracle.weblogic.kubernetes.TestConstants.OCR_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.OCR_USERNAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.TestUtils.getNextFreePort; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * Tests to create JRF domain in persistent volume using WLST. + */ +@DisplayName("Verify the WebLogic server pods can run with domain created in persistent volume") +@IntegrationTest +public class ItJrfDomainInPV { + + private static String dbNamespace = null; + private static String opNamespace = null; + private static String jrfDomainNamespace = null; + + private static final String RCUSCHEMAPREFIX = "jrfdomainpv"; + private static final String ORACLEDBURLPREFIX = "oracledb."; + private static final String ORACLEDBSUFFIX = ".svc.cluster.local:1521/devpdb.k8s"; + private static final String RCUSYSUSERNAME = "sys"; + private static final String RCUSYSPASSWORD = "Oradoc_db1"; + private static final String RCUSCHEMAUSERNAME = "myrcuuser"; + private static final String RCUSCHEMAPASSWORD = "Oradoc_db1"; + + private static String dbUrl = null; + private static String fmwImage = JRF_BASE_IMAGE_NAME + ":" + JRF_BASE_IMAGE_TAG; + private static String dbImage = DB_IMAGE_NAME + ":" + DB_IMAGE_TAG; + private static boolean isUseSecret = true; + private static LoggingFacade logger = null; + + private final String domainUid = "jrfdomain-inpv"; + private final String wlSecretName = domainUid + "-weblogic-credentials"; + private final String rcuSecretName = domainUid + "-rcu-credentials"; + + // create standard, reusable retry/backoff policy + private static final ConditionFactory withStandardRetryPolicy + = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + /** + * Start DB service and create RCU schema. + * Assigns unique namespaces for operator and domains. + * Pull FMW image and Oracle DB image if running tests in Kind cluster. + * Installs operator. + * + * @param namespaces injected by JUnit + */ + @BeforeAll + public static void initAll(@Namespaces(3) List namespaces) { + + logger = getLogger(); + logger.info("Assign a unique namespace for DB and RCU"); + assertNotNull(namespaces.get(0), "Namespace is null"); + dbNamespace = namespaces.get(0); + dbUrl = ORACLEDBURLPREFIX + dbNamespace + ORACLEDBSUFFIX; + + logger.info("Assign a unique namespace for operator"); + assertNotNull(namespaces.get(1), "Namespace is null"); + opNamespace = namespaces.get(1); + + logger.info("Assign a unique namespace for JRF domain"); + assertNotNull(namespaces.get(2), "Namespace is null"); + jrfDomainNamespace = namespaces.get(2); + + //determine if the tests are running in Kind cluster. if true use images from Kind registry + if (KIND_REPO != null) { + dbImage = KIND_REPO + DB_IMAGE_NAME.substring(OCR_REGISTRY.length() + 1) + + ":" + DB_IMAGE_TAG; + fmwImage = KIND_REPO + JRF_BASE_IMAGE_NAME.substring(OCR_REGISTRY.length() + 1) + + ":" + JRF_BASE_IMAGE_TAG; + isUseSecret = false; + } + + logger.info("Start DB and create RCU schema for namespace: {0}, RCU prefix: {1}, " + + "dbUrl: {2}, dbImage: {3}, fmwImage: {4} isUseSecret: {5}", dbNamespace, RCUSCHEMAPREFIX, dbUrl, + dbImage, fmwImage, isUseSecret); + assertDoesNotThrow(() -> DbUtils.setupDBandRCUschema(dbImage, fmwImage, RCUSCHEMAPREFIX, dbNamespace, + 0, dbUrl, isUseSecret), String.format("Failed to create RCU schema for prefix %s in the namespace %s with " + + "dbUrl %s, isUseSecret %s", RCUSCHEMAPREFIX, dbNamespace, dbUrl, isUseSecret)); + + // install operator and verify its running in ready state + installAndVerifyOperator(opNamespace, jrfDomainNamespace); + + logger.info("For ItJrfDomainInPV using DB image: {0}, FMW image {1}", dbImage, fmwImage); + + } + + /** + * Create a JRF domain using WLST in a persistent volume. + * Create a domain custom resource with domainHomeSourceType as PersistentVolume. + * Verify domain pods runs in ready state and services are created. + */ + @Test + @DisplayName("Create JRF domain in PV using WLST script") + public void testJrfDomainInPvUsingWlst() { + final String clusterName = "cluster-jrfdomain-inpv"; + final String adminServerName = "wlst-admin-server"; + final String adminServerPodName = domainUid + "-" + adminServerName; + final String managedServerNameBase = "wlst-ms-"; + final int managedServerPort = 8001; + final String managedServerPodNamePrefix = domainUid + "-" + managedServerNameBase; + final int replicaCount = 2; + final int t3ChannelPort = getNextFreePort(30000, 32767); + + final String pvName = domainUid + "-pv"; + final String pvcName = domainUid + "-pvc"; + + // create pull secrets for jrfDomainNamespace when running in non Kind Kubernetes cluster + if (isUseSecret) { + createDockerRegistrySecret(OCR_USERNAME, OCR_PASSWORD, + OCR_EMAIL, OCR_REGISTRY, OCR_SECRET_NAME, jrfDomainNamespace); + } + + // create JRF domain credential secret + createSecretWithUsernamePassword(wlSecretName, jrfDomainNamespace, + ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT); + + // create RCU credential secret + CommonTestUtils.createRcuSecretWithUsernamePassword(rcuSecretName, jrfDomainNamespace, + RCUSCHEMAUSERNAME, RCUSCHEMAPASSWORD, RCUSYSUSERNAME, RCUSYSPASSWORD); + + // create persistent volume and persistent volume claim for domain + CommonTestUtils.createPV(pvName, domainUid, this.getClass().getSimpleName()); + CommonTestUtils.createPVC(pvName, pvcName, domainUid, jrfDomainNamespace); + + // create a temporary WebLogic domain property file + File domainPropertiesFile = assertDoesNotThrow(() -> + File.createTempFile("domain", "properties"), + "Failed to create domain properties file"); + Properties p = new Properties(); + p.setProperty("oracleHome", "/u01/oracle"); //default $ORACLE_HOME + p.setProperty("javaHome", "/u01/jdk"); //default $JAVA_HOME + p.setProperty("domainParentDir", "/shared/domains/"); + p.setProperty("domainName", domainUid); + p.setProperty("domainUser", ADMIN_USERNAME_DEFAULT); + p.setProperty("domainPassword", ADMIN_PASSWORD_DEFAULT); + p.setProperty("rcuDb", dbUrl); + p.setProperty("rcuSchemaPrefix", RCUSCHEMAPREFIX); + p.setProperty("rcuSchemaPassword", RCUSCHEMAPASSWORD); + p.setProperty("adminListenPort", "7001"); + p.setProperty("adminName", adminServerName); + p.setProperty("managedNameBase", managedServerNameBase); + p.setProperty("managedServerPort",Integer.toString(managedServerPort)); + p.setProperty("prodMode", "true"); + p.setProperty("managedCount", "4"); + p.setProperty("clusterName", clusterName); + p.setProperty("t3ChannelPublicAddress", K8S_NODEPORT_HOST); + p.setProperty("t3ChannelPort", Integer.toString(t3ChannelPort)); + p.setProperty("exposeAdminT3Channel", "true"); + + assertDoesNotThrow(() -> + p.store(new FileOutputStream(domainPropertiesFile), "jrf wlst properties file"), + "Failed to write domain properties file"); + + // WLST script for creating domain + Path wlstScript = Paths.get(RESOURCE_DIR, "python-scripts", "jrf-wlst-create-domain-onpv.py"); + + // create configmap and domain on persistent volume using the WLST script and property file + createDomainOnPVUsingWlst(wlstScript, domainPropertiesFile.toPath(), + pvName, pvcName, jrfDomainNamespace); + + // create a domain custom resource configuration object + logger.info("Creating domain custom resource"); + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(jrfDomainNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHome("/shared/domains/" + domainUid) // point to domain home in pv + .domainHomeSourceType("PersistentVolume") // set the domain home source type as pv + .image(fmwImage) + .imagePullPolicy("IfNotPresent") + .imagePullSecrets(isUseSecret ? Arrays.asList( + new V1LocalObjectReference() + .name(OCR_SECRET_NAME)) + : null) + .webLogicCredentialsSecret(new V1SecretReference() + .name(wlSecretName) + .namespace(jrfDomainNamespace)) + .includeServerOutInPodLog(true) + .logHomeEnabled(Boolean.TRUE) + .logHome("/shared/logs/" + domainUid) + .dataHome("") + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() //serverpod + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom ")) + .addVolumesItem(new V1Volume() + .name(pvName) + .persistentVolumeClaim(new V1PersistentVolumeClaimVolumeSource() + .claimName(pvcName))) + .addVolumeMountsItem(new V1VolumeMount() + .mountPath("/shared") + .name(pvName))) + .adminServer(new AdminServer() //admin server + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)) + .addChannelsItem(new Channel() + .channelName("T3Channel") + .nodePort(t3ChannelPort)))) + .addClustersItem(new Cluster() //cluster + .clusterName(clusterName) + .replicas(replicaCount) + .serverStartState("RUNNING"))); + + // verify the domain custom resource is created + createDomainAndVerify(domain, jrfDomainNamespace); + + // verify the admin server service created + checkServiceExists(adminServerPodName, jrfDomainNamespace); + + // verify admin server pod is ready + checkPodReady(adminServerPodName, domainUid, jrfDomainNamespace); + + // verify managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Checking managed server service {0} is created in namespace {1}", + managedServerPodNamePrefix + i, jrfDomainNamespace); + checkServiceExists(managedServerPodNamePrefix + i, jrfDomainNamespace); + } + + // verify managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Waiting for managed server pod {0} to be ready in namespace {1}", + managedServerPodNamePrefix + i, jrfDomainNamespace); + checkPodReady(managedServerPodNamePrefix + i, domainUid, jrfDomainNamespace); + } + + } + + /** + * Create a WebLogic domain on a persistent volume by doing the following. + * Create a configmap containing WLST script and property file. + * Create a Kubernetes job to create domain on persistent volume. + * + * @param wlstScriptFile python script file to create domain + * @param domainPropertiesFile properties file containing domain configuration + * @param pvName name of the persistent volume to create domain in + * @param pvcName name of the persistent volume claim + * @param namespace name of the domain namespace in which the job is created + */ + private void createDomainOnPVUsingWlst(Path wlstScriptFile, Path domainPropertiesFile, + String pvName, String pvcName, String namespace) { + + logger.info("Preparing to run create domain job using WLST"); + + List domainScriptFiles = new ArrayList<>(); + domainScriptFiles.add(wlstScriptFile); + domainScriptFiles.add(domainPropertiesFile); + + logger.info("Creating a config map to hold domain creation scripts"); + String domainScriptConfigMapName = "create-domain-scripts-cm"; + assertDoesNotThrow( + () -> CommonTestUtils.createConfigMapForDomainCreation(domainScriptConfigMapName, domainScriptFiles, + namespace, this.getClass().getSimpleName()), + "Create configmap for domain creation failed"); + + // create a V1Container with specific scripts and properties for creating domain + V1Container jobCreationContainer = new V1Container() + .addCommandItem("/bin/sh") + .addArgsItem("/u01/oracle/oracle_common/common/bin/wlst.sh") + .addArgsItem("/u01/weblogic/" + wlstScriptFile.getFileName()) //wlst.sh script + .addArgsItem("-skipWLSModuleScanning") + .addArgsItem("-loadProperties") + .addArgsItem("/u01/weblogic/" + domainPropertiesFile.getFileName()); //domain property file + + logger.info("Running a Kubernetes job to create the domain"); + CommonTestUtils.createDomainJob(fmwImage, isUseSecret, pvName, pvcName, domainScriptConfigMapName, + jrfDomainNamespace, jobCreationContainer); + + } + +} + diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiAddCluster.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiAddCluster.java new file mode 100644 index 00000000000..ea294e0a804 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiAddCluster.java @@ -0,0 +1,688 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; + +import com.google.gson.JsonObject; +import io.kubernetes.client.custom.V1Patch; +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1ConfigMap; +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1Secret; +import io.kubernetes.client.openapi.models.V1SecretReference; +import io.kubernetes.client.openapi.models.V1ServiceAccount; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.OperatorParams; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.annotations.tags.MustNotRunInParallel; +import oracle.weblogic.kubernetes.annotations.tags.Slow; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.ExecResult; +import org.awaitility.core.ConditionFactory; +import org.joda.time.DateTime; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.OPERATOR_CHART_DIR; +import static oracle.weblogic.kubernetes.TestConstants.OPERATOR_RELEASE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.REPO_EMAIL; +import static oracle.weblogic.kubernetes.TestConstants.REPO_PASSWORD; +import static oracle.weblogic.kubernetes.TestConstants.REPO_REGISTRY; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.REPO_USERNAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.MODEL_DIR; +import static oracle.weblogic.kubernetes.actions.TestActions.createConfigMap; +import static oracle.weblogic.kubernetes.actions.TestActions.createDockerConfigJson; +import static oracle.weblogic.kubernetes.actions.TestActions.createDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.createSecret; +import static oracle.weblogic.kubernetes.actions.TestActions.createServiceAccount; +import static oracle.weblogic.kubernetes.actions.TestActions.deleteDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.getOperatorImageName; +import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; +import static oracle.weblogic.kubernetes.actions.TestActions.installOperator; +import static oracle.weblogic.kubernetes.actions.TestActions.patchDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.patchDomainResourceWithNewRestartVersion; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.domainExists; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.isHelmReleaseDeployed; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.operatorIsReady; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.podDoesNotExist; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.verifyRollingRestartOccurred; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.getPodCreationTime; +import static oracle.weblogic.kubernetes.utils.ExecCommand.exec; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@DisplayName("Test to add a cluster to model in image domain") +@IntegrationTest +class ItMiiAddCluster { + + private static HelmParams opHelmParams = null; + private static V1ServiceAccount serviceAccount = null; + private String serviceAccountName = null; + private static String opNamespace = null; + private static String operatorImage = null; + private static String domainNamespace = null; + private static ConditionFactory withStandardRetryPolicy = null; + private static String dockerConfigJson = ""; + + private static int replicaCount = 2; + private static final String domainUid = "mii-add-cluster"; + + private StringBuffer checkCluster = null; + private V1Patch patch = null; + + private static Map secretNameMap; + + private final String adminServerPodName = domainUid + "-admin-server"; + private final String managedServerPrefix = domainUid + "-managed-server"; + private static LoggingFacade logger = null; + + /** + * Install Operator. + * Create domain resource defintion. + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void initAll(@Namespaces(2) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + // get a new unique opNamespace + logger.info("Creating unique namespace for Operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + opNamespace = namespaces.get(0); + + logger.info("Creating unique namespace for Domain"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domainNamespace = namespaces.get(1); + + // Create a service account for the unique opNamespace + logger.info("Creating service account"); + String serviceAccountName = opNamespace + "-sa"; + assertDoesNotThrow(() -> createServiceAccount(new V1ServiceAccount() + .metadata( + new V1ObjectMeta() + .namespace(opNamespace) + .name(serviceAccountName)))); + logger.info("Created service account: {0}", serviceAccountName); + + // get Operator image name + operatorImage = getOperatorImageName(); + assertFalse(operatorImage.isEmpty(), "Operator image name can not be empty"); + logger.info("Operator image name {0}", operatorImage); + + // Create docker registry secret in the operator namespace to pull the image from repository + logger.info("Creating docker registry secret in namespace {0}", opNamespace); + JsonObject dockerConfigJsonObject = createDockerConfigJson( + REPO_USERNAME, REPO_PASSWORD, REPO_EMAIL, REPO_REGISTRY); + dockerConfigJson = dockerConfigJsonObject.toString(); + + // Create the V1Secret configuration + logger.info("Creating repo secret {0}", REPO_SECRET_NAME); + V1Secret repoSecret = new V1Secret() + .metadata(new V1ObjectMeta() + .name(REPO_SECRET_NAME) + .namespace(opNamespace)) + .type("kubernetes.io/dockerconfigjson") + .putDataItem(".dockerconfigjson", dockerConfigJson.getBytes()); + + boolean secretCreated = assertDoesNotThrow(() -> createSecret(repoSecret), + String.format("createSecret failed for %s", REPO_SECRET_NAME)); + assertTrue(secretCreated, String.format("createSecret failed while creating secret %s in namespace", + REPO_SECRET_NAME, opNamespace)); + + // map with secret + secretNameMap = new HashMap(); + secretNameMap.put("name", REPO_SECRET_NAME); + // helm install parameters + opHelmParams = new HelmParams() + .releaseName(OPERATOR_RELEASE_NAME) + .namespace(opNamespace) + .chartDir(OPERATOR_CHART_DIR); + + // Operator chart values to override + OperatorParams opParams = + new OperatorParams() + .helmParams(opHelmParams) + .image(operatorImage) + .imagePullSecrets(secretNameMap) + .domainNamespaces(Arrays.asList(domainNamespace)) + .serviceAccount(serviceAccountName); + + // install Operator + logger.info("Installing Operator in namespace {0}", opNamespace); + assertTrue(installOperator(opParams), + String.format("Operator install failed in namespace %s", opNamespace)); + logger.info("Operator installed in namespace {0}", opNamespace); + + // list helm releases matching Operator release name in operator namespace + logger.info("Checking Operator release {0} status in namespace {1}", + OPERATOR_RELEASE_NAME, opNamespace); + assertTrue(isHelmReleaseDeployed(OPERATOR_RELEASE_NAME, opNamespace), + String.format("Operator release %s is not in deployed status in namespace %s", + OPERATOR_RELEASE_NAME, opNamespace)); + logger.info("Operator release {0} status is deployed in namespace {1}", + OPERATOR_RELEASE_NAME, opNamespace); + + // check operator is running + logger.info("Check Operator pod is running in namespace {0}", opNamespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for operator to be running in namespace {0} " + + "(elapsed time {1}ms, remaining time {2}ms)", + opNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(operatorIsReady(opNamespace)); + + // Create the repo secret to pull the image + assertDoesNotThrow(() -> createRepoSecret(domainNamespace), + String.format("createSecret failed for %s", REPO_SECRET_NAME)); + + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + assertDoesNotThrow(() -> createDomainSecret(adminSecretName,"weblogic", + "welcome1", domainNamespace), + String.format("createSecret failed for %s", adminSecretName)); + + // create encryption secret + logger.info("Create encryption secret"); + String encryptionSecretName = "encryptionsecret"; + assertDoesNotThrow(() -> createDomainSecret(encryptionSecretName, "weblogicenc", + "weblogicenc", domainNamespace), + String.format("createSecret failed for %s", encryptionSecretName)); + // create the domain CR with no configmap + createDomainResource(domainUid, domainNamespace, adminSecretName, + REPO_SECRET_NAME, encryptionSecretName, + replicaCount); + + // wait for the domain to exist + logger.info("Check for domain custom resource in namespace {0}", domainNamespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for domain {0} to be created in namespace {1} " + + "(elapsed time {2}ms, remaining time {3}ms)", + domainUid, + domainNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(domainExists(domainUid, DOMAIN_VERSION, domainNamespace)); + } + + /** + * Verify all server pods are running. + * Verify all k8s services for all servers are created. + */ + @BeforeEach + public void beforeEach() { + + // check admin server pod is ready + logger.info("Wait for admin server pod {0} to be ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + logger.info("Check admin service {0} is created in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Wait for managed server pod {0} to be ready in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkPodReady(managedServerPrefix + i, domainUid, domainNamespace); + } + + // check managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check managed server service {0} is created in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkServiceExists(managedServerPrefix + i, domainNamespace); + } + } + + /** + * Patch the domain resource with the configmap to add a cluster. + * Update the restart version of the domain resource to 1. + * Verify rolling restart of the domain by comparing PodCreationTimestamp + * before and after rolling restart. + * Verify servers from new cluster are not in running state, because i + * the spec level replica count to zero(default). + */ + @Test + @Order(1) + @DisplayName("Add a cluster to model in image domain with default replica count") + @Slow + @MustNotRunInParallel + public void testAddMiiClusteriWithNoReplica() { + + // This test uses the WebLogic domain created in BeforeAll method + // BeforeEach method ensures that the server pods are running + + String configMapName = "noreplicaconfigmap"; + createClusterConfigMap(configMapName, "model.config.cluster.yaml"); + + LinkedHashMap pods = new LinkedHashMap<>(); + + // get the creation time of the server pods before patching + DateTime adminPodCreationTime = getPodCreationTime(domainNamespace, adminServerPodName); + pods.put(adminServerPodName, adminPodCreationTime); + for (int i = 1; i <= replicaCount; i++) { + pods.put(managedServerPrefix + i, getPodCreationTime(domainNamespace, managedServerPrefix + i)); + } + + StringBuffer patchStr = null; + patchStr = new StringBuffer("[{"); + patchStr.append("\"op\": \"replace\",") + .append(" \"path\": \"/spec/configuration/model/configMap\",") + .append(" \"value\": \"" + configMapName + "\"") + .append(" }]"); + logger.log(Level.INFO, "Configmap patch string: {0}", patchStr); + + patch = new V1Patch(new String(patchStr)); + boolean cmPatched = assertDoesNotThrow(() -> + patchDomainCustomResource(domainUid, domainNamespace, patch, "application/json-patch+json"), + "patchDomainCustomResource(configMap) failed "); + assertTrue(cmPatched, "patchDomainCustomResource(configMap) failed"); + + String newRestartVersion = patchDomainResourceWithNewRestartVersion(domainUid, domainNamespace); + logger.log(Level.INFO, "New restart version : {0}", newRestartVersion); + + assertTrue(assertDoesNotThrow( + () -> (verifyRollingRestartOccurred(pods, 1, domainNamespace)), + "More than one pod was restarted at same time"), + "Rolling restart failed"); + + // The ServerNamePrefix for the new configured cluster is config-server + // Make sure the managed server from new cluster is not running + + String newServerPodName = domainUid + "-config-server1"; + checkPodNotCreated(newServerPodName, domainUid, domainNamespace); + + boolean isServerConfigured = checkManagedServerConfiguration("config-server1"); + assertTrue(isServerConfigured, "Could not find new managed server configuration"); + logger.info("Found new managed server configuration"); + } + + /** + * Create a configmap with a sparse model file to add a dynamic cluster. + * Patch the domain resource with the configmap. + * Update the restart version of the domain resource to 2. + * Patch the domain resource with the spec/replicas set to 1. + * Verify rolling restart of the domain by comparing PodCreationTimestamp + * before and after rolling restart. + * Verify servers from new cluster are in running state. + */ + @Test + @Order(2) + @DisplayName("Add a dynamic cluster to model in image domain") + @Slow + @MustNotRunInParallel + public void testAddMiiDynamicCluster() { + + // This test uses the WebLogic domain created in BeforeAll method + // BeforeEach method ensures that the server pods are running + + String configMapName = "dynamicclusterconfigmap"; + createClusterConfigMap(configMapName, "model.dynamic.cluster.yaml"); + + LinkedHashMap pods = new LinkedHashMap<>(); + // get the creation time of the admin server pod before patching + DateTime adminPodCreationTime = getPodCreationTime(domainNamespace, adminServerPodName); + pods.put(adminServerPodName, adminPodCreationTime); + // get the creation time of the managed server pods before patching + for (int i = 1; i <= replicaCount; i++) { + pods.put(managedServerPrefix + i, getPodCreationTime(domainNamespace, managedServerPrefix + i)); + } + + StringBuffer patchStr = null; + patchStr = new StringBuffer("[{"); + patchStr.append("\"op\": \"replace\",") + .append(" \"path\": \"/spec/configuration/model/configMap\",") + .append(" \"value\": \"" + configMapName + "\"") + .append(" }]"); + logger.log(Level.INFO, "Configmap patch string: {0}", patchStr); + + patch = new V1Patch(new String(patchStr)); + boolean cmPatched = assertDoesNotThrow(() -> + patchDomainCustomResource(domainUid, domainNamespace, patch, "application/json-patch+json"), + "patchDomainCustomResource(configMap) failed "); + assertTrue(cmPatched, "patchDomainCustomResource(configMap) failed"); + + patchStr = new StringBuffer("[{"); + patchStr.append(" \"op\": \"replace\",") + .append(" \"path\": \"/spec/replicas\",") + .append(" \"value\": 1") + .append(" }]"); + logger.log(Level.INFO, "Replicas patch string: {0}", patchStr); + + patch = new V1Patch(new String(patchStr)); + boolean repilcaPatched = assertDoesNotThrow(() -> + patchDomainCustomResource(domainUid, domainNamespace, patch, "application/json-patch+json"), + "patchDomainCustomResource(restartVersion) failed "); + assertTrue(repilcaPatched, "patchDomainCustomResource(repilcas) failed"); + + String newRestartVersion = patchDomainResourceWithNewRestartVersion(domainUid, domainNamespace); + logger.log(Level.INFO, "New restart version : {0}", newRestartVersion); + + // Check if the admin server pod has been restarted + // by comparing the PodCreationTime before and after rolling restart + + assertTrue(assertDoesNotThrow( + () -> (verifyRollingRestartOccurred(pods, 1, domainNamespace)), + "More than one pod was restarted at same time"), + "Rolling restart failed"); + + // The ServerNamePrefix for the new dynamic cluster is dynamic-server + // Make sure the managed server from the new cluster is running + + String newServerPodName = domainUid + "-dynamic-server1"; + checkPodReady(newServerPodName, domainUid, domainNamespace); + checkServiceExists(newServerPodName, domainNamespace); + + boolean isServerConfigured = checkManagedServerConfiguration("dynamic-server1"); + assertTrue(isServerConfigured, "Could not find new managed server configuration"); + logger.info("Found new managed server configuration"); + } + + /** + * Create a configmap with a sparse model file to add a configured cluster. + * Patch the domain resource with the configmap. + * Update the restart version of the domain resource to 3. + * Patch the domain resource with the spec/replicas set to 1. + * Verify rolling restart of the domain by comparing PodCreationTimestamp + * before and after rolling restart. + * Verify servers from new cluster are in running state. + */ + @Test + @Order(3) + @DisplayName("Add a configured cluster to model in image domain") + @Slow + @MustNotRunInParallel + public void testAddMiiConfiguredCluster() { + + // This test uses the WebLogic domain created in BeforeAll method + // BeforeEach method ensures that the server pods are running + + String configMapName = "configclusterconfigmap"; + createClusterConfigMap(configMapName, "model.config.cluster.yaml"); + + LinkedHashMap pods = new LinkedHashMap<>(); + + // get the creation time of the admin server pod before patching + DateTime adminPodCreationTime = getPodCreationTime(domainNamespace, adminServerPodName); + // get the creation time of the managed server pods before patching + pods.put(adminServerPodName, adminPodCreationTime); + for (int i = 1; i <= replicaCount; i++) { + pods.put(managedServerPrefix + i, getPodCreationTime(domainNamespace, managedServerPrefix + i)); + } + + StringBuffer patchStr = null; + patchStr = new StringBuffer("[{"); + patchStr.append("\"op\": \"replace\",") + .append(" \"path\": \"/spec/configuration/model/configMap\",") + .append(" \"value\": \"" + configMapName + "\"") + .append(" }]"); + logger.log(Level.INFO, "Configmap patch string: {0}", patchStr); + + patch = new V1Patch(new String(patchStr)); + boolean cmPatched = assertDoesNotThrow(() -> + patchDomainCustomResource(domainUid, domainNamespace, patch, "application/json-patch+json"), + "patchDomainCustomResource(configMap) failed "); + assertTrue(cmPatched, "patchDomainCustomResource(configMap) failed"); + + patchStr = new StringBuffer("[{"); + patchStr.append(" \"op\": \"replace\",") + .append(" \"path\": \"/spec/replicas\",") + .append(" \"value\": 1") + .append(" }]"); + logger.log(Level.INFO, "Replicas patch string: {0}", patchStr); + + patch = new V1Patch(new String(patchStr)); + boolean repilcaPatched = assertDoesNotThrow(() -> + patchDomainCustomResource(domainUid, domainNamespace, patch, "application/json-patch+json"), + "patchDomainCustomResource(restartVersion) failed "); + assertTrue(repilcaPatched, "patchDomainCustomResource(repilcas) failed"); + + String newRestartVersion = patchDomainResourceWithNewRestartVersion(domainUid, domainNamespace); + logger.log(Level.INFO, "New restart version : {0}", newRestartVersion); + + assertTrue(assertDoesNotThrow( + () -> (verifyRollingRestartOccurred(pods, 1, domainNamespace)), + "More than one pod was restarted at same time"), + "Rolling restart failed"); + + // The ServerNamePrefix for the new configured cluster is config-server + // Make sure the managed server from the new cluster is running + String newServerPodName = domainUid + "-config-server1"; + checkPodReady(newServerPodName, domainUid, domainNamespace); + checkServiceExists(newServerPodName, domainNamespace); + + boolean isServerConfigured = checkManagedServerConfiguration("config-server1"); + assertTrue(isServerConfigured, "Could not find new managed server configuration"); + logger.info("Found new managed server configuration"); + } + + // This method is needed in this test class, since the cleanup util + // won't cleanup the images. + @AfterAll + void tearDown() { + // Delete domain custom resource + logger.info("Delete domain custom resource in namespace {0}", domainNamespace); + assertDoesNotThrow(() -> deleteDomainCustomResource(domainUid, domainNamespace), + "deleteDomainCustomResource failed with ApiException"); + logger.info("Deleted Domain Custom Resource " + domainUid + " from " + domainNamespace); + } + + private static void createRepoSecret(String domNamespace) throws ApiException { + V1Secret repoSecret = new V1Secret() + .metadata(new V1ObjectMeta() + .name(REPO_SECRET_NAME) + .namespace(domNamespace)) + .type("kubernetes.io/dockerconfigjson") + .putDataItem(".dockerconfigjson", dockerConfigJson.getBytes()); + + boolean secretCreated = false; + try { + secretCreated = createSecret(repoSecret); + } catch (ApiException e) { + logger.info("Exception when calling CoreV1Api#createNamespacedSecret"); + logger.info("Status code: " + e.getCode()); + logger.info("Reason: " + e.getResponseBody()); + logger.info("Response headers: " + e.getResponseHeaders()); + //409 means that the secret already exists - it is not an error, so can proceed + if (e.getCode() != 409) { + throw e; + } else { + secretCreated = true; + } + + } + assertTrue(secretCreated, String.format("create secret failed for %s in namespace %s", + REPO_SECRET_NAME, domNamespace)); + } + + private static void createDomainSecret(String secretName, String username, String password, String domNamespace) + throws ApiException { + Map secretMap = new HashMap(); + secretMap.put("username", username); + secretMap.put("password", password); + boolean secretCreated = assertDoesNotThrow(() -> createSecret(new V1Secret() + .metadata(new V1ObjectMeta() + .name(secretName) + .namespace(domNamespace)) + .stringData(secretMap)), "Create secret failed with ApiException"); + assertTrue(secretCreated, String.format("create secret failed for %s in namespace %s", secretName, domNamespace)); + + } + + private static void createDomainResource( + String domainUid, String domNamespace, String adminSecretName, + String repoSecretName, String encryptionSecretName, + int replicaCount) { + // create the domain CR + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("FromModel") + .image(MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)))) + .addClustersItem(new Cluster() + .clusterName("cluster-1") + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .model(new Model() + .domainType("WLS") + .runtimeEncryptionSecret(encryptionSecretName)) + .introspectorJobActiveDeadlineSeconds(300L))); + + logger.info("Create domain custom resource for domainUid {0} in namespace {1}", + domainUid, domNamespace); + boolean domCreated = assertDoesNotThrow(() -> createDomainCustomResource(domain), + String.format("Create domain custom resource failed with ApiException for %s in namespace %s", + domainUid, domNamespace)); + assertTrue(domCreated, String.format("Create domain custom resource failed with ApiException " + + "for %s in namespace %s", domainUid, domNamespace)); + } + + private void checkPodNotCreated(String podName, String domainUid, String domNamespace) { + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for pod {0} to be not created in namespace {1} " + + "(elapsed time {2}ms, remaining time {3}ms)", + podName, + domNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> podDoesNotExist(podName, domainUid, domNamespace), + String.format("podDoesNotExist failed with ApiException for %s in namespace in %s", + podName, domNamespace))); + + } + + /* + * Verify the server MBEAN configuration through rest API. + * @param managedServer name of the managed server + * @returns true if MBEAN is found otherwise false + **/ + private boolean checkManagedServerConfiguration(String managedServer) { + ExecResult result = null; + int adminServiceNodePort = getServiceNodePort(domainNamespace, adminServerPodName + "-external", "default"); + checkCluster = new StringBuffer("status=$(curl --user weblogic:welcome1 "); + checkCluster.append("http://" + K8S_NODEPORT_HOST + ":" + adminServiceNodePort) + .append("/management/tenant-monitoring/servers/") + .append(managedServer) + .append(" --silent --show-error ") + .append(" -o /dev/null") + .append(" -w %{http_code});") + .append("echo ${status}"); + logger.info("checkManagedServerConfiguration: curl command {0}", new String(checkCluster)); + try { + result = exec(new String(checkCluster), true); + } catch (Exception ex) { + logger.info("Exception in checkManagedServerConfiguration() {0}", ex); + return false; + } + logger.info("checkManagedServerConfiguration: curl command returned {0}", result.toString()); + if (result.stdout().equals("200")) { + return true; + } else { + return false; + } + } + + // Crate a ConfigMap with a model file to add a new WebLogic cluster + private void createClusterConfigMap(String configMapName, String modelFile) { + Map labels = new HashMap<>(); + labels.put("weblogic.domainUid", domainUid); + String dsModelFile = String.format("%s/%s", MODEL_DIR,modelFile); + Map data = new HashMap<>(); + String cmData = null; + cmData = assertDoesNotThrow(() -> Files.readString(Paths.get(dsModelFile)), + String.format("readString operation failed for %s", dsModelFile)); + assertNotNull(cmData, String.format("readString() operation failed while creating ConfigMap %s", configMapName)); + data.put(modelFile, cmData); + + V1ObjectMeta meta = new V1ObjectMeta() + .labels(labels) + .name(configMapName) + .namespace(domainNamespace); + V1ConfigMap configMap = new V1ConfigMap() + .data(data) + .metadata(meta); + + boolean cmCreated = assertDoesNotThrow(() -> createConfigMap(configMap), + String.format("Can't create ConfigMap %s", configMapName)); + assertTrue(cmCreated, String.format("createConfigMap failed while creating ConfigMap %s", configMapName)); + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiChangeAdminCredentials.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiChangeAdminCredentials.java new file mode 100644 index 00000000000..fce1aaf05a1 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiChangeAdminCredentials.java @@ -0,0 +1,208 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.annotations.tags.MustNotRunInParallel; +import oracle.weblogic.kubernetes.annotations.tags.Slow; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import org.awaitility.core.ConditionFactory; +import org.joda.time.DateTime; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_PATCH; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_PATCH; +import static oracle.weblogic.kubernetes.TestConstants.MANAGED_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.actions.TestActions.getPodCreationTimestamp; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.verifyRollingRestartOccurred; +import static oracle.weblogic.kubernetes.utils.CommonMiiTestUtils.createMiiDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonPatchTestUtils.checkPodRestartVersionUpdated; +import static oracle.weblogic.kubernetes.utils.CommonPatchTestUtils.patchDomainWithNewSecretAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.verifyCredentials; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +// Test to change the WebLogic credentials secret of a domain custom resource that uses model-in-image. +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@DisplayName("Test to patch the model-in-image image to change WebLogic admin credentials secret") +@IntegrationTest +class ItMiiChangeAdminCredentials { + + private static String domainNamespace = null; + private static String domainUid = "domain1"; + private static ConditionFactory withStandardRetryPolicy = null; + private static ConditionFactory withQuickRetryPolicy = null; + + private static String adminServerPodName = String.format("%s-%s", domainUid, ADMIN_SERVER_NAME_BASE); + private static String managedServerPrefix = String.format("%s-%s", domainUid, MANAGED_SERVER_NAME_BASE); + private static int replicaCount = 2; + private static LoggingFacade logger = null; + + /** + * Perform initialization for all the tests in this class. + * Set up the necessary namespaces, install the operator in the first namespace, and + * create a domain in the second namespace using the pre-created basic MII image. + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + * JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void initAll(@Namespaces(2) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(6, MINUTES).await(); + + // create quick, reusable retry/backoff policy + withQuickRetryPolicy = with().pollDelay(0, SECONDS) + .and().with().pollInterval(3, SECONDS) + .atMost(12, SECONDS).await(); + + // get namespaces + assertNotNull(namespaces.get(0), String.format("Namespace namespaces.get(0) is null")); + String opNamespace = namespaces.get(0); + + assertNotNull(namespaces.get(1), String.format("Namespace namespaces.get(1) is null")); + domainNamespace = namespaces.get(1); + + // install the operator + logger.info("Install an operator in namespace {0}, managing namespace {1}", + opNamespace, domainNamespace); + installAndVerifyOperator(opNamespace, domainNamespace); + + // create a domain resource + logger.info("Create model-in-image domain {0} in namespace {1}, and wait until it comes up", + domainUid, domainNamespace); + createMiiDomainAndVerify( + domainNamespace, + domainUid, + MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG, + adminServerPodName, + managedServerPrefix, + replicaCount); + } + + /** + * Test patching a running model-in-image domain with a new WebLogic credentials secret. + * Perform two patching operations to the domain spec. First, change the webLogicCredentialsSecret to + * a new secret, and then change the domainRestartVersion to trigger a rolling restart of the server pods. + * Verify that the domain spec's webLogicCredentialsSecret and restartVersion are updated, + * the server pods are recreated by checking each pod's creationTimestamp before and after patching, + * the server pods' weblogic.domainRestartVersion label is updated, and + * the new credentials are valid and can be used to access WebLogic RESTful Management Services. + */ + @Test + @DisplayName("Change the WebLogic credentials") + @Slow + @MustNotRunInParallel + public void testChangeWebLogicCredentials() { + final boolean VALID = true; + final boolean INVALID = false; + + LinkedHashMap pods = new LinkedHashMap<>(); + // get the creation time of the admin server pod before patching + DateTime adminPodCreationTime = + assertDoesNotThrow(() -> getPodCreationTimestamp(domainNamespace,"",adminServerPodName), + String.format("Failed to get creationTimestamp for pod %s", adminServerPodName)); + assertNotNull(adminPodCreationTime, "creationTimestamp of the admin server pod is null"); + + logger.info("Domain {0} in namespace {1}, admin server pod {2} creationTimestamp before patching is {3}", + domainUid, + domainNamespace, + adminServerPodName, + adminPodCreationTime); + + pods.put(adminServerPodName, adminPodCreationTime); + + List msLastCreationTime = new ArrayList(); + // get the creation time of the managed server pods before patching + assertDoesNotThrow( + () -> { + for (int i = 1; i <= replicaCount; i++) { + String managedServerPodName = managedServerPrefix + i; + DateTime creationTime = getPodCreationTimestamp(domainNamespace,"", managedServerPodName); + msLastCreationTime.add(creationTime); + pods.put(managedServerPodName, creationTime); + + logger.info("Domain {0} in namespace {1}, managed server pod {2} creationTimestamp before patching is {3}", + domainUid, + domainNamespace, + managedServerPodName, + creationTime); + } + }, + String.format("Failed to get creationTimestamp for managed server pods")); + + logger.info("Check that before patching current credentials are valid and new credentials are not"); + verifyCredentials(adminServerPodName, domainNamespace, ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT, VALID); + verifyCredentials(adminServerPodName, domainNamespace, ADMIN_USERNAME_PATCH, ADMIN_PASSWORD_PATCH, INVALID); + + // create a new secret for admin credentials + logger.info("Create a new secret that contains new WebLogic admin credentials"); + String adminSecretName = "weblogic-credentials-new"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + adminSecretName, + domainNamespace, + ADMIN_USERNAME_PATCH, + ADMIN_PASSWORD_PATCH), + String.format("createSecret failed for %s", adminSecretName)); + + // patch the domain resource with the new secret and verify that the domain resource is patched. + logger.info("Patch domain {0} in namespace {1} with the secret {2}, and verify the result", + domainUid, domainNamespace, adminSecretName); + + String restartVersion = patchDomainWithNewSecretAndVerify( + domainUid, + domainNamespace, + adminServerPodName, + managedServerPrefix, + replicaCount, + adminSecretName); + + logger.info("Wait for domain {0} admin server pod {1} in namespace {2} to be restarted", + domainUid, adminServerPodName, domainNamespace); + + assertTrue(assertDoesNotThrow( + () -> (verifyRollingRestartOccurred(pods, 1, domainNamespace)), + "More than one pod was restarted at same time"), + "Rolling restart failed"); + + for (int i = 1; i <= replicaCount; i++) { + final String podName = managedServerPrefix + i; + final DateTime lastCreationTime = msLastCreationTime.get(i - 1); + // check that the managed server pod's label has been updated with the new restartVersion + checkPodRestartVersionUpdated(podName, domainUid, domainNamespace, restartVersion); + } + + // check if the new credentials are valid and the old credentials are not valid any more + logger.info("Check that after patching current credentials are not valid and new credentials are"); + verifyCredentials(adminServerPodName, domainNamespace, ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT, INVALID); + verifyCredentials(adminServerPodName, domainNamespace, ADMIN_USERNAME_PATCH, ADMIN_PASSWORD_PATCH, VALID); + + logger.info("Domain {0} in namespace {1} is fully started after changing WebLogic credentials secret", + domainUid, domainNamespace); + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiConfigMap.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiConfigMap.java new file mode 100644 index 00000000000..227afd1fc77 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiConfigMap.java @@ -0,0 +1,509 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.google.gson.JsonObject; +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1Secret; +import io.kubernetes.client.openapi.models.V1SecretReference; +import io.kubernetes.client.openapi.models.V1ServiceAccount; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.OperatorParams; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.annotations.tags.MustNotRunInParallel; +import oracle.weblogic.kubernetes.annotations.tags.Slow; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.ExecResult; +import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.OPERATOR_CHART_DIR; +import static oracle.weblogic.kubernetes.TestConstants.OPERATOR_RELEASE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.REPO_EMAIL; +import static oracle.weblogic.kubernetes.TestConstants.REPO_PASSWORD; +import static oracle.weblogic.kubernetes.TestConstants.REPO_REGISTRY; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.REPO_USERNAME; +import static oracle.weblogic.kubernetes.actions.TestActions.createDockerConfigJson; +import static oracle.weblogic.kubernetes.actions.TestActions.createDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.createSecret; +import static oracle.weblogic.kubernetes.actions.TestActions.createServiceAccount; +import static oracle.weblogic.kubernetes.actions.TestActions.deleteDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.getOperatorImageName; +import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; +import static oracle.weblogic.kubernetes.actions.TestActions.installOperator; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.domainExists; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.isHelmReleaseDeployed; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.operatorIsReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createConfigMapAndVerify; +import static oracle.weblogic.kubernetes.utils.ExecCommand.exec; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@DisplayName("Test to create model in image domain with a configmap") +@IntegrationTest +class ItMiiConfigMap { + + private static HelmParams opHelmParams = null; + private static V1ServiceAccount serviceAccount = null; + private String serviceAccountName = null; + private static String opNamespace = null; + private static String operatorImage = null; + private static String domainNamespace = null; + private static ConditionFactory withStandardRetryPolicy = null; + private static String dockerConfigJson = ""; + + private String domainUid = "miiconfigmap"; + private StringBuffer curlString = null; + + private static Map secretNameMap; + final String adminServerPodName = domainUid + "-admin-server"; + final String managedServerPrefix = domainUid + "-managed-server"; + private static LoggingFacade logger = null; + + /** + * Install Operator. + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void initAll(@Namespaces(2) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + // get a new unique opNamespace + logger.info("Creating unique namespace for Operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + opNamespace = namespaces.get(0); + + logger.info("Creating unique namespace for Domain"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domainNamespace = namespaces.get(1); + + // Create a service account for the unique opNamespace + logger.info("Creating service account"); + String serviceAccountName = opNamespace + "-sa"; + assertDoesNotThrow(() -> createServiceAccount(new V1ServiceAccount() + .metadata( + new V1ObjectMeta() + .namespace(opNamespace) + .name(serviceAccountName)))); + logger.info("Created service account: {0}", serviceAccountName); + + // get Operator image name + operatorImage = getOperatorImageName(); + assertFalse(operatorImage.isEmpty(), "Operator image name can not be empty"); + logger.info("Operator image name {0}", operatorImage); + + // Create docker registry secret in the operator namespace to pull the image from repository + logger.info("Creating docker registry secret in namespace {0}", opNamespace); + JsonObject dockerConfigJsonObject = createDockerConfigJson( + REPO_USERNAME, REPO_PASSWORD, REPO_EMAIL, REPO_REGISTRY); + dockerConfigJson = dockerConfigJsonObject.toString(); + + // Create the V1Secret configuration + logger.info("Creating repo secret {0}", REPO_SECRET_NAME); + V1Secret repoSecret = new V1Secret() + .metadata(new V1ObjectMeta() + .name(REPO_SECRET_NAME) + .namespace(opNamespace)) + .type("kubernetes.io/dockerconfigjson") + .putDataItem(".dockerconfigjson", dockerConfigJson.getBytes()); + + boolean secretCreated = assertDoesNotThrow(() -> createSecret(repoSecret), + String.format("createSecret failed for %s", REPO_SECRET_NAME)); + assertTrue(secretCreated, String.format("createSecret failed while creating secret %s in namespace", + REPO_SECRET_NAME, opNamespace)); + + // map with secret + secretNameMap = new HashMap(); + secretNameMap.put("name", REPO_SECRET_NAME); + // helm install parameters + opHelmParams = new HelmParams() + .releaseName(OPERATOR_RELEASE_NAME) + .namespace(opNamespace) + .chartDir(OPERATOR_CHART_DIR); + + // Operator chart values to override + OperatorParams opParams = + new OperatorParams() + .helmParams(opHelmParams) + .image(operatorImage) + .imagePullSecrets(secretNameMap) + .domainNamespaces(Arrays.asList(domainNamespace)) + .serviceAccount(serviceAccountName); + + // install Operator + logger.info("Installing Operator in namespace {0}", opNamespace); + assertTrue(installOperator(opParams), + String.format("Operator install failed in namespace %s", opNamespace)); + logger.info("Operator installed in namespace {0}", opNamespace); + + // list helm releases matching Operator release name in operator namespace + logger.info("Checking Operator release {0} status in namespace {1}", + OPERATOR_RELEASE_NAME, opNamespace); + assertTrue(isHelmReleaseDeployed(OPERATOR_RELEASE_NAME, opNamespace), + String.format("Operator release %s is not in deployed status in namespace %s", + OPERATOR_RELEASE_NAME, opNamespace)); + logger.info("Operator release {0} status is deployed in namespace {1}", + OPERATOR_RELEASE_NAME, opNamespace); + + // check operator is running + logger.info("Check Operator pod is running in namespace {0}", opNamespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for operator to be running in namespace {0} " + + "(elapsed time {1}ms, remaining time {2}ms)", + opNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(operatorIsReady(opNamespace)); + + } + + /** + * Deploy a WebLogic domain with a defined configmap in configuration/model section of the domain resource. + * The configmap has multiple sparse WDT model files that define + * a JDBCSystemResource, a JMSSystemResource, and a WLDFSystemResource. + * Verify all the SystemResource configurations using the rest API call using adminserver's public nodeport + */ + @Test + @Order(1) + @DisplayName("Create model in image domain with a configmap") + @Slow + @MustNotRunInParallel + public void testCreateMiiConfigMapDomain() { + final int replicaCount = 2; + + // Create the repo secret to pull the image + assertDoesNotThrow(() -> createRepoSecret(domainNamespace), + String.format("createSecret failed for %s", REPO_SECRET_NAME)); + + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + assertDoesNotThrow(() -> createDomainSecret(adminSecretName,"weblogic", + "welcome1", domainNamespace), + String.format("createSecret failed for %s", adminSecretName)); + + // create encryption secret + logger.info("Create encryption secret"); + String encryptionSecretName = "encryptionsecret"; + assertDoesNotThrow(() -> createDomainSecret(encryptionSecretName, "weblogicenc", + "weblogicenc", domainNamespace), + String.format("createSecret failed for %s", encryptionSecretName)); + + //ToDo need to replace with actual URL once we have dynamic PDB instance + //is available thru JUnit5 extension framework + logger.info("Create database secret"); + final String dbSecretName = domainUid + "-db-secret"; + assertDoesNotThrow(() -> createDatabaseSecret(dbSecretName, "scott", + "tiger", "jdbc:oracle:thin:localhost:/ORCLCDB", domainNamespace), + String.format("createSecret failed for %s", dbSecretName)); + + String configMapName = "jdbc-jms-wldf-configmap"; + + createConfigMapAndVerify( + configMapName, domainUid, domainNamespace, + Arrays.asList("model.jdbc.yaml", "model.jms.yaml", "model.wldf.yaml")); + + // create the domain CR with a pre-defined configmap + createDomainResource(domainUid, domainNamespace, adminSecretName, + REPO_SECRET_NAME, encryptionSecretName, + replicaCount, configMapName, dbSecretName); + + // wait for the domain to exist + logger.info("Check for domain custom resource in namespace {0}", domainNamespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for domain {0} to be created in namespace {1} " + + "(elapsed time {2}ms, remaining time {3}ms)", + domainUid, + domainNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(domainExists(domainUid, DOMAIN_VERSION, domainNamespace)); + + + // check admin server pod exists + logger.info("Check for admin server pod {0} existence in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check managed server pods exist + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check for managed server pod {0} existence in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkPodReady(managedServerPrefix + i, domainUid, domainNamespace); + } + + // check admin server pod is ready + logger.info("Wait for admin server pod {0} to be ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Wait for managed server pod {0} to be ready in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkPodReady(managedServerPrefix + i, domainUid, domainNamespace); + } + + logger.info("Check admin service {0} is created in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check managed server service {0} is created in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkServiceExists(managedServerPrefix + i, domainNamespace); + } + + ExecResult result = null; + result = checkSystemResourceConfiguration("JDBCSystemResources", "TestDataSource"); + assertNotNull(result, "CheckJDBCSystemResources returned null"); + logger.info("CheckJDBCSystemResource returned {0}", result.toString()); + assertEquals("200", result.stdout(), "DataSource configuration not found"); + logger.info("Found the DataSource configuration"); + + result = null; + result = checkSystemResourceConfiguration("JMSSystemResources", "TestClusterJmsModule"); + assertNotNull(result, "CheckJMSSystemResources returned null"); + logger.info("CheckJMSSystemResource returned {0}", result.toString()); + assertEquals("200", result.stdout(), "JMSSystemResource not found"); + logger.info("Found the JMSSystemResource configuration"); + + result = null; + result = checkSystemResourceConfiguration("WLDFSystemResources", "TestWldfModule"); + assertNotNull(result, "CheckWLDFSystemResources returned null"); + logger.info("CheckWLDFSystemResource returned {0}", result.toString()); + assertEquals("200", result.stdout(), "WLDFSystemResource not found"); + logger.info("Found the WLDFSystemResource configuration"); + + result = null; + result = checkJdbcRuntime("TestDataSource"); + logger.info("checkJdbcRuntime: returned {0}", result.toString()); + assertTrue(result.stdout().contains("jdbc:oracle:thin:localhost"), + String.format("Overriden Database URL not found on RuntimeMBean")); + assertTrue(result.stdout().contains("scott"), + String.format("Overriden Database user not found on RuntimeMBean")); + } + + // This method is needed in this test class, since the cleanup util + // won't cleanup the images. + @AfterAll + void tearDown() { + // Delete domain custom resource + logger.info("Delete domain custom resource in namespace {0}", domainNamespace); + assertDoesNotThrow(() -> deleteDomainCustomResource(domainUid, domainNamespace), + "deleteDomainCustomResource failed with ApiException"); + logger.info("Deleted Domain Custom Resource " + domainUid + " from " + domainNamespace); + } + + private void createRepoSecret(String domNamespace) throws ApiException { + V1Secret repoSecret = new V1Secret() + .metadata(new V1ObjectMeta() + .name(REPO_SECRET_NAME) + .namespace(domNamespace)) + .type("kubernetes.io/dockerconfigjson") + .putDataItem(".dockerconfigjson", dockerConfigJson.getBytes()); + + boolean secretCreated = false; + try { + secretCreated = createSecret(repoSecret); + } catch (ApiException e) { + logger.info("Exception when calling CoreV1Api#createNamespacedSecret"); + logger.info("Status code: " + e.getCode()); + logger.info("Reason: " + e.getResponseBody()); + logger.info("Response headers: " + e.getResponseHeaders()); + if (e.getCode() != 409) { + throw e; + } else { + secretCreated = true; + } + + } + assertTrue(secretCreated, String.format("create secret failed for %s in namespace %s", + REPO_SECRET_NAME, domNamespace)); + } + + private void createDatabaseSecret( + String secretName, String username, String password, + String dburl, String domNamespace) throws ApiException { + Map secretMap = new HashMap(); + secretMap.put("username", username); + secretMap.put("password", password); + secretMap.put("url", dburl); + boolean secretCreated = assertDoesNotThrow(() -> createSecret(new V1Secret() + .metadata(new V1ObjectMeta() + .name(secretName) + .namespace(domNamespace)) + .stringData(secretMap)), "Create secret failed with ApiException"); + assertTrue(secretCreated, String.format("create secret failed for %s in namespace %s", secretName, domNamespace)); + + } + + + private void createDomainSecret(String secretName, String username, String password, String domNamespace) + throws ApiException { + Map secretMap = new HashMap(); + secretMap.put("username", username); + secretMap.put("password", password); + boolean secretCreated = assertDoesNotThrow(() -> createSecret(new V1Secret() + .metadata(new V1ObjectMeta() + .name(secretName) + .namespace(domNamespace)) + .stringData(secretMap)), "Create secret failed with ApiException"); + assertTrue(secretCreated, String.format("create secret failed for %s in namespace %s", secretName, domNamespace)); + + } + + private void createDomainResource( + String domainUid, String domNamespace, String adminSecretName, + String repoSecretName, String encryptionSecretName, + int replicaCount, String configmapName, String dbSecretName) { + List securityList = new ArrayList<>(); + securityList.add(dbSecretName); + // create the domain CR + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("FromModel") + .image(MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)))) + .addClustersItem(new Cluster() + .clusterName("cluster-1") + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .secrets(securityList) + .model(new Model() + .domainType("WLS") + .configMap(configmapName) + .runtimeEncryptionSecret(encryptionSecretName)) + .introspectorJobActiveDeadlineSeconds(300L))); + + logger.info("Create domain custom resource for domainUid {0} in namespace {1}", + domainUid, domNamespace); + boolean domCreated = assertDoesNotThrow(() -> createDomainCustomResource(domain), + String.format("Create domain custom resource failed with ApiException for %s in namespace %s", + domainUid, domNamespace)); + assertTrue(domCreated, String.format("Create domain custom resource failed with ApiException " + + "for %s in namespace %s", domainUid, domNamespace)); + } + + private ExecResult checkSystemResourceConfiguration(String resourcesType, String resourcesName) { + + int adminServiceNodePort = getServiceNodePort(domainNamespace, adminServerPodName + "-external", "default"); + ExecResult result = null; + curlString = new StringBuffer("status=$(curl --user weblogic:welcome1 "); + curlString.append("http://" + K8S_NODEPORT_HOST + ":" + adminServiceNodePort) + .append("/management/weblogic/latest/domainConfig") + .append("/") + .append(resourcesType) + .append("/") + .append(resourcesName) + .append("/") + .append(" --silent --show-error ") + .append(" -o /dev/null ") + .append(" -w %{http_code});") + .append("echo ${status}"); + logger.info("checkSystemResource: curl command {0}", new String(curlString)); + try { + result = exec(new String(curlString), true); + } catch (Exception ex) { + logger.info("checkSystemResource: caught unexpected exception {0}", ex); + return null; + } + return result; + } + + private ExecResult checkJdbcRuntime(String resourcesName) { + int adminServiceNodePort = getServiceNodePort(domainNamespace, adminServerPodName + "-external", "default"); + ExecResult result = null; + + curlString = new StringBuffer("curl --user weblogic:welcome1 "); + curlString.append("http://" + K8S_NODEPORT_HOST + ":" + adminServiceNodePort) + .append("/management/wls/latest/datasources/id/") + .append(resourcesName) + .append("/") + .append(" --silent --show-error "); + logger.info("checkJdbcRuntime: curl command {0}", new String(curlString)); + try { + result = exec(new String(curlString), true); + } catch (Exception ex) { + logger.info("checkJdbcRuntime: caught unexpected exception {0}", ex); + return null; + } + return result; + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiConfigMapOverride.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiConfigMapOverride.java new file mode 100644 index 00000000000..e00a9fc5bf3 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiConfigMapOverride.java @@ -0,0 +1,549 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; + +import com.google.gson.JsonObject; +import io.kubernetes.client.custom.V1Patch; +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1Secret; +import io.kubernetes.client.openapi.models.V1SecretReference; +import io.kubernetes.client.openapi.models.V1ServiceAccount; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.OperatorParams; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.annotations.tags.MustNotRunInParallel; +import oracle.weblogic.kubernetes.annotations.tags.Slow; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.ExecResult; +import org.awaitility.core.ConditionFactory; +import org.joda.time.DateTime; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.MANAGED_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.OPERATOR_CHART_DIR; +import static oracle.weblogic.kubernetes.TestConstants.OPERATOR_RELEASE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.REPO_EMAIL; +import static oracle.weblogic.kubernetes.TestConstants.REPO_PASSWORD; +import static oracle.weblogic.kubernetes.TestConstants.REPO_REGISTRY; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.REPO_USERNAME; +import static oracle.weblogic.kubernetes.actions.TestActions.createDockerConfigJson; +import static oracle.weblogic.kubernetes.actions.TestActions.createDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.createSecret; +import static oracle.weblogic.kubernetes.actions.TestActions.createServiceAccount; +import static oracle.weblogic.kubernetes.actions.TestActions.deleteDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.getOperatorImageName; +import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; +import static oracle.weblogic.kubernetes.actions.TestActions.installOperator; +import static oracle.weblogic.kubernetes.actions.TestActions.patchDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.patchDomainResourceWithNewRestartVersion; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.domainExists; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.isHelmReleaseDeployed; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.operatorIsReady; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.verifyRollingRestartOccurred; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createConfigMapAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.getPodCreationTime; +import static oracle.weblogic.kubernetes.utils.ExecCommand.exec; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@DisplayName("Test to update a model in image domain with a configmap") +@IntegrationTest +class ItMiiConfigMapOverride { + + private static HelmParams opHelmParams = null; + private static V1ServiceAccount serviceAccount = null; + private String serviceAccountName = null; + private static String opNamespace = null; + private static String operatorImage = null; + private static String domainNamespace = null; + private static ConditionFactory withStandardRetryPolicy = null; + private static String dockerConfigJson = ""; + + private String domainUid = "miicfgoverride"; + private StringBuffer curlString = null; + private V1Patch patch = null; + + private static Map secretNameMap; + final String adminServerPodName = String.format("%s-%s", domainUid, ADMIN_SERVER_NAME_BASE); + final String managedServerPrefix = String.format("%s-%s", domainUid, MANAGED_SERVER_NAME_BASE); + private static LoggingFacade logger = null; + + /** + * Install Operator. + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void initAll(@Namespaces(2) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + // get a new unique opNamespace + logger.info("Creating unique namespace for Operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + opNamespace = namespaces.get(0); + + logger.info("Creating unique namespace for Domain"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domainNamespace = namespaces.get(1); + + // Create a service account for the unique opNamespace + logger.info("Creating service account"); + String serviceAccountName = opNamespace + "-sa"; + assertDoesNotThrow(() -> createServiceAccount(new V1ServiceAccount() + .metadata( + new V1ObjectMeta() + .namespace(opNamespace) + .name(serviceAccountName)))); + logger.info("Created service account: {0}", serviceAccountName); + + // get Operator image name + operatorImage = getOperatorImageName(); + assertFalse(operatorImage.isEmpty(), "Operator image name can not be empty"); + logger.info("Operator image name {0}", operatorImage); + + // Create docker registry secret in the operator namespace to pull the image from repository + logger.info("Creating docker registry secret in namespace {0}", opNamespace); + JsonObject dockerConfigJsonObject = createDockerConfigJson( + REPO_USERNAME, REPO_PASSWORD, REPO_EMAIL, REPO_REGISTRY); + dockerConfigJson = dockerConfigJsonObject.toString(); + + // Create the V1Secret configuration + logger.info("Creating repo secret {0}", REPO_SECRET_NAME); + V1Secret repoSecret = new V1Secret() + .metadata(new V1ObjectMeta() + .name(REPO_SECRET_NAME) + .namespace(opNamespace)) + .type("kubernetes.io/dockerconfigjson") + .putDataItem(".dockerconfigjson", dockerConfigJson.getBytes()); + + boolean secretCreated = assertDoesNotThrow(() -> createSecret(repoSecret), + String.format("createSecret failed for %s", REPO_SECRET_NAME)); + assertTrue(secretCreated, String.format("createSecret failed while creating secret %s in namespace", + REPO_SECRET_NAME, opNamespace)); + + // map with secret + secretNameMap = new HashMap(); + secretNameMap.put("name", REPO_SECRET_NAME); + // helm install parameters + opHelmParams = new HelmParams() + .releaseName(OPERATOR_RELEASE_NAME) + .namespace(opNamespace) + .chartDir(OPERATOR_CHART_DIR); + + // Operator chart values to override + OperatorParams opParams = + new OperatorParams() + .helmParams(opHelmParams) + .image(operatorImage) + .imagePullSecrets(secretNameMap) + .domainNamespaces(Arrays.asList(domainNamespace)) + .serviceAccount(serviceAccountName); + + // install Operator + logger.info("Installing Operator in namespace {0}", opNamespace); + assertTrue(installOperator(opParams), + String.format("Operator install failed in namespace %s", opNamespace)); + logger.info("Operator installed in namespace {0}", opNamespace); + + // list helm releases matching Operator release name in operator namespace + logger.info("Checking Operator release {0} status in namespace {1}", + OPERATOR_RELEASE_NAME, opNamespace); + assertTrue(isHelmReleaseDeployed(OPERATOR_RELEASE_NAME, opNamespace), + String.format("Operator release %s is not in deployed status in namespace %s", + OPERATOR_RELEASE_NAME, opNamespace)); + logger.info("Operator release {0} status is deployed in namespace {1}", + OPERATOR_RELEASE_NAME, opNamespace); + + // check operator is running + logger.info("Check Operator pod is running in namespace {0}", opNamespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for operator to be running in namespace {0} " + + "(elapsed time {1}ms, remaining time {2}ms)", + opNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(operatorIsReady(opNamespace)); + } + + /** + * Start a WebLogic domain with out any pre-defined configmap. + * Create a configmap with a sparse JDBC/JMS/WLDF model files. + * Patch the domain resource with the configmap. + * Update the restart version of the domain resource. + * Verify rolling restart of the domain by comparing PodCreationTimestamp + * for all the server pods before and after rolling restart. + * Verify SystemResource configurations using Rest API call to admin server. + */ + @Test + @Order(1) + @DisplayName("Add JDBC/JMS/WLDF SystemResources to a model in image domain") + @Slow + @MustNotRunInParallel + public void testAddMiiSystemResources() { + final int replicaCount = 2; + + // Create the repo secret to pull the image + assertDoesNotThrow(() -> createRepoSecret(domainNamespace), + String.format("createSecret failed for %s", REPO_SECRET_NAME)); + + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + assertDoesNotThrow(() -> createDomainSecret(adminSecretName,"weblogic", + "welcome1", domainNamespace), + String.format("createSecret failed for %s", adminSecretName)); + + // create encryption secret + logger.info("Create encryption secret"); + String encryptionSecretName = "encryptionsecret"; + assertDoesNotThrow(() -> createDomainSecret(encryptionSecretName, "weblogicenc", + "weblogicenc", domainNamespace), + String.format("createSecret failed for %s", encryptionSecretName)); + + logger.info("Create database secret"); + final String dbSecretName = domainUid + "-db-secret"; + assertDoesNotThrow(() -> createDatabaseSecret(dbSecretName, "scott", + "tiger", "jdbc:oracle:thin:localhost:/ORCLCDB", domainNamespace), + String.format("createSecret failed for %s", dbSecretName)); + + String configMapName = "dsconfigmap"; + createConfigMapAndVerify( + configMapName, domainUid, domainNamespace, + Arrays.asList("model.jdbc.yaml", "model.jms.yaml", "model.wldf.yaml")); + + // create the domain CR with no configmap + createDomainResource(domainUid, domainNamespace, adminSecretName, + REPO_SECRET_NAME, encryptionSecretName, + replicaCount, dbSecretName); + + // wait for the domain to exist + logger.info("Check for domain custom resource in namespace {0}", domainNamespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for domain {0} to be created in namespace {1} " + + "(elapsed time {2}ms, remaining time {3}ms)", + domainUid, + domainNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(domainExists(domainUid, DOMAIN_VERSION, domainNamespace)); + + // check admin server pod exists + logger.info("Check for admin server pod {0} existence in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check managed server pods exist + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check for managed server pod {0} existence in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkPodReady(managedServerPrefix + i, domainUid, domainNamespace); + } + + // check admin server pod is ready + logger.info("Wait for admin server pod {0} to be ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + logger.info("Check admin service {0} is created in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Wait for managed server pod {0} to be ready in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkPodReady(managedServerPrefix + i, domainUid, domainNamespace); + } + + + // check managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check managed server service {0} is created in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkServiceExists(managedServerPrefix + i, domainNamespace); + } + + LinkedHashMap pods = new LinkedHashMap<>(); + // get the creation time of the admin server pod before patching + DateTime adminPodCreationTime = getPodCreationTime(domainNamespace,adminServerPodName); + pods.put(adminServerPodName, adminPodCreationTime); + // get the creation time of the managed server pods before patching + for (int i = 1; i <= replicaCount; i++) { + pods.put(managedServerPrefix + i, getPodCreationTime(domainNamespace, managedServerPrefix + i)); + } + + StringBuffer patchStr = null; + patchStr = new StringBuffer("[{"); + patchStr.append("\"op\": \"replace\",") + .append(" \"path\": \"/spec/configuration/model/configMap\",") + .append(" \"value\": \"" + configMapName + "\"") + .append(" }]"); + logger.log(Level.INFO, "Configmap patch string: {0}", patchStr); + + patch = new V1Patch(new String(patchStr)); + boolean cmPatched = assertDoesNotThrow(() -> + patchDomainCustomResource(domainUid, domainNamespace, patch, "application/json-patch+json"), + "patchDomainCustomResource(configMap) failed "); + assertTrue(cmPatched, "patchDomainCustomResource(configMap) failed"); + + String newRestartVersion = patchDomainResourceWithNewRestartVersion(domainUid, domainNamespace); + logger.log(Level.INFO, "New restart version is {0}", newRestartVersion); + + assertTrue(assertDoesNotThrow( + () -> (verifyRollingRestartOccurred(pods, 1, domainNamespace)), + "More than one pod was restarted at same time"), + "Rolling restart failed"); + + // Even if pods are created, need the service to created + // before checking the DataSource configuration + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check managed server service {0} is created in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkServiceExists(managedServerPrefix + i, domainNamespace); + } + + ExecResult result = null; + result = checkSystemResourceConfiguration("JDBCSystemResources", "TestDataSource"); + assertNotNull(result, "CheckJDBCSystemResources returned null"); + logger.info("CheckJDBCSystemResource returned {0}", result.toString()); + assertEquals("200", result.stdout(), "DataSource configuration not found"); + logger.info("Found the DataSource configuration"); + + result = null; + result = checkSystemResourceConfiguration("JMSSystemResources", "TestClusterJmsModule"); + assertNotNull(result, "CheckJMSSystemResources returned null"); + logger.info("CheckJMSSystemResource returned {0}", result.toString()); + assertEquals("200", result.stdout(), "JMSSystemResource not found"); + logger.info("Found the JMSSystemResource configuration"); + + result = null; + result = checkSystemResourceConfiguration("WLDFSystemResources", "TestWldfModule"); + assertNotNull(result, "CheckWLDFSystemResources returned null"); + logger.info("CheckWLDFSystemResource returned {0}", result.toString()); + assertEquals("200", result.stdout(), "WLDFSystemResource not found"); + logger.info("Found the WLDFSystemResource configuration"); + } + + // This method is needed in this test class, since the cleanup util + // won't cleanup the images. + @AfterAll + void tearDown() { + // Delete domain custom resource + logger.info("Delete domain custom resource in namespace {0}", domainNamespace); + assertDoesNotThrow(() -> deleteDomainCustomResource(domainUid, domainNamespace), + "deleteDomainCustomResource failed with ApiException"); + logger.info("Deleted Domain Custom Resource " + domainUid + " from " + domainNamespace); + } + + private void createRepoSecret(String domNamespace) throws ApiException { + V1Secret repoSecret = new V1Secret() + .metadata(new V1ObjectMeta() + .name(REPO_SECRET_NAME) + .namespace(domNamespace)) + .type("kubernetes.io/dockerconfigjson") + .putDataItem(".dockerconfigjson", dockerConfigJson.getBytes()); + + boolean secretCreated = false; + try { + secretCreated = createSecret(repoSecret); + } catch (ApiException e) { + logger.info("Exception when calling CoreV1Api#createNamespacedSecret"); + logger.info("Status code: " + e.getCode()); + logger.info("Reason: " + e.getResponseBody()); + logger.info("Response headers: " + e.getResponseHeaders()); + //409 means that the secret already exists - it is not an error, so can proceed + if (e.getCode() != 409) { + throw e; + } else { + secretCreated = true; + } + + } + assertTrue(secretCreated, String.format("create secret failed for %s in namespace %s", + REPO_SECRET_NAME, domNamespace)); + } + + private void createDatabaseSecret( + String secretName, String username, String password, + String dburl, String domNamespace) throws ApiException { + Map secretMap = new HashMap(); + secretMap.put("username", username); + secretMap.put("password", password); + secretMap.put("url", dburl); + boolean secretCreated = assertDoesNotThrow(() -> createSecret(new V1Secret() + .metadata(new V1ObjectMeta() + .name(secretName) + .namespace(domNamespace)) + .stringData(secretMap)), "Create secret failed with ApiException"); + assertTrue(secretCreated, String.format("create secret failed for %s in namespace %s", secretName, domNamespace)); + + } + + private void createDomainSecret(String secretName, String username, String password, String domNamespace) + throws ApiException { + Map secretMap = new HashMap(); + secretMap.put("username", username); + secretMap.put("password", password); + boolean secretCreated = assertDoesNotThrow(() -> createSecret(new V1Secret() + .metadata(new V1ObjectMeta() + .name(secretName) + .namespace(domNamespace)) + .stringData(secretMap)), "Create secret failed with ApiException"); + assertTrue(secretCreated, String.format("create secret failed for %s in namespace %s", secretName, domNamespace)); + } + + private void createDomainResource( + String domainUid, String domNamespace, String adminSecretName, + String repoSecretName, String encryptionSecretName, + int replicaCount, String dbSecretName) { + + List securityList = new ArrayList<>(); + securityList.add(dbSecretName); + // create the domain CR + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("FromModel") + .image(MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)))) + .addClustersItem(new Cluster() + .clusterName("cluster-1") + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .secrets(securityList) + .model(new Model() + .domainType("WLS") + .runtimeEncryptionSecret(encryptionSecretName)) + .introspectorJobActiveDeadlineSeconds(300L))); + + logger.info("Create domain custom resource for domainUid {0} in namespace {1}", + domainUid, domNamespace); + boolean domCreated = assertDoesNotThrow(() -> createDomainCustomResource(domain), + String.format("Create domain custom resource failed with ApiException for %s in namespace %s", + domainUid, domNamespace)); + assertTrue(domCreated, String.format("Create domain custom resource failed with ApiException " + + "for %s in namespace %s", domainUid, domNamespace)); + } + + private ExecResult checkSystemResourceConfiguration(String resourcesType, String resourcesName) { + + int adminServiceNodePort = getServiceNodePort(domainNamespace, adminServerPodName + "-external", "default"); + ExecResult result = null; + curlString = new StringBuffer("status=$(curl --user weblogic:welcome1 "); + curlString.append("http://" + K8S_NODEPORT_HOST + ":" + adminServiceNodePort) + .append("/management/weblogic/latest/domainConfig") + .append("/") + .append(resourcesType) + .append("/") + .append(resourcesName) + .append("/") + .append(" --silent --show-error ") + .append(" -o /dev/null ") + .append(" -w %{http_code});") + .append("echo ${status}"); + logger.info("checkSystemResource: curl command {0}", new String(curlString)); + try { + result = exec(new String(curlString), true); + } catch (Exception ex) { + logger.info("checkSystemResource: caught unexpected exception {0}", ex); + return null; + } + return result; + } + + private ExecResult checkJdbcRuntime(String resourcesName) { + int adminServiceNodePort = getServiceNodePort(domainNamespace, adminServerPodName + "-external", "default"); + ExecResult result = null; + curlString = new StringBuffer("curl --user weblogic:welcome1 "); + curlString.append("http://" + K8S_NODEPORT_HOST + ":" + adminServiceNodePort) + .append("/management/wls/latest/datasources/id/") + .append(resourcesName) + .append("/") + .append(" --silent --show-error "); + + logger.info("checkJdbcRuntime: curl command {0}", new String(curlString)); + try { + result = exec(new String(curlString), true); + } catch (Exception ex) { + logger.info("checkJdbcRuntime: caught unexpected exception {0}", ex); + return null; + } + return result; + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiDomain.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiDomain.java new file mode 100644 index 00000000000..666637d98e7 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiDomain.java @@ -0,0 +1,1099 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import io.kubernetes.client.custom.V1Patch; +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1SecretReference; +import io.kubernetes.client.openapi.models.V1ServiceAccount; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.annotations.tags.MustNotRunInParallel; +import oracle.weblogic.kubernetes.annotations.tags.Slow; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.MII_APP_RESPONSE_V1; +import static oracle.weblogic.kubernetes.TestConstants.MII_APP_RESPONSE_V2; +import static oracle.weblogic.kubernetes.TestConstants.MII_APP_RESPONSE_V3; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_APP_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_WDT_MODEL_FILE; +import static oracle.weblogic.kubernetes.TestConstants.MII_TWO_APP_WDT_MODEL_FILE; +import static oracle.weblogic.kubernetes.TestConstants.REPO_DUMMY_VALUE; +import static oracle.weblogic.kubernetes.TestConstants.REPO_NAME; +import static oracle.weblogic.kubernetes.TestConstants.REPO_PASSWORD; +import static oracle.weblogic.kubernetes.TestConstants.REPO_REGISTRY; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.REPO_USERNAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.ARCHIVE_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.MODEL_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WDT_VERSION; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WIT_BUILD_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_NAME; +import static oracle.weblogic.kubernetes.actions.TestActions.buildAppArchive; +import static oracle.weblogic.kubernetes.actions.TestActions.createImage; +import static oracle.weblogic.kubernetes.actions.TestActions.defaultAppParams; +import static oracle.weblogic.kubernetes.actions.TestActions.defaultWitParams; +import static oracle.weblogic.kubernetes.actions.TestActions.deleteDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.deleteImage; +import static oracle.weblogic.kubernetes.actions.TestActions.dockerLogin; +import static oracle.weblogic.kubernetes.actions.TestActions.dockerPush; +import static oracle.weblogic.kubernetes.actions.TestActions.patchDomainCustomResource; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.appAccessibleInPod; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.appNotAccessibleInPod; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.doesImageExist; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.domainResourceImagePatched; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.podImagePatched; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createMiiImageAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.dockerLoginAndPushImageToRegistry; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.upgradeAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.FileUtils.checkDirectory; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +// Test to create model in image domain and verify the domain started successfully +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@DisplayName("Test to create model in image domain and start the domain") +@IntegrationTest +class ItMiiDomain { + + private static HelmParams opHelmParams = null; + private static V1ServiceAccount serviceAccount = null; + private String serviceAccountName = null; + private static String opNamespace = null; + private static String operatorImage = null; + private static String domainNamespace = null; + private static String domainNamespace1 = null; + private static ConditionFactory withStandardRetryPolicy = null; + private static ConditionFactory withQuickRetryPolicy = null; + private static String dockerConfigJson = ""; + + private String domainUid = "domain1"; + private String domainUid1 = "domain2"; + private String miiImagePatchAppV2 = null; + private String miiImageAddSecondApp = null; + private String miiImage = null; + private static LoggingFacade logger = null; + + private static Map secretNameMap; + + /** + * Install Operator. + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void initAll(@Namespaces(3) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(6, MINUTES).await(); + + // create a reusable quick retry policy + withQuickRetryPolicy = with().pollDelay(0, SECONDS) + .and().with().pollInterval(4, SECONDS) + .atMost(10, SECONDS).await(); + + // get a new unique opNamespace + logger.info("Creating unique namespace for Operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + opNamespace = namespaces.get(0); + + logger.info("Creating unique namespace for Domain"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domainNamespace = namespaces.get(1); + assertNotNull(namespaces.get(2), "Namespace list is null"); + domainNamespace1 = namespaces.get(2); + + // install and verify operator + installAndVerifyOperator(opNamespace, domainNamespace, domainNamespace1); + } + + @Test + @Order(1) + @DisplayName("Create model in image domain") + @Slow + @MustNotRunInParallel + public void testCreateMiiDomain() { + // admin/managed server name here should match with model yaml in MII_BASIC_WDT_MODEL_FILE + final String adminServerPodName = domainUid + "-admin-server"; + final String managedServerPrefix = domainUid + "-managed-server"; + final int replicaCount = 2; + + // Create the repo secret to pull the image + assertDoesNotThrow(() -> createDockerRegistrySecret(domainNamespace), + String.format("createSecret failed for %s", REPO_SECRET_NAME)); + + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + adminSecretName, + domainNamespace, + "weblogic", + "welcome1"), + String.format("createSecret failed for %s", adminSecretName)); + + // create encryption secret + logger.info("Create encryption secret"); + String encryptionSecretName = "encryptionsecret"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + encryptionSecretName, + domainNamespace, + "weblogicenc", + "weblogicenc"), + String.format("createSecret failed for %s", encryptionSecretName)); + + // create the domain object + Domain domain = createDomainResource(domainUid, + domainNamespace, + adminSecretName, + REPO_SECRET_NAME, + encryptionSecretName, + replicaCount, + MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG); + + // create model in image domain + logger.info("Creating model in image domain {0} in namespace {1} using docker image {2}", + domainUid, domainNamespace, MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG); + createDomainAndVerify(domain, domainNamespace); + + // check admin server pod is ready + logger.info("Wait for admin server pod {0} to be ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Wait for managed server pod {0} to be ready in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkPodReady(managedServerPrefix + i, domainUid, domainNamespace); + } + + logger.info("Check admin service {0} is created in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check managed server service {0} is created in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkServiceExists(managedServerPrefix + i, domainNamespace); + } + + // check and wait for the application to be accessible in all server pods + for (int i = 1; i <= replicaCount; i++) { + checkAppRunning( + domainNamespace, + managedServerPrefix + i, + "8001", + "sample-war/index.jsp", + MII_APP_RESPONSE_V1 + i); + } + + logger.info("Domain {0} is fully started - servers are running and application is available", + domainUid); + } + + @Test + @Order(2) + @DisplayName("Create a second domain with the image from the the first test") + @Slow + @MustNotRunInParallel + public void testCreateMiiSecondDomainDiffNSSameImage() { + // admin/managed server name here should match with model yaml in MII_BASIC_WDT_MODEL_FILE + final String adminServerPodName = domainUid1 + "-admin-server"; + final String managedServerPrefix = domainUid1 + "-managed-server"; + final int replicaCount = 2; + + // Create the repo secret to pull the image + assertDoesNotThrow(() -> createDockerRegistrySecret(domainNamespace1), + String.format("createSecret failed for %s", REPO_SECRET_NAME)); + + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + adminSecretName, + domainNamespace1, + "weblogic", + "welcome1"), + String.format("createSecret failed for %s", adminSecretName)); + + // create encryption secret + logger.info("Create encryption secret"); + String encryptionSecretName = "encryptionsecret"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + encryptionSecretName, + domainNamespace1, + "weblogicenc", + "weblogicenc"), + String.format("createSecret failed for %s", encryptionSecretName)); + + // create the domain object + Domain domain = createDomainResource(domainUid1, + domainNamespace1, + adminSecretName, + REPO_SECRET_NAME, + encryptionSecretName, + replicaCount, + MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG); + + // create model in image domain + logger.info("Creating model in image domain {0} in namespace {1} using docker image {2}", + domainUid1, domainNamespace1, MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG); + createDomainAndVerify(domain, domainNamespace1); + + // check admin server pod is ready + logger.info("Wait for admin server pod {0} to be ready in namespace {1}", + adminServerPodName, domainNamespace1); + checkPodReady(adminServerPodName, domainUid1, domainNamespace1); + + // check managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Wait for managed server pod {0} to be ready in namespace {1}", + managedServerPrefix + i, domainNamespace1); + checkPodReady(managedServerPrefix + i, domainUid1, domainNamespace1); + } + + logger.info("Check admin service {0} is created in namespace {1}", + adminServerPodName, domainNamespace1); + checkServiceExists(adminServerPodName, domainNamespace1); + + // check managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check managed server service {0} is created in namespace {1}", + managedServerPrefix + i, domainNamespace1); + checkServiceExists(managedServerPrefix + i, domainNamespace1); + } + } + + @Test + @Order(3) + @DisplayName("Update the sample-app application to version 2") + @Slow + @MustNotRunInParallel + public void testPatchAppV2() { + + // application in the new image contains what is in the original application directory sample-app, + // plus the replacements or/and additions in the second application directory sample-app-2. + final String appDir1 = "sample-app"; + final String appDir2 = "sample-app-2"; + final String adminServerPodName = domainUid + "-admin-server"; + final String managedServerPrefix = domainUid + "-managed-server"; + final int replicaCount = 2; + + Thread accountingThread = null; + List appAvailability = new ArrayList(); + + logger.info("Start a thread to keep track of the application's availability"); + // start a new thread to collect the availability data of the application while the + // main thread performs patching operation, and checking of the results. + accountingThread = + new Thread( + () -> { + collectAppAvaiability( + domainNamespace, + appAvailability, + managedServerPrefix, + replicaCount, + "8001", + "sample-war/index.jsp"); + }); + accountingThread.start(); + + try { + logger.info("Check that V1 application is still running"); + for (int i = 1; i <= replicaCount; i++) { + quickCheckAppRunning( + domainNamespace, + managedServerPrefix + i, + "8001", + "sample-war/index.jsp", + MII_APP_RESPONSE_V1 + i); + } + + logger.info("Check that the version 2 application is NOT running"); + for (int i = 1; i <= replicaCount; i++) { + quickCheckAppNotRunning( + domainNamespace, + managedServerPrefix + i, + "8001", + "sample-war/index.jsp", + MII_APP_RESPONSE_V2 + i); + } + + logger.info("Create a new image with application V2"); + miiImagePatchAppV2 = updateImageWithAppV2Patch( + String.format("%s-%s", MII_BASIC_IMAGE_NAME, "test-patch-app-v2"), + Arrays.asList(appDir1, appDir2)); + + // push the image to a registry to make the test work in multi node cluster + pushImageIfNeeded(miiImagePatchAppV2); + + // patch the domain resource with the new image and verify that the domain resource is patched, + // and all server pods are patched as well. + logger.info("Patch domain resource with image {0}, and verify the results", miiImagePatchAppV2); + patchAndVerify( + domainUid, + domainNamespace, + adminServerPodName, + managedServerPrefix, + replicaCount, + miiImagePatchAppV2); + + logger.info("Check and wait for the V2 application to become available"); + for (int i = 1; i <= replicaCount; i++) { + checkAppRunning( + domainNamespace, + managedServerPrefix + i, + "8001", + "sample-war/index.jsp", + MII_APP_RESPONSE_V2 + i); + } + } finally { + + if (accountingThread != null) { + try { + accountingThread.join(); + } catch (InterruptedException ie) { + // do nothing + } + + // check the application availability data that we have collected, and see if + // the application has been available all the time since the beginning of this test method + logger.info("Verify that V2 application was available when domain {0} was being patched with image {1}", + domainUid, miiImagePatchAppV2); + assertTrue(appAlwaysAvailable(appAvailability), + String.format("Application V2 was not always available when domain %s was being patched with image %s", + domainUid, miiImagePatchAppV2)); + } + } + + logger.info("The version 2 application has been deployed correctly on all server pods"); + } + + @Test + @Order(4) + @DisplayName("Update the domain with another application") + @Slow + @MustNotRunInParallel + public void testAddSecondApp() { + + // the existing application is the combination of what are in appDir1 and appDir2 as in test case number 4, + // the second application is in appDir3. + final String appDir1 = "sample-app"; + final String appDir2 = "sample-app-2"; + final String appDir3 = "sample-app-3"; + final String adminServerPodName = domainUid + "-admin-server"; + final String managedServerPrefix = domainUid + "-managed-server"; + final int replicaCount = 2; + + logger.info("Check that V2 application is still running after the previous test"); + for (int i = 1; i <= replicaCount; i++) { + quickCheckAppRunning( + domainNamespace, + managedServerPrefix + i, + "8001", + "sample-war/index.jsp", + MII_APP_RESPONSE_V2 + i); + } + + logger.info("Check that the new application is NOT already running"); + for (int i = 1; i <= replicaCount; i++) { + quickCheckAppNotRunning( + domainNamespace, + managedServerPrefix + i, + "8001", + "sample-war-3/index.jsp", + MII_APP_RESPONSE_V3 + i); + } + + logger.info("Create a new image that contains the additional application"); + miiImageAddSecondApp = updateImageWithSampleApp3( + String.format("%s-%s", MII_BASIC_IMAGE_NAME, "test-add-second-app"), + Arrays.asList(appDir1, appDir2), + Collections.singletonList(appDir3), + MII_TWO_APP_WDT_MODEL_FILE); + + // push the image to a registry to make the test work in multi node cluster + pushImageIfNeeded(miiImageAddSecondApp); + + // patch the domain resource with the new image and verify that the domain resource is patched, + // and all server pods are patched as well. + logger.info("Patch the domain with image {0}, and verify the results", miiImageAddSecondApp); + patchAndVerify( + domainUid, + domainNamespace, + adminServerPodName, + managedServerPrefix, + replicaCount, + miiImageAddSecondApp); + + logger.info("Check and wait for the new application to become ready"); + for (int i = 1; i <= replicaCount; i++) { + checkAppRunning( + domainNamespace, + managedServerPrefix + i, + "8001", + "sample-war-3/index.jsp", + MII_APP_RESPONSE_V3 + i); + } + + logger.info("Check and wait for the original application V2 to become ready"); + for (int i = 1; i <= replicaCount; i++) { + checkAppRunning( + domainNamespace, + managedServerPrefix + i, + "8001", + "sample-war/index.jsp", + MII_APP_RESPONSE_V2 + i); + } + + logger.info("Both of the applications are running correctly after patching"); + } + + /** + * Parameterized test to create model in image domain using different WebLogic version images + * as parameters. + * + * @param imageTag WebLogic image tag + * @param namespaces domain namespace + */ + @ParameterizedTest + @DisplayName("Create model in image domain using different WebLogic version images as parameters") + @MethodSource("oracle.weblogic.kubernetes.utils.Params#webLogicImageTags") + public void testParamsCreateMiiDomain(String imageTag, @Namespaces(1) List namespaces) { + imageTag = imageTag.trim(); + assertTrue(!imageTag.isEmpty(), "imageTag can not be empty string"); + logger.info("Using imageTag {0}", imageTag); + + logger.info("Getting unique namespace for Domain"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + domainNamespace = namespaces.get(0); + + // upgrade Operator for the new domain namespace + assertTrue(upgradeAndVerifyOperator(opNamespace, domainNamespace), + String.format("Failed to upgrade operator in namespace %s", opNamespace)); + + // admin/managed server name here should match with model yaml in MII_BASIC_WDT_MODEL_FILE + final String adminServerPodName = domainUid + "-" + ADMIN_SERVER_NAME_BASE; + final String managedServerPrefix = domainUid + "-managed-server"; + final int replicaCount = 2; + + // create image with model files + logger.info("Creating image with model file and verify"); + miiImage = createMiiImageAndVerify( + "mii-image", + MII_BASIC_WDT_MODEL_FILE, + MII_BASIC_APP_NAME, + WLS_BASE_IMAGE_NAME, + imageTag, + WLS); + + // docker login and push image to docker registry if necessary + dockerLoginAndPushImageToRegistry(miiImage); + + // Create the repo secret to pull the image + assertDoesNotThrow(() -> createDockerRegistrySecret(domainNamespace), + String.format("createSecret failed for %s", REPO_SECRET_NAME)); + + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword(adminSecretName, domainNamespace, "weblogic", + "welcome1"), + String.format("createSecret failed for %s", adminSecretName)); + + // create encryption secret + logger.info("Create encryption secret"); + String encryptionSecretName = "encryptionsecret"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword(encryptionSecretName, domainNamespace, "weblogicenc", + "weblogicenc"), + String.format("createSecret failed for %s", encryptionSecretName)); + + // create the domain object + Domain domain = createDomainResource(domainUid, domainNamespace, adminSecretName, REPO_SECRET_NAME, + encryptionSecretName, replicaCount, miiImage); + + // create model in image domain + logger.info("Creating model in image domain {0} in namespace {1} using docker image {2}", + domainUid, domainNamespace, miiImage); + createDomainAndVerify(domain, domainNamespace); + + // check admin server pod is ready + logger.info("Wait for admin server pod {0} to be ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Wait for managed server pod {0} to be ready in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkPodReady(managedServerPrefix + i, domainUid, domainNamespace); + } + + logger.info("Check admin service {0} is created in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check managed server service {0} is created in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkServiceExists(managedServerPrefix + i, domainNamespace); + } + + // check and wait for the application to be accessible in all server pods + for (int i = 1; i <= replicaCount; i++) { + checkAppRunning( + domainNamespace, + managedServerPrefix + i, + "8001", + "sample-war/index.jsp", + MII_APP_RESPONSE_V1 + i); + } + + logger.info("Domain {0} is fully started - servers are running and application is available", + domainUid); + + } + + // This method is needed in this test class, since the cleanup util + // won't cleanup the images. + + @AfterEach + public void tearDown() { + // delete mii domain images created for parameterized test + if (miiImage != null) { + deleteImage(miiImage); + } + } + + @AfterAll + public void tearDownAll() { + // Delete domain custom resource + logger.info("Delete domain custom resource in namespace {0}", domainNamespace); + assertDoesNotThrow(() -> deleteDomainCustomResource(domainUid, domainNamespace), + "deleteDomainCustomResource failed with ApiException"); + logger.info("Deleted Domain Custom Resource " + domainUid + " from " + domainNamespace); + + logger.info("Delete domain custom resource in namespace {0}", domainNamespace1); + assertDoesNotThrow(() -> deleteDomainCustomResource(domainUid1, domainNamespace1), + "deleteDomainCustomResource failed with ApiException"); + logger.info("Deleted Domain Custom Resource " + domainUid1 + " from " + domainNamespace1); + + logger.info("Delete domain custom resource in namespace {0}", domainNamespace1); + assertDoesNotThrow(() -> deleteDomainCustomResource(domainUid, domainNamespace1), + "deleteDomainCustomResource failed with ApiException"); + logger.info("Deleted Domain Custom Resource " + domainUid + " from " + domainNamespace1); + + // delete the domain images created in the test class + if (miiImagePatchAppV2 != null) { + deleteImage(miiImagePatchAppV2); + } + if (miiImageAddSecondApp != null) { + deleteImage(miiImageAddSecondApp); + } + } + + private void pushImageIfNeeded(String image) { + // push the image to a registry to make the test work in multi node cluster + if (!REPO_USERNAME.equals(REPO_DUMMY_VALUE)) { + logger.info("docker login to registry {0}", REPO_REGISTRY); + assertTrue(dockerLogin(REPO_REGISTRY, REPO_USERNAME, REPO_PASSWORD), "docker login failed"); + } + + // push image + if (!REPO_NAME.isEmpty()) { + logger.info("docker push image {0} to registry", image); + assertTrue(dockerPush(image), String.format("docker push failed for image %s", image)); + } + } + + private String createUniqueImageTag() { + // create unique image name with date + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date date = new Date(); + return dateFormat.format(date) + "-" + System.currentTimeMillis(); + } + + private String updateImageWithAppV2Patch( + String imageName, + List appDirList + ) { + logger.info("Build the model file list that contains {0}", MII_BASIC_WDT_MODEL_FILE); + List modelList = + Collections.singletonList(String.format("%s/%s", MODEL_DIR, MII_BASIC_WDT_MODEL_FILE)); + + logger.info("Build an application archive using what is in {0}", appDirList); + assertTrue( + buildAppArchive( + defaultAppParams() + .srcDirList(appDirList)), + String.format("Failed to create application archive for %s", + MII_BASIC_APP_NAME)); + + logger.info("Build the archive list that contains {0}", + String.format("%s/%s.zip", ARCHIVE_DIR, MII_BASIC_APP_NAME)); + List archiveList = + Collections.singletonList( + String.format("%s/%s.zip", ARCHIVE_DIR, MII_BASIC_APP_NAME)); + + return createImageAndVerify( + imageName, + createUniqueImageTag(), + modelList, + archiveList); + } + + private String updateImageWithSampleApp3( + String imageName, + List appDirList1, + List appDirList2, + String modelFile + ) { + logger.info("Build the model file list that contains {0}", modelFile); + List modelList = Collections.singletonList(MODEL_DIR + "/" + modelFile); + + String appName1 = appDirList1.get(0); + String appName2 = appDirList2.get(0); + + logger.info("Build the first application archive using what is in {0}", appDirList1); + assertTrue( + buildAppArchive( + defaultAppParams() + .srcDirList(appDirList1) + .appName(appName1)), + String.format("Failed to create application archive for %s", + appName1)); + + logger.info("Build the second application archive usingt what is in {0}", appDirList2); + assertTrue( + buildAppArchive( + defaultAppParams() + .srcDirList(appDirList2) + .appName(appName2)), + String.format("Failed to create application archive for %s", + appName2)); + + logger.info("Build the archive list with two zip files: {0} and {1}", + String.format("%s/%s.zip", ARCHIVE_DIR, appName1), + String.format("%s/%s.zip", ARCHIVE_DIR, appName2)); + List archiveList = Arrays.asList( + String.format("%s/%s.zip", ARCHIVE_DIR, appName1), + String.format("%s/%s.zip", ARCHIVE_DIR, appName2)); + + return createImageAndVerify( + imageName, + createUniqueImageTag(), + modelList, + archiveList); + } + + /** + * Patch the domain resource with a new image. + * Here is an example of the JSON patch string that is constructed in this method. + * [ + * {"op": "replace", "path": "/spec/image", "value": "mii-image:v2" } + * ] + * + * @param domainResourceName name of the domain resource + * @param namespace Kubernetes namespace that the domain is hosted + * @param image name of the new image + */ + private void patchDomainResourceImage( + String domainResourceName, + String namespace, + String image + ) { + String patch = + String.format("[\n {\"op\": \"replace\", \"path\": \"/spec/image\", \"value\": \"%s\"}\n]\n", + image); + logger.info("About to patch the domain resource {0} in namespace {1} with:{2}\n", + domainResourceName, namespace, patch); + + assertTrue(patchDomainCustomResource( + domainResourceName, + namespace, + new V1Patch(patch), + V1Patch.PATCH_FORMAT_JSON_PATCH), + String.format("Failed to patch the domain resource {0} in namespace {1} with image {2}", + domainResourceName, namespace, image)); + } + + private String createImageAndVerify( + String imageName, + String imageTag, + List modelList, + List archiveList + ) { + String image = String.format("%s:%s", imageName, imageTag); + + // Set additional environment variables for WIT + checkDirectory(WIT_BUILD_DIR); + Map env = new HashMap<>(); + env.put("WLSIMG_BLDDIR", WIT_BUILD_DIR); + + // For k8s 1.16 support and as of May 6, 2020, we presently need a different JDK for these + // tests and for image tool. This is expected to no longer be necessary once JDK 11.0.8 or + // the next JDK 14 versions are released. + String witJavaHome = System.getenv("WIT_JAVA_HOME"); + if (witJavaHome != null) { + env.put("JAVA_HOME", witJavaHome); + } + + // build an image using WebLogic Image Tool + logger.info("Create image {0} using model list {1} and archive list {2}", + image, modelList, archiveList); + boolean result = createImage( + defaultWitParams() + .modelImageName(imageName) + .modelImageTag(imageTag) + .modelFiles(modelList) + .modelArchiveFiles(archiveList) + .wdtModelOnly(true) + .wdtVersion(WDT_VERSION) + .env(env) + .redirect(true)); + + assertTrue(result, String.format("Failed to create image %s using WebLogic Image Tool", image)); + + /* Check image exists using docker images | grep image tag. + * Tag name is unique as it contains date and timestamp. + * This is a workaround for the issue on Jenkins machine + * as docker images imagename:imagetag is not working and + * the test fails even though the image exists. + */ + assertTrue(doesImageExist(imageTag), + String.format("Image %s doesn't exist", image)); + + return image; + } + + + private Domain createDomainResource(String domainUid, String domNamespace, String adminSecretName, + String repoSecretName, String encryptionSecretName, int replicaCount, + String miiImage) { + // create the domain CR + return new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("FromModel") + .image(miiImage) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)))) + .addClustersItem(new Cluster() + .clusterName("cluster-1") + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .model(new Model() + .domainType("WLS") + .runtimeEncryptionSecret(encryptionSecretName)) + .introspectorJobActiveDeadlineSeconds(300L))); + + + } + + + private void patchAndVerify( + final String domainUid, + final String namespace, + final String adminServerPodName, + final String managedServerPrefix, + final int replicaCount, + final String image + ) { + logger.info( + "Patch the domain resource {0} in namespace {1} to use the new image {2}", + domainUid, namespace, image); + + patchDomainResourceImage(domainUid, namespace, image); + + logger.info( + "Check that domain resource {0} in namespace {1} has been patched with image {2}", + domainUid, namespace, image); + checkDomainPatched(domainUid, namespace, image); + + // check and wait for the admin server pod to be patched with the new image + logger.info( + "Check that admin server pod for domain resource {0} in namespace {1} has been patched with image {2}", + domainUid, namespace, image); + + checkPodImagePatched( + domainUid, + namespace, + adminServerPodName, + image); + + // check and wait for the managed server pods to be patched with the new image + logger.info( + "Check that server pods for domain resource {0} in namespace {1} have been patched with image {2}", + domainUid, namespace, image); + for (int i = 1; i <= replicaCount; i++) { + checkPodImagePatched( + domainUid, + namespace, + managedServerPrefix + i, + image); + } + } + + private void checkAppRunning( + String namespace, + String podName, + String internalPort, + String appPath, + String expectedStr + ) { + + // check if the application is accessible inside of a server pod using standard retry policy + checkAppIsRunning(withStandardRetryPolicy, namespace, podName, internalPort, appPath, expectedStr); + } + + private void quickCheckAppRunning( + String namespace, + String podName, + String internalPort, + String appPath, + String expectedStr + ) { + // check if the application is accessible inside of a server pod using quick retry policy + checkAppIsRunning(withQuickRetryPolicy, namespace, podName, internalPort, appPath, expectedStr); + } + + private void checkAppIsRunning( + ConditionFactory conditionFactory, + String namespace, + String podName, + String internalPort, + String appPath, + String expectedStr + ) { + + // check if the application is accessible inside of a server pod + conditionFactory + .conditionEvaluationListener( + condition -> logger.info("Waiting for application {0} is running on pod {1} in namespace {2} " + + "(elapsed time {3}ms, remaining time {4}ms)", + appPath, + podName, + namespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(() -> appAccessibleInPod( + namespace, + podName, + internalPort, + appPath, + expectedStr)); + + } + + private void quickCheckAppNotRunning( + String namespace, + String podName, + String internalPort, + String appPath, + String expectedStr + ) { + + // check that the application is NOT running inside of a server pod + withQuickRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Checking if application {0} is not running on pod {1} in namespace {2} " + + "(elapsed time {3}ms, remaining time {4}ms)", + appPath, + podName, + namespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(() -> appNotAccessibleInPod( + namespace, + podName, + internalPort, + appPath, + expectedStr)); + } + + private void checkDomainPatched( + String domainUid, + String namespace, + String image + ) { + + // check if the domain resource has been patched with the given image + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for domain {0} to be patched in namespace {1} " + + "(elapsed time {2}ms, remaining time {3}ms)", + domainUid, + namespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> domainResourceImagePatched(domainUid, namespace, image), + String.format( + "Domain %s is not patched in namespace %s with image %s", domainUid, namespace, image))); + + } + + private void checkPodImagePatched( + String domainUid, + String namespace, + String podName, + String image + ) { + + // check if the server pod has been patched with the given image + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for pod {0} to be patched in namespace {1} " + + "(elapsed time {2}ms, remaining time {3}ms)", + podName, + namespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> podImagePatched(domainUid, namespace, podName, "weblogic-server", image), + String.format( + "Pod %s is not patched with image %s in namespace %s.", + podName, + image, + namespace))); + } + + private static void collectAppAvaiability( + String namespace, + List appAvailability, + String managedServerPrefix, + int replicaCount, + String internalPort, + String appPath + ) { + boolean v2AppAvailable = false; + + // Access the pod periodically to check application's availability across the duration + // of patching the domain with newer version of the application. + while (!v2AppAvailable) { + v2AppAvailable = true; + for (int i = 1; i <= replicaCount; i++) { + v2AppAvailable = v2AppAvailable && appAccessibleInPod( + namespace, + managedServerPrefix + i, + internalPort, + appPath, + MII_APP_RESPONSE_V2 + i); + } + + int count = 0; + for (int i = 1; i <= replicaCount; i++) { + if (appAccessibleInPod( + namespace, + managedServerPrefix + i, + internalPort, + appPath, + "Hello World")) { + count++; + } + } + appAvailability.add(count); + + if (count == 0) { + logger.info("XXXXXXXXXXX: application not available XXXXXXXX"); + break; + } else { + logger.fine("YYYYYYYYYYY: application available YYYYYYYY count = " + count); + } + try { + TimeUnit.MILLISECONDS.sleep(200); + } catch (InterruptedException ie) { + // do nothing + } + } + } + + private static boolean appAlwaysAvailable(List appAvailability) { + for (Integer count: appAvailability) { + if (count == 0) { + logger.warning("Application was not available during patching."); + return false; + } + } + return true; + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiMultiModel.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiMultiModel.java new file mode 100644 index 00000000000..b3b5b5f4595 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiMultiModel.java @@ -0,0 +1,548 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1SecretReference; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.primitive.Command; +import oracle.weblogic.kubernetes.actions.impl.primitive.CommandParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.annotations.tags.Slow; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.MANAGED_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_APP_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_WDT_MODEL_FILE; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.WLS_DEFAULT_CHANNEL_NAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.MODEL_DIR; +import static oracle.weblogic.kubernetes.actions.TestActions.deleteDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.deleteImage; +import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createConfigMapAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createMiiImageAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.dockerLoginAndPushImageToRegistry; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Test multiple WDT model files in a model-in-image domain are processed in the expected order. + * + *

    There are three test methods in this class, covering three basic scenarios.

    + * + *
      + *
    • testMiiWithMultiModelImage: test multiple WDT model files in the Docker image.
    • + *
    • testMiiWithMultiModelCM: test multiple WDT model files in the domain resource's ConfigMap.
    • + *
    • testMiiWithMultipleModelImageAndCM: test multiple WDT files in both of the Docker image + * and the domain resource's ConfigMap.
    • + *
    + */ +@DisplayName("Test to create model-in-image domain with multiple WDT models") +@IntegrationTest +class ItMiiMultiModel { + + private static String domainNamespace = null; + private static String adminSecretName = null; + private static String encryptionSecretName = null; + private static String miiImageMultiModel = null; + + private static final String domainUid1 = "mii-mm-cm-domain"; + private static final String domainUid2 = "mii-mm-image-domain"; + private static final String domainUid3 = "mii-mm-image-cm-domain"; + + private static int replicaCount = 2; + + // There are four model files in this test case. + // "multi-model-two-ds.yaml" and "multi-model-delete-one-ds.20.yaml" are in the MII image. + // "multi-model-two-ds.10.yaml" and "multi-model-two-ds.10.yaml" are in the domain's ConfigMap. + + // Define "TestDataSource" and "TestDataSource2" with MaxCapacity set to 10 and 15 respectively + private static final String modelFileName1 = "multi-model-two-ds.yaml"; + + // Delete "TestDataSource2" and define "TestDataSource" with MaxCapacity set to 20 + private static final String modelFileName2 = "multi-model-delete-one-ds.20.yaml"; + + // Define "TestDataSource" and "TestDataSource3" with MaxCapacity set to 30 and 5 respectively + private static final String modelFileName3 = "multi-model-two-ds.10.yaml"; + + // Define "TestDataSource" with MaxCapacity set to 40 + private static final String modelFileName4 = "multi-model-one-ds.20.yaml"; + + private static final String dsName = "TestDataSource"; + private static final String dsName2 = "TestDataSource2"; + private static final String dsName3 = "TestDataSource3"; + + private static LoggingFacade logger = null; + + /** + * Perform initialization for all the tests in this class. + * + *

    Set up the necessary namespaces and install the operator in the first namespace, and + * create a model-in-image image with two WDT model files.

    + * + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + * JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void initAll(@Namespaces(2) List namespaces) { + logger = getLogger(); + // get a new unique opNamespace + logger.info("Creating unique namespace for Operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + String opNamespace = namespaces.get(0); + + logger.info("Creating unique namespace for Domain"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domainNamespace = namespaces.get(1); + + // install the operator + logger.info("Install an operator in namespace {0}, managing namespace {1}", + opNamespace, domainNamespace); + installAndVerifyOperator(opNamespace, domainNamespace); + + logger.info("Create the repo secret {0} to pull the image", REPO_SECRET_NAME); + assertDoesNotThrow(() -> createDockerRegistrySecret(domainNamespace), + String.format("createSecret failed for %s", REPO_SECRET_NAME)); + + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + adminSecretName = "weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + adminSecretName, + domainNamespace, + ADMIN_USERNAME_DEFAULT, + ADMIN_PASSWORD_DEFAULT), + String.format("createSecret failed for %s", adminSecretName)); + + // create encryption secret + logger.info("Create encryption secret"); + encryptionSecretName = "encryptionsecret"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + encryptionSecretName, + domainNamespace, + "weblogicenc", + "weblogicenc"), + String.format("createSecret failed for %s", encryptionSecretName)); + + logger.info("Create an image with two model files"); + miiImageMultiModel = createMiiImageAndVerify( + "mii-test-multi-model-image", + Arrays.asList( + MODEL_DIR + "/" + MII_BASIC_WDT_MODEL_FILE, + MODEL_DIR + "/" + modelFileName2, + MODEL_DIR + "/" + modelFileName1), + Collections.singletonList(MII_BASIC_APP_NAME)); + + // push the image to a registry to make it accessible in multi-node cluster + dockerLoginAndPushImageToRegistry(miiImageMultiModel); + + } + + /** + * Test that two WDT model files in a domain resource's ConfigMap are applied in the expected order. + * + *

    Create a WebLogic domain with a Kubernetes ConfigMap that contains two WDT model files. + * Verify that the effective configuration of the domain is as expected.

    + * + *

    The two model files specify the same DataSource "TestDataSource" with the connection pool's + * MaxCapacity set to 30 and 40 respectively. In addition, the first model file also + * specifies a second DataSource "TestDataSource3" with the maxCapacity set to 5.

    + * + *

    According to the ordering rules, the resultant configuration should have two DataSources, + * "TestDataSource" and "TestDataSource3", with the MaxCapacity set to 40 and 5 respectively.

    + */ + @Test + @DisplayName("Create model-in-image domain with a ConfigMap that contains multiple model files") + @Slow + public void testMiiWithMultiModelCM() { + final String adminServerPodName = String.format("%s-%s", domainUid1, ADMIN_SERVER_NAME_BASE); + final String managedServerPrefix = String.format("%s-%s", domainUid1, MANAGED_SERVER_NAME_BASE); + final String expectedMaxCapacity = "40"; + final String expectedMaxCapacityDS3 = "5"; + + final String configMapName = "ds-multi-model-cm"; + + logger.info("Create ConfigMap {0} in namespace {1} with WDT models {3} and {4}", + configMapName, domainNamespace, modelFileName3, modelFileName4); + + List modelFiles = Arrays.asList(modelFileName3, modelFileName4); + createConfigMapAndVerify( + configMapName, domainUid1, domainNamespace, modelFiles); + + logger.info("Create domain {0} in namespace {1} with CM {2} that contains WDT models {3} and {4}", + domainUid1, domainNamespace, configMapName, modelFileName3, modelFileName4); + + createDomainResourceAndVerify( + domainUid1, + domainNamespace, + adminServerPodName, + managedServerPrefix, + MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG, + configMapName); + + logger.info("Check the MaxCapacity setting of DataSource {0}", dsName); + String maxCapacityValue = getDSMaxCapacity(adminServerPodName, domainNamespace, dsName); + assertEquals(expectedMaxCapacity, maxCapacityValue, + String.format("Domain %s in namespace %s DataSource %s MaxCapacity is %s, instead of %s", + domainUid1, domainNamespace, dsName, maxCapacityValue, expectedMaxCapacity)); + + logger.info(String.format("Domain %s in namespace %s DataSource %s MaxCapacity is %s, as expected", + domainUid1, domainNamespace, dsName, expectedMaxCapacity)); + + logger.info("Check the MaxCapacity setting of DataSource {0}", dsName3); + maxCapacityValue = getDSMaxCapacity(adminServerPodName, domainNamespace, dsName3); + assertEquals(expectedMaxCapacityDS3, maxCapacityValue, + String.format("Domain %s in namespace %s DataSource %s MaxCapacity is %s, instead of %s", + domainUid1, domainNamespace, dsName3, maxCapacityValue, expectedMaxCapacityDS3)); + + logger.info(String.format("Domain %s in namespace %s DataSource %s MaxCapacity is %s, as expected", + domainUid1, domainNamespace, dsName3, expectedMaxCapacityDS3)); + + } + + /** + * Test that two WDT model files in a model-in-image Docker image are applied in the expected order. + * + *

    Create a WebLogic domain using a model-in-image Docker image that contains two WDT model files. + * Verify that the effective configuration of the domain is as expected.

    + * + *

    The two model files specify the same DataSource "TestDataSource" with the connection pool's + * MaxCapacity set to 15 and 20 respectively. In addition, the first model defines a second + * DataSource "TestDataSource2", which is deleted by the second model.

    + * + *

    According to the ordering rules, When the two model files are applied, the resultant domain should + * only have "TestDataSource" with MaxCapacity set to 20, and "TestDataSource2" should not exist.

    + */ + @Test + @DisplayName("Create a model-in-image domain with two WDT model files in the image") + @Slow + public void testMiiWithMultiModelImage() { + final String adminServerPodName = String.format("%s-%s", domainUid2, ADMIN_SERVER_NAME_BASE); + final String managedServerPrefix = String.format("%s-%s", domainUid2, MANAGED_SERVER_NAME_BASE); + final String expectedMaxCapacity = "20"; + + logger.info("Create domain {0} in namespace {1} with image {2} that contains WDT models {3} and {4}", + domainUid2, domainNamespace, miiImageMultiModel, modelFileName2, modelFileName1); + createDomainResourceAndVerify( + domainUid2, + domainNamespace, + adminServerPodName, + managedServerPrefix, + miiImageMultiModel, + null); + + logger.info("Check the MaxCapacity setting of DataSource {0}", dsName); + String maxCapacityValue = getDSMaxCapacity(adminServerPodName, domainNamespace, dsName); + assertEquals(expectedMaxCapacity, maxCapacityValue, + String.format("Domain %s in namespace %s DataSource %s MaxCapacity is %s, instead of %s", + domainUid2, domainNamespace, dsName, maxCapacityValue, expectedMaxCapacity)); + + logger.info(String.format("Domain %s in namespace %s DataSource %s MaxCapacity is %s, as expected", + domainUid2, domainNamespace, dsName, expectedMaxCapacity)); + + logger.info("Check DataSource {0} does not exist", dsName2); + assertTrue(dsDoesNotExist(adminServerPodName, domainNamespace, dsName2), + String.format("Domain %s in namespace %s DataSource %s should not exist", + domainUid2, domainNamespace, dsName2)); + + logger.info(String.format("Domain %s in namespace %s DataSource %s does not exist as expected", + domainUid2, domainNamespace, dsName2)); + + } + + /** + * Test that two WDT model files in a model-in-image image and two WDT model files in the domain + * resource's ConfigMap are handled as expected. + * + *

    Create a WebLogic domain using a model-in-image Docker image that contains two WDT model files, + * and also using a ConfigMap that contains two more model files. + * Verify that the effective configuration of the domain is as expected. Note that the model files + * in the image are ordered independently from the model files in the domain's ConfigMap.

    + * + *

    The two model files in the Docker image define the same DataSource "TestDataSource" with + * the connection pool's MaxCapacity set to 15 and 20 respectively. + * In addition, the first model defines a second DataSource "TestDataSource2", which is deleted by + * the second model. When the two model files are applied, the resultant domain will only have + * "TestDataSource" with MaxCapacity set to 20, and "TestDataSource2" should not exist.

    + * + *

    Then the two model files in the ConfigMap will be applied. + * They define the same DataSource "TestDataSource" with MaxCapaqcity set to 30 and 40 respectively, + * and, in addition, the first model defines another DataSource "TestDataSource3" with MaxCapacity + * set to 5.

    + * + *

    According to the ordering rules, the effective domain should contain "TestDataSource" with + * MaxCapacity set to 40, "TestDataSource3" with MaxCapacity set to "5", and "TestDataSource2" + * should not exist after all four model files are processed by the WebLogic Deploy Tooling.

    + */ + @Test + @DisplayName("Create a model-in-image domain with two model files in both the image and the ConfigMap") + @Slow + public void testMiiWithMultiModelImageAndCM() { + final String adminServerPodName = String.format("%s-%s", domainUid3, ADMIN_SERVER_NAME_BASE); + final String managedServerPrefix = String.format("%s-%s", domainUid3, MANAGED_SERVER_NAME_BASE); + final String configMapName = "ds-multi-model-image-cm"; + final String expectedMaxCapacity = "40"; + final String expectedMaxCapacityDS3 = "5"; + + logger.info("Create ConfigMap {0} in namespace {1} with WDT models {2} and {3}", + configMapName, domainNamespace, modelFileName4, modelFileName3); + + List modelFiles = Arrays.asList(modelFileName4, modelFileName3); + createConfigMapAndVerify( + configMapName, domainUid3, domainNamespace, modelFiles); + + logger.info("Create domain {0} in namespace {1} with image {2} and CM {3} that contains {4} and {5}", + domainUid3, domainNamespace, miiImageMultiModel, configMapName, modelFileName4, modelFileName3); + + createDomainResourceAndVerify( + domainUid3, + domainNamespace, + adminServerPodName, + managedServerPrefix, + miiImageMultiModel, + configMapName); + + logger.info("Check the MaxCapacity setting of DataSource {0}", dsName); + String maxCapacityValue = getDSMaxCapacity(adminServerPodName, domainNamespace, dsName); + assertEquals(expectedMaxCapacity, maxCapacityValue, + String.format("Domain %s in namespace %s DataSource %s MaxCapacity is %s, instead of %s", + domainUid3, domainNamespace, dsName, maxCapacityValue, expectedMaxCapacity)); + + logger.info(String.format("Domain %s in namespace %s DataSource %s MaxCapacity is %s, as expected", + domainUid3, domainNamespace, dsName, expectedMaxCapacity)); + + logger.info("Check the MaxCapacity setting of DataSource {0}", dsName3); + maxCapacityValue = getDSMaxCapacity(adminServerPodName, domainNamespace, dsName3); + assertEquals(expectedMaxCapacityDS3, maxCapacityValue, + String.format("Domain %s in namespace %s DataSource %s MaxCapacity is %s, instead of %s", + domainUid3, domainNamespace, dsName3, maxCapacityValue, expectedMaxCapacityDS3)); + + logger.info(String.format("Domain %s in namespace %s DataSource %s MaxCapacity is %s, as expected", + domainUid3, domainNamespace, dsName3, expectedMaxCapacityDS3)); + + logger.info("Check that DataSource {0} does not exist", dsName2); + assertTrue(dsDoesNotExist(adminServerPodName, domainNamespace, dsName2), + String.format("Domain %s in namespace %s DataSource %s should not exist", + domainUid3, domainNamespace, dsName2)); + + logger.info(String.format("Domain %s in namespace %s DataSource %s does not exist as expected", + domainUid3, domainNamespace, dsName2)); + + } + + /** + * Create a domain object with the given image, ConfigMap and other parameters, and verify that + * the server pods and services are successfully started. + */ + private void createDomainResourceAndVerify( + String domainUid, + String domainNamespace, + String adminServerPodName, + String managedServerPrefix, + String miiImage, + String configMapName) { + + logger.info("Create the domain resource {0} in namespace {1} with ConfigMap {2}", + domainUid, domainNamespace, configMapName); + Domain domain = createDomainResource(domainUid, domainNamespace, adminSecretName, + REPO_SECRET_NAME, encryptionSecretName, replicaCount, miiImage, configMapName); + + createDomainAndVerify(domain, domainNamespace); + + // check admin server pod is ready + logger.info("Wait for admin server pod {0} to be ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + logger.info("Check admin service {0} is created in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Wait for managed server pod {0} to be ready in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkPodReady(managedServerPrefix + i, domainUid, domainNamespace); + } + + // check managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check managed server service {0} is created in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkServiceExists(managedServerPrefix + i, domainNamespace); + } + + } + + @AfterAll + public void tearDownAll() { + // Delete domain custom resources + logger.info("Delete domain custom resource {0} in namespace {1}", domainUid1, domainNamespace); + assertDoesNotThrow(() -> deleteDomainCustomResource(domainUid1, domainNamespace), + "deleteDomainCustomResource failed with ApiException"); + logger.info("Deleted Domain Custom Resource " + domainUid1 + " from " + domainNamespace); + + logger.info("Delete domain custom resource {0} in namespace {1}", domainUid2, domainNamespace); + assertDoesNotThrow(() -> deleteDomainCustomResource(domainUid2, domainNamespace), + "deleteDomainCustomResource failed with ApiException"); + logger.info("Deleted Domain Custom Resource " + domainUid2 + " from " + domainNamespace); + + logger.info("Delete domain custom resource {0} in namespace {1}", domainUid3, domainNamespace); + assertDoesNotThrow(() -> deleteDomainCustomResource(domainUid3, domainNamespace), + "deleteDomainCustomResource failed with ApiException"); + logger.info("Deleted Domain Custom Resource " + domainUid3 + " from " + domainNamespace); + + // delete the domain image created in the test class + if (miiImageMultiModel != null) { + deleteImage(miiImageMultiModel); + } + } + + /** + * Construct a domain object with the given parameters that can be used to create a domain resource. + */ + private Domain createDomainResource( + String domainUid, String domNamespace, String adminSecretName, + String repoSecretName, String encryptionSecretName, + int replicaCount, String miiImage, String configMapName) { + // create the domain CR + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("FromModel") + .image(miiImage) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)))) + .addClustersItem(new Cluster() + .clusterName("cluster-1") + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .model(new Model() + .domainType("WLS") + .runtimeEncryptionSecret(encryptionSecretName)) + .introspectorJobActiveDeadlineSeconds(300L))); + if (configMapName != null) { + domain.spec().configuration().model().configMap(configMapName); + } + return domain; + } + + /** + * Get a DataSource's connection pool MaxCapacity setting. + */ + private String getDSMaxCapacity( + String adminServerPodName, + String namespace, + String dsName) { + int adminServiceNodePort = getServiceNodePort( + namespace, adminServerPodName + "-external", WLS_DEFAULT_CHANNEL_NAME); + + String command = new StringBuffer() + .append("curl --user " + ADMIN_USERNAME_DEFAULT + ":" + ADMIN_PASSWORD_DEFAULT) + .append(" http://" + K8S_NODEPORT_HOST + ":" + adminServiceNodePort) + .append("/management/wls/latest/datasources/id/" + dsName) + .append(" --noproxy '*'") + .append(" --silent --show-error ") + .append("| grep maxCapacity | tr -d -c 0-9 ").toString(); + + CommandParams params = Command + .defaultCommandParams() + .command(command) + .saveResults(true) + .redirect(true); + + Command.withParams(params).execute(); + return params.stdout(); + } + + /** + * Check if a DataSource does not exist. + */ + private static boolean dsDoesNotExist( + String adminServerPodName, + String namespace, + String dsName) { + int adminServiceNodePort = getServiceNodePort( + namespace, adminServerPodName + "-external", WLS_DEFAULT_CHANNEL_NAME); + + String command = new StringBuffer() + .append("curl --user " + ADMIN_USERNAME_DEFAULT + ":" + ADMIN_PASSWORD_DEFAULT) + .append(" http://" + K8S_NODEPORT_HOST + ":" + adminServiceNodePort) + .append("/management/wls/latest/datasources") + .append("/id/" + dsName) + .append(" --noproxy '*'") + .append(" --silent --show-error ").toString(); + + CommandParams params = Command + .defaultCommandParams() + .command(command) + .saveResults(true) + .redirect(true); + + String expectedStr = String.format("'%s' was not found", dsName); + + return Command.withParams(params).executeAndVerify(expectedStr); + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiSample.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiSample.java new file mode 100644 index 00000000000..180fb93eb43 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiSample.java @@ -0,0 +1,431 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import oracle.weblogic.kubernetes.actions.impl.primitive.Command; +import oracle.weblogic.kubernetes.actions.impl.primitive.CommandParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.ExecResult; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.condition.DisabledIfEnvironmentVariable; + +import static oracle.weblogic.kubernetes.TestConstants.DB_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.DB_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.JRF_BASE_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.JRF_BASE_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.KIND_REPO; +import static oracle.weblogic.kubernetes.TestConstants.OCR_EMAIL; +import static oracle.weblogic.kubernetes.TestConstants.OCR_PASSWORD; +import static oracle.weblogic.kubernetes.TestConstants.OCR_REGISTRY; +import static oracle.weblogic.kubernetes.TestConstants.OCR_USERNAME; +import static oracle.weblogic.kubernetes.TestConstants.REPO_EMAIL; +import static oracle.weblogic.kubernetes.TestConstants.REPO_NAME; +import static oracle.weblogic.kubernetes.TestConstants.REPO_PASSWORD; +import static oracle.weblogic.kubernetes.TestConstants.REPO_REGISTRY; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.REPO_USERNAME; +import static oracle.weblogic.kubernetes.TestConstants.RESULTS_ROOT; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.doesImageExist; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.dockerLoginAndPushImageToRegistry; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.TestUtils.getDateAndTimeStamp; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Tests to verify MII sample. + */ +@DisplayName("Test model in image sample") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@IntegrationTest +public class ItMiiSample { + + private static final String MII_SAMPLES_WORK_DIR = RESULTS_ROOT + + "/model-in-image-sample-work-dir"; + private static final String MII_SAMPLES_SCRIPT = + "../src/integration-tests/model-in-image/run-test.sh"; + + private static final String OCR_SECRET_NAME = "docker-store"; + private static final String CURRENT_DATE_TIME = getDateAndTimeStamp(); + private static final String MII_SAMPLE_WLS_IMAGE_NAME_V1 = REPO_NAME + "mii-" + CURRENT_DATE_TIME + "-wlsv1"; + private static final String MII_SAMPLE_WLS_IMAGE_NAME_V2 = REPO_NAME + "mii-" + CURRENT_DATE_TIME + "-wlsv2"; + private static final String MII_SAMPLE_JRF_IMAGE_NAME_V1 = REPO_NAME + "mii-" + CURRENT_DATE_TIME + "-jrfv1"; + private static final String MII_SAMPLE_JRF_IMAGE_NAME_V2 = REPO_NAME + "mii-" + CURRENT_DATE_TIME + "-jrfv2"; + private static final String SUCCESS_SEARCH_STRING = "Finished without errors"; + + private static String opNamespace = null; + private static String domainNamespace = null; + private static String traefikNamespace = null; + private static String dbNamespace = null; + private static Map envMap = null; + private static boolean previousTestSuccessful = true; + private static LoggingFacade logger = null; + + private enum DomainType { + JRF, + WLS + } + + /** + * Install Operator. + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + * JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void initAll(@Namespaces(5) List namespaces) { + logger = getLogger(); + // get a new unique opNamespace + logger.info("Creating unique namespace for Operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + opNamespace = namespaces.get(0); + + logger.info("Creating unique namespace for Domain"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domainNamespace = namespaces.get(1); + + logger.info("Creating unique namespace for Traefik"); + assertNotNull(namespaces.get(2), "Namespace list is null"); + traefikNamespace = namespaces.get(2); + + logger.info("Creating unique namespace for Database"); + assertNotNull(namespaces.get(3), "Namespace list is null"); + dbNamespace = namespaces.get(3); + + // install and verify operator + installAndVerifyOperator(opNamespace, domainNamespace); + + // env variables to override default values in sample scripts + envMap = new HashMap(); + envMap.put("DOMAIN_NAMESPACE", domainNamespace); + envMap.put("TRAEFIK_NAMESPACE", traefikNamespace); + envMap.put("TRAEFIK_HTTP_NODEPORT", "0"); // 0-->dynamically choose the np + envMap.put("TRAEFIK_HTTPS_NODEPORT", "0"); // 0-->dynamically choose the np + envMap.put("WORKDIR", MII_SAMPLES_WORK_DIR); + envMap.put("IMAGE_PULL_SECRET_NAME", REPO_SECRET_NAME); //ocir secret + envMap.put("K8S_NODEPORT_HOST", K8S_NODEPORT_HOST); + + // kind cluster uses openjdk which is not supported by image tool + String witJavaHome = System.getenv("WIT_JAVA_HOME"); + if (witJavaHome != null) { + envMap.put("JAVA_HOME", witJavaHome); + } + + String witInstallerUrl = System.getProperty("wit.download.url"); + if (witInstallerUrl != null) { + envMap.put("WIT_INSTALLER_URL", witInstallerUrl); + } + + String wdtInstallerUrl = System.getProperty("wdt.download.url"); + if (wdtInstallerUrl != null) { + envMap.put("WDT_INSTALLER_URL", wdtInstallerUrl); + } + + logger.info("Env. variables to the script {0}", envMap); + + // install traefik using the mii sample script + execTestScriptAndAssertSuccess("-traefik", "Traefik deployment failure"); + + logger.info("Setting up docker secrets"); + + // Create the repo secret to pull the image + assertDoesNotThrow(() -> createDockerRegistrySecret(REPO_USERNAME, REPO_PASSWORD, REPO_EMAIL, + REPO_REGISTRY, REPO_SECRET_NAME, domainNamespace), + String.format("createSecret failed for %s", REPO_SECRET_NAME)); + logger.info("Docker registry secret {0} created successfully in namespace {1}", + REPO_SECRET_NAME, domainNamespace); + + // create ocr docker registry secret to pull the db images + assertDoesNotThrow(() -> createDockerRegistrySecret(OCR_USERNAME, OCR_PASSWORD, + OCR_EMAIL, OCR_REGISTRY, OCR_SECRET_NAME, dbNamespace), + String.format("createSecret failed for %s", OCR_SECRET_NAME)); + logger.info("Docker registry secret {0} created successfully in namespace {1}", + OCR_SECRET_NAME, dbNamespace); + } + + /** + * Generate sample and verify that this matches the source + * checked into the mii sample git location. + */ + @Test + @Order(1) + @DisabledIfEnvironmentVariable(named = "SKIP_CHECK_SAMPLE", matches = "true") + @DisplayName("Test to verify MII Sample source") + public void testCheckSampleSource() { + execTestScriptAndAssertSuccess("-check-sample","Sample source doesn't match with the generated source"); + } + + /** + * Test to verify MII sample WLS initial use case. + * Builds image required for the initial use case, creates secrets, and + * creates domain resource. + * Verifies all WebLogic Server pods are ready, are at the expected + * restartVersion, and have the expected image. + * Verifies the sample application is running + * (response includes "Hello World!"). + */ + @Test + @Order(2) + @DisabledIfEnvironmentVariable(named = "SKIP_WLS_SAMPLES", matches = "true") + @DisplayName("Test to verify MII sample WLS initial use case") + public void testWlsInitialUseCase() { + previousTestSuccessful = true; + envMap.put("MODEL_IMAGE_NAME", MII_SAMPLE_WLS_IMAGE_NAME_V1); + execTestScriptAndAssertSuccess("-initial-image,-check-image-and-push,-initial-main", "Initial use case failed"); + } + + /** + * Test to verify WLS update1 use case. + * Adds a data source to initial domain via a configmap and updates the + * domain resource restartVersion. + * Verifies all WebLogic Server pods roll to ready, roll to the expected + * restartVersion, and have the expected image. + * Verifies the sample application is running + * and detects the new datasource (response includes + * "mynewdatasource"). + */ + @Test + @Order(3) + @DisabledIfEnvironmentVariable(named = "SKIP_WLS_SAMPLES", matches = "true") + @DisplayName("Test to verify MII sample WLS update1 use case") + public void testWlsUpdate1UseCase() { + execTestScriptAndAssertSuccess("-update1", "Update1 use case failed"); + } + + /** + * Test to verify WLS update2 use case. + * Deploys a second domain 'domain2' with a different domain UID, + * different secrets, and different datasource config map, + * but that is otherwise the same as the update1 domain. + * Verifies all WebLogic Server pods are ready, have the expected + * restartVersion, and have the expected image. + * For each domain, verifies the sample application is running + * (response includes "domain1" or "domain2" depending on domain). + */ + @Test + @Order(4) + @DisabledIfEnvironmentVariable(named = "SKIP_WLS_SAMPLES", matches = "true") + @DisplayName("Test to verify MII sample WLS update2 use case") + public void testWlsUpdate2UseCase() { + execTestScriptAndAssertSuccess("-update2", "Update2 use case failed"); + } + + /** + * Test to verify update3 use case. + * Deploys an updated WebLogic application to the running + * domain from update1 using an updated Docker image, + * and updates the domain resource restartVersion. + * Verifies all WebLogic Server pods roll to ready, roll to the expected + * restartVersion, and have the expected image. + * Verifies the sample application is running + * and is at the new version (response includes "v2"). + */ + @Test + @Order(5) + @DisabledIfEnvironmentVariable(named = "SKIP_WLS_SAMPLES", matches = "true") + @DisplayName("Test to verify MII sample WLS update3 use case") + public void testWlsUpdate3UseCase() { + envMap.put("MODEL_IMAGE_NAME", MII_SAMPLE_WLS_IMAGE_NAME_V2); + execTestScriptAndAssertSuccess("-update3-image,-check-image-and-push,-update3-main", "Update3 use case failed"); + } + + /** + * Test to verify MII sample JRF initial use case. + * Deploys a database and initializes it for RCU, + * uses an FMW infra base image instead of WLS + * base image, and uses a WDT model that's + * specialized for JRF, but is otherwise similar to + * the WLS initial use case. + * @see #testWlsInitialUseCase for more... + */ + @Test + @Order(6) + @DisabledIfEnvironmentVariable(named = "SKIP_JRF_SAMPLES", matches = "true") + @DisplayName("Test to verify MII sample JRF initial use case") + public void testJrfInitialUseCase() { + String dbImageName = (KIND_REPO != null + ? KIND_REPO + DB_IMAGE_NAME.substring(TestConstants.OCR_REGISTRY.length() + 1) : DB_IMAGE_NAME); + String jrfBaseImageName = (KIND_REPO != null + ? KIND_REPO + JRF_BASE_IMAGE_NAME.substring(TestConstants.OCR_REGISTRY.length() + 1) : JRF_BASE_IMAGE_NAME); + + envMap.put("MODEL_IMAGE_NAME", MII_SAMPLE_JRF_IMAGE_NAME_V1); + envMap.put("DB_IMAGE_NAME", dbImageName); + envMap.put("DB_IMAGE_TAG", DB_IMAGE_TAG); + envMap.put("DB_NODE_PORT", "none"); + envMap.put("BASE_IMAGE_NAME", jrfBaseImageName); + envMap.put("BASE_IMAGE_TAG", JRF_BASE_IMAGE_TAG); + envMap.put("POD_WAIT_TIMEOUT_SECS", "1000"); // JRF pod waits on slow machines, can take at least 650 seconds + envMap.put("DB_NAMESPACE", dbNamespace); + envMap.put("DB_IMAGE_PULL_SECRET", OCR_SECRET_NAME); //ocr secret + envMap.put("INTROSPECTOR_DEADLINE_SECONDS", "600"); // introspector needs more time for JRF + + // run JRF use cases irrespective of WLS use cases fail/pass + previousTestSuccessful = true; + execTestScriptAndAssertSuccess(DomainType.JRF,"-db,-rcu", "DB/RCU creation failed"); + execTestScriptAndAssertSuccess( + DomainType.JRF, + "-initial-image,-check-image-and-push,-initial-main", + "Initial use case failed" + ); + } + + + /** + * Test to verify JRF update1 use case. + * @see #testWlsUpdate1UseCase for more... + */ + @Test + @Order(7) + @DisabledIfEnvironmentVariable(named = "SKIP_JRF_SAMPLES", matches = "true") + @DisplayName("Test to verify MII sample JRF update1 use case") + public void testJrfUpdate1UseCase() { + execTestScriptAndAssertSuccess(DomainType.JRF,"-update1", "Update1 use case failed"); + } + + /** + * Test to verify JRF update2 use case. + * @see #testWlsUpdate2UseCase for more... + */ + @Test + @Order(8) + @DisabledIfEnvironmentVariable(named = "SKIP_JRF_SAMPLES", matches = "true") + @DisplayName("Test to verify MII sample JRF update2 use case") + public void testJrfUpdate2UseCase() { + execTestScriptAndAssertSuccess(DomainType.JRF,"-update2", "Update2 use case failed"); + } + + /** + * Test to verify JRF update3 use case. + * @see #testWlsUpdate3UseCase for more... + */ + @Test + @Order(9) + @DisabledIfEnvironmentVariable(named = "SKIP_JRF_SAMPLES", matches = "true") + @DisplayName("Test to verify MII sample JRF update3 use case") + public void testJrfUpdate3UseCase() { + envMap.put("MODEL_IMAGE_NAME", MII_SAMPLE_JRF_IMAGE_NAME_V2); + execTestScriptAndAssertSuccess( + DomainType.JRF, + "-update3-image,-check-image-and-push,-update3-main", + "Update3 use case failed" + ); + } + + /** + * Delete DB deployment and Uninstall traefik. + */ + @AfterAll + public void tearDownAll() { + // db cleanup or deletion + if (envMap != null) { + logger.info("Running samples DB cleanup"); + Command.withParams(new CommandParams() + .command(MII_SAMPLES_SCRIPT + " -precleandb") + .env(envMap) + .redirect(true)).execute(); + } + + // uninstall traefik + if (traefikNamespace != null) { + logger.info("Uninstall traefik"); + Command.withParams(new CommandParams() + .command("helm uninstall traefik-operator -n " + traefikNamespace) + .redirect(true)).execute(); + } + } + + private static void assertImageExistsAndPushIfNeeded() { + String imageName = envMap.get("MODEL_IMAGE_NAME"); + String imageVer = "notset"; + if (imageName.equals(MII_SAMPLE_WLS_IMAGE_NAME_V1)) { + imageVer = "WLS-v1"; + } + if (imageName.equals(MII_SAMPLE_WLS_IMAGE_NAME_V2)) { + imageVer = "WLS-v2"; + } + if (imageName.equals(MII_SAMPLE_JRF_IMAGE_NAME_V1)) { + imageVer = "JRF-v1"; + } + if (imageName.equals(MII_SAMPLE_JRF_IMAGE_NAME_V2)) { + imageVer = "JRF-v2"; + } + String image = imageName + ":" + imageVer; + + // Check image exists using docker images | grep image image. + assertTrue(doesImageExist(imageName), + String.format("Image %s does not exist", image)); + + // docker login and push image to docker registry if necessary + dockerLoginAndPushImageToRegistry(image); + } + + private static void execTestScriptAndAssertSuccess( + String args, + String errString + ) { + // WLS is the the test script's default + execTestScriptAndAssertSuccess(DomainType.WLS, args, errString); + } + + private static void execTestScriptAndAssertSuccess( + DomainType domainType, + String args, + String errString + ) { + for (String arg : args.split(",")) { + Assumptions.assumeTrue(previousTestSuccessful); + previousTestSuccessful = false; + + if (arg.equals("-check-image-and-push")) { + assertImageExistsAndPushIfNeeded(); + + } else { + String command = MII_SAMPLES_SCRIPT + + " " + + arg + + (domainType == DomainType.JRF ? " -jrf " : ""); + + ExecResult result = Command.withParams( + new CommandParams() + .command(command) + .env(envMap) + .redirect(true) + ).executeAndReturnResult(); + + boolean success = + result != null + && result.exitValue() == 0 + && result.stdout() != null + && result.stdout().contains(SUCCESS_SEARCH_STRING); + + String outStr = errString; + outStr += ", domainType=" + domainType + "\n"; + outStr += ", command=\n{\n" + command + "\n}\n"; + outStr += ", stderr=\n{\n" + (result != null ? result.stderr() : "") + "\n}\n"; + outStr += ", stdout=\n{\n" + (result != null ? result.stdout() : "") + "\n}\n"; + + assertTrue(success, outStr); + + } + + previousTestSuccessful = true; + } + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMonitoringExporter.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMonitoringExporter.java new file mode 100644 index 00000000000..6708609b284 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMonitoringExporter.java @@ -0,0 +1,1842 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Properties; +import java.util.concurrent.Callable; +import java.util.stream.Collectors; + +import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.html.HtmlFileInput; +import com.gargoylesoftware.htmlunit.html.HtmlForm; +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import com.gargoylesoftware.htmlunit.html.HtmlRadioButtonInput; +import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput; +import io.kubernetes.client.custom.IntOrString; +import io.kubernetes.client.custom.Quantity; +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1ConfigMap; +import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1ContainerPort; +import io.kubernetes.client.openapi.models.V1Deployment; +import io.kubernetes.client.openapi.models.V1DeploymentSpec; +import io.kubernetes.client.openapi.models.V1DeploymentStrategy; +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1HostPathVolumeSource; +import io.kubernetes.client.openapi.models.V1LabelSelector; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1PersistentVolume; +import io.kubernetes.client.openapi.models.V1PersistentVolumeClaim; +import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimSpec; +import io.kubernetes.client.openapi.models.V1PersistentVolumeSpec; +import io.kubernetes.client.openapi.models.V1Pod; +import io.kubernetes.client.openapi.models.V1PodCondition; +import io.kubernetes.client.openapi.models.V1PodList; +import io.kubernetes.client.openapi.models.V1PodSpec; +import io.kubernetes.client.openapi.models.V1PodTemplateSpec; +import io.kubernetes.client.openapi.models.V1ResourceRequirements; +import io.kubernetes.client.openapi.models.V1SecretReference; +import io.kubernetes.client.openapi.models.V1Service; +import io.kubernetes.client.openapi.models.V1ServicePort; +import io.kubernetes.client.openapi.models.V1ServiceSpec; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.Grafana; +import oracle.weblogic.kubernetes.actions.impl.Namespace; +import oracle.weblogic.kubernetes.actions.impl.Prometheus; +import oracle.weblogic.kubernetes.actions.impl.primitive.Command; +import oracle.weblogic.kubernetes.actions.impl.primitive.CommandParams; +import oracle.weblogic.kubernetes.actions.impl.primitive.Docker; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.assertions.impl.Deployment; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.ExecCommand; +import oracle.weblogic.kubernetes.utils.TestUtils; +import org.apache.commons.io.FileUtils; +import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static java.nio.file.Files.createDirectories; +import static java.nio.file.Paths.get; +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.GRAFANA_CHART_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.MANAGED_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.MONITORING_EXPORTER_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.PROMETHEUS_CHART_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.PV_ROOT; +import static oracle.weblogic.kubernetes.TestConstants.REPO_EMAIL; +import static oracle.weblogic.kubernetes.TestConstants.REPO_NAME; +import static oracle.weblogic.kubernetes.TestConstants.REPO_PASSWORD; +import static oracle.weblogic.kubernetes.TestConstants.REPO_REGISTRY; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.REPO_USERNAME; +import static oracle.weblogic.kubernetes.TestConstants.RESULTS_ROOT; +import static oracle.weblogic.kubernetes.actions.ActionConstants.ITTESTS_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.MODEL_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.MONITORING_EXPORTER_DOWNLOAD_URL; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_NAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_TAG; +import static oracle.weblogic.kubernetes.actions.TestActions.deleteImage; +import static oracle.weblogic.kubernetes.actions.TestActions.deletePersistentVolume; +import static oracle.weblogic.kubernetes.actions.TestActions.deletePersistentVolumeClaim; +import static oracle.weblogic.kubernetes.actions.TestActions.deleteSecret; +import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; +import static oracle.weblogic.kubernetes.actions.TestActions.shutdownDomain; +import static oracle.weblogic.kubernetes.actions.TestActions.uninstallNginx; +import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.createNamespace; +import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.deleteDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.deleteNamespace; +import static oracle.weblogic.kubernetes.assertions.impl.Kubernetes.listPods; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createImageAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createIngressForDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createMiiImageAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createPVPVCAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.dockerLoginAndPushImageToRegistry; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyGrafana; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyNginx; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyPrometheus; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.replaceStringInFile; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.scaleAndVerifyCluster; +import static oracle.weblogic.kubernetes.utils.TestUtils.callWebAppAndCheckForServerNameInResponse; +import static oracle.weblogic.kubernetes.utils.TestUtils.getNextFreePort; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.apache.commons.io.FileUtils.deleteDirectory; +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Verify Prometheus, Grafana, Webhook, Coordinator are installed and running + * Verify the monitoring exporter installed in model in image domain can generate the WebLogic metrics. + * Verify WebLogic metrics can be accessed via NGINX ingress controller. + * Verify WebLogic metrics can be accessed via Prometheus + */ +@DisplayName("Verify WebLogic Metric is processed as expected by MonitoringExporter via Prometheus and Grafana") +@IntegrationTest +class ItMonitoringExporter { + + + // domain constants + private static final int replicaCount = 2; + private static int managedServersCount = 2; + private static String domain1Namespace = null; + private static String domain2Namespace = null; + private static String domain1Uid = "monexp-domain-1"; + private static String domain2Uid = "monexp-domain-2"; + private static HelmParams nginxHelmParams = null; + private static int nodeportshttp = 0; + private static List ingressHost1List = null; + private static List ingressHost2List = null; + + private static String monitoringNS = null; + private static String webhookNS = null; + private static ConditionFactory withStandardRetryPolicy = null; + HelmParams promHelmParams = null; + HelmParams grafanaHelmParams = null; + private static String monitoringExporterEndToEndDir = null; + private static String monitoringExporterSrcDir = null; + private static String monitoringExporterAppDir = null; + private static V1Service webhookService = null; + private static V1Deployment webhookDepl = null; + private static V1Service coordinatorService = null; + private static V1Deployment coordinatorDepl = null; + // constants for creating domain image using model in image + private static final String MONEXP_MODEL_FILE = "model.monexp.yaml"; + private static final String MONEXP_WDT_FILE = "/demo-domains/domainBuilder/scripts/simple-topology.yaml"; + private static final String MONEXP_IMAGE_NAME = "monexp-image"; + private static final String SESSMIGR_APP_NAME = "sessmigr-app"; + + private static String clusterName = "cluster-1"; + private static String miiImage = null; + private static String wdtImage = null; + private static String webhookImage = null; + private static String coordinatorImage = null; + private static int managedServerPort = 8001; + private static int nodeportserver; + private static String exporterUrl = null; + private static String prometheusDomainRegexValue = null; + private static Map clusterNameMsPortMap; + private static LoggingFacade logger = null; + + /** + * Install operator and NGINX. Create model in image domain with multiple clusters. + * Create ingress for the domain. + * + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + * JUnit engine parameter resolution mechanism + */ + @BeforeAll + + public static void initAll(@Namespaces(6) List namespaces) { + + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + logger.info("Get a unique namespace for operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + final String opNamespace = namespaces.get(0); + + logger.info("Get a unique namespace for WebLogic domain1"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domain1Namespace = namespaces.get(1); + + logger.info("Get a unique namespace for WebLogic domain2"); + assertNotNull(namespaces.get(2), "Namespace list is null"); + domain2Namespace = namespaces.get(2); + + logger.info("Get a unique namespace for monitoring"); + assertNotNull(namespaces.get(3), "Namespace list is null"); + monitoringNS = namespaces.get(3); + + logger.info("Get a unique namespace for webhook"); + assertNotNull(namespaces.get(4), "Namespace list is null"); + webhookNS = namespaces.get(4); + + logger.info("Get a unique namespace for NGINX"); + assertNotNull(namespaces.get(5), "Namespace list is null"); + final String nginxNamespace = namespaces.get(5); + + + logger.info("install and verify operator"); + installAndVerifyOperator(opNamespace, domain1Namespace,domain2Namespace); + + logger.info("nstall monitoring exporter"); + installMonitoringExporter(); + + logger.info("create and verify WebLogic domain image using model in image with model files"); + miiImage = createAndVerifyMiiImage(); + + // create and verify one cluster mii domain + logger.info("Create domain and verify that it's running"); + createAndVerifyDomain(miiImage, domain1Uid, domain1Namespace, "FromModel", 1); + + + // install and verify NGINX + nginxHelmParams = installAndVerifyNginx(nginxNamespace, 0, 0); + String nginxServiceName = nginxHelmParams.getReleaseName() + "-nginx-ingress-controller"; + logger.info("NGINX service name: {0}", nginxServiceName); + nodeportshttp = getServiceNodePort(nginxNamespace, nginxServiceName, "http"); + logger.info("NGINX http node port: {0}", nodeportshttp); + + // create ingress for the domain + logger.info("Creating ingress for domain {0} in namespace {1}", domain1Uid, domain1Namespace); + clusterNameMsPortMap = new HashMap<>(); + clusterNameMsPortMap.put(clusterName, managedServerPort); + ingressHost1List = + createIngressForDomainAndVerify(domain1Uid, domain1Namespace,clusterNameMsPortMap, false); + + exporterUrl = String.format("http://%s:%s/wls-exporter/",K8S_NODEPORT_HOST,nodeportshttp); + + logger.info("create pv and pvc for monitoring"); + HashMap labels = new HashMap<>(); + labels.put("app", "monitoring"); + labels.put("weblogic.domainUid", domain1Uid); + assertDoesNotThrow(() -> createPvAndPvc("prometheus", monitoringNS, labels)); + assertDoesNotThrow(() -> createPvAndPvc("alertmanager",monitoringNS, labels)); + assertDoesNotThrow(() -> createPvAndPvc("grafana", monitoringNS, labels)); + + } + + /** + * Test covers end to end sample, provided in the Monitoring Exporter github project. + * Create Prometheus, Grafana, Webhook, Coordinator. + * Create domain in Image with monitoring exporter. + * Verify access to monitoring exporter WebLogic metrics via nginx. + * Check generated by monitoring exporter WebLogic metrics via Prometheus, Grafana. + * Fire Alert using Webhook. + * Change prometheus to add different domain to monitor. + */ + @Test + @DisplayName("Test End to End example from MonitoringExporter github project.") + public void testEndToEndViaChart() throws Exception { + wdtImage = createAndVerifyDomainInImage(); + try { + logger.info("Create wdt domain and verify that it's running"); + createAndVerifyDomain(wdtImage, domain2Uid, domain2Namespace, "Image", replicaCount); + ingressHost2List = + createIngressForDomainAndVerify(domain2Uid, domain2Namespace, clusterNameMsPortMap); + logger.info("Installing Prometheus and Grafana"); + installPrometheusGrafana(PROMETHEUS_CHART_VERSION, GRAFANA_CHART_VERSION, + domain2Namespace, + domain2Uid); + + installWebhook(); + installCoordinator(domain2Namespace); + + logger.info("verify access to Monitoring Exporter"); + verifyMonExpAppAccessThroughNginx(ingressHost2List.get(0), managedServersCount); + logger.info("verify metrics via prometheus"); + String testappPrometheusSearchKey = + "wls_servlet_invocation_total_count%7Bapp%3D%22test-webapp%22%7D%5B15s%5D"; + checkMetricsViaPrometheus(testappPrometheusSearchKey, "test-webapp"); + logger.info("fire alert by scaling down"); + fireAlert(); + logger.info("switch to monitor another domain"); + String oldRegex = String.format("regex: %s;%s;%s", domain2Namespace, domain2Uid, clusterName); + String newRegex = String.format("regex: %s;%s;%s", domain1Namespace, domain1Uid, clusterName); + editPrometheusCM(oldRegex, newRegex); + String sessionAppPrometheusSearchKey = + "wls_servlet_invocation_total_count%7Bapp%3D%22myear%22%7D%5B15s%5D"; + checkMetricsViaPrometheus(sessionAppPrometheusSearchKey, "sessmigr"); + checkPromGrafanaLatestVersion(); + } finally { + logger.info("Shutting down domain2"); + assertTrue(shutdownDomain(domain2Uid, domain2Namespace), + String.format("shutdown domain %s in namespace %s failed", domain2Uid, domain2Namespace)); + } + } + + /** + * Test covers end to end sample, provided in the Monitoring Exporter github project . + * Create Prometheus, Grafana. + * Create Model in Image with monitoring exporter. + * Verify access to monitoring exporter WebLogic metrics via nginx. + * Check generated monitoring exporter WebLogic metrics via Prometheus, Grafana. + * Check basic functionality of monitoring exporter. + */ + @Test + @DisplayName("Test Basic Functionality of Monitoring Exporter.") + public void testBasicFunctionality() throws Exception { + + installPrometheusGrafana(PROMETHEUS_CHART_VERSION, GRAFANA_CHART_VERSION, + domain1Namespace, + domain1Uid); + + //verify access to Monitoring Exporter + verifyMonExpAppAccessThroughNginx(ingressHost1List.get(0),1); + + try { + logger.info("Testing replace configuration"); + replaceConfiguration(); + logger.info("Testing append configuration"); + appendConfiguration(); + logger.info("Testing replace One Attribute Value AsArray configuration"); + replaceOneAttributeValueAsArrayConfiguration(); + logger.info("Testing append One Attribute Value AsArray configuration"); + appendArrayWithOneExistedAndOneDifferentAttributeValueAsArrayConfiguration(); + logger.info("Testing replace with empty configuration"); + replaceWithEmptyConfiguration(); + logger.info("Testing append with empty configuration"); + appendWithEmptyConfiguration(); + logger.info("Testing append with invalid yaml configuration"); + appendWithNotYamlConfiguration(); + logger.info("Testing replace with invalid yaml configuration"); + replaceWithNotYamlConfiguration(); + logger.info("Testing append with corrupted yaml configuration"); + appendWithCorruptedYamlConfiguration(); + logger.info("Testing replace with corrupted yaml configuration"); + replaceWithCorruptedYamlConfiguration(); + logger.info("Testing replace with dublicated values yaml configuration"); + replaceWithDublicatedValuesConfiguration(); + logger.info("Testing append with corrupted yaml configuration"); + appendWithDuplicatedValuesConfiguration(); + logger.info("Testing replace with name snake false yaml configuration"); + replaceMetricsNameSnakeCaseFalseConfiguration(); + logger.info("Testing change with no credentials configuration"); + changeConfigNoCredentials(); + logger.info("Testing change with no invalid user configuration"); + changeConfigInvalidUser(); + logger.info("Testing change with no invalid pass configuration"); + changeConfigInvalidPass(); + logger.info("Testing change with empty user configuration"); + changeConfigEmptyUser(); + logger.info("Testing change with no empty pass configuration"); + changeConfigEmptyPass(); + logger.info("Testing replace with domain qualifier configuration"); + replaceMetricsDomainQualifierTrueConfiguration(); + } finally { + //restore configuration + submitConfigureForm(exporterUrl, "replace", RESOURCE_DIR + "/exporter/exporter-config.yaml"); + } + } + + /** + * Test covers the following use cases. + * Create Prometheus, Grafana from latest version of helm chart + * verify access to monitoring exporter WebLogic metrics via nginx + * check WebLogic metrics via Prometheus + */ + private void checkPromGrafanaLatestVersion() throws Exception { + //uninstall prometheus and grafana if running + uninstallPrometheusGrafana(); + try { + installPrometheusGrafana(null, null, + domain2Namespace, + domain2Uid); + + + //verify access to Monitoring Exporter + verifyMonExpAppAccessThroughNginx(ingressHost2List.get(0),managedServersCount); + //verify metrics via prometheus + String testappPrometheusSearchKey = + "wls_servlet_invocation_total_count%7Bapp%3D%22test-webapp%22%7D%5B15s%5D"; + checkMetricsViaPrometheus(testappPrometheusSearchKey, "test-webapp"); + } finally { + uninstallPrometheusGrafana(); + } + } + + private void fireAlert() throws ApiException { + // scale domain2 + logger.info("Scaling cluster {0} of domain {1} in namespace {2} to {3} servers.", + clusterName, domain2Uid, domain2Namespace, 1); + managedServersCount = 1; + scaleAndVerifyCluster(clusterName, domain2Uid, domain2Namespace, + domain2Uid + "-" + MANAGED_SERVER_NAME_BASE, replicaCount, managedServersCount, + null, null); + + //check webhook log for firing alert + List pods = listPods(webhookNS, "app=webhook").getItems(); + assertNotNull((pods), "No pods are running in namespace : " + webhookNS); + V1Pod pod = pods.stream() + .filter(testpod -> testpod + .getMetadata() + .getName() + .contains("webhook")) + .findAny() + .orElse(null); + + assertNotNull(pod, "Can't find running webhook pod"); + logger.info("Wait for the webhook to fire alert and check webhook log file in {0} namespace ", webhookNS); + + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for webhook to fire alert " + + "(elapsed time {0}ms, remaining time {1}ms)", + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> searchPodLogForKey(pod, + "Some WLS cluster has only one running server for more than 1 minutes"), + + "webhook failed to fire alert")); + } + + /** + * Edit Prometheus Config Map. + * @param oldRegex search for existed value to replace + * @param newRegex new value + * @throws ApiException when update fails + */ + private void editPrometheusCM(String oldRegex, String newRegex) throws ApiException { + List cmList = Kubernetes.listConfigMaps(monitoringNS).getItems(); + V1ConfigMap promCm = cmList.stream() + .filter(cm -> "prometheus-server".equals(cm.getMetadata().getName())) + .findAny() + .orElse(null); + + assertNotNull(promCm,"Can't find cm for prometheus-server"); + Map cmData = promCm.getData(); + String values = cmData.get("prometheus.yml").replace(oldRegex,newRegex); + assertNotNull(values, "can't find values for key prometheus.yml"); + cmData.replace("prometheus.yml", values); + + promCm.setData(cmData); + Kubernetes.replaceConfigMap(promCm); + + cmList = Kubernetes.listConfigMaps(monitoringNS).getItems(); + + promCm = cmList.stream() + .filter(cm -> "prometheus-server".equals(cm.getMetadata().getName())) + .findAny() + .orElse(null); + + assertNotNull(promCm,"Can't find cm for prometheus-server"); + assertNotNull(promCm.getData(), "Can't retreive the cm data for prometheus-server after modification"); + + } + + /** + * Install Prometheus, Grafana using specified helm chart version, and verify that pods are running. + * @throws ApiException when creating helm charts or pods fails + */ + private void installPrometheusGrafana(String promChartVersion, + String grafanaChartVersion, + String domainNS, + String domainUid + ) throws IOException, ApiException { + final String prometheusRegexValue = String.format("regex: %s;%s;%s", domainNS, domainUid, clusterName); + if (promHelmParams == null) { + logger.info("create a staging location for monitoring creation scripts"); + Path fileTemp = Paths.get(RESULTS_ROOT, "ItMonitoringExporter", "createTempValueFile"); + FileUtils.deleteDirectory(fileTemp.toFile()); + Files.createDirectories(fileTemp); + + logger.info("copy the promvalue.yaml to staging location"); + Path srcPromFile = Paths.get(RESOURCE_DIR, "exporter", "promvalues.yaml"); + Path targetPromFile = Paths.get(fileTemp.toString(), "promvalues.yaml"); + Files.copy(srcPromFile, targetPromFile, StandardCopyOption.REPLACE_EXISTING); + String oldValue = "regex: default;domain1;cluster-1"; + replaceStringInFile(targetPromFile.toString(), + oldValue, + prometheusRegexValue); + //replace with webhook ns + replaceStringInFile(targetPromFile.toString(), + "webhook.webhook.svc.cluster.local", + String.format("webhook.%s.svc.cluster.local", webhookNS)); + + + nodeportserver = getNextFreePort(32400, 32600); + int nodeportalertmanserver = getNextFreePort(30400, 30600); + promHelmParams = installAndVerifyPrometheus("prometheus", + monitoringNS, + targetPromFile.toString(), + promChartVersion, + nodeportserver, + nodeportalertmanserver); + + prometheusDomainRegexValue = prometheusRegexValue; + } + //if prometheus already installed change CM for specified domain + if (!prometheusRegexValue.equals(prometheusDomainRegexValue)) { + logger.info("update prometheus Config Map with domain info"); + editPrometheusCM(prometheusDomainRegexValue, prometheusRegexValue); + prometheusDomainRegexValue = prometheusRegexValue; + } + logger.info("Prometheus is running"); + + String testappPrometheusSearchKey = + "wls_servlet_invocation_total_count%7Bapp%3D%22wls-exporter%22%7D%5B15s%5D"; + + assertDoesNotThrow(() -> checkMetricsViaPrometheus(testappPrometheusSearchKey, "wls-exporter")); + + + if (grafanaHelmParams == null) { + int nodeportgrafana = getNextFreePort(31000, 31200); + grafanaHelmParams = installAndVerifyGrafana("grafana", + monitoringNS, + monitoringExporterEndToEndDir + "/grafana/values.yaml", + grafanaChartVersion, + nodeportgrafana); + + //wait until it starts dashboard + String curlCmd = String.format("curl -v -H 'Content-Type: application/json' " + + " -X GET http://admin:12345678@%s:%s/api/dashboards", + K8S_NODEPORT_HOST, nodeportgrafana); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Check access to grafana dashboard " + + "(elapsed time {0}ms, remaining time {1}ms)", + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> searchForKey(curlCmd, "grafana"), + String.format("Check access to grafana dashboard" + ))); + logger.info("installing grafana dashboard"); + // url + String curlCmd0 = + String.format("curl -v -H 'Content-Type: application/json' -H \"Content-Type: application/json\"" + + " -X POST http://admin:12345678@%s:%s/api/datasources/" + + " --data-binary @%sgrafana/datasource.json", + K8S_NODEPORT_HOST, nodeportgrafana, monitoringExporterEndToEndDir); + + logger.info("Executing Curl cmd {0}", curlCmd); + assertDoesNotThrow(() -> ExecCommand.exec(curlCmd0)); + + String curlCmd1 = + String.format("curl -v -H 'Content-Type: application/json' -H \"Content-Type: application/json\"" + + " -X POST http://admin:12345678@%s:%s/api/dashboards/db/" + + " --data-binary @%sgrafana/dashboard.json", + K8S_NODEPORT_HOST, nodeportgrafana, monitoringExporterEndToEndDir); + logger.info("Executing Curl cmd {0}", curlCmd1); + assertDoesNotThrow(() -> ExecCommand.exec(curlCmd1)); + + String curlCmd2 = String.format("curl -v -H 'Content-Type: application/json' " + + " -X GET http://admin:12345678@%s:%s/api/dashboards/db/weblogic-server-dashboard", + K8S_NODEPORT_HOST, nodeportgrafana); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Check grafana dashboard metric against expected {0} " + + "(elapsed time {2}ms, remaining time {3}ms)", + "wls_jvm_uptime", + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> searchForKey(curlCmd2, "wls_jvm_uptime"), + String.format("Check grafana dashboard wls against expected %s", + "wls_jvm_uptime"))); + } + logger.info("Grafana is running"); + } + + /** + * Create a Webhook image, install and verify that pod is running. + * @throws ApiException when creating images or pods fails + */ + private void installWebhook() throws ApiException { + assertTrue(installAndVerifyPodFromCustomImage(monitoringExporterEndToEndDir + "/webhook", + "webhook", + webhookNS, + "app=webhook", REPO_SECRET_NAME), "Failed to start webhook"); + } + + /** + * Create a Coordinator image, install and verify that pod is running. + * @param namespace of domain to coordinate + * @throws ApiException when creating images or pods fails + */ + private void installCoordinator(String namespace) throws ApiException { + assertTrue(installAndVerifyPodFromCustomImage(monitoringExporterSrcDir + "/config_coordinator", + "coordinator", + namespace, + "app=coordinator", "coordsecret"), "Failed to start coordinator"); + } + + @AfterAll + public void tearDownAll() { + + // shutdown domain1 + logger.info("Shutting down domain1"); + assertTrue(shutdownDomain(domain1Uid, domain1Namespace), + String.format("shutdown domain %s in namespace %s failed", domain1Uid, domain1Namespace)); + + // delete mii domain images created for parameterized test + if (miiImage != null) { + deleteImage(miiImage); + } + if (wdtImage != null) { + deleteImage(miiImage); + } + + // Delete domain custom resource + logger.info("Delete domain custom resource in namespace {0}", domain1Namespace); + assertDoesNotThrow(() -> deleteDomainCustomResource(domain1Uid, domain1Namespace), + "deleteDomainCustomResource failed with ApiException"); + logger.info("Deleted Domain Custom Resource " + domain1Uid + " from " + domain1Namespace); + + // Delete wdt domain custom resource + logger.info("Delete domain custom resource in namespace {0}", domain2Namespace); + assertDoesNotThrow(() -> deleteDomainCustomResource(domain2Uid, domain2Namespace), + "deleteDomainCustomResource failed with ApiException"); + logger.info("Deleted Domain Custom Resource " + domain2Uid + " from " + domain2Namespace); + + uninstallPrometheusGrafana(); + + deletePersistentVolumeClaim("pvc-alertmanager",monitoringNS); + deletePersistentVolume("pv-testalertmanager"); + deletePersistentVolumeClaim("pvc-prometheus",monitoringNS); + deletePersistentVolume("pv-testprometheus"); + deletePersistentVolumeClaim("pvc-grafana",monitoringNS); + deletePersistentVolume("pv-testgrafana"); + deleteNamespace(monitoringNS); + uninstallDeploymentService(webhookDepl, webhookService); + uninstallDeploymentService(coordinatorDepl, coordinatorService); + // delete coordinator and webhook images + if (webhookImage != null) { + deleteImage(webhookImage); + } + if (coordinatorImage != null) { + deleteImage(webhookImage); + } + deleteMonitoringExporterTempDir(); + + // uninstall NGINX release + if (nginxHelmParams != null) { + assertThat(uninstallNginx(nginxHelmParams)) + .as("Test uninstallNginx1 returns true") + .withFailMessage("uninstallNginx() did not return true") + .isTrue(); + } + } + + /** + * Create a persistent volume and persistent volume claim. + * @param nameSuffix unique nameSuffix for pv and pvc to create + * @throws IOException when creating pv path fails + */ + private static void createPvAndPvc(String nameSuffix, String namespace, HashMap labels) + throws IOException { + logger.info("creating persistent volume and persistent volume claim"); + // create persistent volume and persistent volume claims + Path pvHostPath = assertDoesNotThrow( + () -> createDirectories(get(PV_ROOT, "ItMonitoringExporter", "monexp-persistentVolume",nameSuffix)), + "createDirectories failed with IOException"); + logger.info("Creating PV directory {0}", pvHostPath); + assertDoesNotThrow(() -> deleteDirectory(pvHostPath.toFile()), "deleteDirectory failed with IOException"); + assertDoesNotThrow(() -> createDirectories(pvHostPath), "createDirectories failed with IOException"); + + V1PersistentVolume v1pv = new V1PersistentVolume() + .spec(new V1PersistentVolumeSpec() + .addAccessModesItem("ReadWriteMany") + .storageClassName(nameSuffix) + .volumeMode("Filesystem") + .putCapacityItem("storage", Quantity.fromString("10Gi")) + .persistentVolumeReclaimPolicy("Retain") + .accessModes(Arrays.asList("ReadWriteMany")) + .hostPath(new V1HostPathVolumeSource() + .path(pvHostPath.toString()))) + .metadata(new V1ObjectMeta() + .name("pv-test" + nameSuffix) + .namespace(namespace)); + + boolean hasLabels = false; + String labelSelector = null; + if (labels != null || !labels.isEmpty()) { + hasLabels = true; + v1pv.getMetadata().setLabels(labels); + labelSelector = labels.entrySet() + .stream() + .map(e -> e.getKey() + "=" + + e.getValue()) + .collect(Collectors.joining(",")); + } + + + V1PersistentVolumeClaim v1pvc = new V1PersistentVolumeClaim() + .spec(new V1PersistentVolumeClaimSpec() + .addAccessModesItem("ReadWriteMany") + .storageClassName(nameSuffix) + .volumeName("pv-test" + nameSuffix) + .resources(new V1ResourceRequirements() + .putRequestsItem("storage", Quantity.fromString("10Gi")))) + .metadata(new V1ObjectMeta() + .name("pvc-" + nameSuffix) + .namespace(namespace)); + if (hasLabels) { + v1pvc.getMetadata().setLabels(labels); + } + + createPVPVCAndVerify(v1pv,v1pvc, labelSelector, namespace); + } + + /** + * Create, install Webhook or Coordinator and wait up to five minutes until the pod is ready. + * + * @param dockerFileDir directory where dockerfile is located + * @param baseImageName base image name + * @param namespace namespace + * @return status of installation + */ + public static boolean installAndVerifyPodFromCustomImage(String dockerFileDir, + String baseImageName, + String namespace, + String labelSelector, + String secretName) throws ApiException { + //build webhook image + String imagePullPolicy = "IfNotPresent"; + if (!REPO_NAME.isEmpty()) { + imagePullPolicy = "Always"; + } + String image = createPushImage(dockerFileDir,baseImageName, namespace, secretName); + logger.info("Installing {0} in namespace {1}", baseImageName, namespace); + if (baseImageName.equalsIgnoreCase(("webhook"))) { + webhookImage = image; + createWebHook(webhookImage, imagePullPolicy, namespace, REPO_SECRET_NAME); + } else if (baseImageName.contains("coordinator")) { + coordinatorImage = image; + createCoordinator(coordinatorImage, imagePullPolicy, namespace, "coordsecret"); + } else { + throw new ApiException("Custom image creation for " + baseImageName + "is not supported"); + } + // wait for the pod to be ready + logger.info("Wait for the {0} pod is ready in namespace {1}", baseImageName, namespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for {0} to be running in namespace {1} " + + "(elapsed time {2}ms, remaining time {3}ms)", + baseImageName, + namespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> podIsReady(namespace, labelSelector, baseImageName), + baseImageName + " podIsReady failed with ApiException")); + return true; + } + + /** + * Create Webhook deployment and service. + * + * @param image full image name for deployment + * @param imagePullPolicy policy for image + * @param namespace webhook namespace + * @param secretName webhook image secret name + */ + private static void createWebHook(String image, + String imagePullPolicy, + String namespace, + String secretName) throws ApiException { + Map labels = new HashMap(); + labels.put("app", "webhook"); + + webhookDepl = new V1Deployment() + .apiVersion("apps/v1") + .kind("Deployment") + .metadata(new V1ObjectMeta() + .name("webhook") + .namespace(namespace) + .labels(labels)) + .spec(new V1DeploymentSpec() + .replicas(1) + .selector(new V1LabelSelector() + .matchLabels(labels)) + .template(new V1PodTemplateSpec() + .metadata(new V1ObjectMeta() + .labels(labels)) + .spec(new V1PodSpec() + .containers(Arrays.asList( + new V1Container() + .image(image) + .imagePullPolicy(imagePullPolicy) + .name("webhook"))) + .imagePullSecrets(Arrays.asList( + new V1LocalObjectReference() + .name(secretName)))))); + + logger.info("Create deployment for webhook in namespace {0}", + namespace); + boolean deploymentCreated = assertDoesNotThrow(() -> Kubernetes.createDeployment(webhookDepl), + String.format("Create deployment failed with ApiException for webhook in namespace %s", + namespace)); + assertTrue(deploymentCreated, String.format( + "Create deployment failed with ApiException for webhook in namespace %s ", + namespace)); + logger.info("Checking if the deployment is ready {0} completed in namespace {1}", + "webhook", namespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for deployment {0} to be completed in namespace {1} " + + "(elapsed time {2} ms, remaining time {3} ms)", + "webhook", + namespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(Deployment.isReady("webhook", labels, namespace)); + + webhookService = new V1Service() + .metadata(new V1ObjectMeta() + .name("webhook") + .namespace(namespace) + .labels(labels)) + .spec(new V1ServiceSpec() + .ports(Arrays.asList( + new V1ServicePort() + .port(8080) + .protocol("TCP"))) + .selector(labels)); + + logger.info("Create service for webhook in namespace {0}", + namespace); + boolean serviceCreated = assertDoesNotThrow(() -> Kubernetes.createService(webhookService), + String.format("Create service failed with ApiException for webhook in namespace %s", + namespace)); + assertTrue(serviceCreated, String.format( + "Create service failed with ApiException for webhook in namespace %s ", + namespace)); + // wait for the webhook pod to be ready + logger.info("Wait for the webhook pod is ready in namespace {0}", namespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for webhook to be running in namespace {0} " + + "(elapsed time {1}ms, remaining time {2}ms)", + namespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> podIsReady(namespace, "app=webhook", "webhook"), + "webhook podIsReady failed with ApiException")); + } + + /** + * Uninstall provided deployment and service. + */ + private static void uninstallDeploymentService(V1Deployment deployment, V1Service service) { + String namespace = null; + String serviceName = null; + String deploymentName = null; + try { + if (service != null) { + serviceName = service.getMetadata().getName(); + namespace = service.getMetadata().getNamespace(); + Kubernetes.deleteService(serviceName, namespace); + } + } catch (Exception ex) { + logger.warning(ex.getMessage()); + logger.warning("Failed to delete service {0} in namespace {1} ", + serviceName, namespace); + } + try { + if (deployment != null) { + deploymentName = deployment.getMetadata().getName(); + namespace = deployment.getMetadata().getNamespace(); + Kubernetes.deleteDeployment(namespace, deploymentName); + } + } catch (Exception ex) { + logger.warning(ex.getMessage()); + logger.warning("Failed to delete deployment {0} in namespace {1}", + deploymentName, namespace); + } + if (namespace != null) { + deleteNamespace(namespace); + } + } + + /** + * Create Coordinator deployment and service. + * + * @param image full image name for deployment + * @param imagePullPolicy policy for image + * @param namespace coordinator namespace + * @param secretName coordinator secret name + */ + private static void createCoordinator(String image, + String imagePullPolicy, + String namespace, + String secretName) throws ApiException { + if (coordinatorDepl == null) { + Map labels = new HashMap(); + labels.put("app", "coordinator"); + coordinatorDepl = new V1Deployment() + .apiVersion("apps/v1") + .kind("Deployment") + .metadata(new V1ObjectMeta() + .name("coordinator") + .namespace(namespace) + .labels(labels)) + .spec(new V1DeploymentSpec() + .replicas(1) + .selector(new V1LabelSelector() + .matchLabels(labels)) + .strategy(new V1DeploymentStrategy() + .type("Recreate")) + .template(new V1PodTemplateSpec() + .metadata(new V1ObjectMeta() + .labels(labels)) + .spec(new V1PodSpec() + .containers(Arrays.asList( + new V1Container() + .image(image) + .imagePullPolicy(imagePullPolicy) + .name("coordinator") + .ports(Arrays.asList( + new V1ContainerPort() + .containerPort(8999))))) + .imagePullSecrets(Arrays.asList( + new V1LocalObjectReference() + .name(secretName)))))); + + logger.info("Create deployment for coordinator in namespace {0}", + namespace); + boolean deploymentCreated = assertDoesNotThrow(() -> Kubernetes.createDeployment(coordinatorDepl), + String.format("Create deployment failed with ApiException for coordinator in namespace %s", + namespace)); + assertTrue(deploymentCreated, String.format( + "Create deployment failed with ApiException for coordinator in namespace %s ", + namespace)); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for deployment {0} to be completed in namespace {1} " + + "(elapsed time {2} ms, remaining time {3} ms)", + "coordinator", + namespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(Deployment.isReady("coordinator", labels, namespace)); + + HashMap annotations = new HashMap<>(); + annotations.put("kubectl.kubernetes.io/last-applied-configuration",""); + coordinatorService = new V1Service() + .metadata(new V1ObjectMeta() + .name("coordinator") + .annotations(annotations) + .namespace(namespace) + .labels(labels)) + .spec(new V1ServiceSpec() + .ports(Arrays.asList( + new V1ServicePort() + .port(8999) + .targetPort(new IntOrString(8999)))) + .type("NodePort") + .selector(labels)); + + logger.info("Create service for coordinator in namespace {0}", + namespace); + boolean success = assertDoesNotThrow(() -> Kubernetes.createService(coordinatorService), + String.format("Create service failed with ApiException for coordinator in namespace %s", + namespace)); + assertTrue(success, "Coordinator service creation failed"); + } + } + + /** + * Checks if the pod is running in a given namespace. + * The method assumes the pod name to starts with provided value for podName + * and decorated with provided label selector + * @param namespace in which to check for the pod existence + * @return true if pods are exist and running otherwise false + * @throws ApiException when there is error in querying the cluster + */ + public static boolean isPodReady(String namespace, String labelSelector, String podName) throws ApiException { + boolean status = false; + V1PodList pods = listPods(namespace, labelSelector); + V1Pod pod = null; + for (var testpod : pods.getItems()) { + if ((testpod.getMetadata().getName()).contains(podName)) { + pod = testpod; + } + } + if (pod != null) { + // get the podCondition with the 'Ready' type field + V1PodCondition v1PodReadyCondition = pod.getStatus().getConditions().stream() + .filter(v1PodCondition -> "Ready".equals(v1PodCondition.getType())) + .findAny() + .orElse(null); + + if (v1PodReadyCondition != null) { + status = v1PodReadyCondition.getStatus().equalsIgnoreCase("true"); + } + } else { + logger.info(podName + " pod doesn't exist"); + } + return status; + } + + /** + * Build image with unique name, create corresponding docker secret and push to registry. + * + * @param dockerFileDir directory where dockerfile is located + * @param baseImageName base image name + * @param namespace image namespace + * @param secretName docker secretname for image + * @return image name + */ + public static String createPushImage(String dockerFileDir, String baseImageName, + String namespace, String secretName) throws ApiException { + // create unique image name with date + final String imageTag = TestUtils.getDateAndTimeStamp(); + // Add repository name in image name for Jenkins runs + final String imageName = REPO_NAME + baseImageName; + + final String image = imageName + ":" + imageTag; + + //build image + assertTrue(Docker.createImage(dockerFileDir, image), "Failed to create image " + baseImageName); + logger.info("image is created with name {0}", image); + if (!new Namespace().exists(namespace)) { + createNamespace(namespace); + } + + //create registry docker secret + createDockerRegistrySecret(REPO_USERNAME, REPO_PASSWORD, REPO_EMAIL, + REPO_REGISTRY, secretName, namespace); + // docker login and push image to docker registry if necessary + dockerLoginAndPushImageToRegistry(image); + + return image; + } + + /** + * Check if Pod is running. + * + * @param namespace in which is pod is running + * @return true if running false otherwise + */ + public static Callable podIsReady(String namespace, + String labelSelector, + String podName) throws ApiException { + return () -> { + return isPodReady(namespace, labelSelector, podName); + }; + } + + //download src from monitoring exporter github project and build webapp. + private static void installMonitoringExporter() { + logger.info("create a staging location for monitoring exporter github"); + Path monitoringTemp = Paths.get(RESULTS_ROOT, "monitoringexp", "srcdir"); + assertDoesNotThrow(() -> FileUtils.deleteDirectory(monitoringTemp.toFile())); + assertDoesNotThrow(() -> Files.createDirectories(monitoringTemp)); + Path monitoringApp = Paths.get(RESULTS_ROOT, "monitoringexp", "apps"); + assertDoesNotThrow(() -> FileUtils.deleteDirectory(monitoringApp.toFile())); + assertDoesNotThrow(() -> Files.createDirectories(monitoringApp)); + + CommandParams params = Command.defaultCommandParams() + .command("git clone " + MONITORING_EXPORTER_DOWNLOAD_URL + " " + monitoringTemp) + .saveResults(true) + .redirect(false); + assertTrue(() -> Command.withParams(params) + .execute()); + + monitoringExporterSrcDir = monitoringTemp.toString(); + monitoringExporterEndToEndDir = monitoringTemp + "/samples/kubernetes/end2end/"; + String monitoringExporterVersion = Optional.ofNullable(System.getenv("MONITORING_EXPORTER_VERSION")) + .orElse(MONITORING_EXPORTER_VERSION); + logger.info("create a monitoring exporter version {0} ",monitoringExporterVersion); + monitoringExporterAppDir = monitoringApp.toString(); + String monitoringExporterBuildFile = String.format( + "%s/get%s.sh", monitoringExporterAppDir, monitoringExporterVersion); + logger.info("Download a monitoring exporter build file {0} ", monitoringExporterBuildFile); + String curlDownloadCmd = String.format("cd %s && " + + "curl -O -L -k https://github.com/oracle/weblogic-monitoring-exporter/releases/download/v%s/get%s.sh", + monitoringExporterAppDir, + monitoringExporterVersion, + monitoringExporterVersion); + logger.info("execute command a monitoring exporter curl command {0} ",curlDownloadCmd); + assertTrue(new Command() + .withParams(new CommandParams() + .command(curlDownloadCmd)) + .execute(),"Failed to download monitoring exporter webapp"); + String command = String.format("chmod 777 %s ", monitoringExporterBuildFile); + assertTrue(new Command() + .withParams(new CommandParams() + .command(command)) + .execute(),"Failed to build monitoring exporter webapp"); + String appDest = monitoringExporterAppDir; + command = String.format("cd %s && %s %s/exporter/exporter-config.yaml", + appDest, + monitoringExporterBuildFile, + RESOURCE_DIR); + assertTrue(new Command() + .withParams(new CommandParams() + .command(command)) + .execute(),"Failed to build monitoring exporter webapp"); + } + + /** + * Delete monitoring exporter dir. + */ + private static void deleteMonitoringExporterTempDir() { + logger.info("delete temp dir for monitoring exporter github"); + Path monitoringTemp = Paths.get(RESULTS_ROOT, "monitoringexp", "srcdir"); + assertDoesNotThrow(() -> FileUtils.deleteDirectory(monitoringTemp.toFile())); + Path monitoringApp = Paths.get(RESULTS_ROOT, "monitoringexp", "apps"); + assertDoesNotThrow(() -> FileUtils.deleteDirectory(monitoringApp.toFile())); + Path fileTemp = Paths.get(RESULTS_ROOT, "ItMonitoringExporter", "promCreateTempValueFile"); + assertDoesNotThrow(() -> FileUtils.deleteDirectory(fileTemp.toFile())); + } + + /** + * Create mii image with monitoring exporter webapp. + */ + private static String createAndVerifyMiiImage() { + // create image with model files + logger.info("Create image with model file with monitoring exporter app and verify"); + String appPath = String.format("%s/wls-exporter.war", monitoringExporterAppDir); + List appList = new ArrayList(); + appList.add(appPath); + appList.add(SESSMIGR_APP_NAME); + + // build the model file list + final List modelList = Collections.singletonList(MODEL_DIR + "/" + MONEXP_MODEL_FILE); + miiImage = + createMiiImageAndVerify(MONEXP_IMAGE_NAME, modelList, appList); + + // docker login and push image to docker registry if necessary + dockerLoginAndPushImageToRegistry(miiImage); + + // create docker registry secret to pull the image from registry + logger.info("Create docker registry secret in namespace {0}", domain1Namespace); + assertDoesNotThrow(() -> createDockerRegistrySecret(domain1Namespace), + String.format("create Docker Registry Secret failed for %s", REPO_SECRET_NAME)); + + return miiImage; + } + + /** + * Create and verify domain in image from endtoend sample topology with monitoring exporter. + * @return image name + */ + private static String createAndVerifyDomainInImage() { + // create image with model files + logger.info("Create image with model file with monitoring exporter app and verify"); + String app1Path = String.format("%s/wls-exporter.war", monitoringExporterAppDir); + String app2Path = String.format("%s/../src/integration-tests/apps/testwebapp.war", ITTESTS_DIR); + + List appList = new ArrayList(); + appList.add(app1Path); + appList.add(app2Path); + + final int t3ChannelPort = getNextFreePort(31000, 32767); // the port range has to be between 30,000 to 32,767 + + Properties p = new Properties(); + p.setProperty("ADMIN_USER", ADMIN_USERNAME_DEFAULT); + p.setProperty("ADMIN_PWD", ADMIN_PASSWORD_DEFAULT); + p.setProperty("DOMAIN_NAME", domain2Uid); + p.setProperty("ADMIN_NAME", "admin-server"); + p.setProperty("PRODUCTION_MODE_ENABLED", "true"); + p.setProperty("CLUSTER_NAME", clusterName); + p.setProperty("CLUSTER_TYPE", "DYNAMIC"); + p.setProperty("CONFIGURED_MANAGED_SERVER_COUNT", "2"); + p.setProperty("MANAGED_SERVER_NAME_BASE", "managed-server"); + p.setProperty("T3_CHANNEL_PORT", Integer.toString(t3ChannelPort)); + p.setProperty("T3_PUBLIC_ADDRESS", K8S_NODEPORT_HOST); + p.setProperty("MANAGED_SERVER_PORT", "8001"); + p.setProperty("SERVER_START_MODE", "prod"); + p.setProperty("ADMIN_PORT", "7001"); + p.setProperty("MYSQL_USER", "wluser1"); + p.setProperty("MYSQL_PWD", "wlpwd123"); + // create a temporary WebLogic domain property file as a input for WDT model file + File domainPropertiesFile = assertDoesNotThrow(() -> + File.createTempFile("domain", "properties"), + "Failed to create domain properties file"); + assertDoesNotThrow(() -> + p.store(new FileOutputStream(domainPropertiesFile), "WDT properties file"), + "Failed to write domain properties file"); + + final List propertyList = Collections.singletonList(domainPropertiesFile.getPath()); + + // build the model file list + final List modelList = Collections.singletonList(monitoringExporterEndToEndDir + + MONEXP_WDT_FILE); + + wdtImage = + createImageAndVerify(MONEXP_IMAGE_NAME, + modelList, + appList, + propertyList, + WLS_BASE_IMAGE_NAME, + WLS_BASE_IMAGE_TAG, + WLS, + false, + domain2Uid, true); + + + + // docker login and push image to docker registry if necessary + dockerLoginAndPushImageToRegistry(wdtImage); + + // create docker registry secret to pull the image from registry + logger.info("Create docker registry secret in namespace {0}", domain2Namespace); + assertDoesNotThrow(() -> createDockerRegistrySecret(domain2Namespace), + String.format("create Docker Registry Secret failed for %s", REPO_SECRET_NAME)); + + return wdtImage; + } + + //create domain from provided image and verify it's start + private static void createAndVerifyDomain(String miiImage, + String domainUid, + String namespace, + String domainHomeSource, + int replicaCount) { + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword(adminSecretName, namespace, + "weblogic", "welcome1"), + String.format("create secret for admin credentials failed for %s", adminSecretName)); + + // create encryption secret + logger.info("Create encryption secret"); + String encryptionSecretName = "encryptionsecret"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword(encryptionSecretName, namespace, + "weblogicenc", "weblogicenc"), + String.format("create encryption secret failed for %s", encryptionSecretName)); + + // create domain and verify + logger.info("Create model in image domain {0} in namespace {1} using docker image {2}", + domainUid, namespace, miiImage); + createDomainCrAndVerify(adminSecretName, REPO_SECRET_NAME, encryptionSecretName, miiImage,domainUid, + namespace, domainHomeSource, replicaCount); + String adminServerPodName = domainUid + "-admin-server"; + + // check that admin service exists in the domain namespace + logger.info("Checking that admin service {0} exists in namespace {1}", + adminServerPodName, namespace); + checkServiceExists(adminServerPodName, namespace); + + // check that admin server pod is ready + logger.info("Checking that admin server pod {0} is ready in namespace {1}", + adminServerPodName, namespace); + checkPodReady(adminServerPodName, domainUid, namespace); + + String managedServerPrefix = domainUid + "-managed-server"; + // check for managed server pods existence in the domain namespace + for (int i = 1; i <= replicaCount; i++) { + String managedServerPodName = managedServerPrefix + i; + + // check that the managed server pod exists + logger.info("Checking that managed server pod {0} exists in namespace {1}", + managedServerPodName, namespace); + checkPodExists(managedServerPodName, domainUid, namespace); + + // check that the managed server pod is ready + logger.info("Checking that managed server pod {0} is ready in namespace {1}", + managedServerPodName, namespace); + checkPodReady(managedServerPodName, domainUid, namespace); + + // check that the managed server service exists in the domain namespace + logger.info("Checking that managed server service {0} exists in namespace {1}", + managedServerPodName, namespace); + checkServiceExists(managedServerPodName, namespace); + } + } + + private static void createDomainCrAndVerify(String adminSecretName, + String repoSecretName, + String encryptionSecretName, + String miiImage, + String domainUid, + String namespace, + String domainHomeSource, + int replicaCount) { + // create the domain CR + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(namespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType(domainHomeSource) + .image(miiImage) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(namespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)))) + .addClustersItem(new Cluster() + .clusterName(clusterName) + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .model(new Model() + .domainType("WLS") + .runtimeEncryptionSecret(encryptionSecretName)) + .introspectorJobActiveDeadlineSeconds(300L))); + + // create domain using model in image + logger.info("Create model in image domain {0} in namespace {1} using docker image {2}", + domainUid, namespace, miiImage); + createDomainAndVerify(domain, namespace); + } + + /** + * Verify the monitoring exporter app can be accessed from all managed servers in the domain through NGINX. + */ + private void verifyMonExpAppAccessThroughNginx(String nginxHost, int replicaCount) { + + List managedServerNames = new ArrayList<>(); + for (int i = 1; i <= replicaCount; i++) { + managedServerNames.add(MANAGED_SERVER_NAME_BASE + i); + } + + // check that NGINX can access the sample apps from all managed servers in the domain + String curlCmd = + String.format("curl --silent --show-error --noproxy '*' -H 'host: %s' http://%s:%s@%s:%s/wls-exporter/metrics", + nginxHost, + ADMIN_USERNAME_DEFAULT, + ADMIN_PASSWORD_DEFAULT, + K8S_NODEPORT_HOST, + nodeportshttp); + assertThat(callWebAppAndCheckForServerNameInResponse(curlCmd, managedServerNames, 50)) + .as("Verify NGINX can access the monitoring exporter metrics from all managed servers in the domain") + .withFailMessage("NGINX can not access the monitoring exporter metrics from one or more of the managed servers") + .isTrue(); + } + + /** + * Check metrics using Prometheus. + * + * @param searchKey - metric query expression + * @param expectedVal - expected metrics to search + * @throws Exception if command to check metrics fails + */ + private static void checkMetricsViaPrometheus(String searchKey, String expectedVal) + throws Exception { + + // url + String curlCmd = + String.format("curl --silent --show-error --noproxy '*' http://%s:%s/api/v1/query?query=%s", + K8S_NODEPORT_HOST, nodeportserver, searchKey); + + logger.info("Executing Curl cmd {0}", curlCmd); + logger.info("Checking searchKey: {0}", searchKey); + logger.info(" expected Value {0} ", expectedVal); + + + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Check prometheus metric {0} against expected {1} " + + "(elapsed time {2}ms, remaining time {3}ms)", + searchKey, + expectedVal, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(searchForKey(curlCmd, expectedVal)); + } + + /** + * Check output of the command against expected output. + * + * @param cmd command + * @param searchKey expected response from the command + * @return true if the command succeeds + */ + public static boolean execCommandCheckResponse(String cmd, String searchKey) { + CommandParams params = Command + .defaultCommandParams() + .command(cmd) + .saveResults(true) + .redirect(false) + .verbose(true); + return Command.withParams(params).executeAndVerify(searchKey); + } + + /** + * Check if executed command contains expected output. + * + * @param cmd command to execute + * @param searchKey expected output + * @return true if the output matches searchKey otherwise false + */ + private static Callable searchForKey(String cmd, String searchKey) { + return () -> execCommandCheckResponse(cmd, searchKey); + } + + /** + * Check if executed command contains expected output. + * + * @param pod V1Pod object + * @param searchKey expected string in the log + * @return true if the output matches searchKey otherwise false + */ + private static Callable searchPodLogForKey(V1Pod pod, String searchKey) { + return () -> Kubernetes.getPodLog(pod.getMetadata().getName(), + pod.getMetadata().getNamespace()).contains(searchKey); + } + + /* + ** uninstall Prometheus and Grafana helm charts + */ + private void uninstallPrometheusGrafana() { + if (promHelmParams != null) { + Prometheus.uninstall(promHelmParams); + promHelmParams = null; + prometheusDomainRegexValue = null; + logger.info("Prometheus is uninstalled"); + } + if (grafanaHelmParams != null) { + Grafana.uninstall(grafanaHelmParams); + deleteSecret("grafana-secret",monitoringNS); + grafanaHelmParams = null; + logger.info("Grafana is uninstalled"); + } + } + + private void changeConfigNegative(String effect, String configFile, String expectedErrorMsg) + throws Exception { + final WebClient webClient = new WebClient(); + //webClient.addRequestHeader("Host", ingressHost1List.get(0)); + HtmlPage originalPage = webClient.getPage(exporterUrl); + assertNotNull(originalPage); + HtmlPage page = submitConfigureForm(exporterUrl, effect, configFile); + assertTrue((page.asText()).contains(expectedErrorMsg)); + assertTrue(!(page.asText()).contains("Error 500--Internal Server Error")); + } + + private void changeConfigNegativeAuth( + String effect, String configFile, String expectedErrorMsg, String username, String password) + throws Exception { + try { + final WebClient webClient = new WebClient(); + setCredentials(webClient, username, password); + HtmlPage page = submitConfigureForm(exporterUrl, effect, configFile, webClient); + throw new RuntimeException("Expected exception was not thrown "); + } catch (FailingHttpStatusCodeException ex) { + assertTrue((ex.getMessage()).contains(expectedErrorMsg)); + } + } + + private HtmlPage submitConfigureForm(String exporterUrl, String effect, String configFile) + throws Exception { + final WebClient webClient = new WebClient(); + webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); + setCredentials(webClient); + return submitConfigureForm(exporterUrl, effect, configFile, webClient); + } + + private HtmlPage submitConfigureForm( + String exporterUrl, String effect, String configFile, WebClient webClient) throws Exception { + // Get the first page + HtmlPage page1 = webClient.getPage(exporterUrl); + if (page1 == null) { + //try again + page1 = webClient.getPage(exporterUrl); + } + assertNotNull(page1, "can't retrieve exporter dashboard page"); + assertTrue((page1.asText()).contains("This is the WebLogic Monitoring Exporter.")); + + // Get the form that we are dealing with and within that form, + // find the submit button and the field that we want to change.Generated form for cluster had + // extra path for wls-exporter + HtmlForm form = page1.getFirstByXPath("//form[@action='configure']"); + if (form == null) { + form = page1.getFirstByXPath("//form[@action='/wls-exporter/configure']"); + } + assertNotNull(form, "can't retrieve configure form"); + List radioButtons = form.getRadioButtonsByName("effect"); + assertNotNull(radioButtons, "can't retrieve buttons with effect"); + for (HtmlRadioButtonInput radioButton : radioButtons) { + if (radioButton.getValueAttribute().equalsIgnoreCase(effect)) { + radioButton.setChecked(true); + } + } + + HtmlSubmitInput button = + page1.getFirstByXPath("//form//input[@type='submit']"); + assertNotNull(button, "can't retrieve submit button"); + final HtmlFileInput fileField = form.getInputByName("configuration"); + assertNotNull(fileField); + + // Change the value of the text field + fileField.setValueAttribute(configFile); + fileField.setContentType("multipart/form-data"); + + // Now submit the form by clicking the button and get back the second page. + HtmlPage page2 = button.click(); + assertNotNull(page2, "can't reach page after submit"); + assertFalse((page2.asText()).contains("Error 500--Internal Server Error"), + "page returns Error 500--Internal Server Error"); + // wait time to update configuration + Thread.sleep(15 * 1000); + return page2; + } + + private static void setCredentials(WebClient webClient) { + String base64encodedUsernameAndPassword = + base64Encode(String.format("%s:%s", + ADMIN_USERNAME_DEFAULT, + ADMIN_PASSWORD_DEFAULT)); + webClient.addRequestHeader("Authorization", "Basic " + base64encodedUsernameAndPassword); + } + + private static void setCredentials(WebClient webClient, String username, String password) { + String base64encodedUsernameAndPassword = base64Encode(username + ":" + password); + webClient.addRequestHeader("Authorization", "Basic " + base64encodedUsernameAndPassword); + } + + private static String base64Encode(String stringToEncode) { + Base64.Encoder enc = Base64.getEncoder(); + return enc.encodeToString(stringToEncode.getBytes()); + } + + /** + * Replace monitoring exporter configuration and verify it was applied to both managed servers. + * + * @throws Exception if test fails + */ + private void replaceConfiguration() throws Exception { + HtmlPage page = submitConfigureForm(exporterUrl, "replace", RESOURCE_DIR + "/exporter/rest_jvm.yaml"); + assertNotNull(page, "Failed to replace configuration"); + assertTrue(page.asText().contains("JVMRuntime"), + "Page does not contain expected JVMRuntime configuration"); + assertFalse(page.asText().contains("WebAppComponentRuntime"), + "Page contains unexpected WebAppComponentRuntime configuration"); + Thread.sleep(20 * 1000); + // "heap_free_current{name="managed-server1"}[15s]" search for results for last 15secs + String prometheusSearchKey1 = + "heap_free_current%7Bname%3D%22managed-server1%22%7D%5B15s%5D"; + checkMetricsViaPrometheus(prometheusSearchKey1, "managed-server1"); + } + + /** + * Add additional monitoring exporter configuration and verify it was applied. + * + * @throws Exception if test fails + */ + private void appendConfiguration() throws Exception { + + // run append + HtmlPage page = submitConfigureForm(exporterUrl, "append", RESOURCE_DIR + "/exporter/rest_webapp.yaml"); + assertTrue(page.asText().contains("WebAppComponentRuntime"), + "Page does not contain expected WebAppComponentRuntime configuration"); + // check previous config is there + assertTrue(page.asText().contains("JVMRuntime"), "Page does not contain expected JVMRuntime configuration"); + + String sessionAppPrometheusSearchKey = + "wls_servlet_invocation_total_count%7Bapp%3D%22myear%22%7D%5B15s%5D"; + checkMetricsViaPrometheus(sessionAppPrometheusSearchKey, "sessmigr"); + } + + /** + * Replace monitoring exporter configuration with only one attribute and verify it was applied. + * + * @throws Exception if test fails + */ + private void replaceOneAttributeValueAsArrayConfiguration() throws Exception { + HtmlPage page = + submitConfigureForm(exporterUrl, "replace", RESOURCE_DIR + "/exporter/rest_oneattribval.yaml"); + assertTrue(page.asText().contains("values: invocationTotalCount")); + assertFalse(page.asText().contains("reloadTotal")); + } + + /** + * Append monitoring exporter configuration with one more attribute and verify it was applied + * append to [a] new config [a,b]. + * + * @throws Exception if test fails + */ + private void appendArrayWithOneExistedAndOneDifferentAttributeValueAsArrayConfiguration() + throws Exception { + HtmlPage page = + submitConfigureForm(exporterUrl, "replace", RESOURCE_DIR + "/exporter/rest_oneattribval.yaml"); + assertTrue(page.asText().contains("values: invocationTotalCount")); + page = submitConfigureForm(exporterUrl, "append", RESOURCE_DIR + "/exporter/rest_twoattribs.yaml"); + assertTrue(page.asText().contains("values: [invocationTotalCount, executionTimeAverage]")); + } + + /** + * Replace monitoring exporter configuration with empty configuration. + * + * @throws Exception if test fails + */ + private void replaceWithEmptyConfiguration() throws Exception { + HtmlPage page = submitConfigureForm(exporterUrl, "replace", RESOURCE_DIR + "/exporter/rest_empty.yaml"); + assertTrue(page.asText().contains("queries:") && !page.asText().contains("values")); + } + + /** + * Try to append monitoring exporter configuration with empty configuration. + * + * @throws Exception if failed to apply configuration or check the expected values. + */ + private void appendWithEmptyConfiguration() throws Exception { + final WebClient webClient = new WebClient(); + HtmlPage originalPage = webClient.getPage(exporterUrl); + assertNotNull(originalPage); + HtmlPage page = submitConfigureForm(exporterUrl, "append", RESOURCE_DIR + "/exporter/rest_empty.yaml"); + assertTrue(originalPage.asText().equals(page.asText())); + } + + /** + * Try to append monitoring exporter configuration with configuration file not in the yaml format. + * + * @throws Exception if test fails + */ + private void appendWithNotYamlConfiguration() throws Exception { + changeConfigNegative( + "append", RESOURCE_DIR + "/exporter/rest_notyamlformat.yaml", "Configuration is not in YAML format"); + } + + /** + * Try to replace monitoring exporter configuration with configuration file not in the yaml + * format. + * + * @throws Exception if failed to apply configuration or check the expected values. + */ + private void replaceWithNotYamlConfiguration() throws Exception { + changeConfigNegative( + "replace", RESOURCE_DIR + "/exporter/rest_notyamlformat.yaml", "Configuration is not in YAML format"); + } + + /** + * Try to append monitoring exporter configuration with configuration file in the corrupted yaml + * format. + * + * @throws Exception if test fails + */ + private void appendWithCorruptedYamlConfiguration() throws Exception { + changeConfigNegative( + "append", + RESOURCE_DIR + "/exporter/rest_notyaml.yaml", + "Configuration YAML format has errors while scanning a simple key"); + } + + /** + * Try to replace monitoring exporter configuration with configuration file in the corrupted yaml + * format. + * + * @throws Exception if failed to apply configuration or check the expected values. + */ + private void replaceWithCorruptedYamlConfiguration() throws Exception { + changeConfigNegative( + "replace", + RESOURCE_DIR + "/exporter/rest_notyaml.yaml", + "Configuration YAML format has errors while scanning a simple key"); + } + + /** + * Try to replace monitoring exporter configuration with configuration file with dublicated + * values. + * + * @throws Exception if test fails + */ + private void replaceWithDublicatedValuesConfiguration() throws Exception { + changeConfigNegative( + "replace", + RESOURCE_DIR + "/exporter/rest_dublicatedval.yaml", + "Duplicate values for [deploymentState] at applicationRuntimes.componentRuntimes"); + } + + /** + * Try to append monitoring exporter configuration with configuration file with duplicated values. + * + * @throws Exception if test fails + */ + private void appendWithDuplicatedValuesConfiguration() throws Exception { + changeConfigNegative( + "append", + RESOURCE_DIR + "/exporter/rest_dublicatedval.yaml", + "Duplicate values for [deploymentState] at applicationRuntimes.componentRuntimes"); + } + + /** + * Try to replace monitoring exporter configuration with configuration file with + * NameSnakeCase=false. + * + * @throws Exception if failed to apply configuration or check the expected values. + */ + private void replaceMetricsNameSnakeCaseFalseConfiguration() throws Exception { + HtmlPage page = + submitConfigureForm(exporterUrl, "replace", RESOURCE_DIR + "/exporter/rest_snakecasefalse.yaml"); + assertNotNull(page); + assertFalse(page.asText().contains("metricsNameSnakeCase")); + String searchKey = "wls_servlet_executionTimeAverage%7Bapp%3D%22myear%22%7D%5B15s%5D"; + checkMetricsViaPrometheus(searchKey, "sessmigr"); + } + + /** + * Test to replace monitoring exporter configuration with configuration file with + * domainQualifier=true. + * + * @throws Exception if failed to apply configuration or check the expected values. + */ + private void replaceMetricsDomainQualifierTrueConfiguration() throws Exception { + HtmlPage page = + submitConfigureForm(exporterUrl, "replace", RESOURCE_DIR + "/exporter/rest_domainqualtrue.yaml"); + assertNotNull(page); + logger.info("page - " + page.asText()); + assertTrue(page.asText().contains("domainQualifier")); + + String searchKey = "wls_servlet_executionTimeAverage%7Bapp%3D%22myear%22%7D%5B15s%5D"; + checkMetricsViaPrometheus(searchKey, "\"domain\":\"wls-" + domain1Uid + "\""); + } + + /** + * Test to change monitoring exporter configuration without authentication. + * + * @throws Exception if failed to apply configuration or check the expected values. + */ + // verify that change configuration fails without authentication + private void changeConfigNoCredentials() throws Exception { + WebClient webClient = new WebClient(); + String expectedErrorMsg = "401 Unauthorized for " + exporterUrl; + try { + HtmlPage page = + submitConfigureForm( + exporterUrl, "append", RESOURCE_DIR + "/exporter/rest_snakecasetrue.yaml", webClient); + throw new RuntimeException("Form was submitted successfully with no credentials"); + } catch (FailingHttpStatusCodeException ex) { + assertTrue((ex.getMessage()).contains(expectedErrorMsg)); + } + } + + /** + * Try to change monitoring exporter configuration with invalid username. + * + * @throws Exception if the expected exception message does not match + */ + private void changeConfigInvalidUser() throws Exception { + changeConfigNegativeAuth( + "replace", + RESOURCE_DIR + "/exporter/rest_snakecasetrue.yaml", + "401 Unauthorized for " + exporterUrl, + "invaliduser", + ADMIN_PASSWORD_DEFAULT); + } + + /** + * Try to change monitoring exporter configuration with invalid password. + * + * @throws Exception if the expected exception message does not match + */ + private void changeConfigInvalidPass() throws Exception { + changeConfigNegativeAuth( + "replace", + RESOURCE_DIR + "/exporter/rest_snakecasetrue.yaml", + "401 Unauthorized for " + exporterUrl, + ADMIN_USERNAME_DEFAULT, + "invalidpass"); + } + + /** + * Try to change monitoring exporter configuration with empty username. + * + * @throws Exception if the expected exception message does not match + */ + private void changeConfigEmptyUser() throws Exception { + changeConfigNegativeAuth( + "replace", + RESOURCE_DIR + "/exporter/rest_snakecasetrue.yaml", + "401 Unauthorized for " + exporterUrl, + "", + ADMIN_PASSWORD_DEFAULT); + } + + /** + * Try to change monitoring exporter configuration with empty pass. + * + * @throws Exception if the expected exception message does not match + */ + private void changeConfigEmptyPass() throws Exception { + changeConfigNegativeAuth( + "replace", + RESOURCE_DIR + "/exporter/rest_snakecasetrue.yaml", + "401 Unauthorized for " + exporterUrl, + ADMIN_USERNAME_DEFAULT, + ""); + } +} \ No newline at end of file diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItOperatorRestartWhenPodRoll.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItOperatorRestartWhenPodRoll.java new file mode 100644 index 00000000000..b2c2c44695f --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItOperatorRestartWhenPodRoll.java @@ -0,0 +1,247 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.annotations.tags.MustNotRunInParallel; +import oracle.weblogic.kubernetes.annotations.tags.Slow; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.CommonPatchTestUtils; +import org.awaitility.core.ConditionFactory; +import org.joda.time.DateTime; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_PATCH; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_PATCH; +import static oracle.weblogic.kubernetes.TestConstants.MANAGED_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.actions.TestActions.deletePod; +import static oracle.weblogic.kubernetes.actions.TestActions.getOperatorPodName; +import static oracle.weblogic.kubernetes.actions.TestActions.getPodCreationTimestamp; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.isOperatorPodRestarted; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.verifyRollingRestartOccurred; +import static oracle.weblogic.kubernetes.utils.CommonMiiTestUtils.createMiiDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonPatchTestUtils.checkPodRestartVersionUpdated; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.verifyCredentials; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +// Test to restart the operator when the server pods roll after changing the WebLogic credentials secret of a +// domain custom resource that uses model-in-image. +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@DisplayName("Test to patch the model-in-image image to change WebLogic admin credentials secret") +@IntegrationTest +public class ItOperatorRestartWhenPodRoll { + private static String opNamespace = null; + private static String domainNamespace = null; + private static String domainUid = "domain1"; + private static ConditionFactory withStandardRetryPolicy = null; + + private static String adminServerPodName = String.format("%s-%s", domainUid, ADMIN_SERVER_NAME_BASE); + private static String managedServerPrefix = String.format("%s-%s", domainUid, MANAGED_SERVER_NAME_BASE); + private static int replicaCount = 2; + private static LoggingFacade logger = null; + + /** + * Perform initialization for all the tests in this class. + * Set up the necessary namespaces, install the operator in the first namespace, and + * create a domain in the second namespace using the pre-created basic MII image. + * + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + * JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void initAll(@Namespaces(2) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(6, MINUTES).await(); + + // get namespaces + assertNotNull(namespaces.get(0), String.format("Namespace namespaces.get(0) is null")); + opNamespace = namespaces.get(0); + + assertNotNull(namespaces.get(1), String.format("Namespace namespaces.get(1) is null")); + domainNamespace = namespaces.get(1); + + // install the operator + logger.info("Install an operator in namespace {0}, managing namespace {1}", + opNamespace, domainNamespace); + installAndVerifyOperator(opNamespace, domainNamespace); + + // create a domain resource + logger.info("Create model-in-image domain {0} in namespace {1}, and wait until it comes up", + domainUid, domainNamespace); + createMiiDomainAndVerify( + domainNamespace, + domainUid, + MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG, + adminServerPodName, + managedServerPrefix, + replicaCount); + } + + /** + * Test patching a running model-in-image domain with a new WebLogic credentials secret. + * Perform two patching operations to the domain spec. First, change the webLogicCredentialsSecret to + * a new secret, and then change the domainRestartVersion to trigger a rolling restart of the server pods. + * While the rolling is on-going, restart the operator pod. + * Verify that after the operator is restarted, the domain spec's webLogicCredentialsSecret and, + * restartVersion are updated, and the server pods are recreated, the server pods' weblogic.domainRestartVersion + * label is updated, and the new credentials are valid and can be used to access WebLogic RESTful + * Management Services. + */ + @Test + @DisplayName("Restart operator when the domain is rolling after the admin credentials are changed") + @Slow + @MustNotRunInParallel + public void testOperatorRestartWhenPodRoll() { + final boolean VALID = true; + final boolean INVALID = false; + + LinkedHashMap pods = new LinkedHashMap<>(); + + // get the creation time of the admin server pod before patching + DateTime adminPodCreationTime = + assertDoesNotThrow(() -> getPodCreationTimestamp(domainNamespace, "", adminServerPodName), + String.format("Failed to get creationTimestamp for pod %s", adminServerPodName)); + assertNotNull(adminPodCreationTime, "creationTimestamp of the admin server pod is null"); + + logger.info("Domain {0} in namespace {1}, admin server pod {2} creationTimestamp before patching is {3}", + domainUid, + domainNamespace, + adminServerPodName, + adminPodCreationTime); + + pods.put(adminServerPodName, adminPodCreationTime); + + List msLastCreationTime = new ArrayList(); + // get the creation time of the managed server pods before patching + assertDoesNotThrow( + () -> { + for (int i = 1; i <= replicaCount; i++) { + String managedServerPodName = managedServerPrefix + i; + DateTime creationTime = getPodCreationTimestamp(domainNamespace, "", managedServerPodName); + msLastCreationTime.add(creationTime); + pods.put(managedServerPodName, creationTime); + + logger.info("Domain {0} in namespace {1}, server pod {2} creationTimestamp before patching is {3}", + domainUid, + domainNamespace, + managedServerPodName, + creationTime); + } + }, + String.format("Failed to get creationTimestamp for managed server pods")); + + logger.info("Check that before patching current credentials are valid and new credentials are not"); + verifyCredentials(adminServerPodName, domainNamespace, ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT, VALID); + verifyCredentials(adminServerPodName, domainNamespace, ADMIN_USERNAME_PATCH, ADMIN_PASSWORD_PATCH, INVALID); + + // create a new secret for admin credentials + logger.info("Create a new secret that contains new WebLogic admin credentials"); + String adminSecretName = "weblogic-credentials-new"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + adminSecretName, + domainNamespace, + ADMIN_USERNAME_PATCH, + ADMIN_PASSWORD_PATCH), + String.format("createSecret failed for %s", adminSecretName)); + + // patch the domain resource with the new secret and verify that the domain resource is patched. + logger.info("Patch domain {0} in namespace {1} with the secret {2}, and verify the result", + domainUid, domainNamespace, adminSecretName); + + String restartVersion = CommonPatchTestUtils.patchDomainWithNewSecretAndVerify( + domainUid, + domainNamespace, + adminServerPodName, + managedServerPrefix, + replicaCount, + adminSecretName); + + logger.info("Delete the operator pod in namespace {0} and wait for it to be restarted", opNamespace); + restartOperatorAndVerify(); + + logger.info("Wait for domain {0} admin server pod {1} in namespace {2} to be restarted", + domainUid, adminServerPodName, domainNamespace); + + assertTrue(assertDoesNotThrow( + () -> (verifyRollingRestartOccurred(pods, 1, domainNamespace)), + "More than one pod was restarted at same time"), + "Rolling restart failed"); + + for (int i = 1; i <= replicaCount; i++) { + final String podName = managedServerPrefix + i; + final DateTime lastCreationTime = msLastCreationTime.get(i - 1); + // check that the managed server pod's label has been updated with the new restartVersion + checkPodRestartVersionUpdated(podName, domainUid, domainNamespace, restartVersion); + } + + // check if the new credentials are valid and the old credentials are not valid any more + logger.info("Check that after patching current credentials are not valid and new credentials are"); + verifyCredentials(adminServerPodName, domainNamespace, ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT, INVALID); + verifyCredentials(adminServerPodName, domainNamespace, ADMIN_USERNAME_PATCH, ADMIN_PASSWORD_PATCH, VALID); + + logger.info("Domain {0} in namespace {1} is fully started after changing WebLogic credentials secret", + domainUid, domainNamespace); + } + + private void restartOperatorAndVerify() { + String opPodName = + assertDoesNotThrow(() -> getOperatorPodName(TestConstants.OPERATOR_RELEASE_NAME, opNamespace), + "Failed to get the name of the operator pod"); + + // get the creation time of the admin server pod before patching + DateTime opPodCreationTime = + assertDoesNotThrow(() -> getPodCreationTimestamp(opNamespace, "", opPodName), + String.format("Failed to get creationTimestamp for pod %s", opPodName)); + assertNotNull(opPodCreationTime, "creationTimestamp of the operator pod is null"); + + assertDoesNotThrow( + () -> deletePod(opPodName, opNamespace), + "Got exception in deleting the Operator pod"); + + // wait for the operator to be ready + logger.info("Wait for the operator pod is ready in namespace {0}", opNamespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for operator to be running in namespace {0} " + + "(elapsed time {1}ms, remaining time {2}ms)", + opNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> isOperatorPodRestarted(opNamespace, opPodCreationTime), + "Failed to check if the operator is restarted with ApiException")); + + String opPodNameNew = + assertDoesNotThrow(() -> getOperatorPodName(TestConstants.OPERATOR_RELEASE_NAME, opNamespace), + "Failed to get the name of the operator pod"); + + assertFalse(opPodNameNew.equals(opPodName), + "The operator names before and after a restart should be different"); + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItOperatorTwoDomains.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItOperatorTwoDomains.java index 439b0d34f70..998d22394b5 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItOperatorTwoDomains.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItOperatorTwoDomains.java @@ -43,7 +43,7 @@ import oracle.weblogic.domain.ServerPod; import oracle.weblogic.kubernetes.annotations.IntegrationTest; import oracle.weblogic.kubernetes.annotations.Namespaces; -import oracle.weblogic.kubernetes.extensions.LoggedTest; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import org.joda.time.DateTime; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; @@ -67,8 +67,8 @@ import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_NAME; import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_TAG; import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; -import static oracle.weblogic.kubernetes.actions.TestActions.restartDomain; import static oracle.weblogic.kubernetes.actions.TestActions.shutdownDomain; +import static oracle.weblogic.kubernetes.actions.TestActions.startDomain; import static oracle.weblogic.kubernetes.assertions.TestAssertions.adminNodePortAccessible; import static oracle.weblogic.kubernetes.assertions.TestAssertions.podStateNotChanged; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodDoesNotExist; @@ -85,6 +85,7 @@ import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.scaleAndVerifyCluster; import static oracle.weblogic.kubernetes.utils.TestUtils.getNextFreePort; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.apache.commons.io.FileUtils.deleteDirectory; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -96,7 +97,7 @@ */ @DisplayName("Verify operator manages multiple domains") @IntegrationTest -public class ItOperatorTwoDomains implements LoggedTest { +public class ItOperatorTwoDomains { private static final int numberOfDomains = 2; private static final int numberOfOperators = 2; @@ -121,6 +122,7 @@ public class ItOperatorTwoDomains implements LoggedTest { private List domainAdminPodOriginalTimestamps = new ArrayList<>(); private List domain1ManagedServerPodOriginalTimestampList = new ArrayList<>(); private List domain2ManagedServerPodOriginalTimestampList = new ArrayList<>(); + private static LoggingFacade logger = null; /** * Get namespaces, install operator and initiate domain UID list. @@ -129,7 +131,7 @@ public class ItOperatorTwoDomains implements LoggedTest { */ @BeforeAll public static void initAll(@Namespaces(4) List namespaces) { - + logger = getLogger(); // get unique operator namespaces logger.info("Get unique namespaces for operator1 and operator2"); for (int i = 0; i < numberOfOperators; i++) { @@ -217,7 +219,7 @@ private void createTwoDomainsOnPVUsingWlstAndVerify() { String domainUid = domainUids.get(i); String domainNamespace = domainNamespaces.get(i); - String pvName = domainUid + "-pv"; + String pvName = domainUid + "-pv-" + domainNamespace; String pvcName = domainUid + "-pvc"; // create WebLogic credentials secret @@ -245,7 +247,6 @@ private void createTwoDomainsOnPVUsingWlstAndVerify() { .metadata(new V1ObjectMetaBuilder() .withName(pvName) .build() - .putLabelsItem("weblogic.resourceVersion", "domain-v2") .putLabelsItem("weblogic.domainUid", domainUid)); V1PersistentVolumeClaim v1pvc = new V1PersistentVolumeClaim() @@ -259,7 +260,6 @@ private void createTwoDomainsOnPVUsingWlstAndVerify() { .withName(pvcName) .withNamespace(domainNamespace) .build() - .putLabelsItem("weblogic.resourceVersion", "domain-v2") .putLabelsItem("weblogic.domainUid", domainUid)); String labelSelector = String.format("weblogic.domainUid in (%s)", domainUid); @@ -279,7 +279,7 @@ private void createTwoDomainsOnPVUsingWlstAndVerify() { .spec(new DomainSpec() .domainUid(domainUid) .domainHome("/shared/domains/" + domainUid) - .domainHomeInImage(false) + .domainHomeSourceType("PersistentVolume") .image(image) .imagePullSecrets(isUseSecret ? Arrays.asList( new V1LocalObjectReference() @@ -528,19 +528,19 @@ private void restartDomain1AndVerifyNoImpactOnDomain2() { verifyDomain2NotChanged(); // restart domain1 - logger.info("Restarting domain1"); - assertTrue(restartDomain(domain1Uid, domain1Namespace), - String.format("restart domain %s in namespace %s failed", domain1Uid, domain1Namespace)); + logger.info("Starting domain1"); + assertTrue(startDomain(domain1Uid, domain1Namespace), + String.format("start domain %s in namespace %s failed", domain1Uid, domain1Namespace)); // verify domain1 is restarted // check domain1 admin server pod is ready, also check admin service exists in the domain1 namespace - logger.info("Checking admin server pod in domain1 was restarted"); + logger.info("Checking admin server pod in domain1 was started"); checkPodReadyAndServiceExists(domain1AdminServerPodName, domain1Uid, domain1Namespace); checkPodRestarted(domain1Uid, domain1Namespace, domain1AdminServerPodName, domainAdminPodOriginalTimestamps.get(0)); // check managed server pods in domain1 - logger.info("Checking managed server pods in domain1 were restarted"); + logger.info("Checking managed server pods in domain1 were started"); for (int i = 1; i <= replicasAfterScale; i++) { String domain1ManagedServerPodName = domain1Uid + "-" + MANAGED_SERVER_NAME_BASE + i; checkPodReadyAndServiceExists(domain1ManagedServerPodName, domain1Uid, domain1Namespace); @@ -549,7 +549,7 @@ private void restartDomain1AndVerifyNoImpactOnDomain2() { } // verify domain2 was not changed after domain1 was restarted - logger.info("Verifying that domain2 was not changed after domain1 was restarted"); + logger.info("Verifying that domain2 was not changed after domain1 was started"); verifyDomain2NotChanged(); } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItPodsRestart.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItPodsRestart.java index c73aeb6248c..bc17c7c841a 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItPodsRestart.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItPodsRestart.java @@ -18,12 +18,14 @@ import io.kubernetes.client.openapi.models.V1SecretReference; import oracle.weblogic.domain.AdminServer; import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; import oracle.weblogic.domain.Domain; import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; import oracle.weblogic.domain.ServerPod; import oracle.weblogic.kubernetes.annotations.IntegrationTest; import oracle.weblogic.kubernetes.annotations.Namespaces; -import oracle.weblogic.kubernetes.extensions.LoggedTest; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import org.joda.time.DateTime; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; @@ -32,9 +34,10 @@ import static oracle.weblogic.kubernetes.TestConstants.ADMIN_SERVER_NAME_BASE; import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; import static oracle.weblogic.kubernetes.TestConstants.MANAGED_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_TAG; import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; -import static oracle.weblogic.kubernetes.TestConstants.WDT_BASIC_IMAGE_NAME; -import static oracle.weblogic.kubernetes.TestConstants.WDT_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.WLS_DOMAIN_TYPE; import static oracle.weblogic.kubernetes.actions.TestActions.getDomainCustomResource; import static oracle.weblogic.kubernetes.actions.TestActions.getPodCreationTimestamp; import static oracle.weblogic.kubernetes.actions.TestActions.patchDomainCustomResource; @@ -47,6 +50,7 @@ import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.dockerLoginAndPushImageToRegistry; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; @@ -58,7 +62,7 @@ */ @DisplayName("Test pods are restarted after some properties in server pods are changed") @IntegrationTest -class ItPodsRestart implements LoggedTest { +class ItPodsRestart { private static String domainNamespace = null; @@ -68,6 +72,7 @@ class ItPodsRestart implements LoggedTest { private static final int replicaCount = 2; private static final String adminServerPodName = domainUid + "-" + ADMIN_SERVER_NAME_BASE; private static final String managedServerPrefix = domainUid + "-" + MANAGED_SERVER_NAME_BASE; + private static LoggingFacade logger = null; /** * Get namespaces for operator and WebLogic domain. @@ -77,7 +82,7 @@ class ItPodsRestart implements LoggedTest { */ @BeforeAll public static void initAll(@Namespaces(2) List namespaces) { - + logger = getLogger(); // get a unique operator namespace logger.info("Getting a unique namespace for operator"); assertNotNull(namespaces.get(0), "Namespace list is null"); @@ -225,10 +230,10 @@ public void testServerPodsRestartByChangingResource() { private static void createAndVerifyMiiDomain() { // get the pre-built image created by IntegrationTestWatcher - String wdtImage = WDT_BASIC_IMAGE_NAME + ":" + WDT_BASIC_IMAGE_TAG; + String miiImage = MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG; // docker login and push image to docker registry if necessary - dockerLoginAndPushImageToRegistry(wdtImage); + dockerLoginAndPushImageToRegistry(miiImage); // create docker registry secret to pull the image from registry logger.info("Creating docker registry secret in namespace {0}", domainNamespace); @@ -239,6 +244,11 @@ private static void createAndVerifyMiiDomain() { String adminSecretName = "weblogic-credentials"; createSecretWithUsernamePassword(adminSecretName, domainNamespace, "weblogic", "welcome1"); + // create encryption secret + logger.info("Creating encryption secret"); + String encryptionSecretName = "encryptionsecret"; + createSecretWithUsernamePassword(encryptionSecretName, domainNamespace, "weblogicenc", "weblogicenc"); + // create the domain CR Domain domain = new Domain() .apiVersion(DOMAIN_API_VERSION) @@ -248,8 +258,8 @@ private static void createAndVerifyMiiDomain() { .namespace(domainNamespace)) .spec(new DomainSpec() .domainUid(domainUid) - .domainHomeInImage(true) - .image(wdtImage) + .domainHomeSourceType("FromModel") + .image(miiImage) .addImagePullSecretsItem(new V1LocalObjectReference() .name(REPO_SECRET_NAME)) .webLogicCredentialsSecret(new V1SecretReference() @@ -272,11 +282,15 @@ private static void createAndVerifyMiiDomain() { .addClustersItem(new Cluster() .clusterName(clusterName) .replicas(replicaCount) - .serverStartState("RUNNING"))); + .serverStartState("RUNNING")) + .configuration(new Configuration() + .model(new Model() + .domainType(WLS_DOMAIN_TYPE) + .runtimeEncryptionSecret(encryptionSecretName)))); // create model in image domain - logger.info("Creating domain home in image domain {0} in namespace {1} using docker image {2}", - domainUid, domainNamespace, wdtImage); + logger.info("Creating model in image domain {0} in namespace {1} using docker image {2}", + domainUid, domainNamespace, miiImage); createDomainAndVerify(domain, domainNamespace); // check that admin server pod exists in the domain namespace diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItScaleMiiDomainNginx.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItScaleMiiDomainNginx.java new file mode 100644 index 00000000000..f1d92f7a534 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItScaleMiiDomainNginx.java @@ -0,0 +1,479 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1SecretReference; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.MANAGED_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_APP_NAME; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.WLS_DOMAIN_TYPE; +import static oracle.weblogic.kubernetes.actions.ActionConstants.MODEL_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLDF_CLUSTER_ROLE_BINDING_NAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLDF_CLUSTER_ROLE_NAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_NAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_TAG; +import static oracle.weblogic.kubernetes.actions.TestActions.deleteClusterRole; +import static oracle.weblogic.kubernetes.actions.TestActions.deleteClusterRoleBinding; +import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; +import static oracle.weblogic.kubernetes.actions.TestActions.uninstallNginx; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.clusterRoleBindingExists; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.clusterRoleExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createIngressForDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createMiiImageAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.dockerLoginAndPushImageToRegistry; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyNginx; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.scaleAndVerifyCluster; +import static oracle.weblogic.kubernetes.utils.TestUtils.getNextFreePort; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Verify the model in image domain with multiple clusters can be scaled up and down. + * Also verify the sample application can be accessed via NGINX ingress controller. + */ +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@DisplayName("Verify scaling multiple clusters domain and the sample application can be accessed via NGINX") +@IntegrationTest +class ItScaleMiiDomainNginx { + + // mii constants + private static final String WDT_MODEL_FILE = "model-multiclusterdomain-sampleapp-wls.yaml"; + private static final String MII_IMAGE_NAME = "mii-image"; + + // domain constants + private static final String domainUid = "domain1"; + private static final int NUMBER_OF_CLUSTERS = 2; + private static final String CLUSTER_NAME_PREFIX = "cluster-"; + private static final int MANAGED_SERVER_PORT = 8001; + private static final int replicaCount = 2; + private static final String SAMPLE_APP_CONTEXT_ROOT = "sample-war"; + private static final String WLDF_OPENSESSION_APP = "opensessionapp"; + private static final String WLDF_OPENSESSION_APP_CONTEXT_ROOT = "opensession"; + private static final String DOMAIN_HOME = "/u01/domains/domain1"; + + private static String opNamespace = null; + private static String domainNamespace = null; + private static String opServiceAccount = null; + private static HelmParams nginxHelmParams = null; + private static int nodeportshttp = 0; + private static int externalRestHttpsPort = 0; + private static LoggingFacade logger = null; + private String curlCmd = null; + + /** + * Install operator and NGINX. Create model in image domain with multiple clusters. + * Create ingress for the domain. + * + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + * JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void initAll(@Namespaces(3) List namespaces) { + logger = getLogger(); + // get a unique operator namespace + logger.info("Get a unique namespace for operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + opNamespace = namespaces.get(0); + + // get a unique domain namespace + logger.info("Get a unique namespace for WebLogic domain"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domainNamespace = namespaces.get(1); + + // get a unique NGINX namespace + logger.info("Get a unique namespace for NGINX"); + assertNotNull(namespaces.get(2), "Namespace list is null"); + String nginxNamespace = namespaces.get(2); + + // set the service account name for the operator + opServiceAccount = opNamespace + "-sa"; + + // get a free port for external REST HTTPS port + externalRestHttpsPort = getNextFreePort(31001, 31201); + + // install and verify operator with REST API + installAndVerifyOperator(opNamespace, opServiceAccount, true, externalRestHttpsPort, domainNamespace); + + // install and verify NGINX + nginxHelmParams = installAndVerifyNginx(nginxNamespace, 0, 0); + + String nginxServiceName = nginxHelmParams.getReleaseName() + "-nginx-ingress-controller"; + logger.info("NGINX service name: {0}", nginxServiceName); + nodeportshttp = getServiceNodePort(nginxNamespace, nginxServiceName, "http"); + logger.info("NGINX http node port: {0}", nodeportshttp); + + // create model in image domain with multiple clusters + createMiiDomainWithMultiClusters(); + + // create ingress using host based routing + Map clusterNameMsPortMap = new HashMap<>(); + for (int i = 1; i <= NUMBER_OF_CLUSTERS; i++) { + clusterNameMsPortMap.put(CLUSTER_NAME_PREFIX + i, MANAGED_SERVER_PORT); + } + logger.info("Creating ingress for domain {0} in namespace {1}", domainUid, domainNamespace); + createIngressForDomainAndVerify(domainUid, domainNamespace, nodeportshttp, clusterNameMsPortMap); + } + + @Test + @DisplayName("Verify scale each cluster of the domain by patching domain resource") + public void testScaleClustersByPatchingDomainResource() { + + for (int i = 1; i <= NUMBER_OF_CLUSTERS; i++) { + + String clusterName = CLUSTER_NAME_PREFIX + i; + int numberOfServers; + // scale cluster-1 to 1 server and cluster-2 to 3 servers + if (i == 1) { + numberOfServers = 1; + } else { + numberOfServers = 3; + } + + logger.info("Scaling cluster {0} of domain {1} in namespace {2} to {3} servers.", + clusterName, domainUid, domainNamespace, numberOfServers); + curlCmd = generateCurlCmd(clusterName, SAMPLE_APP_CONTEXT_ROOT); + List managedServersBeforeScale = listManagedServersBeforeScale(clusterName, replicaCount); + scaleClusterAndVerifyByPatchingDomainResource(clusterName, replicaCount, numberOfServers, + managedServersBeforeScale); + + // then scale cluster-1 and cluster-2 to 2 servers + logger.info("Scaling cluster {0} of domain {1} in namespace {2} from {3} servers to {4} servers.", + clusterName, domainUid, domainNamespace, numberOfServers, replicaCount); + managedServersBeforeScale = listManagedServersBeforeScale(clusterName, numberOfServers); + scaleClusterAndVerifyByPatchingDomainResource(clusterName, numberOfServers, replicaCount, + managedServersBeforeScale); + } + } + + @Test + @DisplayName("Verify scale each cluster of the domain by calling REST API") + public void testScaleClustersWithRestApi() { + + String clusterName = "cluster-2"; + int numberOfServers = 3; + + logger.info("Scaling cluster {0} of domain {1} in namespace {2} from {3} servers to {4} servers.", + clusterName, domainUid, domainNamespace, replicaCount, numberOfServers); + curlCmd = generateCurlCmd(clusterName, SAMPLE_APP_CONTEXT_ROOT); + List managedServersBeforeScale = listManagedServersBeforeScale(clusterName, replicaCount); + scaleClusterAndVerifyWithRestApi(clusterName, replicaCount, numberOfServers, managedServersBeforeScale); + + // then scale cluster-1 and cluster-2 to 2 servers + logger.info("Scaling cluster {0} of domain {1} in namespace {2} from {3} servers to {4} servers.", + clusterName, domainUid, domainNamespace, numberOfServers, replicaCount); + managedServersBeforeScale = listManagedServersBeforeScale(clusterName, numberOfServers); + scaleClusterAndVerifyWithRestApi(clusterName, numberOfServers, replicaCount, managedServersBeforeScale); + } + + /** + * Scale each cluster in the domain using WLDF policy. + */ + @Test + @DisplayName("Verify scale each cluster of the domain using WLDF policy") + public void testScaleClustersWithWLDF() { + + String clusterName = "cluster-1"; + curlCmd = generateCurlCmd(clusterName, SAMPLE_APP_CONTEXT_ROOT); + + // scale up the cluster by 1 server + logger.info("Scaling cluster {0} of domain {1} in namespace {2} from {3} servers to {4} servers.", + clusterName, domainUid, domainNamespace, replicaCount, replicaCount + 1); + List managedServersBeforeScale = listManagedServersBeforeScale(clusterName, replicaCount); + scaleClusterAndVerifyWithWLDF(clusterName, replicaCount, replicaCount + 1, + managedServersBeforeScale, "scaleUp"); + + // scale down the cluster by 1 server + logger.info("Scaling cluster {0} of domain {1} in namespace {2} from {3} servers to {4} servers.", + clusterName, domainUid, domainNamespace, replicaCount + 1, replicaCount); + managedServersBeforeScale = listManagedServersBeforeScale(clusterName, replicaCount + 1); + scaleClusterAndVerifyWithWLDF(clusterName, replicaCount + 1, replicaCount, + managedServersBeforeScale, "scaleDown"); + + } + + /** + * TODO: remove this after Sankar's PR is merged + * The cleanup framework does not uninstall NGINX release. Do it here for now. + */ + @AfterAll + public void tearDownAll() { + + // uninstall NGINX release + if (nginxHelmParams != null) { + assertThat(uninstallNginx(nginxHelmParams)) + .as("Test uninstallNginx returns true") + .withFailMessage("uninstallNginx() did not return true") + .isTrue(); + } + + // delete cluster role binding created for WLDF policy + if (assertDoesNotThrow(() -> clusterRoleBindingExists(WLDF_CLUSTER_ROLE_BINDING_NAME))) { + assertTrue(deleteClusterRoleBinding(WLDF_CLUSTER_ROLE_BINDING_NAME)); + } + + // delete cluster role created for WLDF policy + if (assertDoesNotThrow(() -> clusterRoleExists(WLDF_CLUSTER_ROLE_NAME))) { + assertThat(assertDoesNotThrow(() -> deleteClusterRole(WLDF_CLUSTER_ROLE_NAME), + "deleteClusterRole failed with ApiException")) + .as("Test delete cluster role returns true") + .withFailMessage("deleteClusterRole() did not return true") + .isTrue(); + } + } + + /** + * Create model in image domain with multiple clusters. + */ + private static void createMiiDomainWithMultiClusters() { + + // admin/managed server name here should match with model yaml in WDT_MODEL_FILE + String adminServerPodName = domainUid + "-" + ADMIN_SERVER_NAME_BASE; + + // create image with model files + logger.info("Creating image with model file and verify"); + List appSrcDirList = new ArrayList<>(); + appSrcDirList.add(MII_BASIC_APP_NAME); + appSrcDirList.add(WLDF_OPENSESSION_APP); + String miiImage = + createMiiImageAndVerify(MII_IMAGE_NAME, Collections.singletonList(MODEL_DIR + "/" + WDT_MODEL_FILE), + appSrcDirList, WLS_BASE_IMAGE_NAME, WLS_BASE_IMAGE_TAG, WLS_DOMAIN_TYPE, false); + + // docker login and push image to docker registry if necessary + dockerLoginAndPushImageToRegistry(miiImage); + + // create docker registry secret to pull the image from registry + logger.info("Creating docker registry secret in namespace {0}", domainNamespace); + createDockerRegistrySecret(domainNamespace); + + // create secret for admin credentials + logger.info("Creating secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + createSecretWithUsernamePassword(adminSecretName, domainNamespace, "weblogic", "welcome1"); + + // create encryption secret + logger.info("Creating encryption secret"); + String encryptionSecretName = "encryptionsecret"; + createSecretWithUsernamePassword(encryptionSecretName, domainNamespace, "weblogicenc", "weblogicenc"); + + // construct the cluster list used for domain custom resource + List clusterList = new ArrayList<>(); + for (int i = NUMBER_OF_CLUSTERS; i >= 1; i--) { + clusterList.add(new Cluster() + .clusterName(CLUSTER_NAME_PREFIX + i) + .replicas(replicaCount) + .serverStartState("RUNNING")); + } + + // create the domain CR + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domainNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("FromModel") + .image(miiImage) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(REPO_SECRET_NAME)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domainNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)))) + .clusters(clusterList) + .configuration(new Configuration() + .model(new Model() + .domainType(WLS_DOMAIN_TYPE) + .runtimeEncryptionSecret(encryptionSecretName)))); + + // create model in image domain + logger.info("Creating model in image domain {0} in namespace {1} using docker image {2}", + domainUid, domainNamespace, miiImage); + createDomainAndVerify(domain, domainNamespace); + + // check admin server pod exists in domain namespace + logger.info("Checking that admin server pod {0} exists in namespace {1}", + adminServerPodName, domainNamespace); + checkPodExists(adminServerPodName, domainUid, domainNamespace); + + // check admin server pod is ready + logger.info("Checking that admin server pod {0} is ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check admin service exists in the domain namespace + logger.info("Checking that admin service {0} exists in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check the readiness for the managed servers in each cluster + for (int i = 1; i <= NUMBER_OF_CLUSTERS; i++) { + for (int j = 1; j <= replicaCount; j++) { + String managedServerPodName = + domainUid + "-" + CLUSTER_NAME_PREFIX + i + "-" + MANAGED_SERVER_NAME_BASE + j; + + // check managed server pod exists in the namespace + logger.info("Checking that managed server pod {0} exists in namespace {1}", + managedServerPodName, domainNamespace); + checkPodExists(managedServerPodName, domainUid, domainNamespace); + + // check managed server pod is ready + logger.info("Checking that managed server pod {0} is ready in namespace {1}", + managedServerPodName, domainNamespace); + checkPodReady(managedServerPodName, domainUid, domainNamespace); + + // check managed server service exists in the domain namespace + logger.info("Checking that managed server service {0} exists in namespace {1}", + managedServerPodName, domainNamespace); + checkServiceExists(managedServerPodName, domainNamespace); + } + } + } + + /** + * Generate the curl command to access the sample app from the ingress controller. + * + * @param clusterName WebLogic cluster name which is the backend of the ingress + * @param appContextRoot the context root of the application + * @return curl command string + */ + private String generateCurlCmd(String clusterName, String appContextRoot) { + + return String.format("curl --silent --show-error --noproxy '*' -H 'host: %s' http://%s:%s/%s/index.jsp", + domainUid + "." + domainNamespace + "." + clusterName + ".test", K8S_NODEPORT_HOST, nodeportshttp, + appContextRoot); + } + + /** + * Generate a server list which contains all managed servers in the cluster before scale. + * + * @param clusterName the name of the WebLogic cluster + * @param replicasBeforeScale the replicas of WebLogic cluster before scale + * @return list of managed servers in the cluster before scale + */ + private List listManagedServersBeforeScale(String clusterName, int replicasBeforeScale) { + List managedServerNames = new ArrayList<>(); + for (int i = 1; i <= replicasBeforeScale; i++) { + managedServerNames.add(clusterName + "-" + MANAGED_SERVER_NAME_BASE + i); + } + + return managedServerNames; + } + + /** + * Scale a cluster using REST API. + * + * @param clusterName cluster name to scale + * @param replicasBeforeScale number of servers in cluster before scaling + * @param replicasAfterScale number of servers in cluster after scaling + * @param managedServersBeforeScale list of managed servers in the cluster before scale + */ + private void scaleClusterAndVerifyWithRestApi(String clusterName, + int replicasBeforeScale, + int replicasAfterScale, + List managedServersBeforeScale) { + scaleAndVerifyCluster(clusterName, domainUid, domainNamespace, + domainUid + "-" + clusterName + "-" + MANAGED_SERVER_NAME_BASE, + replicasBeforeScale, replicasAfterScale, true, externalRestHttpsPort, opNamespace, opServiceAccount, + false, "", "", 0, "", "", curlCmd, managedServersBeforeScale); + } + + /** + * Scale a cluster using WLDF policy. + * + * @param clusterName cluster name to scale + * @param replicasBeforeScale number of servers in cluster before scaling + * @param replicasAfterScale number of servers in cluster after scaling + * @param managedServersBeforeScale list of managed servers in the cluster before scale + * @param scalingAction scale action, accepted value: scaleUp or scaleDown + */ + private void scaleClusterAndVerifyWithWLDF(String clusterName, + int replicasBeforeScale, + int replicasAfterScale, + List managedServersBeforeScale, + String scalingAction) { + String curlCmdForWLDFScript = generateCurlCmd(clusterName, WLDF_OPENSESSION_APP_CONTEXT_ROOT); + + scaleAndVerifyCluster(clusterName, domainUid, domainNamespace, + domainUid + "-" + clusterName + "-" + MANAGED_SERVER_NAME_BASE, + replicasBeforeScale, replicasAfterScale, false, 0, opNamespace, opServiceAccount, + true, DOMAIN_HOME, scalingAction, 1, + WLDF_OPENSESSION_APP, curlCmdForWLDFScript, curlCmd, managedServersBeforeScale); + } + + /** + * Scale a cluster by patching a domain resource. + * + * @param clusterName cluster name to scale + * @param replicasBeforeScale number of servers in cluster before scaling + * @param replicasAfterScale number of servers in cluster after scaling + * @param managedServersBeforeScale list of managed servers in the cluster before scale + */ + private void scaleClusterAndVerifyByPatchingDomainResource(String clusterName, + int replicasBeforeScale, + int replicasAfterScale, + List managedServersBeforeScale) { + scaleAndVerifyCluster(clusterName, domainUid, domainNamespace, + domainUid + "-" + clusterName + "-" + MANAGED_SERVER_NAME_BASE, + replicasBeforeScale, replicasAfterScale, curlCmd, managedServersBeforeScale); + } + +} \ No newline at end of file diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItSessionMigration.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItSessionMigration.java new file mode 100644 index 00000000000..5496cc5c51f --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItSessionMigration.java @@ -0,0 +1,465 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.google.common.primitives.Ints; +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1SecretReference; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.annotations.tags.MustNotRunInParallel; +import oracle.weblogic.kubernetes.annotations.tags.Slow; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.ExecResult; +import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.actions.TestActions.execCommand; +import static oracle.weblogic.kubernetes.actions.TestActions.shutdownManagedServerUsingServerStartPolicy; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodDoesNotExist; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createMiiImageAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.dockerLoginAndPushImageToRegistry; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +/** + * Verify that when the primary server is down, another server takes on its clients + * to become the new primary server and HTTP session state is migrated to the new primary server. + */ +@DisplayName("Test the HTTP session replication features of WebLogic") +@IntegrationTest +class ItSessionMigration { + + // constants for creating domain image using model in image + private static final String SESSMIGR_MODEL_FILE = "model.sessmigr.yaml"; + private static final String SESSMIGR_IMAGE_NAME = "mii-image"; + + // constants for web service + private static final String SESSMIGR_APP_NAME = "sessmigr-app"; + private static final String SESSMIGR_APP_WAR_NAME = "sessmigr-war"; + private static final int SESSION_STATE = 4; + private static Map httpAttrMap; + + // constants for operator and WebLogic domain + private static String domainUid = "sessmigr-domain-1"; + private static String clusterName = "cluster-1"; + private static String adminServerPodName = domainUid + "-admin-server"; + private static String managedServerPrefix = domainUid + "-managed-server"; + private static int managedServerPort = 8001; + private static int replicaCount = 2; + private static String opNamespace = null; + private static String domainNamespace = null; + private static ConditionFactory withStandardRetryPolicy = null; + private static LoggingFacade logger = null; + + /** + * Install operator, create a custom image using model in image with model files + * and create a one cluster domain. + * + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + * JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void init(@Namespaces(2) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + // get a unique operator namespace + logger.info("Get a unique namespace for operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + opNamespace = namespaces.get(0); + + // get a unique domain namespace + logger.info("Get a unique namespace for WebLogic domain"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domainNamespace = namespaces.get(1); + + // install and verify operator + installAndVerifyOperator(opNamespace, domainNamespace); + + // create and verify WebLogic domain image using model in image with model files + String imageName = createAndVerifyDomainImage(); + + // create and verify one cluster domain + logger.info("Create domain and verify that it's running"); + createAndVerifyDomain(imageName); + + // map to save HTTP response data + httpAttrMap = new HashMap(); + httpAttrMap.put("sessioncreatetime", "(.*)sessioncreatetime>(.*)(.*)(.*)(.*)(.*) httpDataInfo = + getServerAndSessionInfoAndVerify(serverName, webServiceSetUrl, " -D "); + // get server and session info from web service deployed on the cluster + String origPrimaryServerName = httpDataInfo.get(primaryServerAttr); + String origSecondaryServerName = httpDataInfo.get(secondaryServerAttr); + String origSessionCreateTime = httpDataInfo.get(sessionCreateTimeAttr); + logger.info("Got the primary server {0}, the secondary server {1} " + + "and session create time {2} before shutting down the primary server", + origPrimaryServerName, origSecondaryServerName, origSessionCreateTime); + + // stop the primary server by changing ServerStartPolicy to NEVER and patching domain + logger.info("Shut down the primary server {0}", origPrimaryServerName); + shutdownServerUsingServerStartPolicy(origPrimaryServerName); + + // send a HTTP request to get server and session info after shutting down the primary server + serverName = domainUid + "-" + origSecondaryServerName; + httpDataInfo = + getServerAndSessionInfoAndVerify(serverName, webServiceGetUrl, " -b "); + // get server and session info from web service deployed on the cluster + String primaryServerName = httpDataInfo.get(primaryServerAttr); + String sessionCreateTime = httpDataInfo.get(sessionCreateTimeAttr); + String countStr = httpDataInfo.get(countAttr); + int count = Optional.ofNullable(countStr).map(Ints::tryParse).orElse(0); + logger.info("After patching the domain, the primary server changes to {0} " + + ", session create time {1} and session state {2}", + primaryServerName, sessionCreateTime, countStr); + + // verify that a new primary server is picked and HTTP session state is migrated + assertAll("Check that WebLogic server and session vars is not null or empty", + () -> assertNotEquals(origPrimaryServerName, primaryServerName, + "After the primary server stopped, another server should become the new primary server"), + () -> assertEquals(origSessionCreateTime, sessionCreateTime, + "After the primary server stopped, HTTP session state should be migrated to the new primary server"), + () -> assertEquals(count, SESSION_STATE, + "After the primary server stopped, HTTP session state should be migrated to the new primary server") + ); + + logger.info("SUCCESS --- testSessionMigration \nThe new primary server is {0}, it was {1}. " + + "\nThe session state was set to {2}, it is migrated to the new primary server.", + primaryServerName, origPrimaryServerName, SESSION_STATE); + } + + /** + * An util method referred by the test method testSessionMigration. It sends a HTTP request + * to set or get http session state (count number) and return the primary server, + * the secondary server, session create time and session state(count number). + * + * @param serverName server name in the cluster on which the web app is running + * @param webServiceUrl fully qualified URL to the server on which the web app is running + * @param headerOption option to save or use HTTP session info + * + * @return map that contains primary and secondary server names, session create time and session state + */ + private Map getServerAndSessionInfoAndVerify(String serverName, + String webServiceUrl, + String headerOption) { + final String primaryServerAttr = "primary"; + final String secondaryServerAttr = "secondary"; + final String sessionCreateTimeAttr = "sessioncreatetime"; + final String countAttr = "count"; + + // send a HTTP request to set http session state(count number) and save HTTP session info + logger.info("Process HTTP request with web service URL {0} in the pod {1} ", + webServiceUrl, serverName); + Map httpAttrInfo = + processHttpRequest(serverName, webServiceUrl, headerOption); + + // get HTTP response data + String primaryServerName = httpAttrInfo.get(primaryServerAttr); + String secondaryServerName = httpAttrInfo.get(secondaryServerAttr); + String sessionCreateTime = httpAttrInfo.get(sessionCreateTimeAttr); + String countStr = httpAttrInfo.get(countAttr); + + // verify that the HTTP response data are not null + assertAll("Check that WebLogic server and session vars is not null or empty", + () -> assertNotNull(primaryServerName,"Primary server name shouldn’t be null"), + () -> assertNotNull(secondaryServerName,"Second server name shouldn’t be null"), + () -> assertNotNull(sessionCreateTime,"Session create time shouldn’t be null"), + () -> assertNotNull(countStr,"Session state shouldn’t be null") + ); + + // map to save server and session info + Map httpDataInfo = new HashMap(); + httpDataInfo.put(primaryServerAttr, primaryServerName); + httpDataInfo.put(secondaryServerAttr, secondaryServerName); + httpDataInfo.put(sessionCreateTimeAttr, sessionCreateTime); + httpDataInfo.put(countAttr, countStr); + + return httpDataInfo; + } + + private static String createAndVerifyDomainImage() { + // create image with model files + logger.info("Create image with model file and verify"); + String miiImage = + createMiiImageAndVerify(SESSMIGR_IMAGE_NAME, SESSMIGR_MODEL_FILE, SESSMIGR_APP_NAME); + + // docker login and push image to docker registry if necessary + dockerLoginAndPushImageToRegistry(miiImage); + + // create docker registry secret to pull the image from registry + logger.info("Create docker registry secret in namespace {0}", domainNamespace); + assertDoesNotThrow(() -> createDockerRegistrySecret(domainNamespace), + String.format("create Docker Registry Secret failed for %s", REPO_SECRET_NAME)); + + return miiImage; + } + + private static void createAndVerifyDomain(String miiImage) { + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword(adminSecretName, domainNamespace, + "weblogic", "welcome1"), + String.format("create secret for admin credentials failed for %s", adminSecretName)); + + // create encryption secret + logger.info("Create encryption secret"); + String encryptionSecretName = "encryptionsecret"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword(encryptionSecretName, domainNamespace, + "weblogicenc", "weblogicenc"), + String.format("create encryption secret failed for %s", encryptionSecretName)); + + // create domain and verify + logger.info("Create model in image domain {0} in namespace {1} using docker image {2}", + domainUid, domainNamespace, miiImage); + createDomainCrAndVerify(adminSecretName, REPO_SECRET_NAME, encryptionSecretName, miiImage); + + // check that admin server pod exists in the domain namespace + logger.info("Checking that admin server pod {0} exists in namespace {1}", + adminServerPodName, domainNamespace); + checkPodExists(adminServerPodName, domainUid, domainNamespace); + + // check that admin server pod is ready + logger.info("Checking that admin server pod {0} is ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check that admin service exists in the domain namespace + logger.info("Checking that admin service {0} exists in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check for managed server pods existence in the domain namespace + for (int i = 1; i <= replicaCount; i++) { + String managedServerPodName = managedServerPrefix + i; + + // check that the managed server pod exists + logger.info("Checking that managed server pod {0} exists in namespace {1}", + managedServerPodName, domainNamespace); + checkPodExists(managedServerPodName, domainUid, domainNamespace); + + // check that the managed server pod is ready + logger.info("Checking that managed server pod {0} is ready in namespace {1}", + managedServerPodName, domainNamespace); + checkPodReady(managedServerPodName, domainUid, domainNamespace); + + // check that the managed server service exists in the domain namespace + logger.info("Checking that managed server service {0} exists in namespace {1}", + managedServerPodName, domainNamespace); + checkServiceExists(managedServerPodName, domainNamespace); + } + } + + private static void createDomainCrAndVerify(String adminSecretName, + String repoSecretName, + String encryptionSecretName, + String miiImage) { + // create the domain CR + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domainNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("FromModel") + .image(miiImage) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domainNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)))) + .addClustersItem(new Cluster() + .clusterName(clusterName) + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .model(new Model() + .domainType("WLS") + .runtimeEncryptionSecret(encryptionSecretName)) + .introspectorJobActiveDeadlineSeconds(300L))); + + // create domain using model in image + logger.info("Create model in image domain {0} in namespace {1} using docker image {2}", + domainUid, domainNamespace, miiImage); + createDomainAndVerify(domain, domainNamespace); + } + + private void shutdownServerUsingServerStartPolicy(String msName) { + final String podName = domainUid + "-" + msName; + + // shutdown a server by changing the it's serverStartPolicy property. + logger.info("Shutdown the server {0}", msName); + boolean serverStopped = assertDoesNotThrow(() -> + shutdownManagedServerUsingServerStartPolicy(domainUid, domainNamespace, msName)); + assertTrue(serverStopped, + String.format("Failed to shutdown server %s ", msName)); + + // check that the managed server pod shutdown successfylly + logger.info("Check that managed server pod {0} stopped in namespace {1}", + podName, domainNamespace); + checkPodDoesNotExist(podName, domainUid, domainNamespace); + } + + private static String buildCurlCommand(String podName, + String curlUrlPath, + String headerOption) { + logger.info("Build a curl command with pod name {0}, curl URL path {1} and HTTP header option {2}", + podName, curlUrlPath, headerOption); + final String httpHeaderFile = "/u01/oracle/header"; + + StringBuffer curlCmd = new StringBuffer("curl --silent --show-error http://"); + curlCmd.append(podName) + .append(":") + .append(managedServerPort) + .append("/") + .append(curlUrlPath) + .append(headerOption) + .append(httpHeaderFile); + + return curlCmd.toString(); + } + + private static Map processHttpRequest(String serverName, + String curlUrlPath, + String headerOption) { + String[] httpAttrArray = + {"sessioncreatetime", "sessionid", "primary", "secondary", "count"}; + Map httpAttrInfo = new HashMap(); + + // build curl command + String curlCmd = buildCurlCommand(serverName, curlUrlPath, headerOption); + logger.info("Command to set HTTP request and get HTTP response {0} ", curlCmd); + + // set HTTP request and get HTTP response + ExecResult execResult = assertDoesNotThrow( + () -> execCommand(domainNamespace, adminServerPodName, + null, true, "/bin/sh", "-c", curlCmd)); + if (execResult.exitValue() == 0) { + logger.info("\n HTTP response is \n " + execResult.stdout()); + assertAll("Check that primary server name is not null or empty", + () -> assertNotNull(execResult.stdout(), "Primary server name shouldn’t be null"), + () -> assertFalse(execResult.stdout().isEmpty(), "Primary server name shouldn’t be empty") + ); + + for (String httpAttrKey : httpAttrArray) { + String httpAttrValue = getHttpResponseAttribute(execResult.stdout(), httpAttrKey); + httpAttrInfo.put(httpAttrKey, httpAttrValue); + } + } else { + fail("Failed to process HTTP request " + execResult.stderr()); + } + + return httpAttrInfo; + } + + private static String getHttpResponseAttribute(String httpResponseString, String attribute) { + // retrieve the search pattern that matches the given HTTP data attribute + String attrPatn = httpAttrMap.get(attribute); + assertNotNull(attrPatn,"HTTP Attribute key shouldn’t be null"); + + // search the value of given HTTP data attribute + Pattern pattern = Pattern.compile(attrPatn); + Matcher matcher = pattern.matcher(httpResponseString); + String httpAttribute = null; + + if (matcher.find()) { + httpAttribute = matcher.group(2); + } + + return httpAttribute; + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItSimpleValidation.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItSimpleValidation.java index 55d9189d469..738de80de3b 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItSimpleValidation.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItSimpleValidation.java @@ -30,7 +30,7 @@ import oracle.weblogic.kubernetes.annotations.Namespaces; import oracle.weblogic.kubernetes.annotations.tags.MustNotRunInParallel; import oracle.weblogic.kubernetes.annotations.tags.Slow; -import oracle.weblogic.kubernetes.extensions.LoggedTest; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; @@ -55,6 +55,7 @@ import static oracle.weblogic.kubernetes.assertions.TestAssertions.domainExists; import static oracle.weblogic.kubernetes.assertions.TestAssertions.isHelmReleaseDeployed; import static oracle.weblogic.kubernetes.assertions.TestAssertions.operatorIsReady; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.awaitility.Awaitility.with; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -66,7 +67,7 @@ // Every test class needs to tagged with this annotation for // diagnostic log collection in case of failures and for test cleanup. @IntegrationTest -class ItSimpleValidation implements LoggedTest { +class ItSimpleValidation { private String opNamespace = null; private String domainNamespace1 = null; @@ -74,6 +75,8 @@ class ItSimpleValidation implements LoggedTest { final String domainUid = "domain1"; String serviceAccountName; + private static LoggingFacade logger = null; + /** * Setup for test suite. Creates service account, persistent volume * and persistent volume claim. @@ -81,7 +84,7 @@ class ItSimpleValidation implements LoggedTest { */ @BeforeAll public void setup(@Namespaces(2) List namespaces) { - + logger = getLogger(); logger.info("Assigning unique namespace for operator"); assertNotNull(namespaces.get(0), "Namespace is null"); opNamespace = namespaces.get(0); @@ -115,7 +118,6 @@ public void setup(@Namespaces(2) List namespaces) { .withName(pvName) .withNamespace(domainNamespace1) .build() - .putLabelsItem("weblogic.resourceVersion", "domain-v2") .putLabelsItem("weblogic.domainUid", domainUid)); boolean success = assertDoesNotThrow( () -> TestActions.createPersistentVolume(v1pv), @@ -135,7 +137,6 @@ public void setup(@Namespaces(2) List namespaces) { .withName(pvcName) .withNamespace(domainNamespace1) .build() - .putLabelsItem("weblogic.resourceVersion", "domain-v2") .putLabelsItem("weblogic.domainUid", domainUid)); success = assertDoesNotThrow( @@ -249,7 +250,7 @@ public void testCreatingDomain() { .image("store/oracle/weblogic:12.2.1.3") .imagePullPolicy("IfNotPresent"); Domain domain = new Domain() - .apiVersion("weblogic.oracle/v7") + .apiVersion("weblogic.oracle/v8") .kind("Domain") .metadata(metadata) .spec(domainSpec); @@ -271,7 +272,7 @@ public void testCreatingDomain() { // and here we can set the maximum time we are prepared to wait .await().atMost(5, MINUTES) // operatorIsRunning() is one of our custom, reusable assertions - .until(domainExists(domainUid, "v7", domainNamespace1)); + .until(domainExists(domainUid, "v8", domainNamespace1)); } } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItStickySession.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItStickySession.java new file mode 100644 index 00000000000..3e7c8572d15 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItStickySession.java @@ -0,0 +1,484 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.google.common.primitives.Ints; +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1SecretReference; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.annotations.tags.MustNotRunInParallel; +import oracle.weblogic.kubernetes.annotations.tags.Slow; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.ExecCommand; +import oracle.weblogic.kubernetes.utils.ExecResult; +import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.LOGS_DIR; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.VOYAGER_CHART_NAME; +import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; +import static oracle.weblogic.kubernetes.actions.TestActions.uninstallVoyager; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createMiiImageAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.dockerLoginAndPushImageToRegistry; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyVoyager; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installVoyagerIngressAndVerify; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.fail; + +/** + * This test is used for testing the affinity between a web client and a WebLogic server + * for the duration of a HTTP session. + */ +@DisplayName("Test that Voyager is installed and the Voyager ingress is created successfully") +@IntegrationTest +class ItStickySession { + + // constants for creating domain image using model in image + private static final String SESSMIGR_MODEL_FILE = "model.stickysess.yaml"; + private static final String SESSMIGR_IMAGE_NAME = "mii-image"; + + // constants for web service + private static final String SESSMIGR_APP_NAME = "stickysess-app"; + private static final String SESSMIGR_APP_WAR_NAME = "stickysess-war"; + private static final int SESSION_STATE = 4; + private static Map httpAttrMap; + + // constants for operator and WebLogic domain + private static String domainUid = "stickysess-domain-1"; + private static String clusterName = "cluster-1"; + private static String adminServerPodName = domainUid + "-admin-server"; + private static String managedServerPrefix = domainUid + "-managed-server"; + private static int managedServerPort = 8001; + private static int replicaCount = 2; + private static String opNamespace = null; + private static String domainNamespace = null; + private static ConditionFactory withStandardRetryPolicy = null; + + // constants for Voyager + private static String cloudProvider = "baremetal"; + private static boolean enableValidatingWebhook = false; + private static HelmParams voyagerHelmParams = null; + private static LoggingFacade logger = null; + + /** + * Install Voyager and operator, create a custom image using model in image with model files + * and create a one cluster domain. + * + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + * JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void init(@Namespaces(3) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + // get a unique Voyager namespace + logger.info("Get a unique namespace for Voyager"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + String voyagerNamespace = namespaces.get(0); + + // get a unique operator namespace + logger.info("Get a unique namespace for operator"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + opNamespace = namespaces.get(1); + + // get a unique domain namespace + logger.info("Get a unique namespace for WebLogic domain"); + assertNotNull(namespaces.get(2), "Namespace list is null"); + domainNamespace = namespaces.get(2); + + // install and verify Voyager + voyagerHelmParams = + installAndVerifyVoyager(voyagerNamespace, cloudProvider, enableValidatingWebhook); + + // install and verify operator + installAndVerifyOperator(opNamespace, domainNamespace); + + // create and verify WebLogic domain image using model in image with model files + String imageName = createAndVerifyDomainImage(); + + // create and verify one cluster domain + logger.info("Create domain and verify that it's running"); + createAndVerifyDomain(imageName); + + // map to save HTTP response data + httpAttrMap = new HashMap(); + httpAttrMap.put("sessioncreatetime", "(.*)sessioncreatetime>(.*)(.*)(.*)(.*) clusterNameMsPortMap = new HashMap<>(); + clusterNameMsPortMap.put(clusterName, managedServerPort); + List hostNames = + installVoyagerIngressAndVerify(domainUid, domainNamespace, ingressName, clusterNameMsPortMap); + + // get ingress service Nodeport + int ingressServiceNodePort = assertDoesNotThrow( + () -> getServiceNodePort(domainNamespace, ingressServiceName, channelName), + "Getting admin server node port failed"); + logger.info("Node port for {0} is: {1} :", ingressServiceName, ingressServiceNodePort); + + // send a HTTP request to set http session state(count number) and save HTTP session info + Map httpDataInfo = + getServerAndSessionInfoAndVerify(hostNames.get(0), + ingressServiceNodePort, webServiceSetUrl, " -D "); + // get server and session info from web service deployed on the cluster + String serverName1 = httpDataInfo.get(serverNameAttr); + String sessionId1 = httpDataInfo.get(sessionIdAttr); + logger.info("Got the server {0} and session ID {1} from the first HTTP connection", + serverName1, sessionId1); + + // send a HTTP request again to get server and session info + httpDataInfo = + getServerAndSessionInfoAndVerify(hostNames.get(0), + ingressServiceNodePort, webServiceGetUrl, " -b "); + // get server and session info from web service deployed on the cluster + String serverName2 = httpDataInfo.get(serverNameAttr); + String sessionId2 = httpDataInfo.get(sessionIdAttr); + String countStr = httpDataInfo.get(countAttr); + int count = Optional.ofNullable(countStr).map(Ints::tryParse).orElse(0); + logger.info("Got the server {0}, session ID {1} and session state {2} " + + "from the second HTTP connection", serverName2, sessionId2, count); + + // verify that two HTTP connections are sticky to the same server + assertAll("Check that teh sticky session is supported", + () -> assertEquals(serverName1, serverName2, + "HTTP connections should be sticky to the server " + serverName1), + () -> assertEquals(sessionId1, sessionId2, + "HTTP session ID should be same for all HTTP connections " + sessionId1), + () -> assertEquals(count, SESSION_STATE, + "HTTP session state should equels " + SESSION_STATE) + ); + + logger.info("SUCCESS --- testSameSessionStickiness \n" + + "Two HTTP connections are sticky to server {0} The session state " + + "from the econd HTTP connections is {2}", serverName2, SESSION_STATE); + } + + private static String createAndVerifyDomainImage() { + // create image with model files + logger.info("Create image with model file and verify"); + String miiImage = + createMiiImageAndVerify(SESSMIGR_IMAGE_NAME, SESSMIGR_MODEL_FILE, SESSMIGR_APP_NAME); + + // docker login and push image to docker registry if necessary + dockerLoginAndPushImageToRegistry(miiImage); + + // create docker registry secret to pull the image from registry + logger.info("Create docker registry secret in namespace {0}", domainNamespace); + assertDoesNotThrow(() -> createDockerRegistrySecret(domainNamespace), + String.format("create Docker Registry Secret failed for %s", REPO_SECRET_NAME)); + + return miiImage; + } + + private static void createAndVerifyDomain(String miiImage) { + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword(adminSecretName, domainNamespace, + "weblogic", "welcome1"), + String.format("create secret for admin credentials failed for %s", adminSecretName)); + + // create encryption secret + logger.info("Create encryption secret"); + String encryptionSecretName = "encryptionsecret"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword(encryptionSecretName, domainNamespace, + "weblogicenc", "weblogicenc"), + String.format("create encryption secret failed for %s", encryptionSecretName)); + + // create domain and verify + logger.info("Create model in image domain {0} in namespace {1} using docker image {2}", + domainUid, domainNamespace, miiImage); + createDomainCrAndVerify(adminSecretName, REPO_SECRET_NAME, encryptionSecretName, miiImage); + + // check that admin server pod exists in the domain namespace + logger.info("Checking that admin server pod {0} exists in namespace {1}", + adminServerPodName, domainNamespace); + checkPodExists(adminServerPodName, domainUid, domainNamespace); + + // check that admin server pod is ready + logger.info("Checking that admin server pod {0} is ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check that admin service exists in the domain namespace + logger.info("Checking that admin service {0} exists in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check for managed server pods existence in the domain namespace + for (int i = 1; i <= replicaCount; i++) { + String managedServerPodName = managedServerPrefix + i; + + // check that the managed server pod exists + logger.info("Checking that managed server pod {0} exists in namespace {1}", + managedServerPodName, domainNamespace); + checkPodExists(managedServerPodName, domainUid, domainNamespace); + + // check that the managed server pod is ready + logger.info("Checking that managed server pod {0} is ready in namespace {1}", + managedServerPodName, domainNamespace); + checkPodReady(managedServerPodName, domainUid, domainNamespace); + + // check that the managed server service exists in the domain namespace + logger.info("Checking that managed server service {0} exists in namespace {1}", + managedServerPodName, domainNamespace); + checkServiceExists(managedServerPodName, domainNamespace); + } + } + + private static void createDomainCrAndVerify(String adminSecretName, + String repoSecretName, + String encryptionSecretName, + String miiImage) { + // create the domain CR + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domainNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("FromModel") + .image(miiImage) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domainNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)))) + .addClustersItem(new Cluster() + .clusterName(clusterName) + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .model(new Model() + .domainType("WLS") + .runtimeEncryptionSecret(encryptionSecretName)) + .introspectorJobActiveDeadlineSeconds(300L))); + + // create domain using model in image + logger.info("Create model in image domain {0} in namespace {1} using docker image {2}", + domainUid, domainNamespace, miiImage); + createDomainAndVerify(domain, domainNamespace); + } + + /** + * An util method referred by the test method testSessionMigration. It sends a HTTP request + * to set or get http session state (count number) and return the primary server, + * the secondary server, session create time and session state(count number). + * + * @param serverName server name in the cluster on which the web app is running + * @param webServiceUrl fully qualified URL to the server on which the web app is running + * @param headerOption option to save or use HTTP session info + * + * @return map that contains primary and secondary server names, session create time and session state + */ + private Map getServerAndSessionInfoAndVerify(String hostName, + int ingressServiceNodePort, + String curlUrlPath, + String headerOption) { + final String serverNameAttr = "servername"; + final String sessionIdAttr = "sessionid"; + final String countAttr = "count"; + + // send a HTTP request + logger.info("Process HTTP request in host {0} and ingressServiceNodePort {1} ", + hostName, ingressServiceNodePort); + Map httpAttrInfo = + processHttpRequest(hostName, ingressServiceNodePort, curlUrlPath, headerOption); + + // get HTTP response data + String serverName = httpAttrInfo.get(serverNameAttr); + String sessionId = httpAttrInfo.get(sessionIdAttr); + String countStr = httpAttrInfo.get(countAttr); + + // verify that the HTTP response data are not null + assertAll("Check that WebLogic server and session vars is not null or empty", + () -> assertNotNull(serverName,"Server name shouldn’t be null"), + () -> assertNotNull(sessionId,"Session ID shouldn’t be null"), + () -> assertNotNull(countStr,"Session state shouldn’t be null") + ); + + // map to save server and session info + Map httpDataInfo = new HashMap(); + httpDataInfo.put(serverNameAttr, serverName); + httpDataInfo.put(sessionIdAttr, sessionId); + httpDataInfo.put(countAttr, countStr); + + return httpDataInfo; + } + + private static Map processHttpRequest(String hostName, + int ingressServiceNodePort, + String curlUrlPath, + String headerOption) { + String[] httpAttrArray = + {"sessioncreatetime", "sessionid", "servername", "count"}; + Map httpAttrInfo = new HashMap(); + + // build curl command + String curlCmd = + buildCurlCommand(hostName, ingressServiceNodePort, curlUrlPath, headerOption); + logger.info("Command to set HTTP request or get HTTP response {0} ", curlCmd); + + // set HTTP request and get HTTP response + ExecResult execResult = assertDoesNotThrow( + () -> ExecCommand.exec(curlCmd, true)); + assertNotNull(execResult, "curl command returns null"); + + if (execResult.exitValue() == 0) { + logger.info("\n HTTP response is \n " + execResult.stdout()); + assertAll("Check that primary server name is not null or empty", + () -> assertNotNull(execResult.stdout(), "Primary server name shouldn’t be null"), + () -> assertFalse(execResult.stdout().isEmpty(), "Primary server name shouldn’t be empty") + ); + + for (String httpAttrKey : httpAttrArray) { + String httpAttrValue = getHttpResponseAttribute(execResult.stdout(), httpAttrKey); + httpAttrInfo.put(httpAttrKey, httpAttrValue); + } + } else { + fail("Failed to process HTTP request " + execResult.stderr()); + } + + return httpAttrInfo; + } + + private static String buildCurlCommand(String hostName, + int ingressServiceNodePort, + String curlUrlPath, + String headerOption) { + logger.info("Build a curl command with hostname {0} and ingress service NodePort {1}", + hostName, ingressServiceNodePort); + + final String httpHeaderFile = LOGS_DIR + "/headers"; + + StringBuffer curlCmd = + new StringBuffer("curl --show-error --noproxy '*' -H 'host: "); + curlCmd.append(hostName) + .append("' http://") + .append(K8S_NODEPORT_HOST) + .append(":") + .append(ingressServiceNodePort) + .append("/") + .append(curlUrlPath) + .append(headerOption) + .append(httpHeaderFile); + + return curlCmd.toString(); + } + + private static String getHttpResponseAttribute(String httpResponseString, String attribute) { + // retrieve the search pattern that matches the given HTTP data attribute + String attrPatn = httpAttrMap.get(attribute); + assertNotNull(attrPatn,"HTTP Attribute key shouldn’t be null"); + + // search the value of given HTTP data attribute + Pattern pattern = Pattern.compile(attrPatn); + Matcher matcher = pattern.matcher(httpResponseString); + String httpAttribute = null; + + if (matcher.find()) { + httpAttribute = matcher.group(2); + } + + return httpAttribute; + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItUsabilityOperatorHelmChart.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItUsabilityOperatorHelmChart.java index 43358f5ce3f..711f2bda6dc 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItUsabilityOperatorHelmChart.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItUsabilityOperatorHelmChart.java @@ -14,15 +14,17 @@ import io.kubernetes.client.openapi.models.V1SecretReference; import oracle.weblogic.domain.AdminServer; import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; import oracle.weblogic.domain.Domain; import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; import oracle.weblogic.domain.ServerPod; import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; import oracle.weblogic.kubernetes.annotations.IntegrationTest; import oracle.weblogic.kubernetes.annotations.Namespaces; import oracle.weblogic.kubernetes.annotations.tags.MustNotRunInParallel; import oracle.weblogic.kubernetes.annotations.tags.Slow; -import oracle.weblogic.kubernetes.extensions.LoggedTest; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import org.joda.time.DateTime; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -35,11 +37,13 @@ import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; import static oracle.weblogic.kubernetes.TestConstants.MANAGED_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_TAG; import static oracle.weblogic.kubernetes.TestConstants.OPERATOR_SERVICE_NAME; import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; -import static oracle.weblogic.kubernetes.TestConstants.WDT_BASIC_IMAGE_NAME; -import static oracle.weblogic.kubernetes.TestConstants.WDT_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.WLS_DOMAIN_TYPE; import static oracle.weblogic.kubernetes.actions.TestActions.getPodCreationTimestamp; +import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; import static oracle.weblogic.kubernetes.actions.TestActions.uninstallNginx; import static oracle.weblogic.kubernetes.actions.TestActions.uninstallOperator; import static oracle.weblogic.kubernetes.assertions.TestAssertions.podStateNotChanged; @@ -56,7 +60,7 @@ import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyNginx; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; import static oracle.weblogic.kubernetes.utils.TestUtils.callWebAppAndCheckForServerNameInResponse; -import static oracle.weblogic.kubernetes.utils.TestUtils.getNextFreePort; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -68,7 +72,7 @@ @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @DisplayName("Test operator usability using Helm chart installation") @IntegrationTest -class ItUsabilityOperatorHelmChart implements LoggedTest { +class ItUsabilityOperatorHelmChart { private static String opNamespace = null; private static String domainNamespace = null; @@ -85,6 +89,7 @@ class ItUsabilityOperatorHelmChart implements LoggedTest { // ingress host list private List ingressHostList; + private static LoggingFacade logger = null; /** * Get namespaces for operator, domain1 and NGINX. @@ -95,7 +100,7 @@ class ItUsabilityOperatorHelmChart implements LoggedTest { */ @BeforeAll public static void initAll(@Namespaces(3) List namespaces) { - + logger = getLogger(); // get a unique operator namespace logger.info("Getting a unique namespace for operator"); assertNotNull(namespaces.get(0), "Namespace list is null"); @@ -111,13 +116,14 @@ public static void initAll(@Namespaces(3) List namespaces) { assertNotNull(namespaces.get(2), "Namespace list is null"); String nginxNamespace = namespaces.get(2); - // get a free node port for NGINX - nodeportshttp = getNextFreePort(30305, 30405); - int nodeportshttps = getNextFreePort(30443, 30543); - // install and verify NGINX logger.info("Installing and verifying NGINX"); - nginxHelmParams = installAndVerifyNginx(nginxNamespace, nodeportshttp, nodeportshttps); + nginxHelmParams = installAndVerifyNginx(nginxNamespace, 0, 0); + + String nginxServiceName = nginxHelmParams.getReleaseName() + "-nginx-ingress-controller"; + logger.info("NGINX service name: {0}", nginxServiceName); + nodeportshttp = getServiceNodePort(nginxNamespace, nginxServiceName, "http"); + logger.info("NGINX http node port: {0}", nodeportshttp); } /** @@ -238,10 +244,10 @@ public void tearDownAll() { private void createAndVerifyMiiDomain() { // get the pre-built image created by IntegrationTestWatcher - String wdtImage = WDT_BASIC_IMAGE_NAME + ":" + WDT_BASIC_IMAGE_TAG; + String miiImage = MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG; // docker login and push image to docker registry if necessary - dockerLoginAndPushImageToRegistry(wdtImage); + dockerLoginAndPushImageToRegistry(miiImage); // create docker registry secret to pull the image from registry logger.info("Creating docker registry secret in namespace {0}", domainNamespace); @@ -252,6 +258,11 @@ private void createAndVerifyMiiDomain() { String adminSecretName = "weblogic-credentials"; createSecretWithUsernamePassword(adminSecretName, domainNamespace, "weblogic", "welcome1"); + // create encryption secret + logger.info("Creating encryption secret"); + String encryptionSecretName = "encryptionsecret"; + createSecretWithUsernamePassword(encryptionSecretName, domainNamespace, "weblogicenc", "weblogicenc"); + // construct a list of oracle.weblogic.domain.Cluster objects to be used in the domain custom resource List clusters = new ArrayList<>(); clusters.add(new Cluster() @@ -268,8 +279,8 @@ private void createAndVerifyMiiDomain() { .namespace(domainNamespace)) .spec(new DomainSpec() .domainUid(domainUid) - .domainHomeInImage(true) - .image(wdtImage) + .domainHomeSourceType("FromModel") + .image(miiImage) .addImagePullSecretsItem(new V1LocalObjectReference() .name(REPO_SECRET_NAME)) .webLogicCredentialsSecret(new V1SecretReference() @@ -286,11 +297,15 @@ private void createAndVerifyMiiDomain() { .value("-Djava.security.egd=file:/dev/./urandom "))) .adminServer(new AdminServer() .serverStartState("RUNNING")) - .clusters(clusters)); + .clusters(clusters) + .configuration(new Configuration() + .model(new Model() + .domainType(WLS_DOMAIN_TYPE) + .runtimeEncryptionSecret(encryptionSecretName)))); // create model in image domain - logger.info("Creating domain home in image domain {0} in namespace {1} using docker image {2}", - domainUid, domainNamespace, wdtImage); + logger.info("Creating model in image domain {0} in namespace {1} using docker image {2}", + domainUid, domainNamespace, miiImage); createDomainAndVerify(domain, domainNamespace); // check that admin server pod exists in the domain namespace diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItVoyagerSample.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItVoyagerSample.java new file mode 100644 index 00000000000..6fd7336ff54 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/ItVoyagerSample.java @@ -0,0 +1,300 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1SecretReference; +import oracle.weblogic.domain.AdminServer; +import oracle.weblogic.domain.AdminService; +import oracle.weblogic.domain.Channel; +import oracle.weblogic.domain.Cluster; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.Domain; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.annotations.tags.MustNotRunInParallel; +import oracle.weblogic.kubernetes.annotations.tags.Slow; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.ExecCommand; +import oracle.weblogic.kubernetes.utils.ExecResult; +import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.VOYAGER_CHART_NAME; +import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; +import static oracle.weblogic.kubernetes.actions.TestActions.uninstallVoyager; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.dockerLoginAndPushImageToRegistry; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyVoyager; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installVoyagerIngressAndVerify; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +/** + * Verify that Voyager and Voyager ingress are installed successfully. + */ +@DisplayName("Test Voyager is installed and the Voyager ingress is created successfully") +@IntegrationTest +class ItVoyagerSample { + + // constants for operator and WebLogic domain + private static String domainUid = "voyager-domain-1"; + private static String clusterName = "cluster-1"; + private static String adminServerPodName = domainUid + "-admin-server"; + private static String managedServerPrefix = domainUid + "-managed-server"; + private static int managedServerPort = 8001; + private static int replicaCount = 2; + private static String opNamespace = null; + private static String domainNamespace = null; + private static ConditionFactory withStandardRetryPolicy = null; + + private static HelmParams voyagerHelmParams = null; + private static LoggingFacade logger = null; + + /** + * Install operator, create a one cluster domain and install Voyager. + * + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + * JUnit engine parameter resolution mechanism + */ + @BeforeAll + public static void init(@Namespaces(3) List namespaces) { + logger = getLogger(); + // create standard, reusable retry/backoff policy + withStandardRetryPolicy = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + // get a unique Voyager namespace + logger.info("Get a unique namespace for Voyager"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + String voyagerNamespace = namespaces.get(0); + + // get a unique operator namespace + logger.info("Get a unique namespace for operator"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + opNamespace = namespaces.get(1); + + // get a unique domain namespace + logger.info("Get a unique namespace for WebLogic domain"); + assertNotNull(namespaces.get(2), "Namespace list is null"); + domainNamespace = namespaces.get(2); + + final String cloudProvider = "baremetal"; + final boolean enableValidatingWebhook = false; + + // install and verify Voyager + voyagerHelmParams = + installAndVerifyVoyager(voyagerNamespace, cloudProvider, enableValidatingWebhook); + + // install and verify operator + installAndVerifyOperator(opNamespace, domainNamespace); + + // create and verify one cluster domain + logger.info("Create domain and verify that it's running"); + createAndVerifyDomain(); + } + + @AfterAll + void tearDown() { + // uninstall Voyager + if (voyagerHelmParams != null) { + assertThat(uninstallVoyager(voyagerHelmParams)) + .as("Test uninstallVoyager returns true") + .withFailMessage("uninstallVoyager() did not return true") + .isTrue(); + } + } + + /** + * The test invokes a webapp to verify the Voyager is installed successfully and ready to use. + */ + @Test + @DisplayName("Create the Voyager ingress and test Voyager load balancing with host name-based routing") + @Slow + @MustNotRunInParallel + public void testVoyagerWorks() { + String ingressName = domainUid + "-ingress-host-routing"; + String ingressServiceName = VOYAGER_CHART_NAME + "-" + ingressName; + String channelName = "tcp-80"; + ExecResult result = null; + + // create Voyager ingress resource + Map clusterNameMsPortMap = new HashMap<>(); + clusterNameMsPortMap.put(clusterName, managedServerPort); + List hostNames = + installVoyagerIngressAndVerify(domainUid, domainNamespace, ingressName, clusterNameMsPortMap); + + // get ingress service Nodeport + int ingressServiceNodePort = assertDoesNotThrow(() + -> getServiceNodePort(domainNamespace, ingressServiceName, channelName), + "Getting admin server node port failed"); + logger.info("Node port for {0} is: {1} :", ingressServiceName, ingressServiceNodePort); + + // invoke webapp + String curlRequest = String.format("curl --silent --show-error --noproxy '*' " + + "-H 'host: %s' http://%s:%s/sample-war/index.jsp", + hostNames.get(0), K8S_NODEPORT_HOST, ingressServiceNodePort); + logger.info("Exec curl command :" + curlRequest); + try { + result = ExecCommand.exec(curlRequest, true); + } catch (Exception ex) { + logger.info("Got exception while running command: {0}", curlRequest); + fail("Failed to process curl command " + ex.getMessage()); + } + + assertNotNull(result, "curl command returns null"); + logger.info("curl command returns: \n{0}, \n{1}", result.stdout(), result.stderr()); + assertTrue(result.stdout().contains("Hello World"), "Failed to invoke the webapp"); + } + + private static void createAndVerifyDomain() { + // get the pre-built image created by IntegrationTestWatcher + String miiImage = MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG; + + // docker login and push image to docker registry if necessary + dockerLoginAndPushImageToRegistry(miiImage); + + // create docker registry secret to pull the image from registry + logger.info("Create docker registry secret in namespace {0}", domainNamespace); + assertDoesNotThrow(() -> createDockerRegistrySecret(domainNamespace), + String.format("create Docker Registry Secret failed for %s", REPO_SECRET_NAME)); + + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword(adminSecretName, domainNamespace, + "weblogic", "welcome1"), + String.format("create secret for admin credentials failed for %s", adminSecretName)); + + // create encryption secret + logger.info("Create encryption secret"); + String encryptionSecretName = "encryptionsecret"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword(encryptionSecretName, domainNamespace, + "weblogicenc", "weblogicenc"), + String.format("create encryption secret failed for %s", encryptionSecretName)); + + // create domain and verify + logger.info("Create model in image domain {0} in namespace {1} using docker image {2}", + domainUid, domainNamespace, miiImage); + createDomainCrAndVerify(adminSecretName, REPO_SECRET_NAME, encryptionSecretName, miiImage); + + // check that admin server pod exists in the domain namespace + logger.info("Checking that admin server pod {0} exists in namespace {1}", + adminServerPodName, domainNamespace); + checkPodExists(adminServerPodName, domainUid, domainNamespace); + + // check that admin server pod is ready + logger.info("Checking that admin server pod {0} is ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check that admin service exists in the domain namespace + logger.info("Checking that admin service {0} exists in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check for managed server pods existence in the domain namespace + for (int i = 1; i <= replicaCount; i++) { + String managedServerPodName = managedServerPrefix + i; + + // check that the managed server pod exists + logger.info("Checking that managed server pod {0} exists in namespace {1}", + managedServerPodName, domainNamespace); + checkPodExists(managedServerPodName, domainUid, domainNamespace); + + // check that the managed server pod is ready + logger.info("Checking that managed server pod {0} is ready in namespace {1}", + managedServerPodName, domainNamespace); + checkPodReady(managedServerPodName, domainUid, domainNamespace); + + // check that the managed server service exists in the domain namespace + logger.info("Checking that managed server service {0} exists in namespace {1}", + managedServerPodName, domainNamespace); + checkServiceExists(managedServerPodName, domainNamespace); + } + } + + private static void createDomainCrAndVerify(String adminSecretName, + String repoSecretName, + String encryptionSecretName, + String miiImage) { + // create the domain CR + Domain domain = new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domainNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("FromModel") + .image(miiImage) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new V1SecretReference() + .name(adminSecretName) + .namespace(domainNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new AdminServer() + .serverStartState("RUNNING") + .adminService(new AdminService() + .addChannelsItem(new Channel() + .channelName("default") + .nodePort(0)))) + .addClustersItem(new Cluster() + .clusterName(clusterName) + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new Configuration() + .model(new Model() + .domainType("WLS") + .runtimeEncryptionSecret(encryptionSecretName)) + .introspectorJobActiveDeadlineSeconds(300L))); + + // create domain using model in image + logger.info("Create model in image domain {0} in namespace {1} using docker image {2}", + domainUid, domainNamespace, miiImage); + createDomainAndVerify(domain, domainNamespace); + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/TestConstants.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/TestConstants.java index 5c10287bb50..5ff493b5c24 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/TestConstants.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/TestConstants.java @@ -13,7 +13,7 @@ public interface TestConstants { // domain constants - public static final String DOMAIN_VERSION = "v7"; + public static final String DOMAIN_VERSION = "v8"; public static final String DOMAIN_API_VERSION = "weblogic.oracle/" + DOMAIN_VERSION; public static final String ADMIN_SERVER_NAME_BASE = "admin-server"; public static final String MANAGED_SERVER_NAME_BASE = "managed-server"; @@ -77,6 +77,21 @@ public interface TestConstants { public static final String STABLE_REPO_NAME = "stable"; public static final String NGINX_CHART_NAME = "nginx-ingress"; + // Voyager constants + public static final String APPSCODE_REPO_URL = "https://charts.appscode.com/stable/"; + public static final String VOYAGER_RELEASE_NAME = "voyager-release" + BUILD_ID; + public static final String APPSCODE_REPO_NAME = "appscode"; + public static final String VOYAGER_CHART_NAME = "voyager"; + public static final String VOYAGER_CHART_VERSION = "12.0.0"; + + // MII image constants + public static final String MII_BASIC_WDT_MODEL_FILE = "model-singleclusterdomain-sampleapp-wls.yaml"; + public static final String MII_BASIC_IMAGE_NAME = REPO_NAME + "mii-basic-image"; + public static final String MII_BASIC_IMAGE_TAG = TestUtils.getDateAndTimeStamp(); + public static final String MII_BASIC_IMAGE_DOMAINTYPE = "mii"; + public static final String MII_BASIC_APP_NAME = "sample-app"; + public static final String MII_TWO_APP_WDT_MODEL_FILE = "model-singlecluster-two-sampleapp-wls.yaml"; + // application constants public static final String MII_APP_RESPONSE_V1 = "Hello World, you have reached server managed-server"; public static final String MII_APP_RESPONSE_V2 = "Hello World AGAIN, you have reached server managed-server"; @@ -84,11 +99,13 @@ public interface TestConstants { public static final String READ_STATE_COMMAND = "/weblogic-operator/scripts/readState.sh"; // WDT domain-in-image constants + public static final String WDT_BASIC_MODEL_FILE = "wdt-singlecluster-sampleapp-usingprop-wls.yaml"; public static final String WDT_BASIC_MODEL_PROPERTIES_FILE = "wdt-singleclusterdomain-sampleapp-wls.properties"; public static final String WDT_BASIC_IMAGE_NAME = REPO_NAME + "wdt-basic-image"; public static final String WDT_BASIC_IMAGE_TAG = TestUtils.getDateAndTimeStamp(); public static final String WDT_BASIC_IMAGE_DOMAINHOME = "/u01/oracle/user_projects/domains/domain1"; + public static final String WDT_IMAGE_DOMAINHOME_BASE_DIR = "/u01/oracle/user_projects/domains"; public static final String WDT_BASIC_IMAGE_DOMAINTYPE = "wdt"; public static final String WDT_BASIC_APP_NAME = "sample-app"; @@ -118,4 +135,10 @@ public interface TestConstants { public static final String DB_IMAGE_NAME = OCR_REGISTRY + "/database/enterprise"; public static final String DB_IMAGE_TAG = "12.2.0.1-slim"; + // istio constants + public static final String ISTIO_VERSION = "1.5.4"; + + //MySQL database constants + public static final String MYSQL_VERSION = "5.6"; + } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/ActionConstants.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/ActionConstants.java index 1a81d7029be..3267c3bbf65 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/ActionConstants.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/ActionConstants.java @@ -36,25 +36,43 @@ public interface ActionConstants { = TestConstants.OCR_REGISTRY + "/middleware/weblogic"; public static final String WLS_BASE_IMAGE_TAG = "12.2.1.4"; - public static final String DEFAULT_IMAGE_NAME = "test-image"; - public static final String DEFAULT_IMAGE_TAG = "v1"; + public static final String DEFAULT_MODEL_IMAGE_NAME = "test-mii-image"; + public static final String DEFAULT_MODEL_IMAGE_TAG = "v1"; // ------------ WebLogic Image Tool constants---------------------------- public static final String WIT = "WIT"; public static final String WDT = "WDT"; + public static final String WIT_DOWNLOAD_URL_DEFAULT + = "https://github.com/oracle/weblogic-image-tool/releases/latest"; public static final String WIT_DOWNLOAD_URL - = "https://github.com/oracle/weblogic-image-tool"; - public static final String WIT_VERSION = System.getProperty("wit.version", "latest"); - public static final String WIT_FILE_NAME = "imagetool.zip"; + = System.getProperty("wit.download.url", WIT_DOWNLOAD_URL_DEFAULT); + public static final String WIT_DOWNLOAD_FILENAME_DEFAULT = "imagetool.zip"; + public static final String WDT_DOWNLOAD_URL_DEFAULT + = "https://github.com/oracle/weblogic-deploy-tooling/releases/latest"; public static final String WDT_DOWNLOAD_URL - = "https://github.com/oracle/weblogic-deploy-tooling"; + = System.getProperty("wdt.download.url", WDT_DOWNLOAD_URL_DEFAULT); public static final String WDT_VERSION = System.getProperty("wdt.version", "latest"); - public static final String WDT_FILE_NAME = "weblogic-deploy.zip"; + public static final String WDT_DOWNLOAD_FILENAME_DEFAULT = "weblogic-deploy.zip"; public static final String IMAGE_TOOL = WORK_DIR + "/imagetool/bin/imagetool.sh"; - public static final String WDT_ZIP_PATH = DOWNLOAD_DIR + "/" + WDT_FILE_NAME; + public static final String WDT_ZIP_PATH = DOWNLOAD_DIR + "/" + WDT_DOWNLOAD_FILENAME_DEFAULT; + + // ------------ WLDF RBAC constants ------------------------------------------ + public static final String WLDF_CLUSTER_ROLE_NAME = "weblogic-domain-cluster-role"; + public static final String WLDF_CLUSTER_ROLE_BINDING_NAME = "domain-cluster-rolebinding"; + public static final String WLDF_ROLE_BINDING_NAME = "weblogic-domain-operator-rolebinding"; + public static final String RBAC_CLUSTER_ROLE = "ClusterRole"; + public static final String RBAC_CLUSTER_ROLE_BINDING = "ClusterRoleBinding"; + public static final String RBAC_ROLE_BINDING = "RoleBinding"; + public static final String RBAC_API_VERSION = "rbac.authorization.k8s.io/v1"; + public static final String RBAC_API_GROUP = "rbac.authorization.k8s.io"; + public static final String MONITORING_EXPORTER_DOWNLOAD_URL = "https://github.com/oracle/weblogic-monitoring-exporter.git"; + + // ------------ Ingress constants---------------------------- + public static final String INGRESS_API_VERSION = "networking.k8s.io/v1beta1"; + public static final String INGRESS_KIND = "Ingress"; } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/TestActions.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/TestActions.java index 49049b86d66..e46ef7d54b8 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/TestActions.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/TestActions.java @@ -10,6 +10,7 @@ import com.google.gson.JsonObject; import io.kubernetes.client.custom.V1Patch; import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1ClusterRole; import io.kubernetes.client.openapi.models.V1ClusterRoleBinding; import io.kubernetes.client.openapi.models.V1ConfigMap; import io.kubernetes.client.openapi.models.V1Job; @@ -17,19 +18,23 @@ import io.kubernetes.client.openapi.models.V1PersistentVolumeClaim; import io.kubernetes.client.openapi.models.V1Pod; import io.kubernetes.client.openapi.models.V1PodList; +import io.kubernetes.client.openapi.models.V1RoleBinding; import io.kubernetes.client.openapi.models.V1Secret; import io.kubernetes.client.openapi.models.V1SecretList; import io.kubernetes.client.openapi.models.V1Service; import io.kubernetes.client.openapi.models.V1ServiceAccount; +import io.kubernetes.client.openapi.models.V1ServiceList; import oracle.weblogic.domain.DomainList; import oracle.weblogic.kubernetes.actions.impl.AppBuilder; import oracle.weblogic.kubernetes.actions.impl.AppParams; +import oracle.weblogic.kubernetes.actions.impl.ClusterRole; import oracle.weblogic.kubernetes.actions.impl.ClusterRoleBinding; import oracle.weblogic.kubernetes.actions.impl.ConfigMap; import oracle.weblogic.kubernetes.actions.impl.Domain; import oracle.weblogic.kubernetes.actions.impl.Exec; import oracle.weblogic.kubernetes.actions.impl.Grafana; import oracle.weblogic.kubernetes.actions.impl.GrafanaParams; +import oracle.weblogic.kubernetes.actions.impl.Ingress; import oracle.weblogic.kubernetes.actions.impl.Job; import oracle.weblogic.kubernetes.actions.impl.Namespace; import oracle.weblogic.kubernetes.actions.impl.Nginx; @@ -44,6 +49,8 @@ import oracle.weblogic.kubernetes.actions.impl.Secret; import oracle.weblogic.kubernetes.actions.impl.Service; import oracle.weblogic.kubernetes.actions.impl.ServiceAccount; +import oracle.weblogic.kubernetes.actions.impl.Voyager; +import oracle.weblogic.kubernetes.actions.impl.VoyagerParams; import oracle.weblogic.kubernetes.actions.impl.primitive.Docker; import oracle.weblogic.kubernetes.actions.impl.primitive.Helm; import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; @@ -51,11 +58,12 @@ import oracle.weblogic.kubernetes.actions.impl.primitive.WebLogicImageTool; import oracle.weblogic.kubernetes.actions.impl.primitive.WitParams; import oracle.weblogic.kubernetes.extensions.ImageBuilders; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import oracle.weblogic.kubernetes.utils.ExecResult; import org.joda.time.DateTime; import static oracle.weblogic.kubernetes.actions.impl.Prometheus.uninstall; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -170,8 +178,8 @@ public static boolean shutdownDomain(String domainUid, String namespace) { * @param namespace name of namespace * @return true on success, false otherwise */ - public static boolean restartDomain(String domainUid, String namespace) { - return Domain.restart(domainUid, namespace); + public static boolean startDomain(String domainUid, String namespace) { + return Domain.start(domainUid, namespace); } /** @@ -200,6 +208,43 @@ public static boolean patchDomainCustomResource(String domainUid, String namespa return Domain.patchDomainCustomResource(domainUid, namespace, patch, patchFormat); } + /** + * Patch a running domain with introspectVersion. + * If the introspectVersion doesn't exist it will add the value as 2, + * otherwise the value is updated by 1. + * + * @param domainUid UID of the domain to patch with introspectVersion + * @param namespace namespace in which the domain resource exists + * @return true if patching is successful, otherwise false + * @throws ApiException when patching fails + */ + public static boolean patchDomainResourceWithNewIntrospectVersion( + String domainUid, String namespace) throws ApiException { + return Domain.patchDomainResourceWithNewIntrospectVersion(domainUid, namespace); + } + + /** + * Get next introspectVersion for a given domain. + * + * @param domainUid domain id + * @param namespace namespace in which the domain resource exists + * @return String containing next introspectVersion + * @throws ApiException when getting domain resource fails + */ + public static String getNextIntrospectVersion(String domainUid, String namespace) throws ApiException { + LoggingFacade logger = getLogger(); + oracle.weblogic.domain.Domain domain = Domain.getDomainCustomResource(domainUid, namespace); + String introspectVersion = domain.getSpec().getIntrospectVersion(); + if (null != introspectVersion) { + logger.info("current introspectVersion: {0}", introspectVersion); + introspectVersion = Integer.toString(Integer.valueOf(introspectVersion) + 1); + logger.info("modified introspectVersion: {0}", introspectVersion); + } else { + introspectVersion = Integer.toString(1); + } + return introspectVersion; + } + /** * Scale the cluster of the domain in the specified namespace by patching the domain resource. * @@ -236,6 +281,39 @@ public static boolean scaleClusterWithRestApi(String domainUid, externalRestHttpsPort, opNamespace, opServiceAccount); } + /** + * Scale the cluster of the domain in the specified namespace with WLDF policy. + * + * @param clusterName name of the WebLogic cluster to be scaled in the domain + * @param domainUid domainUid of the domain to be scaled + * @param domainNamespace domain namespace in which the domain exists + * @param domainHomeLocation domain home location of the domain + * @param scalingAction scaling action, accepted value: scaleUp or scaleDown + * @param scalingSize number of servers to be scaled up or down + * @param opNamespace namespace of WebLogic operator + * @param opServiceAccount service account of operator + * @param myWebAppName web app name deployed to the domain used in the WLDF policy expression + * @param curlCommand curl command to call the web app used in the WLDF policy expression + * @return true if scaling the cluster succeeds, false otherwise + * @throws ApiException if Kubernetes client API call fails + * @throws IOException if an I/O error occurs + * @throws InterruptedException if any thread has interrupted the current thread + */ + public static boolean scaleClusterWithWLDF(String clusterName, + String domainUid, + String domainNamespace, + String domainHomeLocation, + String scalingAction, + int scalingSize, + String opNamespace, + String opServiceAccount, + String myWebAppName, + String curlCommand) + throws ApiException, IOException, InterruptedException { + return Domain.scaleClusterWithWLDF(clusterName, domainUid, domainNamespace, domainHomeLocation, scalingAction, + scalingSize, opNamespace, opServiceAccount, myWebAppName, curlCommand); + } + // ------------------------ Ingress Controller ---------------------- /** @@ -250,18 +328,14 @@ public static boolean installNginx(NginxParams params) { } /** - * Create an ingress for the WebLogic domain with domainUid in the specified domain namespace. - * The ingress host is set to 'domainUid.clusterName.test'. + * Install Voyager ingress controller. * - * @param ingressName the name of the ingress to be created - * @param domainNamespace the WebLogic domain namespace in which to create the ingress - * @param domainUid WebLogic domainUid which is backend to the ingress - * @param clusterNameMsPortMap the map with key as cluster name and value as managed server port of the cluster - * @return list of ingress hosts or null if got ApiException when calling Kubernetes client API to create ingress + * @param params the parameters to Helm install command, such as release name, namespace, repo url, + * repo name and chart name + * @return true on success, false otherwise */ - public static List createIngress(String ingressName, String domainNamespace, String domainUid, - Map clusterNameMsPortMap) { - return Nginx.createIngress(ingressName, domainNamespace, domainUid, clusterNameMsPortMap); + public static boolean installVoyager(VoyagerParams params) { + return Voyager.install(params); } /** @@ -274,6 +348,16 @@ public static boolean upgradeNginx(NginxParams params) { return Nginx.upgrade(params); } + /** + * Upgrade Voyager release. + * + * @param params the parameters to Helm upgrade command, such as release name and http/https nodeport + * @return true on success, false otherwise + */ + public static boolean upgradeVoyager(VoyagerParams params) { + return Voyager.upgrade(params); + } + /** * Uninstall the NGINX release. * @@ -284,6 +368,41 @@ public static boolean uninstallNginx(HelmParams params) { return Nginx.uninstall(params); } + /** + * Uninstall the Voyager release. + * + * @param params the parameters to Helm uninstall command, such as release name and namespace + * @return true on success, false otherwise + */ + public static boolean uninstallVoyager(HelmParams params) { + return Voyager.uninstall(params); + } + + /** + * Create an ingress for the WebLogic domain with domainUid in the specified domain namespace. + * The ingress host is set to 'domainUid.clusterName.test'. + * + * @param ingressName the name of the ingress to be created + * @param domainNamespace the WebLogic domain namespace in which to create the ingress + * @param domainUid WebLogic domainUid which is backend to the ingress + * @param clusterNameMsPortMap the map with key as cluster name and value as managed server port of the cluster + * @param annotations annotations to create ingress resource + * @param setIngressHost if true set to specific host or all + * @return list of ingress hosts or null if got ApiException when calling Kubernetes client API to create ingress + */ + public static List createIngress(String ingressName, + String domainNamespace, + String domainUid, + Map clusterNameMsPortMap, + Map annotations, + boolean setIngressHost) { + return Ingress.createIngress(ingressName, + domainNamespace, + domainUid, + clusterNameMsPortMap, + annotations, setIngressHost); + } + /** * Get a list of ingresses in the specified namespace. * @@ -292,7 +411,7 @@ public static boolean uninstallNginx(HelmParams params) { * @throws ApiException if Kubernetes client API call fails */ public static List listIngresses(String namespace) throws ApiException { - return Nginx.listIngresses(namespace); + return Ingress.listIngresses(namespace); } // ------------------------- namespaces ------------------------------- @@ -367,7 +486,7 @@ public static WitParams defaultWitParams() { /** * Create an image using WDT models using WebLogic Image Tool. * - * @param params - the parameters for creating a Docker image with a model + * @param params - the parameters for creating a model-in-image Docker image * @return true if the operation succeeds */ public static boolean createImage(WitParams params) { @@ -496,6 +615,16 @@ public static boolean createService(V1Service service) throws ApiException { return Service.create(service); } + /** + * List services in a namespace. + * + * @param namespace namespace in which to list services + * @return V1ServiceList + */ + public static V1ServiceList listServices(String namespace) { + return Service.listServices(namespace); + } + /** * Delete Kubernetes Service. * @@ -570,26 +699,59 @@ public static boolean deleteServiceAccount(String name, String namespace) { // ----------------------- Role-based access control (RBAC) --------------------------- /** - * Create a Cluster Role Binding. + * Create a cluster role. * - * @param clusterRoleBinding V1ClusterRoleBinding object containing role binding configuration - * data - * @return true if successful + * @param clusterRole V1ClusterRole object containing cluster role configuration data + * @return true if creation is successful, false otherwise + * @throws ApiException if Kubernetes client API call fails + */ + public static boolean createClusterRole(V1ClusterRole clusterRole) throws ApiException { + return ClusterRole.createClusterRole(clusterRole); + } + + /** + * Create a cluster role binding. + * + * @param clusterRoleBinding V1ClusterRoleBinding object containing cluster role binding configuration data + * @return true if creation is successful, false otherwise * @throws ApiException if Kubernetes client API call fails */ public static boolean createClusterRoleBinding(V1ClusterRoleBinding clusterRoleBinding) throws ApiException { - return ClusterRoleBinding.create(clusterRoleBinding); + return ClusterRoleBinding.createClusterRoleBinding(clusterRoleBinding); } /** - * Delete Cluster Role Binding. + * Create a role binding in the specified namespace. + * + * @param namespace the namespace in which the role binding to be created + * @param roleBinding V1RoleBinding object containing role binding configuration data + * @return true if the creation succeeds, false otherwise + * @throws ApiException if Kubernetes client call fails + */ + public static boolean createRoleBinding(String namespace, V1RoleBinding roleBinding) throws ApiException { + return Kubernetes.createNamespacedRoleBinding(namespace, roleBinding); + } + + /** + * Delete cluster role binding. * * @param name name of cluster role binding - * @return true if successful, false otherwise + * @return true if deletion is successful, false otherwise */ public static boolean deleteClusterRoleBinding(String name) { - return ClusterRoleBinding.delete(name); + return ClusterRoleBinding.deleteClusterRoleBinding(name); + } + + /** + * Delete a cluster role. + * + * @param name the name of cluster role to delete + * @return true if deletion succeeds, false otherwise + * @throws ApiException if Kubernetes client API call fails + */ + public static boolean deleteClusterRole(String name) throws ApiException { + return ClusterRole.deleteClusterRole(name); } // ----------------------- Helm ----------------------------------- @@ -618,9 +780,9 @@ public static AppParams defaultAppParams() { /** * Create an application archive that can be used by WebLogic Image Tool - * to create an image with the application. + * to create an image with the application for a model-in-image use case. * - * @param params the parameters for creating a Docker image + * @param params the parameters for creating a model-in-image Docker image * @return true if the operation succeeds */ public static boolean buildAppArchive(AppParams params) { @@ -630,17 +792,31 @@ public static boolean buildAppArchive(AppParams params) { .build(); } + /** + * Create an application archive that can be used by WebLogic Image Tool + * to create an image with coh-proxy-server.gar for testing Coherence use case + * + * @param params the parameters for creating a model-in-image Docker image + * @return true if the operation succeeds + */ + public static boolean buildCoherenceArchive(AppParams params) { + return + AppBuilder + .withParams(params) + .buildCoherence(); + } + /** * Archive an application from provided ear or war file that can be used by WebLogic Image Tool - * to create an image with the application. + * to create an image with the application for a model-in-image use case. * - * @param params the parameters for creating a Docker image + * @param params the parameters for creating a model-in-image Docker image * @return true if the operation succeeds */ public static boolean archiveApp(AppParams params) { return AppBuilder - .withParams(params) - .archiveApp(); + .withParams(params) + .archiveApp(); } // ------------------------ Docker -------------------------------------- @@ -802,6 +978,19 @@ public static V1Pod getPod(String namespace, String labelSelector, String podNam return Pod.getPod(namespace, labelSelector, podName); } + /** + * Get the IP address allocated to the pod with following parameters. + * + * @param namespace namespace in which to check for the pod existence + * @param labelSelector in the format "weblogic.domainUID in (%s)" + * @param podName name of the pod to return + * @return IP address allocated to the pod + * @throws ApiException if Kubernetes client API call fails + **/ + public static String getPodIP(String namespace, String labelSelector, String podName) throws ApiException { + return Pod.getPodIP(namespace, labelSelector, podName); + } + /** * Get a pod's log. * @@ -826,6 +1015,17 @@ public static V1PodList listPods(String namespace, String labelSelectors) throws return Pod.listPods(namespace, labelSelectors); } + /** + * Delete a pod in a given namespace. + * + * @param podName name of the pod to be deleted + * @param namespace Kubernetes namespace that the pod is running in + * @throws ApiException if Kubernetes client API call fails + */ + public static void deletePod(String podName, String namespace) throws ApiException { + Kubernetes.deletePod(podName, namespace); + } + /** * Get the weblogic.domainRestartVersion label from a given pod. * @@ -978,6 +1178,7 @@ public static boolean uninstallGrafana(HelmParams params) { */ public static String patchDomainResourceWithNewRestartVersion( String domainResourceName, String namespace) { + LoggingFacade logger = getLogger(); String oldVersion = assertDoesNotThrow( () -> getDomainCustomResource(domainResourceName, namespace).getSpec().getRestartVersion(), String.format("Failed to get the restartVersion of %s in namespace %s", domainResourceName, namespace)); @@ -1003,4 +1204,14 @@ public static String patchDomainResourceWithNewRestartVersion( return String.valueOf(newVersion); } + /** + * Get the name of the operator pod. + * + * @param release release name of the operator + * @param namespace Kubernetes namespace that the operator belongs to + * @throws ApiException if Kubernetes client API call fails + */ + public static String getOperatorPodName(String release, String namespace) throws ApiException { + return Kubernetes.getOperatorPodName(release, namespace); + } } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/AppBuilder.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/AppBuilder.java index 92bfc0f3cfd..3754344c547 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/AppBuilder.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/AppBuilder.java @@ -10,8 +10,6 @@ import java.util.List; import oracle.weblogic.kubernetes.actions.impl.primitive.Command; -import oracle.weblogic.kubernetes.logging.LoggingFacade; -import oracle.weblogic.kubernetes.logging.LoggingFactory; import static oracle.weblogic.kubernetes.actions.ActionConstants.APP_DIR; import static oracle.weblogic.kubernetes.actions.ActionConstants.ARCHIVE_DIR; @@ -19,14 +17,13 @@ import static oracle.weblogic.kubernetes.utils.FileUtils.checkDirectory; import static oracle.weblogic.kubernetes.utils.FileUtils.cleanupDirectory; import static oracle.weblogic.kubernetes.utils.FileUtils.copyFolder; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; /** * Implementation of actions that build an application archive file. */ public class AppBuilder { - private static final LoggingFacade logger = LoggingFactory.getLogger(AppBuilder.class); - private static final String ARCHIVE_SRC_DIR = ARCHIVE_DIR + "/wlsdeploy/applications"; private AppParams params; @@ -77,7 +74,7 @@ public boolean build() { ARCHIVE_SRC_DIR); } } catch (IOException ioe) { - logger.severe("Failed to get the directory " + ARCHIVE_DIR + " ready", ioe); + getLogger().severe("Failed to get the directory " + ARCHIVE_DIR + " ready", ioe); return false; } @@ -97,6 +94,39 @@ public boolean build() { return jarBuilt && zipBuilt; } + /** + * Build an application archive using a pre-populated AppParams instance. + * @return true if the command succeeds + */ + public boolean buildCoherence() { + // prepare the archive directory and copy over the app src + try { + cleanupDirectory(ARCHIVE_SRC_DIR); + checkDirectory(ARCHIVE_SRC_DIR); + for (String item : params.srcDirList()) { + copyFolder(APP_DIR + "/" + item, ARCHIVE_SRC_DIR); + } + } catch (IOException ioe) { + getLogger().info("Failed to get the directory " + ARCHIVE_DIR + " ready", ioe); + return false; + } + + // make sure that we always have an app name + if (params.appName() == null) { + params.appName(params.srcDirList().get(0)); + } + + // build the app archive + String jarPath = String.format("%s.gar", params.appName()); + boolean jarBuilt = buildJarArchive(jarPath, ARCHIVE_SRC_DIR); + + // build a zip file that can be passed to WIT + String zipPath = String.format("%s/%s.zip", ARCHIVE_DIR, params.appName()); + boolean zipBuilt = buildCoherenceZipArchive(zipPath, ARCHIVE_DIR); + + return jarBuilt && zipBuilt; + } + /** * Build an archive that includes the contents in srcDir. * @@ -123,11 +153,16 @@ private boolean buildJarArchive( * @param zipPath zip file path for the resulting archive * @param srcDir source directory */ - private boolean buildZipArchive( + public boolean buildZipArchive( String zipPath, String srcDir ) { + // make sure that we always have an app name + if (params.appName() == null) { + params.appName(params.srcDirList().get(0)); + } + String cmd = String.format( "cd %s ; zip %s wlsdeploy/applications/%s.ear ", srcDir, @@ -141,9 +176,35 @@ private boolean buildZipArchive( .execute(); } + /** + * Build a zip archive that includes coh-proxy-server.gar in the srcDir. + * + * @param zipPath zip file path for the resulting archive + * @param srcDir source directory + */ + public boolean buildCoherenceZipArchive(String zipPath, String srcDir) { + + // make sure that we always have an app name + if (params.appName() == null) { + params.appName(params.srcDirList().get(0)); + } + + String cmd = String.format( + "cd %s ; zip %s wlsdeploy/applications/%s.gar ", + srcDir, + zipPath, + params.appName()); + + return Command.withParams( + defaultCommandParams() + .command(cmd) + .redirect(false)) + .execute(); + } + /** * Archive an application from provided ear or war file that can be used by WebLogic Image Tool - * to create an image with the application. + * to create an image with the application for a model-in-image use case. * * @return true if the operation succeeds */ @@ -157,14 +218,14 @@ public boolean archiveApp() { checkDirectory(appDir); for (String appSrcFile : srcFiles) { if (appSrcFile.length() > 0) { - logger.info("copy {0]} to {1} ", appSrcFile, appDir); + getLogger().info("copy {0]} to {1} ", appSrcFile, appDir); String fileName = appSrcFile.substring(appSrcFile.lastIndexOf("/") + 1); Files.copy(Paths.get(appSrcFile), Paths.get(appDir + "/" + fileName), StandardCopyOption.REPLACE_EXISTING); } } } catch (IOException ioe) { - logger.severe("Failed to get the directory " + ARCHIVE_DIR + " ready", ioe); + getLogger().severe("Failed to get the directory " + ARCHIVE_DIR + " ready", ioe); return false; } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/ClusterRole.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/ClusterRole.java new file mode 100644 index 00000000000..f986ab95d4a --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/ClusterRole.java @@ -0,0 +1,34 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.actions.impl; + +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1ClusterRole; +import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; + +public class ClusterRole { + + /** + * Create a Cluster Role. + * + * @param clusterRole V1ClusterRole object containing cluster role configuration data + * @return true if creation is successful, false otherwise + * @throws ApiException if Kubernetes client API call fails + */ + public static boolean createClusterRole(V1ClusterRole clusterRole) throws ApiException { + return Kubernetes.createClusterRole(clusterRole); + } + + /** + * Delete Cluster Role. + * + * @param name name of cluster role + * @return true if deletion is successful, false otherwise + * @throws ApiException if Kubernetes client API call fails + */ + public static boolean deleteClusterRole(String name) throws ApiException { + return Kubernetes.deleteClusterRole(name); + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/ClusterRoleBinding.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/ClusterRoleBinding.java index b58261574dc..fe40250e236 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/ClusterRoleBinding.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/ClusterRoleBinding.java @@ -17,7 +17,7 @@ public class ClusterRoleBinding { * @return true if successful * @throws ApiException if Kubernetes client API call fails */ - public static boolean create(V1ClusterRoleBinding clusterRoleBinding) throws ApiException { + public static boolean createClusterRoleBinding(V1ClusterRoleBinding clusterRoleBinding) throws ApiException { return Kubernetes.createClusterRoleBinding(clusterRoleBinding); } @@ -27,7 +27,8 @@ public static boolean create(V1ClusterRoleBinding clusterRoleBinding) throws Api * @param name name of cluster role binding * @return true if successful, false otherwise */ - public static boolean delete(String name) { + public static boolean deleteClusterRoleBinding(String name) { return Kubernetes.deleteClusterRoleBinding(name); } + } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Domain.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Domain.java index af0395213bf..5274d88665c 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Domain.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Domain.java @@ -3,20 +3,53 @@ package oracle.weblogic.kubernetes.actions.impl; +import java.io.IOException; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Base64; import java.util.List; import io.kubernetes.client.custom.V1Patch; import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1ClusterRole; +import io.kubernetes.client.openapi.models.V1ClusterRoleBinding; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1Pod; +import io.kubernetes.client.openapi.models.V1PolicyRule; +import io.kubernetes.client.openapi.models.V1RoleBinding; +import io.kubernetes.client.openapi.models.V1RoleRef; +import io.kubernetes.client.openapi.models.V1Subject; import oracle.weblogic.domain.Cluster; import oracle.weblogic.domain.DomainList; import oracle.weblogic.kubernetes.actions.impl.primitive.Command; import oracle.weblogic.kubernetes.actions.impl.primitive.CommandParams; import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.utils.ExecResult; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.TestConstants.PROJECT_ROOT; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RBAC_API_GROUP; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RBAC_API_VERSION; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RBAC_CLUSTER_ROLE; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RBAC_CLUSTER_ROLE_BINDING; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RBAC_ROLE_BINDING; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLDF_CLUSTER_ROLE_BINDING_NAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLDF_CLUSTER_ROLE_NAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLDF_ROLE_BINDING_NAME; +import static oracle.weblogic.kubernetes.actions.impl.ClusterRole.createClusterRole; +import static oracle.weblogic.kubernetes.actions.impl.ClusterRoleBinding.createClusterRoleBinding; +import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.copyFileToPod; +import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.createNamespacedRoleBinding; +import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.exec; +import static oracle.weblogic.kubernetes.assertions.impl.ClusterRole.clusterRoleExists; +import static oracle.weblogic.kubernetes.assertions.impl.ClusterRoleBinding.clusterRoleBindingExists; +import static oracle.weblogic.kubernetes.assertions.impl.RoleBinding.roleBindingExists; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; public class Domain { @@ -49,10 +82,11 @@ public static DomainList listDomainCustomResources(String namespace) { * @return true if patching domain custom resource succeeded, false otherwise */ public static boolean shutdown(String domainUid, String namespace) { + LoggingFacade logger = getLogger(); // change the /spec/serverStartPolicy to NEVER to shut down all servers in the domain // create patch string to shut down the domain StringBuffer patchStr = new StringBuffer("[{") - .append("\"op\": \"add\", ") + .append("\"op\": \"replace\", ") .append("\"path\": \"/spec/serverStartPolicy\", ") .append("\"value\": \"NEVER\"") .append("}]"); @@ -66,14 +100,14 @@ public static boolean shutdown(String domainUid, String namespace) { } /** - * Restart a domain in the specified namespace. + * Start domain in the specified namespace. * * @param domainUid the domain to restart * @param namespace the namespace in which the domain exists * @return true if patching domain resource succeeded, false otherwise */ - public static boolean restart(String domainUid, String namespace) { - + public static boolean start(String domainUid, String namespace) { + LoggingFacade logger = getLogger(); // change the /spec/serverStartPolicy to IF_NEEDED to start all servers in the domain // create patch string to start the domain StringBuffer patchStr = new StringBuffer("[{") @@ -110,7 +144,7 @@ public static boolean deleteDomainCustomResource(String domainUid, String namesp * @throws ApiException if Kubernetes request fails */ public static oracle.weblogic.domain.Domain getDomainCustomResource(String domainUid, - String namespace) throws ApiException { + String namespace) throws ApiException { return Kubernetes.getDomainCustomResource(domainUid, namespace); } @@ -125,10 +159,52 @@ public static oracle.weblogic.domain.Domain getDomainCustomResource(String domai * @return true if successful, false otherwise */ public static boolean patchDomainCustomResource(String domainUid, String namespace, V1Patch patch, - String patchFormat) { + String patchFormat) { return Kubernetes.patchDomainCustomResource(domainUid, namespace, patch, patchFormat); } + /** + * Patch a running domain with introspectVersion. + * If the introspectVersion doesn't exist it will add the value as 2, + * otherwise the value is updated by 1. + * + * @param domainUid UID of the domain to patch with introspectVersion + * @param namespace namespace in which the domain resource exists + * @return true if patching is successful, otherwise false + * @throws ApiException when patching fails + */ + public static boolean patchDomainResourceWithNewIntrospectVersion( + String domainUid, String namespace) throws ApiException { + LoggingFacade logger = getLogger(); + StringBuffer patchStr; + oracle.weblogic.domain.Domain res = getDomainCustomResource(domainUid, namespace); + // construct the patch string + if (res.getSpec().getIntrospectVersion() == null) { + patchStr = new StringBuffer("[{") + .append("\"op\": \"add\", ") + .append("\"path\": \"/spec/introspectVersion\", ") + .append("\"value\": \"2") + .append("\"}]"); + } else { + int introspectVersion = Integer.parseInt(res.getSpec().getIntrospectVersion()) + 1; + patchStr = new StringBuffer("[{") + .append("\"op\": \"replace\", ") + .append("\"path\": \"/spec/introspectVersion\", ") + .append("\"value\": \"") + .append(introspectVersion) + .append("\"}]"); + } + + logger.info("Patch String \n{0}", patchStr); + logger.info("Adding/updating introspectVersion in domain {0} in namespace {1} using patch string: {2}", + domainUid, namespace, patchStr.toString()); + + // patch the domain + V1Patch patch = new V1Patch(new String(patchStr)); + return patchDomainCustomResource(domainUid, namespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH); + + } + /** * Scale the cluster of the domain in the specified namespace. * @@ -141,7 +217,7 @@ public static boolean patchDomainCustomResource(String domainUid, String namespa */ public static boolean scaleCluster(String domainUid, String namespace, String clusterName, int numOfServers) throws ApiException { - + LoggingFacade logger = getLogger(); // get the domain cluster list oracle.weblogic.domain.Domain domain = getDomainCustomResource(domainUid, namespace); @@ -194,7 +270,7 @@ public static boolean scaleClusterWithRestApi(String domainUid, int externalRestHttpsPort, String opNamespace, String opServiceAccount) { - + LoggingFacade logger = getLogger(); logger.info("Getting the secret of service account {0} in namespace {1}", opServiceAccount, opNamespace); String secretName = Secret.getSecretOfServiceAccount(opNamespace, opServiceAccount); if (secretName.isEmpty()) { @@ -250,4 +326,238 @@ public static boolean scaleClusterWithRestApi(String domainUid, return Command.withParams(params).execute(); } + + /** + * Scale the cluster of the domain in the specified namespace with WLDF. + * + * @param clusterName name of the WebLogic cluster to be scaled in the domain + * @param domainUid domainUid of the domain to be scaled + * @param domainNamespace domain namespace in which the domain exists + * @param domainHomeLocation domain home location of the domain + * @param scalingAction scaling action, accepted value: scaleUp or scaleDown + * @param scalingSize number of servers to be scaled up or down + * @param opNamespace namespace of WebLogic operator + * @param opServiceAccount service account of operator + * @param myWebAppName web app name deployed to the domain used in the WLDF policy expression + * @param curlCommand curl command to call the web app used in the WLDF policy expression + * @return true if scaling the cluster succeeds, false otherwise + * @throws ApiException if Kubernetes client API call fails + * @throws IOException if an I/O error occurs + * @throws InterruptedException if any thread has interrupted the current thread + */ + public static boolean scaleClusterWithWLDF(String clusterName, + String domainUid, + String domainNamespace, + String domainHomeLocation, + String scalingAction, + int scalingSize, + String opNamespace, + String opServiceAccount, + String myWebAppName, + String curlCommand) + throws ApiException, IOException, InterruptedException { + LoggingFacade logger = getLogger(); + // create RBAC API objects for WLDF script + logger.info("Creating RBAC API objects for WLDF script"); + if (!createRbacApiObjectsForWLDFScript(domainNamespace, opNamespace)) { + return false; + } + + // copy scalingAction.sh to Admin Server pod + // NOTE: you must copy scalingAction.sh to $DOMAIN_HOME/bin/scripts on admin server pod + String adminServerPodName = domainUid + "-" + ADMIN_SERVER_NAME_BASE; + V1Pod adminPod = Kubernetes.getPod(domainNamespace, null, adminServerPodName); + if (adminPod == null) { + logger.info("The admin pod {0} does not exist in namespace {1}!", adminServerPodName, domainNamespace); + return false; + } + + // create $DOMAIN_HOME/bin/scripts directory on admin server pod + logger.info("Creating directory {0}/bin/scripts on admin server pod", domainHomeLocation); + ExecResult result = exec(adminPod, null, true, + "/bin/sh", "-c", "mkdir -p " + domainHomeLocation + "/bin/scripts"); + if (result.exitValue() != 0) { + return false; + } + + logger.info("Copying scalingAction.sh to admin server pod"); + try { + copyFileToPod(domainNamespace, adminServerPodName, null, + Paths.get(PROJECT_ROOT + "/../src/scripts/scaling/scalingAction.sh"), + Paths.get(domainHomeLocation + "/bin/scripts/scalingAction.sh")); + } catch (ApiException apex) { + logger.severe("Got ApiException while copying file to admin pod {0}", apex.getResponseBody()); + return false; + } catch (IOException ioex) { + logger.severe("Got IOException while copying file to admin pod {0}", ioex.getStackTrace()); + return false; + } + + logger.info("Adding execute mode for scalingAction.sh"); + result = exec(adminPod, null, true, + "/bin/sh", "-c", "chmod +x " + domainHomeLocation + "/bin/scripts/scalingAction.sh"); + if (result.exitValue() != 0) { + return false; + } + + // copy wldf.py and callpyscript.sh to Admin Server pod + logger.info("Copying wldf.py and callpyscript.sh to admin server pod"); + try { + copyFileToPod(domainNamespace, adminServerPodName, null, + Paths.get(RESOURCE_DIR, "python-scripts", "wldf.py"), + Paths.get("/u01/oracle/wldf.py")); + + copyFileToPod(domainNamespace, adminServerPodName, null, + Paths.get(RESOURCE_DIR, "bash-scripts", "callpyscript.sh"), + Paths.get("/u01/oracle/callpyscript.sh")); + } catch (ApiException apex) { + logger.severe("Got ApiException while copying file to admin pod {0}", apex.getResponseBody()); + return false; + } catch (IOException ioex) { + logger.severe("Got IOException while copying file to admin pod {0}", ioex.getStackTrace()); + return false; + } + + logger.info("Adding execute mode for callpyscript.sh"); + result = exec(adminPod, null, true, + "/bin/sh", "-c", "chmod +x /u01/oracle/callpyscript.sh"); + if (result.exitValue() != 0) { + return false; + } + + if (!scalingAction.equals("scaleUp") && !scalingAction.equals("scaleDown")) { + logger.info("Set scaleAction to either scaleUp or scaleDown"); + return false; + } + + logger.info("Creating WLDF policy rule and action"); + String command = new StringBuffer("/u01/oracle/callpyscript.sh /u01/oracle/wldf.py ") + .append(ADMIN_USERNAME_DEFAULT) + .append(" ") + .append(ADMIN_PASSWORD_DEFAULT) + .append(" t3://") + .append(adminServerPodName) + .append(":7001 ") + .append(scalingAction) + .append(" ") + .append(domainUid) + .append(" ") + .append(clusterName) + .append(" ") + .append(domainNamespace) + .append(" ") + .append(opNamespace) + .append(" ") + .append(opServiceAccount) + .append(" ") + .append(scalingSize) + .append(" ") + .append(myWebAppName).toString(); + + result = exec(adminPod, null, true, "/bin/sh", "-c", command); + if (result.exitValue() != 0) { + return false; + } + + // sleep for a while to make sure the diagnostic modules are created + try { + Thread.sleep(5000); + } catch (InterruptedException ex) { + // ignore + } + + // call the web app to trigger the WLDF policy which will call the script action to scale the cluster + CommandParams params = Command + .defaultCommandParams() + .command(curlCommand) + .saveResults(true) + .redirect(true); + + return Command.withParams(params).execute(); + } + + /** + * Create cluster role, cluster role binding and role binding used by WLDF script action. + * + * @param domainNamespace WebLogic domain namespace + * @param opNamespace WebLogic operator namespace + */ + private static boolean createRbacApiObjectsForWLDFScript(String domainNamespace, String opNamespace) + throws ApiException { + LoggingFacade logger = getLogger(); + // create cluster role + if (!clusterRoleExists(WLDF_CLUSTER_ROLE_NAME)) { + logger.info("Creating cluster role {0}", WLDF_CLUSTER_ROLE_NAME); + + V1ClusterRole v1ClusterRole = new V1ClusterRole() + .kind(RBAC_CLUSTER_ROLE) + .apiVersion(RBAC_API_VERSION) + .metadata(new V1ObjectMeta() + .name(WLDF_CLUSTER_ROLE_NAME)) + .addRulesItem(new V1PolicyRule() + .addApiGroupsItem("weblogic.oracle") + .addResourcesItem("domains") + .addVerbsItem("get") + .addVerbsItem("list") + .addVerbsItem("update")) + .addRulesItem(new V1PolicyRule() + .addApiGroupsItem("apiextensions.k8s.io") + .addResourcesItem("customresourcedefinitions") + .addVerbsItem("get") + .addVerbsItem("list")); + + if (!createClusterRole(v1ClusterRole)) { + return false; + } + } + + // create cluster role binding + if (!clusterRoleBindingExists(WLDF_CLUSTER_ROLE_BINDING_NAME)) { + logger.info("Creating cluster role binding {0}", WLDF_CLUSTER_ROLE_BINDING_NAME); + + V1ClusterRoleBinding v1ClusterRoleBinding = new V1ClusterRoleBinding() + .kind(RBAC_CLUSTER_ROLE_BINDING) + .apiVersion(RBAC_API_VERSION) + .metadata(new V1ObjectMeta() + .name(WLDF_CLUSTER_ROLE_BINDING_NAME)) + .addSubjectsItem(new V1Subject() + .kind("ServiceAccount") + .name("default") + .namespace(domainNamespace) + .apiGroup("")) + .roleRef(new V1RoleRef() + .kind(RBAC_CLUSTER_ROLE) + .name(WLDF_CLUSTER_ROLE_NAME) + .apiGroup(RBAC_API_GROUP)); + + if (!createClusterRoleBinding(v1ClusterRoleBinding)) { + return false; + } + } + + // create domain operator role binding + if (!roleBindingExists(WLDF_ROLE_BINDING_NAME, opNamespace)) { + logger.info("Creating role binding {0} in namespace {1}", WLDF_ROLE_BINDING_NAME, opNamespace); + + V1RoleBinding v1RoleBinding = new V1RoleBinding() + .kind(RBAC_ROLE_BINDING) + .apiVersion(RBAC_API_VERSION) + .metadata(new V1ObjectMeta() + .name(WLDF_ROLE_BINDING_NAME) + .namespace(opNamespace)) + .addSubjectsItem(new V1Subject() + .kind("ServiceAccount") + .name("default") + .namespace(domainNamespace) + .apiGroup("")) + .roleRef(new V1RoleRef() + .kind(RBAC_CLUSTER_ROLE) + .name("cluster-admin") + .apiGroup(RBAC_API_GROUP)); + + return createNamespacedRoleBinding(opNamespace, v1RoleBinding); + } + + return true; + } } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Ingress.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Ingress.java new file mode 100644 index 00000000000..c65558b3073 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Ingress.java @@ -0,0 +1,184 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.actions.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import io.kubernetes.client.custom.IntOrString; +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.NetworkingV1beta1HTTPIngressPath; +import io.kubernetes.client.openapi.models.NetworkingV1beta1HTTPIngressRuleValue; +import io.kubernetes.client.openapi.models.NetworkingV1beta1Ingress; +import io.kubernetes.client.openapi.models.NetworkingV1beta1IngressBackend; +import io.kubernetes.client.openapi.models.NetworkingV1beta1IngressList; +import io.kubernetes.client.openapi.models.NetworkingV1beta1IngressRule; +import io.kubernetes.client.openapi.models.NetworkingV1beta1IngressSpec; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; +import oracle.weblogic.kubernetes.logging.LoggingFacade; + +import static oracle.weblogic.kubernetes.actions.ActionConstants.INGRESS_API_VERSION; +import static oracle.weblogic.kubernetes.actions.ActionConstants.INGRESS_KIND; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; + +/** + * Utility class for ingress resource . + */ +public class Ingress { + + /** + * Create an ingress for the WebLogic domain with domainUid in the specified domain namespace. + * The ingress host is set to 'domainUid.domainNamespace.clusterName.test'. + * + * @param ingressName name of the ingress to be created + * @param domainNamespace the WebLogic domain namespace in which the ingress will be created + * @param domainUid the WebLogic domainUid which is backend to the ingress + * @param clusterNameMsPortMap the map with key as cluster name and value as managed server port of the cluster + * @param annotations annotations to create ingress resource + * @return list of ingress hosts or null if got ApiException when calling Kubernetes client API to create ingress + */ + public static List createIngress(String ingressName, + String domainNamespace, + String domainUid, + Map clusterNameMsPortMap, + Map annotations) { + LoggingFacade logger = getLogger(); + List ingressHostList = new ArrayList<>(); + ArrayList ingressRules = new ArrayList<>(); + clusterNameMsPortMap.forEach((clusterName, managedServerPort) -> { + // set the http ingress paths + NetworkingV1beta1HTTPIngressPath httpIngressPath = new NetworkingV1beta1HTTPIngressPath() + .path(null) + .backend(new NetworkingV1beta1IngressBackend() + .serviceName(domainUid + "-cluster-" + clusterName.toLowerCase().replace("_", "-")) + .servicePort(new IntOrString(managedServerPort)) + ); + ArrayList httpIngressPaths = new ArrayList<>(); + httpIngressPaths.add(httpIngressPath); + + // set the ingress rule + String ingressHost = domainUid + "." + domainNamespace + "." + clusterName + ".test"; + NetworkingV1beta1IngressRule ingressRule = new NetworkingV1beta1IngressRule() + .host(ingressHost) + .http(new NetworkingV1beta1HTTPIngressRuleValue() + .paths(httpIngressPaths)); + + ingressRules.add(ingressRule); + ingressHostList.add(ingressHost); + }); + + // set the ingress + NetworkingV1beta1Ingress ingress = new NetworkingV1beta1Ingress() + .apiVersion(INGRESS_API_VERSION) + .kind(INGRESS_KIND) + .metadata(new V1ObjectMeta() + .name(ingressName) + .namespace(domainNamespace) + .annotations(annotations)) + .spec(new NetworkingV1beta1IngressSpec() + .rules(ingressRules)); + + // create the ingress + try { + Kubernetes.createIngress(domainNamespace, ingress); + } catch (ApiException apex) { + logger.severe("got ApiException while calling createIngress: {0}", apex.getResponseBody()); + return null; + } + + return ingressHostList; + } + + /** + * Create an ingress for the WebLogic domain with domainUid in the specified domain namespace. + * The ingress host is set to 'domainUid.domainNamespace.clusterName.test'. + * + * @param ingressName name of the ingress to be created + * @param domainNamespace the WebLogic domain namespace in which the ingress will be created + * @param domainUid the WebLogic domainUid which is backend to the ingress + * @param clusterNameMsPortMap the map with key as cluster name and value as managed server port of the cluster + * @param annotations annotations to create ingress resource + * @param setIngressHost if false does not set ingress host + * @return list of ingress hosts or null if got ApiException when calling Kubernetes client API to create ingress + */ + public static List createIngress(String ingressName, + String domainNamespace, + String domainUid, + Map clusterNameMsPortMap, + Map annotations, boolean setIngressHost) { + + List ingressHostList = new ArrayList<>(); + ArrayList ingressRules = new ArrayList<>(); + clusterNameMsPortMap.forEach((clusterName, managedServerPort) -> { + // set the http ingress paths + NetworkingV1beta1HTTPIngressPath httpIngressPath = new NetworkingV1beta1HTTPIngressPath() + .path(null) + .backend(new NetworkingV1beta1IngressBackend() + .serviceName(domainUid + "-cluster-" + clusterName.toLowerCase().replace("_", "-")) + .servicePort(new IntOrString(managedServerPort)) + ); + ArrayList httpIngressPaths = new ArrayList<>(); + httpIngressPaths.add(httpIngressPath); + + // set the ingress rule + String ingressHost = domainUid + "." + domainNamespace + "." + clusterName + ".test"; + if (!setIngressHost) { + ingressHost = ""; + ingressHostList.add("*"); + } + NetworkingV1beta1IngressRule ingressRule = new NetworkingV1beta1IngressRule() + .host(ingressHost) + .http(new NetworkingV1beta1HTTPIngressRuleValue() + .paths(httpIngressPaths)); + + ingressRules.add(ingressRule); + ingressHostList.add(ingressHost); + }); + + // set the ingress + NetworkingV1beta1Ingress ingress = new NetworkingV1beta1Ingress() + .apiVersion(INGRESS_API_VERSION) + .kind(INGRESS_KIND) + .metadata(new V1ObjectMeta() + .name(ingressName) + .namespace(domainNamespace) + .annotations(annotations)) + .spec(new NetworkingV1beta1IngressSpec() + .rules(ingressRules)); + + // create the ingress + try { + Kubernetes.createIngress(domainNamespace, ingress); + } catch (ApiException apex) { + getLogger().severe("got ApiException while calling createIngress: {0}", apex.getResponseBody()); + return null; + } + + return ingressHostList; + } + + /** + * List all of the ingresses in the specified namespace. + * + * @param namespace the namespace to which the ingresses belong + * @return a list of ingress names in the namespace + * @throws ApiException if Kubernetes client API call fails + */ + public static List listIngresses(String namespace) throws ApiException { + + List ingressNames = new ArrayList<>(); + NetworkingV1beta1IngressList ingressList = Kubernetes.listNamespacedIngresses(namespace); + List listOfIngress = ingressList.getItems(); + + listOfIngress.forEach(ingress -> { + if (ingress.getMetadata() != null) { + ingressNames.add(ingress.getMetadata().getName()); + } + }); + + return ingressNames; + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Namespace.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Namespace.java index 04244d27e6e..1d7dab235ee 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Namespace.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Namespace.java @@ -12,7 +12,7 @@ import io.kubernetes.client.openapi.models.V1NamespaceList; import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; public class Namespace { public static Random random = new Random(System.currentTimeMillis()); @@ -98,7 +98,7 @@ public static void addLabelsToNamespace(String name, Map labels) } } if (!found) { - logger.severe("Namespace {0} not found or failed to add labels", name); + getLogger().severe("Namespace {0} not found or failed to add labels", name); } } } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Nginx.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Nginx.java index 2741a084946..1cccc27d03e 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Nginx.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Nginx.java @@ -10,26 +10,26 @@ import io.kubernetes.client.custom.IntOrString; import io.kubernetes.client.openapi.ApiException; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1HTTPIngressPath; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1HTTPIngressRuleValue; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Ingress; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1IngressBackend; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1IngressList; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1IngressRule; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1IngressSpec; +import io.kubernetes.client.openapi.models.NetworkingV1beta1HTTPIngressPath; +import io.kubernetes.client.openapi.models.NetworkingV1beta1HTTPIngressRuleValue; +import io.kubernetes.client.openapi.models.NetworkingV1beta1Ingress; +import io.kubernetes.client.openapi.models.NetworkingV1beta1IngressBackend; +import io.kubernetes.client.openapi.models.NetworkingV1beta1IngressList; +import io.kubernetes.client.openapi.models.NetworkingV1beta1IngressRule; +import io.kubernetes.client.openapi.models.NetworkingV1beta1IngressSpec; import io.kubernetes.client.openapi.models.V1ObjectMeta; import oracle.weblogic.kubernetes.actions.impl.primitive.Helm; import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; /** * Utility class for NGINX ingress controller. */ public class Nginx { - private static final String INGRESS_API_VERSION = "extensions/v1beta1"; + private static final String INGRESS_API_VERSION = "networking.k8s.io/v1beta1"; private static final String INGRESS_KIND = "Ingress"; private static final String INGRESS_NGINX_CLASS = "nginx"; @@ -78,51 +78,75 @@ public static List createIngress(String ingressName, String domainNamespace, String domainUid, Map clusterNameMsPortMap) { + return createIngress(ingressName, domainNamespace, domainUid, clusterNameMsPortMap, true); + } + + /** + * Create an ingress for the WebLogic domain with domainUid in the specified domain namespace. + * The ingress host is set to 'domainUid.domainNamespace.clusterName.test'. + * + * @param ingressName name of the ingress to be created + * @param domainNamespace the WebLogic domain namespace in which the ingress will be created + * @param domainUid the WebLogic domainUid which is backend to the ingress + * @param clusterNameMsPortMap the map with key as cluster name and value as managed server port of the cluster + * @param setIngressHost if false will set to any + * @return list of ingress hosts or null if got ApiException when calling Kubernetes client API to create ingress + */ + public static List createIngress(String ingressName, + String domainNamespace, + String domainUid, + Map clusterNameMsPortMap, + boolean setIngressHost) { // set the annotation for kubernetes.io/ingress.class to "nginx" HashMap annotation = new HashMap<>(); annotation.put("kubernetes.io/ingress.class", INGRESS_NGINX_CLASS); List ingressHostList = new ArrayList<>(); - ArrayList ingressRules = new ArrayList<>(); + ArrayList ingressRules = new ArrayList<>(); clusterNameMsPortMap.forEach((clusterName, managedServerPort) -> { // set the http ingress paths - ExtensionsV1beta1HTTPIngressPath httpIngressPath = new ExtensionsV1beta1HTTPIngressPath() - .path(null) - .backend(new ExtensionsV1beta1IngressBackend() - .serviceName(domainUid + "-cluster-" + clusterName.toLowerCase().replace("_", "-")) - .servicePort(new IntOrString(managedServerPort)) - ); - ArrayList httpIngressPaths = new ArrayList<>(); + NetworkingV1beta1HTTPIngressPath httpIngressPath = new NetworkingV1beta1HTTPIngressPath() + .path(null) + .backend(new NetworkingV1beta1IngressBackend() + .serviceName(domainUid + "-cluster-" + clusterName.toLowerCase().replace("_", "-")) + .servicePort(new IntOrString(managedServerPort)) + ); + ArrayList httpIngressPaths = new ArrayList<>(); httpIngressPaths.add(httpIngressPath); // set the ingress rule - String ingressHost = domainUid + "." + clusterName + ".test"; - ExtensionsV1beta1IngressRule ingressRule = new ExtensionsV1beta1IngressRule() - .host(ingressHost) - .http(new ExtensionsV1beta1HTTPIngressRuleValue() - .paths(httpIngressPaths)); + String ingressHost = domainUid + "." + domainNamespace + "." + clusterName + ".test"; + if (!setIngressHost) { + ingressHost = ""; + ingressHostList.add("*"); + } + NetworkingV1beta1IngressRule ingressRule = new NetworkingV1beta1IngressRule() + .host(ingressHost) + .http(new NetworkingV1beta1HTTPIngressRuleValue() + .paths(httpIngressPaths)); ingressRules.add(ingressRule); ingressHostList.add(ingressHost); + }); // set the ingress - ExtensionsV1beta1Ingress ingress = new ExtensionsV1beta1Ingress() - .apiVersion(INGRESS_API_VERSION) - .kind(INGRESS_KIND) - .metadata(new V1ObjectMeta() - .name(ingressName) - .namespace(domainNamespace) - .annotations(annotation)) - .spec(new ExtensionsV1beta1IngressSpec() - .rules(ingressRules)); + NetworkingV1beta1Ingress ingress = new NetworkingV1beta1Ingress() + .apiVersion(INGRESS_API_VERSION) + .kind(INGRESS_KIND) + .metadata(new V1ObjectMeta() + .name(ingressName) + .namespace(domainNamespace) + .annotations(annotation)) + .spec(new NetworkingV1beta1IngressSpec() + .rules(ingressRules)); // create the ingress try { Kubernetes.createIngress(domainNamespace, ingress); } catch (ApiException apex) { - logger.severe("got ApiException while calling createIngress: {0}", apex.getResponseBody()); + getLogger().severe("got ApiException while calling createIngress: {0}", apex.getResponseBody()); return null; } return ingressHostList; @@ -138,8 +162,8 @@ public static List createIngress(String ingressName, public static List listIngresses(String namespace) throws ApiException { List ingressNames = new ArrayList<>(); - ExtensionsV1beta1IngressList ingressList = Kubernetes.listNamespacedIngresses(namespace); - List listOfIngress = ingressList.getItems(); + NetworkingV1beta1IngressList ingressList = Kubernetes.listNamespacedIngresses(namespace); + List listOfIngress = ingressList.getItems(); listOfIngress.forEach(ingress -> { if (ingress.getMetadata() != null) { diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Operator.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Operator.java index a20f29c80eb..42a20f50719 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Operator.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Operator.java @@ -9,8 +9,6 @@ import oracle.weblogic.kubernetes.actions.impl.primitive.CommandParams; import oracle.weblogic.kubernetes.actions.impl.primitive.Helm; import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; -import oracle.weblogic.kubernetes.logging.LoggingFacade; -import oracle.weblogic.kubernetes.logging.LoggingFactory; import static oracle.weblogic.kubernetes.TestConstants.BRANCH_NAME_FROM_JENKINS; import static oracle.weblogic.kubernetes.TestConstants.BUILD_ID; @@ -22,7 +20,6 @@ * Action class with implementation methods for Operator. */ public class Operator { - private static final LoggingFacade logger = LoggingFactory.getLogger(Operator.class); /** * install helm chart. diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Pod.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Pod.java index 6f0293647ca..345ab203fdd 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Pod.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Pod.java @@ -8,15 +8,16 @@ import io.kubernetes.client.openapi.models.V1Pod; import io.kubernetes.client.openapi.models.V1PodList; import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; -import oracle.weblogic.kubernetes.extensions.LoggedTest; import org.joda.time.DateTime; -public class Pod implements LoggedTest { +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; + +public class Pod { /** * Delete Kubernetes Pod. * - * @param name name of the pod + * @param name name of the pod * @param namespace name of namespace * @return true if successful, false otherwise * @throws ApiException if Kubernetes client API call fails @@ -28,7 +29,7 @@ public static boolean deletePod(String name, String namespace) throws ApiExcepti /** * List Kubernetes pods in a namespace. * - * @param namespace name of namespace + * @param namespace name of namespace * @param labelSelectors with which pods are decorated * @return V1PodList list of pods * @throws ApiException if Kubernetes client API call fails @@ -40,7 +41,7 @@ public static V1PodList listPods(String namespace, String labelSelectors) throws /** * Get a pod's log. * - * @param podName name of the pod + * @param podName name of the pod * @param namespace name of the namespace * @return log as a String * @throws ApiException if Kubernetes client API call fails @@ -52,9 +53,9 @@ public static String getPodLog(String podName, String namespace) throws ApiExcep /** * Get the creationTimestamp for a given pod with following parameters. * - * @param namespace namespace in which to check for the pod existence + * @param namespace namespace in which to check for the pod existence * @param labelSelector in the format "weblogic.domainUID in (%s)" - * @param podName name of the pod + * @param podName name of the pod * @return creationTimestamp from metadata section of the pod * @throws ApiException if Kubernetes client API call fails */ @@ -66,9 +67,9 @@ public static DateTime getPodCreationTimestamp(String namespace, String labelSel /** * Get the Kubernetes pod object with following parameters. * - * @param namespace namespace in which to check for the pod existence + * @param namespace namespace in which to check for the pod existence * @param labelSelector in the format "weblogic.domainUID in (%s)" - * @param podName name of the pod + * @param podName name of the pod * @return V1Pod pod object * @throws ApiException if Kubernetes client API call fails */ @@ -76,12 +77,25 @@ public static V1Pod getPod(String namespace, String labelSelector, String podNam return Kubernetes.getPod(namespace, labelSelector, podName); } + /** + * Get the IP address allocated to the pod with following parameters. + * + * @param namespace namespace in which to check for the pod existence + * @param labelSelector in the format "weblogic.domainUID in (%s)" + * @param podName name of the pod to return + * @return IP address allocated to the pod + * @throws ApiException if Kubernetes client API call fails + */ + public static String getPodIP(String namespace, String labelSelector, String podName) throws ApiException { + return Kubernetes.getPodIP(namespace, labelSelector, podName); + } + /** * Patch domain to shutdown a WebLogic server by changing the value of * its serverStartPolicy property to NEVER. * - * @param domainUid unique domain identifier - * @param namespace name of the namespace + * @param domainUid unique domain identifier + * @param namespace name of the namespace * @param serverName name of the WebLogic server to shutdown * @return true if patching domain operation succeeds or false if the operation fails * @throws ApiException if Kubernetes client API call fails @@ -89,15 +103,15 @@ public static V1Pod getPod(String namespace, String labelSelector, String podNam public static boolean shutdownManagedServerUsingServerStartPolicy(String domainUid, String namespace, String serverName) throws ApiException { - return patchDomainUsingServerStartPolicy(domainUid, namespace, serverName,"NEVER"); + return patchDomainUsingServerStartPolicy(domainUid, namespace, serverName, "NEVER"); } /** * Patch domain to start a WebLogic server by changing the value of * its serverStartPolicy property to IF_NEEDED. * - * @param domainUid unique domain identifier - * @param namespace name of the namespace + * @param domainUid unique domain identifier + * @param namespace name of the namespace * @param serverName name of the WebLogic server to start * @return true if patching domain operation succeeds or false if the operation fails * @throws ApiException if Kubernetes client API call fails @@ -105,16 +119,16 @@ public static boolean shutdownManagedServerUsingServerStartPolicy(String domainU public static boolean startManagedServerUsingServerStartPolicy(String domainUid, String namespace, String serverName) throws ApiException { - return patchDomainUsingServerStartPolicy(domainUid, namespace, serverName,"IF_NEEDED"); + return patchDomainUsingServerStartPolicy(domainUid, namespace, serverName, "IF_NEEDED"); } /** * Patch domain to change the serverStartPolicy property of a WebLogic server. * - * @param domainUid unique domain identifier - * @param namespace name of the namespace + * @param domainUid unique domain identifier + * @param namespace name of the namespace * @param serverName name of the WebLogic server - * @param policy value for serverStartPolicy property + * @param policy value for serverStartPolicy property * @return true if patching domain operation succeeds or false if the operation fails * @throws ApiException if Kubernetes client API call fails **/ @@ -131,7 +145,7 @@ public static boolean patchDomainUsingServerStartPolicy(String domainUid, .append("\",\"serverStartPolicy\": \"") .append(policy) .append("\"}]}]"); - logger.info("Patch data to change serverStartPolicy is: {0}", patchData); + getLogger().info("Patch data to change serverStartPolicy is: {0}", patchData); // call Kubernetes API GenericKubernetesApi.patch to patch the domain V1Patch patch = new V1Patch(new String(patchData)); diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Service.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Service.java index 0a3e7024134..11809afdd8a 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Service.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Service.java @@ -6,6 +6,7 @@ import io.kubernetes.client.openapi.ApiException; import io.kubernetes.client.openapi.models.V1Service; +import io.kubernetes.client.openapi.models.V1ServiceList; import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; @@ -68,5 +69,15 @@ public static int getServicePort(String namespace, String serviceName, String ch return Kubernetes.getServicePort(namespace, serviceName, channelName); } + /** + * List services in a namespace. + * + * @param namespace namespace in which to list services + * @return V1ServiceList + */ + public static V1ServiceList listServices(String namespace) { + return Kubernetes.listServices(namespace); + } + } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Voyager.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Voyager.java new file mode 100644 index 00000000000..99eebc7818d --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Voyager.java @@ -0,0 +1,43 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.actions.impl; + +import oracle.weblogic.kubernetes.actions.impl.primitive.Helm; +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; + +/** + * Utility class for Voyager ingress controller. + */ +public class Voyager { + /** + * Install Voyager Helm chart. + * + * @param params the parameters to Helm install command such as release name, namespace, repo url or chart dir, + * chart name and chart values + * @return true on success, false otherwise + */ + public static boolean install(VoyagerParams params) { + return Helm.install(params.getHelmParams(), params.getValues()); + } + + /** + * Upgrade Voyager Helm release. + * + * @param params the parameters to Helm upgrade command such as release name, namespace and chart values to override + * @return true on success, false otherwise + */ + public static boolean upgrade(VoyagerParams params) { + return Helm.upgrade(params.getHelmParams(), params.getValues()); + } + + /** + * Uninstall Voyager Helm release. + * + * @param params the parameters to Helm uninstall command such as release name and namespace + * @return true on success, false otherwise + */ + public static boolean uninstall(HelmParams params) { + return Helm.uninstall(params); + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/VoyagerParams.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/VoyagerParams.java new file mode 100644 index 00000000000..7901b5b8b6f --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/VoyagerParams.java @@ -0,0 +1,62 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.actions.impl; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; + +/** + * All parameters needed to install Voyager ingress controller. + */ +public class VoyagerParams { + + // params used when installing Voyager + private static final String CLOUD_PROVIDER = "cloudProvider"; + private static final String ENABLE_VALIDATING_WEBHOOK = "apiserver.enableValidatingWebhook"; + + // Adding some of the most commonly used params for now + private String cloudProvider; + private boolean enableValidatingWebhook; + private HelmParams helmParams; + + public VoyagerParams cloudProvider(String cloudProvider) { + this.cloudProvider = cloudProvider; + return this; + } + + public VoyagerParams enableValidatingWebhook(boolean enableValidatingWebhook) { + this.enableValidatingWebhook = enableValidatingWebhook; + return this; + } + + public VoyagerParams helmParams(HelmParams helmParams) { + this.helmParams = helmParams; + return this; + } + + public HelmParams getHelmParams() { + return helmParams; + } + + /** + * Loads Helm values into a value map. + * + * @return Map of values + */ + public Map getValues() { + Map values = new HashMap<>(); + + if (cloudProvider != null && !cloudProvider.isEmpty()) { + values.put(CLOUD_PROVIDER, cloudProvider); + } + + values.put(ENABLE_VALIDATING_WEBHOOK, enableValidatingWebhook); + + values.values().removeIf(Objects::isNull); + return values; + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Command.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Command.java index 66f5c29eaad..7e3ff690c11 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Command.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Command.java @@ -5,16 +5,15 @@ import java.io.IOException; -import oracle.weblogic.kubernetes.logging.LoggingFacade; -import oracle.weblogic.kubernetes.logging.LoggingFactory; import oracle.weblogic.kubernetes.utils.ExecCommand; import oracle.weblogic.kubernetes.utils.ExecResult; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; + /** * Implementation of actions that perform command execution. */ public class Command { - private static final LoggingFacade logger = LoggingFactory.getLogger(Command.class); private CommandParams params; @@ -48,7 +47,7 @@ private Command params(CommandParams params) { */ public boolean execute() { if (params.verbose()) { - logger.info("Executing command {0}", params.command()); + getLogger().info("Executing command {0}", params.command()); } try { ExecResult result = ExecCommand.exec( @@ -63,15 +62,15 @@ public boolean execute() { // check exitValue to determine if the command execution has failed. if (params.verbose()) { if (result.exitValue() != 0) { - logger.severe("The command execution failed because it returned non-zero exit value: {0}.", result); + getLogger().severe("The command execution failed because it returned non-zero exit value: {0}.", result); } else { - logger.info("The command execution succeeded with result: {0}.", result); + getLogger().info("The command execution succeeded with result: {0}.", result); } } return result.exitValue() == 0; } catch (IOException | InterruptedException ie) { - logger.severe("The command execution failed", ie); + getLogger().severe("The command execution failed", ie); return false; } } @@ -84,7 +83,7 @@ public boolean execute() { */ public boolean executeAndVerify(String expectedResponse) { if (params.verbose()) { - logger.info("Executing command {0}", params.command()); + getLogger().info("Executing command {0}", params.command()); } try { ExecResult result = ExecCommand.exec( @@ -99,9 +98,9 @@ public boolean executeAndVerify(String expectedResponse) { // check exitValue to determine if the command execution has failed. if (params.verbose()) { if (result.exitValue() != 0) { - logger.severe("The command execution failed because it returned non-zero exit value: {0}.", result); + getLogger().severe("The command execution failed because it returned non-zero exit value: {0}.", result); } else { - logger.info("The command execution succeeded with result: {0}.", result); + getLogger().info("The command execution succeeded with result: {0}.", result); } } @@ -109,7 +108,7 @@ public boolean executeAndVerify(String expectedResponse) { && result.stdout() != null && result.stdout().contains(expectedResponse); } catch (IOException | InterruptedException ie) { - logger.severe("The command execution failed", ie); + getLogger().severe("The command execution failed", ie); return false; } } @@ -121,7 +120,7 @@ public boolean executeAndVerify(String expectedResponse) { */ public ExecResult executeAndReturnResult() { if (params.verbose()) { - logger.info("Executing command {0}", params.command()); + getLogger().info("Executing command {0}", params.command()); } ExecResult result = null; try { @@ -135,11 +134,9 @@ public ExecResult executeAndReturnResult() { } } catch (IOException | InterruptedException ie) { - logger.severe("The command execution failed", ie); + getLogger().severe("The command execution failed", ie); } return result; } - - } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Helm.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Helm.java index 03864ba4c38..ec79fc407e1 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Helm.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Helm.java @@ -5,15 +5,13 @@ import java.util.Map; -import oracle.weblogic.kubernetes.logging.LoggingFacade; -import oracle.weblogic.kubernetes.logging.LoggingFactory; import oracle.weblogic.kubernetes.utils.ExecCommand; import oracle.weblogic.kubernetes.utils.ExecResult; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.assertj.core.api.Assertions.assertThat; public class Helm { - private static final LoggingFacade logger = LoggingFactory.getLogger(Helm.class); /** * Installs a Helm chart. @@ -59,7 +57,7 @@ public static boolean install(HelmParams helmParams, Map chartVa } } - logger.fine("Installing a chart in namespace {0} using chart reference {1}", namespace, chartRef); + getLogger().fine("Installing a chart in namespace {0} using chart reference {1}", namespace, chartRef); // build Helm install command String installCmd = String.format("helm install %1s %2s --namespace %3s ", @@ -80,6 +78,10 @@ public static boolean install(HelmParams helmParams, Map chartVa // add override chart values installCmd = installCmd + valuesToString(chartValues); + if (helmParams.getChartVersion() != null) { + installCmd = installCmd + " --version " + helmParams.getChartVersion(); + } + // run the command return exec(installCmd); @@ -114,7 +116,7 @@ public static boolean upgrade(HelmParams params, Map chartValues // chart reference to be used in Helm upgrade String chartDir = params.getChartDir(); - logger.fine("Upgrading a release in namespace {0} using chart reference {1}", namespace, chartDir); + getLogger().fine("Upgrading a release in namespace {0} using chart reference {1}", namespace, chartDir); // build Helm upgrade command String upgradeCmd = String.format("helm upgrade %1s %2s --namespace %3s --reuse-values", @@ -144,7 +146,7 @@ public static boolean uninstall(HelmParams params) { .isNotNull() .isNotEmpty(); - logger.fine("Uninstalling release {0} in namespace {1}", params.getReleaseName(), params.getNamespace()); + getLogger().fine("Uninstalling release {0} in namespace {1}", params.getReleaseName(), params.getNamespace()); String uninstallCmd = String.format("helm uninstall %1s -n %2s", params.getReleaseName(), params.getNamespace()); @@ -211,15 +213,15 @@ private static String valuesToString(Map helmValues) { * @return true on success, false otherwise */ private static boolean exec(String command) { - logger.info("Running command - \n" + command); + getLogger().info("Running command - \n" + command); try { ExecResult result = ExecCommand.exec(command, true); if (result.exitValue() != 0) { - logger.info("Command failed with errors " + result.stderr() + "\n" + result.stdout()); + getLogger().info("Command failed with errors " + result.stderr() + "\n" + result.stdout()); return false; } } catch (Exception e) { - logger.info("Got exception, command failed with errors " + e.getMessage()); + getLogger().info("Got exception, command failed with errors " + e.getMessage()); return false; } return true; diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/InstallParams.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/InstallParams.java index 35b5ea07b1b..1b3cebd5c24 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/InstallParams.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/InstallParams.java @@ -11,15 +11,12 @@ public class InstallParams { // WIT or WDT private String type; - - // The version of the tool - private String version; - - // The download site location + + // The download site location or local file system location to get the installer + // Examples: + // https://github.com/oracle/weblogic-deploy-tooling/releases/download/weblogic-deploy-tooling-1.9.0/weblogic-deploy.zip + // https://github.com/oracle/weblogic-image-tool/releases/download/release-1.8.5/imagetool.zip private String location; - - // The installer file name - private String fileName; // Whether verify before download private boolean verify = true; @@ -43,15 +40,6 @@ public String type() { return type; } - public InstallParams version(String version) { - this.version = version; - return this; - } - - public String version() { - return version; - } - public InstallParams location(String location) { this.location = location; return this; @@ -87,13 +75,4 @@ public InstallParams unzip(boolean unzip) { public boolean unzip() { return unzip; } - - public InstallParams fileName(String fileName) { - this.fileName = fileName; - return this; - } - - public String fileName() { - return fileName; - } } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Installer.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Installer.java index 8fd16c7dd1e..6ed9cf4daf7 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Installer.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Installer.java @@ -5,24 +5,21 @@ import java.io.File; -import oracle.weblogic.kubernetes.logging.LoggingFacade; -import oracle.weblogic.kubernetes.logging.LoggingFactory; - import static oracle.weblogic.kubernetes.actions.ActionConstants.DOWNLOAD_DIR; import static oracle.weblogic.kubernetes.actions.ActionConstants.IMAGE_TOOL; import static oracle.weblogic.kubernetes.actions.ActionConstants.WDT; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WDT_DOWNLOAD_FILENAME_DEFAULT; import static oracle.weblogic.kubernetes.actions.ActionConstants.WDT_DOWNLOAD_URL; -import static oracle.weblogic.kubernetes.actions.ActionConstants.WDT_FILE_NAME; -import static oracle.weblogic.kubernetes.actions.ActionConstants.WDT_VERSION; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WDT_DOWNLOAD_URL_DEFAULT; import static oracle.weblogic.kubernetes.actions.ActionConstants.WIT; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WIT_DOWNLOAD_FILENAME_DEFAULT; import static oracle.weblogic.kubernetes.actions.ActionConstants.WIT_DOWNLOAD_URL; -import static oracle.weblogic.kubernetes.actions.ActionConstants.WIT_FILE_NAME; -import static oracle.weblogic.kubernetes.actions.ActionConstants.WIT_VERSION; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WIT_DOWNLOAD_URL_DEFAULT; import static oracle.weblogic.kubernetes.actions.ActionConstants.WORK_DIR; import static oracle.weblogic.kubernetes.actions.impl.primitive.Command.defaultCommandParams; import static oracle.weblogic.kubernetes.utils.FileUtils.checkDirectory; import static oracle.weblogic.kubernetes.utils.FileUtils.doesFileExist; - +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; /** * Implementation of actions that download/install tools for the uses to use. @@ -31,7 +28,6 @@ */ public class Installer { - private static final LoggingFacade logger = LoggingFactory.getLogger(Installer.class); private static final String TMP_FILE_NAME = "temp-download-file.out"; @@ -45,8 +41,6 @@ public static InstallParams defaultInstallWdtParams() { return new InstallParams() .defaults() .type(WDT) - .fileName(WDT_FILE_NAME) - .version(WDT_VERSION) .location(WDT_DOWNLOAD_URL) .verify(true) .unzip(false); @@ -60,8 +54,6 @@ public static InstallParams defaultInstallWitParams() { return new InstallParams() .defaults() .type(WIT) - .fileName(WIT_FILE_NAME) - .version(WIT_VERSION) .location(WIT_DOWNLOAD_URL) .verify(true) .unzip(true); @@ -91,15 +83,15 @@ public boolean download() { boolean downloadSucceeded = true; boolean unzipSucceeded = true; if (params.verify() - && new File(DOWNLOAD_DIR, params.fileName()).exists()) { - logger.fine("File {0} already exists.", params.fileName()); + && new File(DOWNLOAD_DIR, getInstallerFileName(params.type())).exists()) { + getLogger().fine("File {0} already exists.", getInstallerFileName(params.type())); } else { // check and make sure DOWNLOAD_DIR exists; will create it if it is missing checkDirectory(DOWNLOAD_DIR); // we are about to download the installer. We need to get the real version that is requested try { - params.version(getActualVersionIfNeeded(params.location(), params.type(), params.version())); + params.location(getActualLocationIfNeeded(params.location(), params.type())); } catch (RuntimeException re) { // already logged return false; @@ -121,8 +113,12 @@ && new File(DOWNLOAD_DIR, params.fileName()).exists()) { } private boolean unzip() { - String command = - String.format("unzip -o -d %s %s/%s", WORK_DIR, DOWNLOAD_DIR, params.fileName()); + String command = String.format( + "unzip -o -d %s %s/%s", + WORK_DIR, + DOWNLOAD_DIR, + getInstallerFileName(params.type())); + return Command.withParams( defaultCommandParams() .command(command) @@ -132,12 +128,10 @@ private boolean unzip() { private String buildDownloadCommand() { String command = String.format( - "curl -fL %s/releases/download/%s/%s -o %s/%s", - params.location(), - params.version(), - params.fileName(), + "curl -fL %s -o %s/%s", + params.location(), DOWNLOAD_DIR, - params.fileName()); + getInstallerFileName(params.type())); return command; } @@ -149,14 +143,15 @@ private String buildDownloadCommand() { * @return the version number that is determined * @throws RuntimeException if the operation failed for any reason */ - private String getActualVersionIfNeeded( + private String getActualLocationIfNeeded( String location, - String type, - String version + String type ) throws RuntimeException { - if (version == null || version.equalsIgnoreCase("latest")) { + String actualLocation = location; + if (needToGetActualLocation(location, type)) { + String version = ""; String command = String.format( - "curl -fL %s/releases/latest -o %s/%s-%s", + "curl -fL %s -o %s/%s-%s", location, DOWNLOAD_DIR, type, @@ -169,7 +164,7 @@ private String getActualVersionIfNeeded( if (!Command.withParams(params).execute()) { RuntimeException exception = new RuntimeException(String.format("Failed to get the latest %s release information.", type)); - logger.severe( + getLogger().severe( String.format( "Failed to get the latest %s release information. The stderr is %s", type, @@ -196,11 +191,11 @@ private String getActualVersionIfNeeded( if (Command.withParams(params).execute() && params.stdout() != null && params.stdout().length() != 0) { - return params.stdout(); + version = params.stdout(); } else { RuntimeException exception = new RuntimeException(String.format("Failed to get the version number of the requested %s release.", type)); - logger.severe( + getLogger().severe( String.format( "Failed to get the version number of the requested %s release. The stderr is %s", type, @@ -208,7 +203,37 @@ private String getActualVersionIfNeeded( exception); throw exception; } + + if (version != null) { + actualLocation = location.replace("latest", + String.format("download/%s/%s", version, getInstallerFileName(type))); + } + } + getLogger().info("The actual download location for {0} is {1}", params.type(), actualLocation); + return actualLocation; + } + + private boolean needToGetActualLocation( + String location, + String type + ) { + if (type == WDT && WDT_DOWNLOAD_URL_DEFAULT.equals(location) + || type == WIT && WIT_DOWNLOAD_URL_DEFAULT.equals(location)) { + return true; + } + return false; + } + + private String getInstallerFileName( + String type + ) { + switch (type) { + case WDT: + return WDT_DOWNLOAD_FILENAME_DEFAULT; + case WIT: + return WIT_DOWNLOAD_FILENAME_DEFAULT; + default: + return ""; } - return version; } } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Kubernetes.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Kubernetes.java index b8f9415c474..cb60f4d7fb4 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Kubernetes.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Kubernetes.java @@ -33,10 +33,10 @@ import io.kubernetes.client.openapi.apis.BatchV1Api; import io.kubernetes.client.openapi.apis.CoreV1Api; import io.kubernetes.client.openapi.apis.CustomObjectsApi; -import io.kubernetes.client.openapi.apis.ExtensionsV1beta1Api; +import io.kubernetes.client.openapi.apis.NetworkingV1beta1Api; import io.kubernetes.client.openapi.apis.RbacAuthorizationV1Api; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Ingress; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1IngressList; +import io.kubernetes.client.openapi.models.NetworkingV1beta1Ingress; +import io.kubernetes.client.openapi.models.NetworkingV1beta1IngressList; import io.kubernetes.client.openapi.models.V1ClusterRole; import io.kubernetes.client.openapi.models.V1ClusterRoleBinding; import io.kubernetes.client.openapi.models.V1ClusterRoleBindingList; @@ -77,27 +77,29 @@ import io.kubernetes.client.util.ClientBuilder; import oracle.weblogic.domain.Domain; import oracle.weblogic.domain.DomainList; -import oracle.weblogic.kubernetes.extensions.LoggedTest; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import oracle.weblogic.kubernetes.utils.ExecResult; import org.awaitility.core.ConditionFactory; import org.joda.time.DateTime; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.awaitility.Awaitility.with; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertNotNull; // TODO ryan - in here we want to implement all of the kubernetes // primitives that we need, using the API, not spawning a process // to run kubectl. -public class Kubernetes implements LoggedTest { +public class Kubernetes { private static String PRETTY = "true"; private static Boolean ALLOW_WATCH_BOOKMARKS = false; private static String RESOURCE_VERSION = ""; private static Integer TIMEOUT_SECONDS = 5; private static String DOMAIN_GROUP = "weblogic.oracle"; - private static String DOMAIN_VERSION = "v7"; + private static String DOMAIN_VERSION = "v8"; private static String DOMAIN_PLURAL = "domains"; private static String FOREGROUND = "Foreground"; private static String BACKGROUND = "Background"; @@ -131,6 +133,10 @@ public class Kubernetes implements LoggedTest { try { Configuration.setDefaultApiClient(ClientBuilder.defaultClient()); apiClient = Configuration.getDefaultApiClient(); + // disable connection and read write timeout to force the internal HTTP client + // to keep a long running connection with the server to fix SSL connection closed issue + apiClient.setConnectTimeout(0); + apiClient.setReadTimeout(0); coreV1Api = new CoreV1Api(); customObjectsApi = new CustomObjectsApi(); rbacAuthApi = new RbacAuthorizationV1Api(); @@ -308,7 +314,7 @@ public static boolean createDeployment(V1Deployment deployment) throws ApiExcept status = true; } } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } return status; @@ -338,7 +344,7 @@ public static V1DeploymentList listDeployments(String namespace) throws ApiExcep Boolean.FALSE // Boolean | Watch for changes to the described resources. ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return deployments; @@ -366,7 +372,7 @@ public static boolean deleteDeployment(String namespace, String name) throws Api null // V1DeleteOptions. ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return true; @@ -411,7 +417,7 @@ public static String getPodLog(String name, String namespace, String container) null // Boolean, add timestamp at the beginning of every line of log output ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } return log; @@ -430,7 +436,7 @@ public static V1Pod createPod(String namespace, V1Pod podBody) throws ApiExcepti try { pod = coreV1Api.createNamespacedPod(namespace, podBody, null, null, null); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } return pod; @@ -448,13 +454,13 @@ public static boolean deletePod(String name, String namespace) { KubernetesApiResponse response = podClient.delete(namespace, name); if (!response.isSuccess()) { - logger.warning("Failed to delete pod '" + name + "' from namespace: " + getLogger().warning("Failed to delete pod '" + name + "' from namespace: " + namespace + " with HTTP status code: " + response.getHttpStatusCode()); return false; } if (response.getObject() != null) { - logger.info( + getLogger().info( "Received after-deletion status of the requested object, will be deleting " + "pod in background!"); } @@ -481,6 +487,20 @@ public static V1Pod getPod(String namespace, String labelSelector, String podNam return null; } + /** + * Returns the IP address allocated to the pod with following parameters. + * + * @param namespace in which to check for the pod existence + * @param labelSelectors in the format "weblogic.domainUID in (%s)" + * @param podName name of the pod to return + * @return IP address allocated to the pod + * @throws ApiException if Kubernetes client API call fails + */ + public static String getPodIP(String namespace, String labelSelectors, String podName) throws ApiException { + V1Pod pod = getPod(namespace, labelSelectors, podName); + return pod.getStatus().getPodIP(); + } + /** * Get the creationTimestamp for a given pod with following parameters. * @@ -497,7 +517,7 @@ public static DateTime getPodCreationTimestamp(String namespace, String labelSel if (pod != null && pod.getMetadata() != null) { return pod.getMetadata().getCreationTimestamp(); } else { - logger.info("Pod doesn't exist or pod metadata is null"); + getLogger().info("Pod doesn't exist or pod metadata is null"); return null; } } @@ -527,16 +547,17 @@ public static int getContainerRestartCount( return containerStatus.getRestartCount(); } } - logger.severe("Container {0} status doesn't exist or pod's container statuses is empty in namespace {1}", + getLogger().severe("Container {0} status doesn't exist or pod's container statuses is empty in namespace {1}", containerName, namespace); } } else { - logger.severe("Pod {0} doesn't exist or pod status is null in namespace {1}", + getLogger().severe("Pod {0} doesn't exist or pod status is null in namespace {1}", podName, namespace); } return 0; } + /** * Get the weblogic.domainRestartVersion label from a given pod. * @@ -553,7 +574,7 @@ public static String getPodRestartVersion(String namespace, String labelSelector // return the value of the weblogic.domainRestartVersion label return pod.getMetadata().getLabels().get("weblogic.domainRestartVersion"); } else { - logger.info("getPodRestartVersion(): Pod doesn't exist"); + getLogger().info("getPodRestartVersion(): Pod doesn't exist"); return null; } } @@ -583,7 +604,7 @@ public static V1PodList listPods(String namespace, String labelSelectors) throws Boolean.FALSE // Watch for changes to the described resources. ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } return v1PodList; @@ -616,7 +637,7 @@ public static void copyDirectoryFromPod(V1Pod pod, String srcPath, Path destinat public static void copyFileToPod( String namespace, String pod, String container, Path srcPath, Path destPath) throws IOException, ApiException { - Copy copy = new Copy(); + Copy copy = new Copy(apiClient); copy.copyFileToPod(namespace, pod, container, srcPath, destPath); } @@ -640,7 +661,7 @@ public static boolean createNamespace(String name) throws ApiException { null // name associated with the actor or entity that is making these changes ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } @@ -669,7 +690,7 @@ public static boolean createNamespace(V1Namespace namespace) throws ApiException null // name associated with the actor or entity that is making these changes ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } @@ -693,7 +714,7 @@ public static void replaceNamespace(V1Namespace ns) throws ApiException { null // field manager ); } catch (ApiException ex) { - logger.severe(ex.getResponseBody()); + getLogger().severe(ex.getResponseBody()); throw ex; } } @@ -719,7 +740,7 @@ public static List listNamespaces() throws ApiException { false // Watch for changes to the described resources ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } @@ -750,7 +771,7 @@ public static V1NamespaceList listNamespacesAsObjects() throws ApiException { false // Watch for changes to the described resources ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } @@ -772,10 +793,10 @@ public static boolean deleteNamespace(String name) { // status 409 means contents in the namespace being removed, // once done namespace will be purged if (response.getHttpStatusCode() == 409) { - logger.warning(response.getStatus().getMessage()); + getLogger().warning(response.getStatus().getMessage()); return false; } else { - logger.warning("Failed to delete namespace: " + getLogger().warning("Failed to delete namespace: " + name + " with HTTP status code: " + response.getHttpStatusCode()); return false; } @@ -783,7 +804,7 @@ public static boolean deleteNamespace(String name) { withStandardRetryPolicy .conditionEvaluationListener( - condition -> logger.info("Waiting for namespace {0} to be deleted " + condition -> getLogger().info("Waiting for namespace {0} to be deleted " + "(elapsed time {1}ms, remaining time {2}ms)", name, condition.getElapsedTimeInMS(), @@ -836,7 +857,7 @@ public static List listNamespacedEvents(String namespace) throws ApiExc events.sort(Comparator.comparing(e -> e.getMetadata().getCreationTimestamp())); Collections.reverse(events); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return events; @@ -883,7 +904,7 @@ public static boolean createDomainCustomResource(Domain domain) throws ApiExcept null // field manager ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } @@ -913,14 +934,14 @@ public static boolean deleteDomainCustomResource(String domainUid, String namesp KubernetesApiResponse response = crdClient.delete(namespace, domainUid, deleteOptions); if (!response.isSuccess()) { - logger.warning( + getLogger().warning( "Failed to delete Domain Custom Resource '" + domainUid + "' from namespace: " + namespace + " with HTTP status code: " + response.getHttpStatusCode()); return false; } if (response.getObject() != null) { - logger.info( + getLogger().info( "Received after-deletion status of the requested object, will be deleting " + "domain custom resource in background!"); } @@ -948,7 +969,7 @@ public static Domain getDomainCustomResource(String domainUid, String namespace) domainUid // custom object's name ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } @@ -956,7 +977,7 @@ public static Domain getDomainCustomResource(String domainUid, String namespace) return handleResponse(domain, Domain.class); } - logger.warning("Domain Custom Resource '" + domainUid + "' not found in namespace " + namespace); + getLogger().warning("Domain Custom Resource '" + domainUid + "' not found in namespace " + namespace); return null; } @@ -1030,7 +1051,7 @@ public static boolean patchDomainCustomResource(String domainUid, String namespa ); if (!response.isSuccess()) { - logger.warning( + getLogger().warning( "Failed to patch " + domainUid + " in namespace " + namespace + " using patch format: " + patchFormat); return false; @@ -1063,7 +1084,7 @@ public static DomainList listDomains(String namespace) { try { response = crdClient.list(namespace); } catch (Exception ex) { - logger.warning(ex.getMessage()); + getLogger().warning(ex.getMessage()); throw ex; } return response != null ? response.getObject() : new DomainList(); @@ -1104,6 +1125,52 @@ public static boolean createConfigMap(V1ConfigMap configMap) throws ApiException null, // indicates that modifications should not be persisted null // name associated with the actor or entity that is making these changes ); + } catch (ApiException apex) { + getLogger().severe(apex.getResponseBody()); + throw apex; + } + + return true; + } + + /** + * Replace a Kubernetes Config Map. + * The following command updates a complete configMap. + * + * @param configMap V1ConfigMap object containing config map configuration data + * @return true if successful + * @throws ApiException if Kubernetes client API call fails + */ + public static boolean replaceConfigMap(V1ConfigMap configMap) throws ApiException { + LoggingFacade logger = getLogger(); + if (configMap == null) { + throw new IllegalArgumentException( + "Parameter 'configMap' cannot be null when calling patchConfigMap()"); + } + + if (configMap.getMetadata() == null) { + throw new IllegalArgumentException( + "'metadata' field of the parameter 'configMap' cannot be null when calling patchConfigMap()"); + } + + if (configMap.getMetadata().getNamespace() == null) { + throw new IllegalArgumentException( + "'namespace' field in the metadata cannot be null when calling patchConfigMap()"); + } + + String namespace = configMap.getMetadata().getNamespace(); + + V1ConfigMap cm; + try { + cm = coreV1Api.replaceNamespacedConfigMap( + configMap.getMetadata().getName(), + namespace, + configMap, // config map configuration data + PRETTY, // pretty print output + null, // indicates that modifications should not be persisted + null // name associated with the actor or entity that is making these changes + ); + assertNotNull(cm, "cm replace failed "); } catch (ApiException apex) { logger.severe(apex.getResponseBody()); throw apex; @@ -1136,7 +1203,7 @@ public static V1ConfigMapList listConfigMaps(String namespace) throws ApiExcepti false // Watch for changes to the described resources ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } @@ -1153,15 +1220,14 @@ public static V1ConfigMapList listConfigMaps(String namespace) throws ApiExcepti public static boolean deleteConfigMap(String name, String namespace) { KubernetesApiResponse response = configMapClient.delete(namespace, name, deleteOptions); - if (!response.isSuccess()) { - logger.warning("Failed to delete config map '" + name + "' from namespace: " + getLogger().warning("Failed to delete config map '" + name + "' from namespace: " + namespace + " with HTTP status code: " + response.getHttpStatusCode()); return false; } if (response.getObject() != null) { - logger.info( + getLogger().info( "Received after-deletion status of the requested object, will be deleting " + "config map in background!"); } @@ -1205,7 +1271,7 @@ public static boolean createSecret(V1Secret secret) throws ApiException { null // fieldManager is a name associated with the actor ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } @@ -1224,13 +1290,13 @@ public static boolean deleteSecret(String name, String namespace) { KubernetesApiResponse response = secretClient.delete(namespace, name); if (!response.isSuccess()) { - logger.warning("Failed to delete secret '" + name + "' from namespace: " + getLogger().warning("Failed to delete secret '" + name + "' from namespace: " + namespace + " with HTTP status code: " + response.getHttpStatusCode()); return false; } if (response.getObject() != null) { - logger.info( + getLogger().info( "Received after-deletion status of the requested object, will be deleting " + "secret in background!"); } @@ -1248,7 +1314,7 @@ public static V1SecretList listSecrets(String namespace) { if (list.isSuccess()) { return list.getObject(); } else { - logger.warning("Failed to list secrets, status code {0}", list.getHttpStatusCode()); + getLogger().warning("Failed to list secrets, status code {0}", list.getHttpStatusCode()); return null; } } @@ -1276,7 +1342,7 @@ public static boolean createPv(V1PersistentVolume persistentVolume) throws ApiEx null // fieldManager is a name associated with the actor ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } @@ -1319,7 +1385,7 @@ public static boolean createPvc(V1PersistentVolumeClaim persistentVolumeClaim) t null // fieldManager is a name associated with the actor ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } @@ -1337,13 +1403,13 @@ public static boolean deletePv(String name) { KubernetesApiResponse response = pvClient.delete(name, deleteOptions); if (!response.isSuccess()) { - logger.warning("Failed to delete persistent volume '" + name + "' " + getLogger().warning("Failed to delete persistent volume '" + name + "' " + "with HTTP status code: " + response.getHttpStatusCode()); return false; } if (response.getObject() != null) { - logger.info( + getLogger().info( "Received after-deletion status of the requested object, will be deleting " + "persistent volume in background!"); } @@ -1363,14 +1429,14 @@ public static boolean deletePvc(String name, String namespace) { KubernetesApiResponse response = pvcClient.delete(namespace, name, deleteOptions); if (!response.isSuccess()) { - logger.warning( + getLogger().warning( "Failed to delete persistent volume claim '" + name + "' from namespace: " + namespace + " with HTTP status code: " + response.getHttpStatusCode()); return false; } if (response.getObject() != null) { - logger.info( + getLogger().info( "Received after-deletion status of the requested object, will be deleting " + "persistent volume claim in background!"); } @@ -1387,7 +1453,7 @@ public static V1PersistentVolumeList listPersistentVolumes() { if (list.isSuccess()) { return list.getObject(); } else { - logger.warning("Failed to list Persistent Volumes," + getLogger().warning("Failed to list Persistent Volumes," + " status code {0}", list.getHttpStatusCode()); return null; } @@ -1414,7 +1480,7 @@ public static V1PersistentVolumeList listPersistentVolumes(String labels) throws false // Watch for changes to the described resources ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } return listPersistentVolume; @@ -1430,7 +1496,7 @@ public static V1PersistentVolumeClaimList listPersistentVolumeClaims(String name if (list.isSuccess()) { return list.getObject(); } else { - logger.warning("Failed to list Persistent Volumes claims," + getLogger().warning("Failed to list Persistent Volumes claims," + " status code {0}", list.getHttpStatusCode()); return null; } @@ -1472,7 +1538,7 @@ public static V1ServiceAccount createServiceAccount(V1ServiceAccount serviceAcco null // fieldManager is a name associated with the actor ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } @@ -1491,17 +1557,17 @@ public static boolean deleteServiceAccount(String name, String namespace) { KubernetesApiResponse response = serviceAccountClient.delete(namespace, name, deleteOptions); if (!response.isSuccess()) { - logger.warning("Failed to delete Service Account '" + name + "' from namespace: " + getLogger().warning("Failed to delete Service Account '" + name + "' from namespace: " + namespace + " with HTTP status code: " + response.getHttpStatusCode()); return false; } if (response.getObject() != null) { - logger.info( + getLogger().info( "Received after-deletion status of the requested object, will be deleting " + "service account in background!"); V1ServiceAccount serviceAccount = (V1ServiceAccount) response.getObject(); - logger.info( + getLogger().info( "Deleting Service Account " + serviceAccount.getMetadata().getName() + " in background."); } @@ -1519,7 +1585,7 @@ public static V1ServiceAccountList listServiceAccounts(String namespace) { if (list.isSuccess()) { return list.getObject(); } else { - logger.warning("Failed to list service accounts, status code {0}", list.getHttpStatusCode()); + getLogger().warning("Failed to list service accounts, status code {0}", list.getHttpStatusCode()); return null; } } @@ -1560,7 +1626,7 @@ public static boolean createService(V1Service service) throws ApiException { null // fieldManager is a name associated with the actor ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } @@ -1579,13 +1645,13 @@ public static boolean deleteService(String name, String namespace) { KubernetesApiResponse response = serviceClient.delete(namespace, name, deleteOptions); if (!response.isSuccess()) { - logger.warning("Failed to delete Service '" + name + "' from namespace: " + getLogger().warning("Failed to delete Service '" + name + "' from namespace: " + namespace + " with HTTP status code: " + response.getHttpStatusCode()); return false; } if (response.getObject() != null) { - logger.info( + getLogger().info( "Received after-deletion status of the requested object, will be deleting " + "service in background!"); } @@ -1666,7 +1732,7 @@ public static V1ServiceList listServices(String namespace) { if (list.isSuccess()) { return list.getObject(); } else { - logger.warning("Failed to list services in namespace {0}, status code {1}", + getLogger().warning("Failed to list services in namespace {0}, status code {1}", namespace, list.getHttpStatusCode()); return null; } @@ -1695,7 +1761,7 @@ public static String createNamespacedJob(V1Job jobBody) throws ApiException { name = createdJob.getMetadata().getName(); } } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } return name; @@ -1723,7 +1789,7 @@ public static boolean deleteJob(String namespace, String name) throws ApiExcepti null // V1DeleteOptions. ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return true; @@ -1753,7 +1819,7 @@ public static V1JobList listJobs(String namespace) throws ApiException { Boolean.FALSE // Boolean | Watch for changes to the described resources ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return list; @@ -1804,7 +1870,7 @@ public static boolean deleteReplicaSet(String namespace, String name) throws Api null // V1DeleteOptions. ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return true; @@ -1834,13 +1900,35 @@ public static V1ReplicaSetList listReplicaSets(String namespace) throws ApiExcep ); return list; } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } } // --------------------------- Role-based access control (RBAC) --------------------------- + /** + * Create a cluster role. + * @param clusterRole V1ClusterRole object containing cluster role configuration data + * @return true if creation is successful, false otherwise + * @throws ApiException if Kubernetes client API call fails + */ + public static boolean createClusterRole(V1ClusterRole clusterRole) throws ApiException { + try { + V1ClusterRole cr = rbacAuthApi.createClusterRole( + clusterRole, // cluster role configuration data + PRETTY, // pretty print output + null, // indicates that modifications should not be persisted + null // fieldManager is a name associated with the actor + ); + } catch (ApiException apex) { + getLogger().severe(apex.getResponseBody()); + throw apex; + } + + return true; + } + /** * Create a Cluster Role Binding. * @@ -1858,7 +1946,32 @@ public static boolean createClusterRoleBinding(V1ClusterRoleBinding clusterRoleB null // fieldManager is a name associated with the actor ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); + throw apex; + } + + return true; + } + + /** + * Create a role binding in the specified namespace. + * + * @param namespace the namespace in which the role binding to be created + * @param roleBinding V1RoleBinding object containing role binding configuration data + * @return true if the creation succeeds, false otherwise + * @throws ApiException if Kubernetes client call fails + */ + public static boolean createNamespacedRoleBinding(String namespace, V1RoleBinding roleBinding) throws ApiException { + try { + V1RoleBinding crb = rbacAuthApi.createNamespacedRoleBinding( + namespace, // namespace where this role binding is created + roleBinding, // role binding configuration data + PRETTY, // pretty print output + null, // indicates that modifications should not be persisted + null // fieldManager is a name associated with the actor + ); + } catch (ApiException apex) { + getLogger().severe(apex.getResponseBody()); throw apex; } @@ -1875,14 +1988,14 @@ public static boolean deleteClusterRoleBinding(String name) { KubernetesApiResponse response = roleBindingClient.delete(name, deleteOptions); if (!response.isSuccess()) { - logger.warning( + getLogger().warning( "Failed to delete Cluster Role Binding '" + name + " with HTTP status code: " + response .getHttpStatusCode()); return false; } if (response.getObject() != null) { - logger.info( + getLogger().info( "Received after-deletion status of the requested object, will be deleting " + "Cluster Role Binding " + name + " in background!"); } @@ -1891,13 +2004,13 @@ public static boolean deleteClusterRoleBinding(String name) { } /** - * List cluster role bindings. + * List role bindings in all namespaces. * * @param labelSelector labels to narrow the list * @return V1RoleBindingList list of {@link V1RoleBinding} objects * @throws ApiException when listing fails */ - public static V1RoleBindingList listClusterRoleBindings(String labelSelector) throws ApiException { + public static V1RoleBindingList listRoleBindingForAllNamespaces(String labelSelector) throws ApiException { V1RoleBindingList roleBindings; try { roleBindings = rbacAuthApi.listRoleBindingForAllNamespaces( @@ -1912,12 +2025,40 @@ public static V1RoleBindingList listClusterRoleBindings(String labelSelector) th Boolean.FALSE // Boolean | Watch for changes to the described resources ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return roleBindings; } + /** + * List cluster role bindings. + * + * @param labelSelector labels to narrow the list + * @return V1ClusterRoleBindingList list of {@link V1CLusterRoleBinding} objects + * @throws ApiException if Kubernetes client API call fails + */ + public static V1ClusterRoleBindingList listClusterRoleBindings(String labelSelector) throws ApiException { + V1ClusterRoleBindingList clusterRoleBindingList; + try { + clusterRoleBindingList = rbacAuthApi.listClusterRoleBinding( + PRETTY, // String | If true, then the output is pretty printed. + ALLOW_WATCH_BOOKMARKS, // Boolean | allowWatchBookmarks requests watch events with type "BOOKMARK". + null, // String | The continue option should be set when retrieving more results from the server. + null, // String | A selector to restrict the list of returned objects by their fields. + labelSelector, // String | A selector to restrict the list of returned objects by their labels. + null, // Integer | limit is a maximum number of responses to return for a list call. + RESOURCE_VERSION, // String | Shows changes that occur after that particular version of a resource. + TIMEOUT_SECONDS, // Integer | Timeout for the list/watch call. + Boolean.FALSE // Boolean | Watch for changes to the described resources + ); + } catch (ApiException apex) { + getLogger().warning(apex.getResponseBody()); + throw apex; + } + return clusterRoleBindingList; + } + /** * Delete a rolebinding in the given namespace. * @@ -1940,7 +2081,7 @@ public static boolean deleteNamespacedRoleBinding(String namespace, String name) null // V1DeleteOptions. ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return true; @@ -1970,7 +2111,7 @@ public static V1RoleBindingList listNamespacedRoleBinding(String namespace) Boolean.FALSE // Boolean | Watch for changes to the described resources. ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return roleBindings; @@ -1996,7 +2137,7 @@ public static boolean deleteClusterRole(String name) throws ApiException { null // V1DeleteOptions. ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return true; @@ -2025,7 +2166,7 @@ public static V1ClusterRoleList listClusterRoles(String labelSelector) throws Ap Boolean.FALSE // Boolean | Watch for changes to the described resources. ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return roles; @@ -2052,7 +2193,7 @@ public static boolean deleteNamespacedRole(String namespace, String name) throws null // V1DeleteOptions. ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return true; @@ -2081,7 +2222,7 @@ public static V1RoleList listNamespacedRoles(String namespace) throws ApiExcepti Boolean.FALSE // Boolean | Watch for changes to the described resources. ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return roles; @@ -2091,13 +2232,13 @@ public static V1RoleList listNamespacedRoles(String namespace) throws ApiExcepti * List Ingresses in the given namespace. * * @param namespace name of the namespace - * @return ExtensionsV1beta1IngressList list of {@link ExtensionsV1beta1Ingress} objects + * @return NetworkingV1beta1IngressList list of {@link NetworkingV1beta1Ingress} objects * @throws ApiException when listing fails */ - public static ExtensionsV1beta1IngressList listNamespacedIngresses(String namespace) throws ApiException { - ExtensionsV1beta1IngressList ingressList; + public static NetworkingV1beta1IngressList listNamespacedIngresses(String namespace) throws ApiException { + NetworkingV1beta1IngressList ingressList; try { - ExtensionsV1beta1Api apiInstance = new ExtensionsV1beta1Api(apiClient); + NetworkingV1beta1Api apiInstance = new NetworkingV1beta1Api(apiClient); ingressList = apiInstance.listNamespacedIngress( namespace, // namespace PRETTY, // String | If 'true', then the output is pretty printed. @@ -2111,7 +2252,7 @@ public static ExtensionsV1beta1IngressList listNamespacedIngresses(String namesp ALLOW_WATCH_BOOKMARKS // Boolean | Watch for changes to the described resources. ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return ingressList; @@ -2122,20 +2263,20 @@ public static ExtensionsV1beta1IngressList listNamespacedIngresses(String namesp * * @param namespace name of the namespace * @param name name of the Ingress object - * @return ExtensionsV1beta1Ingress Ingress object when found, otherwise null + * @return NetworkingV1beta1Ingress Ingress object when found, otherwise null * @throws ApiException when get fails */ - public static ExtensionsV1beta1Ingress getNamespacedIngress(String namespace, String name) + public static NetworkingV1beta1Ingress getNamespacedIngress(String namespace, String name) throws ApiException { try { - for (ExtensionsV1beta1Ingress item + for (NetworkingV1beta1Ingress item : listNamespacedIngresses(namespace).getItems()) { if (name.equals(item.getMetadata().getName())) { return item; } } } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return null; @@ -2178,7 +2319,7 @@ public static ExecResult exec(V1Pod pod, String containerName, boolean redirectT } catch (IOException ex) { // "Pipe broken" is expected when process is finished so don't log if (ex.getMessage() != null && !ex.getMessage().contains("Pipe broken")) { - logger.warning("Exception reading from input stream.", ex); + getLogger().warning("Exception reading from input stream.", ex); } } }); @@ -2223,32 +2364,31 @@ public static KubernetesExec createKubernetesExec(V1Pod pod, String containerNam .apiClient(apiClient) // the Kubernetes api client to dispatch the "exec" command .pod(pod) // The pod where the command is to be run .containerName(containerName) // the container in which the command is to be run - .passStdinAsStream() // pass a stdin stream into the container - .stdinIsTty(); // stdin is a TTY (only applies if stdin is true) + .passStdinAsStream(); // pass a stdin stream into the container } /** * Create an Ingress in the specified namespace. * * @param namespace the namespace in which the ingress will be created - * @param ingressBody ExtensionsV1beta1Ingress object, representing the ingress details + * @param ingressBody NetworkingV1beta1Ingress object, representing the ingress details * @return the ingress created * @throws ApiException if Kubernetes client API call fails */ - public static ExtensionsV1beta1Ingress createIngress(String namespace, ExtensionsV1beta1Ingress ingressBody) + public static NetworkingV1beta1Ingress createIngress(String namespace, NetworkingV1beta1Ingress ingressBody) throws ApiException { - ExtensionsV1beta1Ingress ingress; + NetworkingV1beta1Ingress ingress; try { - ExtensionsV1beta1Api apiInstance = new ExtensionsV1beta1Api(apiClient); + NetworkingV1beta1Api apiInstance = new NetworkingV1beta1Api(apiClient); ingress = apiInstance.createNamespacedIngress( namespace, //namespace - ingressBody, // ExtensionsV1beta1Ingress object, representing the ingress details + ingressBody, // NetworkingV1beta1Ingress object, representing the ingress details PRETTY, // pretty print output null, // when present, indicates that modifications should not be persisted null // a name associated with the actor or entity that is making these changes ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } @@ -2266,11 +2406,30 @@ private static String readExecCmdData(InputStream is) { sb.append((char) c); } } catch (IOException e) { - logger.warning("Exception thrown " + e); + getLogger().warning("Exception thrown " + e); } return sb.toString().trim(); } + /** + * Get the name of the operator pod. + * + * @param release release name of the operator + * @param namespace Kubernetes namespace that the operator is running in + * @return name of the operator pod + * @throws ApiException if Kubernetes client API call fails + */ + public static String getOperatorPodName(String release, String namespace) throws ApiException { + String labelSelector = String.format("app in (%s)", release); + V1PodList pods = listPods(namespace, labelSelector); + for (var pod : pods.getItems()) { + if (pod.getMetadata().getName().contains(release)) { + return pod.getMetadata().getName(); + } + } + return null; + } + /** * Simple class to redirect/copy data to both the stdout stream and a buffer * which can be read from later. diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/KubernetesExec.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/KubernetesExec.java index 67007ce9563..c97db36d308 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/KubernetesExec.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/KubernetesExec.java @@ -26,9 +26,6 @@ public class KubernetesExec { // If true, pass a stdin stream into the container private boolean passStdinAsStream; - // If true, stdin is a TTY (only applies if stdin is true) - private boolean stdinIsTty; - /** * Set the API client for subsequent exec commands. * @@ -72,16 +69,6 @@ public KubernetesExec passStdinAsStream() { return this; } - /** - * Enable the stdin input stream as a TTY terminal. - * - * @return a KubernetesExec instance where a stdin stream will be a TTY terminal - */ - public KubernetesExec stdinIsTty() { - this.stdinIsTty = true; - return this; - } - /** * Execute a command in a container. * @@ -91,6 +78,6 @@ public KubernetesExec stdinIsTty() { * @throws IOException if another problem occurs while trying to run the command */ public Process exec(String... command) throws ApiException, IOException { - return new Exec(apiClient).exec(pod, command, containerName, passStdinAsStream, stdinIsTty); + return new Exec(apiClient).exec(pod, command, containerName, passStdinAsStream, false); } } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/WebLogicImageTool.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/WebLogicImageTool.java index a03dbff2ad2..280802375cf 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/WebLogicImageTool.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/WebLogicImageTool.java @@ -5,9 +5,6 @@ import java.util.List; -import oracle.weblogic.kubernetes.logging.LoggingFacade; -import oracle.weblogic.kubernetes.logging.LoggingFactory; - import static oracle.weblogic.kubernetes.actions.ActionConstants.IMAGE_TOOL; import static oracle.weblogic.kubernetes.actions.ActionConstants.WDT_ZIP_PATH; import static oracle.weblogic.kubernetes.actions.impl.primitive.Command.defaultCommandParams; @@ -19,7 +16,6 @@ */ public class WebLogicImageTool { - private static final LoggingFacade logger = LoggingFactory.getLogger(WebLogicImageTool.class); private WitParams params; @@ -97,7 +93,7 @@ private String buildiWitCommand() { String command = IMAGE_TOOL + " update " - + " --tag " + params.imageName() + ":" + params.imageTag() + + " --tag " + params.modelImageName() + ":" + params.modelImageTag() + " --fromImage " + params.baseImageName() + ":" + params.baseImageTag() + " --wdtDomainType " + params.domainType(); diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/WitParams.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/WitParams.java index 8c425b7d80c..becab541ac4 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/WitParams.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/WitParams.java @@ -6,8 +6,8 @@ import java.util.List; import java.util.Map; -import static oracle.weblogic.kubernetes.actions.ActionConstants.DEFAULT_IMAGE_NAME; -import static oracle.weblogic.kubernetes.actions.ActionConstants.DEFAULT_IMAGE_TAG; +import static oracle.weblogic.kubernetes.actions.ActionConstants.DEFAULT_MODEL_IMAGE_NAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.DEFAULT_MODEL_IMAGE_TAG; import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS; import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_NAME; import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_TAG; @@ -25,10 +25,10 @@ public class WitParams { private String baseImageTag; // The name of the to be generated Docker image - private String imageName; + private String modelImageName; // The name of the to be generated Docker image - private String imageTag; + private String modelImageTag; // A comma separated list of the names of the WDT model yaml files private List modelFiles; @@ -67,8 +67,8 @@ public class WitParams { public WitParams defaults() { this.baseImageName(WLS_BASE_IMAGE_NAME) .baseImageTag(WLS_BASE_IMAGE_TAG) - .imageName(DEFAULT_IMAGE_NAME) - .imageTag(DEFAULT_IMAGE_TAG) + .modelImageName(DEFAULT_MODEL_IMAGE_NAME) + .modelImageTag(DEFAULT_MODEL_IMAGE_TAG) .domainType(WLS); return this; } @@ -91,22 +91,22 @@ public String baseImageTag() { return baseImageTag; } - public WitParams imageName(String imageName) { - this.imageName = imageName; + public WitParams modelImageName(String modelImageName) { + this.modelImageName = modelImageName; return this; } - public String imageName() { - return imageName; + public String modelImageName() { + return modelImageName; } - public WitParams imageTag(String imageTag) { - this.imageTag = imageTag; + public WitParams modelImageTag(String modelImageTag) { + this.modelImageTag = modelImageTag; return this; } - public String imageTag() { - return imageTag; + public String modelImageTag() { + return modelImageTag; } public WitParams wdtVersion(String wdtVersion) { @@ -182,7 +182,7 @@ public List modelArchiveFiles() { } public String generatedImageName() { - return imageName + ":" + imageTag; + return modelImageName + ":" + modelImageTag; } public WitParams env(Map env) { diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/annotations/IntegrationTest.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/annotations/IntegrationTest.java index 2689e974fd9..281de24f3f8 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/annotations/IntegrationTest.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/annotations/IntegrationTest.java @@ -10,13 +10,17 @@ import oracle.weblogic.kubernetes.extensions.ImageBuilders; import oracle.weblogic.kubernetes.extensions.IntegrationTestWatcher; +import oracle.weblogic.kubernetes.extensions.LoggingExtension; import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.extension.ExtendWith; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Tag("integration") +@ExtendWith(LoggingExtension.class) @ExtendWith(ImageBuilders.class) @ExtendWith(IntegrationTestWatcher.class) +@TestInstance(TestInstance.Lifecycle.PER_CLASS) public @interface IntegrationTest { } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/TestAssertions.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/TestAssertions.java index 3af9d7906e5..130607b5512 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/TestAssertions.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/TestAssertions.java @@ -9,6 +9,8 @@ import io.kubernetes.client.openapi.ApiException; import oracle.weblogic.kubernetes.assertions.impl.Application; +import oracle.weblogic.kubernetes.assertions.impl.ClusterRole; +import oracle.weblogic.kubernetes.assertions.impl.ClusterRoleBinding; import oracle.weblogic.kubernetes.assertions.impl.Docker; import oracle.weblogic.kubernetes.assertions.impl.Domain; import oracle.weblogic.kubernetes.assertions.impl.Grafana; @@ -22,6 +24,7 @@ import oracle.weblogic.kubernetes.assertions.impl.Pod; import oracle.weblogic.kubernetes.assertions.impl.Prometheus; import oracle.weblogic.kubernetes.assertions.impl.Service; +import oracle.weblogic.kubernetes.assertions.impl.Voyager; import oracle.weblogic.kubernetes.assertions.impl.WitAssertion; import org.joda.time.DateTime; @@ -60,6 +63,28 @@ public static Callable isNginxReady(String namespace) { return Nginx.isReady(namespace); } + /** + * Check if Voyager pod is running. + * + * @param namespace in which to check if Voyager pod is running + * @param podName name of Voyager ingress controller pod or ingress resource pod + * @return true if Voyager pod is running, false otherwise + */ + public static Callable isVoyagerRunning(String namespace, String podName) { + return Voyager.isRunning(namespace, podName); + } + + /** + * Check if Voyager pods is in the ready state in a given namespace. + * + * @param namespace in which to check if Voyager pod is in the ready state + * @param podName name of Voyager ingress controller pod or ingress resource pod + * @return true if Voyager pod is in the ready state, false otherwise + */ + public static Callable isVoyagerReady(String namespace, String podName) { + return Voyager.isReady(namespace, podName); + } + /** * Check if operator REST service is running. * @@ -407,19 +432,33 @@ public static boolean isHelmReleaseDeployed(String releaseName, String namespace * Check if a pod is restarted based on podCreationTimestamp. * * @param podName the name of the pod to check for - * @param domainUid the label the pod is decorated with * @param namespace in which the pod is running * @param timestamp the initial podCreationTimestamp * @return true if the pod new timestamp is not equal to initial PodCreationTimestamp otherwise false */ public static Callable isPodRestarted( String podName, - String domainUid, String namespace, DateTime timestamp ) { return () -> { - return Kubernetes.isPodRestarted(podName,domainUid,namespace,timestamp); + return Kubernetes.isPodRestarted(podName, namespace,timestamp); + }; + } + + /** + * Check if the oeprator pod in a given namespace is restarted based on podCreationTimestamp. + * + * @param namespace in which the pod is running + * @param timestamp the initial podCreationTimestamp + * @return true if the pod new timestamp is not equal to initial PodCreationTimestamp otherwise false + */ + public static Callable isOperatorPodRestarted( + String namespace, + DateTime timestamp + ) { + return () -> { + return Kubernetes.isOperatorPodRestarted(namespace, timestamp); }; } @@ -492,4 +531,26 @@ public static Callable pvExists(String pvName, String labelSelector) { public static Callable pvcExists(String pvcName, String namespace) { return PersistentVolumeClaim.pvcExists(pvcName, namespace); } + + /** + * Check whether the cluster role exists. + * + * @param clusterRoleName name of the cluster role + * @return true if cluster role exists, false otherwise + * @throws ApiException if Kubernetes client API call fails + */ + public static boolean clusterRoleExists(String clusterRoleName) throws ApiException { + return ClusterRole.clusterRoleExists(clusterRoleName); + } + + /** + * Check whether the cluster role binding exists. + * + * @param clusterRoleBindingName name of the cluster role binding + * @return true if cluster role binding exists, false otherwise + * @throws ApiException if Kubernetes client API call fails + */ + public static boolean clusterRoleBindingExists(String clusterRoleBindingName) throws ApiException { + return ClusterRoleBinding.clusterRoleBindingExists(clusterRoleBindingName); + } } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Application.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Application.java index 22e8cfc48df..08e6c2fae88 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Application.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Application.java @@ -6,11 +6,10 @@ import java.io.IOException; import io.kubernetes.client.openapi.ApiException; -import oracle.weblogic.kubernetes.logging.LoggingFacade; -import oracle.weblogic.kubernetes.logging.LoggingFactory; import oracle.weblogic.kubernetes.utils.ExecResult; import static oracle.weblogic.kubernetes.actions.TestActions.execCommand; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; /** * Assertions for applications that are deployed in a domain custom resource. @@ -18,7 +17,6 @@ */ public class Application { - private static final LoggingFacade logger = LoggingFactory.getLogger(Application.class); /** * Check if an application is accessible inside a WebLogic server pod using @@ -57,27 +55,27 @@ public static boolean appAccessibleInPod( if (execResult.exitValue() == 0 && execResult.stdout() != null && execResult.stdout().contains(expectedResponse)) { - logger.info( + getLogger().info( String.format("App is accessible inside pod %s in namespace %s", podName, namespace)); return true; } else { - logger.warning( + getLogger().warning( String.format("Failed to access the app inside pod %s in namespace %s", podName, namespace)); return false; } } catch (ApiException | IOException | InterruptedException e) { - logger.warning( + getLogger().warning( String.format("Failed to access the app inside pod %s in namespace %s", podName, namespace), e); return false; } catch (IllegalArgumentException iae) { - logger.warning(String.format("Failed to find pod %s to check the app", podName)); + getLogger().warning(String.format("Failed to find pod %s to check the app", podName)); return false; } } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/ClusterRole.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/ClusterRole.java new file mode 100644 index 00000000000..cdbe0bca463 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/ClusterRole.java @@ -0,0 +1,37 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.assertions.impl; + +import java.util.List; + +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1ClusterRole; +import io.kubernetes.client.openapi.models.V1ClusterRoleList; + +import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.listClusterRoles; + +public class ClusterRole { + + /** + * Check whether the specified cluster role exists. + * + * @param name name of the cluster role to check + * @return true if the cluster role exists, false otherwise + * @throws ApiException if Kubernetes client API call fails + */ + public static boolean clusterRoleExists(String name) throws ApiException { + + V1ClusterRoleList clusterRoleList = listClusterRoles(""); + List clusterRoles = clusterRoleList.getItems(); + for (V1ClusterRole clusterRole : clusterRoles) { + if (clusterRole.getMetadata() != null && clusterRole.getMetadata().getName() != null) { + if (clusterRole.getMetadata().getName().equals(name)) { + return true; + } + } + } + + return false; + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/ClusterRoleBinding.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/ClusterRoleBinding.java new file mode 100644 index 00000000000..ea39cd53d9e --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/ClusterRoleBinding.java @@ -0,0 +1,36 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.assertions.impl; + +import java.util.List; + +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1ClusterRoleBinding; +import io.kubernetes.client.openapi.models.V1ClusterRoleBindingList; + +import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.listClusterRoleBindings; + +public class ClusterRoleBinding { + + /** + * Check whether the specified cluster role binding exists. + * + * @param name the name of cluster role binding to check + * @return true if the cluster role binding exists, false otherwise + */ + public static boolean clusterRoleBindingExists(String name) throws ApiException { + V1ClusterRoleBindingList clusterRoleBindingList = listClusterRoleBindings(""); + List clusterRoleBindings = clusterRoleBindingList.getItems(); + + for (V1ClusterRoleBinding clusterRoleBinding : clusterRoleBindings) { + if (clusterRoleBinding.getMetadata() != null && clusterRoleBinding.getMetadata().getName() != null) { + if (clusterRoleBinding.getMetadata().getName().equals(name)) { + return true; + } + } + } + + return false; + } +} \ No newline at end of file diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Deployment.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Deployment.java new file mode 100644 index 00000000000..10dc36c1009 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Deployment.java @@ -0,0 +1,21 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.assertions.impl; + +import java.util.Map; +import java.util.concurrent.Callable; + +public class Deployment { + + /** + * Check if deployment is running in a given namespace. + * @param deploymentName deployment name to check + * @param label map of labels for deployment + * @param namespace in which to check for the deployment + * @return true if found and running otherwise false + */ + public static Callable isReady(String deploymentName, Map label, String namespace) { + return () -> Kubernetes.isDeploymentReady(deploymentName, label,namespace); + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Domain.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Domain.java index 2c48bdd4f95..feb65b20b11 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Domain.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Domain.java @@ -18,8 +18,11 @@ import io.kubernetes.client.util.ClientBuilder; import oracle.weblogic.kubernetes.actions.impl.primitive.Command; import oracle.weblogic.kubernetes.actions.impl.primitive.CommandParams; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import org.awaitility.core.ConditionFactory; import org.joda.time.DateTime; +import static java.util.concurrent.TimeUnit.SECONDS; import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; @@ -29,7 +32,8 @@ import static oracle.weblogic.kubernetes.assertions.impl.Kubernetes.doesPodNotExist; import static oracle.weblogic.kubernetes.assertions.impl.Kubernetes.isPodReady; import static oracle.weblogic.kubernetes.assertions.impl.Kubernetes.isPodRestarted; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -44,6 +48,10 @@ public class Domain { } } + private static ConditionFactory withQuickRetryPolicy = with().pollDelay(0, SECONDS) + .and().with().pollInterval(3, SECONDS) + .atMost(12, SECONDS).await(); + private static final CustomObjectsApi customObjectsApi = new CustomObjectsApi(); private static final ApiextensionsV1beta1Api apiextensionsV1beta1Api = new ApiextensionsV1beta1Api(); @@ -86,10 +94,10 @@ public static Callable doesDomainExist(String domainUid, String domainV = customObjectsApi.getNamespacedCustomObject( "weblogic.oracle", domainVersion, namespace, "domains", domainUid); } catch (ApiException apex) { - logger.info(apex.getMessage()); + getLogger().info(apex.getMessage()); } boolean domainExist = (domainObject != null); - logger.info("Domain Object exists : " + domainExist); + getLogger().info("Domain Object exists : " + domainExist); return domainExist; }; } @@ -111,12 +119,12 @@ public static boolean domainResourceImagePatched( try { domain = getDomainCustomResource(domainUID, namespace); } catch (ApiException apex) { - logger.severe("Failed to obtain the domain resource object from the API server", apex); + getLogger().severe("Failed to obtain the domain resource object from the API server", apex); return false; } boolean domainPatched = (domain.spec().image().equals(image)); - logger.info("Domain Object patched : " + domainPatched + " domain image = " + domain.spec().image()); + getLogger().info("Domain Object patched : " + domainPatched + " domain image = " + domain.spec().image()); return domainPatched; } @@ -137,12 +145,13 @@ public static boolean domainResourceCredentialsSecretPatched( try { domain = getDomainCustomResource(domainUID, namespace); } catch (ApiException apex) { - logger.severe(String.format("Failed to obtain domain resource %s in namespace %s", domainUID, namespace), apex); + getLogger().severe(String.format("Failed to obtain domain resource %s in namespace %s", + domainUID, namespace), apex); return false; } boolean domainPatched = domain.spec().webLogicCredentialsSecret().getName().equals(secretName); - logger.info("Domain {0} is patched with webLogicCredentialsSecret: {1}", + getLogger().info("Domain {0} is patched with webLogicCredentialsSecret: {1}", domainUID, domain.getSpec().webLogicCredentialsSecret().getName()); return domainPatched; } @@ -163,6 +172,9 @@ public static boolean adminT3ChannelAccessible(String domainUid, String namespac */ public static boolean adminNodePortAccessible(int nodePort, String userName, String password) throws IOException { + + LoggingFacade logger = getLogger(); + String consoleUrl = new StringBuffer() .append("http://") .append(K8S_NODEPORT_HOST) @@ -170,7 +182,7 @@ public static boolean adminNodePortAccessible(int nodePort, String userName, Str .append(nodePort) .append("/console/login/LoginForm.jsp").toString(); - logger.info("Accessing WebLogic console with url {0}", consoleUrl); + getLogger().info("Accessing WebLogic console with url {0}", consoleUrl); final WebClient webClient = new WebClient(); final HtmlPage loginPage = assertDoesNotThrow(() -> webClient.getPage(consoleUrl), "connection to the WebLogic admin console failed"); @@ -178,10 +190,10 @@ public static boolean adminNodePortAccessible(int nodePort, String userName, Str form.getInputByName("j_username").type(userName); form.getInputByName("j_password").type(password); HtmlElement submit = form.getOneHtmlElementByAttribute("input", "type", "submit"); - logger.info("Clicking login button"); + getLogger().info("Clicking login button"); HtmlPage home = submit.click(); assertTrue(home.asText().contains("Persistent Stores"), "Home does not contain Persistent Stores text"); - logger.info("Console login passed"); + getLogger().info("Console login passed"); return true; } @@ -202,25 +214,25 @@ public static boolean podStateNotChanged(String podName, if (assertDoesNotThrow(() -> doesPodNotExist(domainNamespace, domainUid, podName), String.format("podExists failed with ApiException for pod %s in namespace %s", podName, domainNamespace))) { - logger.info("pod {0} does not exist in namespace {1}", podName, domainNamespace); + getLogger().info("pod {0} does not exist in namespace {1}", podName, domainNamespace); return false; } // if the pod is not in ready state, return false - logger.info("Checking that pod {0} is ready in namespace {1}", podName, domainNamespace); + getLogger().info("Checking that pod {0} is ready in namespace {1}", podName, domainNamespace); if (!assertDoesNotThrow(() -> isPodReady(domainNamespace, domainUid, podName), String.format("isPodReady failed with ApiException for pod %s in namespace %s", podName, domainNamespace))) { - logger.info("pod {0} is not ready in namespace {1}", podName, domainNamespace); + getLogger().info("pod {0} is not ready in namespace {1}", podName, domainNamespace); return false; } // if the pod was restarted, return false - logger.info("Checking that pod {0} is not restarted in namespace {1}", podName, domainNamespace); + getLogger().info("Checking that pod {0} is not restarted in namespace {1}", podName, domainNamespace); if (assertDoesNotThrow(() -> - isPodRestarted(podName, domainUid, domainNamespace, podOriginalCreationTimestamp), + isPodRestarted(podName, domainNamespace, podOriginalCreationTimestamp), String.format("isPodRestarted failed with ApiException for pod %s in namespace %s", podName, domainNamespace))) { - logger.info("pod {0} is restarted in namespace {1}", podName, domainNamespace); + getLogger().info("pod {0} is restarted in namespace {1}", podName, domainNamespace); return false; } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Kubernetes.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Kubernetes.java index 2e573dfcaec..5d4a69f96fd 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Kubernetes.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Kubernetes.java @@ -4,6 +4,7 @@ package oracle.weblogic.kubernetes.assertions.impl; import java.io.IOException; +import java.nio.file.Path; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -11,6 +12,7 @@ import java.util.logging.Level; import java.util.stream.Collectors; +import io.kubernetes.client.Copy; import io.kubernetes.client.openapi.ApiClient; import io.kubernetes.client.openapi.ApiException; import io.kubernetes.client.openapi.Configuration; @@ -18,6 +20,9 @@ import io.kubernetes.client.openapi.apis.CoreV1Api; import io.kubernetes.client.openapi.apis.CustomObjectsApi; import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1Deployment; +import io.kubernetes.client.openapi.models.V1DeploymentCondition; +import io.kubernetes.client.openapi.models.V1DeploymentList; import io.kubernetes.client.openapi.models.V1Job; import io.kubernetes.client.openapi.models.V1JobCondition; import io.kubernetes.client.openapi.models.V1JobList; @@ -29,12 +34,14 @@ import io.kubernetes.client.openapi.models.V1Service; import io.kubernetes.client.openapi.models.V1ServiceList; import io.kubernetes.client.util.ClientBuilder; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import org.joda.time.DateTime; import static io.kubernetes.client.util.Yaml.dump; import static oracle.weblogic.kubernetes.actions.TestActions.getPodRestartVersion; import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.getPodCreationTimestamp; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.listDeployments; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; public class Kubernetes { @@ -95,7 +102,7 @@ public static boolean doesPodNotExist(String namespace, String domainUid, String if (pod == null) { podDeleted = true; } else { - logger.info("[" + pod.getMetadata().getName() + "] still exist"); + getLogger().info("[" + pod.getMetadata().getName() + "] still exist"); } return podDeleted; } @@ -118,7 +125,7 @@ public static boolean isPodRunning(String namespace, String domainUid, String po if (pod != null) { status = pod.getStatus().getPhase().equals(RUNNING); } else { - logger.info("Pod doesn't exist"); + getLogger().info("Pod doesn't exist"); } return status; } @@ -133,6 +140,7 @@ public static boolean isPodRunning(String namespace, String domainUid, String po @throws ApiException if Kubernetes client API call fails */ public static boolean isPodReady(String namespace, Map labels, String podName) throws ApiException { + final LoggingFacade logger = getLogger(); boolean status = false; String labelSelector = null; if (labels != null && !labels.isEmpty()) { @@ -191,6 +199,7 @@ public static boolean isPodReady(String namespace, String domainUid, String podN */ public static boolean isPodTerminating(String namespace, String domainUid, String podName) throws ApiException { + LoggingFacade logger = getLogger(); boolean terminating = false; String labelSelector = null; if (domainUid != null) { @@ -225,6 +234,7 @@ public static boolean podRestartVersionUpdated( String podName, String expectedRestartVersion ) throws ApiException { + LoggingFacade logger = getLogger(); String restartVersion = getPodRestartVersion(namespace, "", podName); if (restartVersion != null && restartVersion.equals(expectedRestartVersion)) { @@ -297,7 +307,7 @@ public static boolean isOperatorPodReady(String namespace) throws ApiException { status = v1PodReadyCondition.getStatus().equalsIgnoreCase("true"); } } else { - logger.info("Pod doesn't exist"); + getLogger().info("Pod doesn't exist"); } return status; } @@ -352,7 +362,7 @@ public static V1Pod getPod(String namespace, String labelSelector, String podNam ); for (V1Pod item : v1PodList.getItems()) { if (item.getMetadata().getName().contains(podName.trim())) { - logger.info("Name: {0}, Namespace: {1}, Phase: {2}", + getLogger().info("Name: {0}, Namespace: {1}, Phase: {2}", item.getMetadata().getName(), namespace, item.getStatus().getPhase()); return item; } @@ -390,6 +400,7 @@ public static boolean doesServiceExist( public static V1Service getService( String serviceName, Map label, String namespace) throws ApiException { + LoggingFacade logger = getLogger(); String labelSelector = null; if (label != null) { String key = label.keySet().iterator().next().toString(); @@ -427,6 +438,75 @@ public static V1Service getService( return null; } + /** + * Get V1Deployment object for the given name, label and namespace. + * @param deploymentName name of the deployment to look for + * @param label the key value pair with which the deployment is decorated with + * @param namespace the namespace in which to check for the deployment + * @return V1Deployment object if found otherwise null + * @throws ApiException when there is error in querying the cluster + */ + public static V1Deployment getDeployment( + String deploymentName, Map label, String namespace) + throws ApiException { + String labelSelector = null; + LoggingFacade logger = getLogger(); + if (label != null) { + String key = label.keySet().iterator().next().toString(); + String value = label.get(key).toString(); + labelSelector = String.format("%s in (%s)", key, value); + logger.info(labelSelector); + } + V1DeploymentList v1DeploymentList = listDeployments(namespace); + + for (V1Deployment deployment : v1DeploymentList.getItems()) { + if (deployment.getMetadata().getName().equals(deploymentName.trim()) + && deployment.getMetadata().getNamespace().equals(namespace.trim())) { + logger.info("Deployment Name : " + deployment.getMetadata().getName()); + logger.info("Deployment Namespace : " + deployment.getMetadata().getNamespace()); + logger.info("Deployment status : " + deployment.getStatus().toString()); + Map labels = deployment.getMetadata().getLabels(); + if (labels != null) { + for (Map.Entry entry : labels.entrySet()) { + logger.log(Level.INFO, "Label Key: {0} Label Value: {1}", + new Object[]{entry.getKey(), entry.getValue()}); + } + } + return deployment; + } + } + return null; + } + + /** + * Checks if an deployment is running in a given namespace. + * @param deploymentName name of deployment to check + * @param label set of deployment labels + * @param namespace in which to check for the pod existence + * @return true if deployment exists and available otherwise false + * @throws ApiException when there is error in querying the cluster + */ + public static boolean isDeploymentReady(String deploymentName, + Map label, + String namespace) throws ApiException { + boolean status = false; + V1Deployment deployment = getDeployment(deploymentName, label, namespace); + if (deployment != null) { + // get the deploymentCondition with the 'Available' type field + V1DeploymentCondition v1DeploymentRunningCondition = deployment.getStatus().getConditions().stream() + .filter(v1DeploymentCondition -> "Available".equals(v1DeploymentCondition.getType())) + .findAny() + .orElse(null); + + if (v1DeploymentRunningCondition != null) { + status = v1DeploymentRunningCondition.getStatus().equalsIgnoreCase("true"); + } + } else { + getLogger().info("Deployment doesn't exist"); + } + return status; + } + /** * Get a list of pods from given namespace and label. * @@ -460,6 +540,7 @@ public static V1PodList listPods(String namespace, String labelSelectors) throws * @throws ApiException when there is error in querying the cluster */ public static void listServices(String namespace, String labelSelectors) throws ApiException { + LoggingFacade logger = getLogger(); V1ServiceList v1ServiceList = coreV1Api.listServiceForAllNamespaces( Boolean.FALSE, // allowWatchBookmarks requests watch events with type "BOOKMARK". @@ -521,7 +602,7 @@ public static V1JobList listJobs(String namespace, String labelSelectors) Boolean.FALSE // Boolean | Watch for changes to the described resources ); } catch (ApiException apex) { - logger.warning(apex.getResponseBody()); + getLogger().warning(apex.getResponseBody()); throw apex; } return list; @@ -558,6 +639,7 @@ public static V1Job getJob(String namespace, String labelSelectors, String jobNa public static boolean isJobComplete(String namespace, String labelSelectors, String jobName) throws ApiException { boolean completionStatus = false; + LoggingFacade logger = getLogger(); V1Job job = getJob(namespace, labelSelectors, jobName); if (job != null && job.getStatus() != null) { @@ -596,15 +678,15 @@ public static boolean adminServerReady(String domainUid, String namespace) { * Check if a pod is restarted based on podCreationTimestamp. * * @param podName the name of the pod to check for - * @param domainUid the label the pod is decorated with * @param namespace in which the pod is running * @param timestamp the initial podCreationTimestamp * @return true if the pod's creation timestamp is later than the initial PodCreationTimestamp * @throws ApiException when query fails */ public static boolean isPodRestarted( - String podName, String domainUid, + String podName, String namespace, DateTime timestamp) throws ApiException { + LoggingFacade logger = getLogger(); DateTime newCreationTime = getPodCreationTimestamp(namespace, "", podName); if (newCreationTime != null @@ -640,7 +722,7 @@ public static V1PersistentVolumeList listPersistentVolumes(String labels) throws false // Watch for changes to the described resources ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } return listPersistentVolume; @@ -668,10 +750,57 @@ public static V1PersistentVolumeClaimList listPersistentVolumeClaims(String name false // Watch for changes to the described resources ); } catch (ApiException apex) { - logger.severe(apex.getResponseBody()); + getLogger().severe(apex.getResponseBody()); throw apex; } return v1PersistentVolumeClaimList; } + + /** + * Copy a file to a pod in specified namespace. + * @param namespace namespace in which the pod exists + * @param pod name of pod where the file will be copied to + * @param container name of the container inside of the pod + * @param srcPath source location of the file + * @param destPath destination location of the file + * @throws ApiException if Kubernetes API client call fails + * @throws IOException if copy fails + */ + public static void copyFileToPod(String namespace, + String pod, + String container, + Path srcPath, + Path destPath) + throws ApiException, IOException { + Copy copy = new Copy(apiClient); + copy.copyFileToPod(namespace, pod, container, srcPath, destPath); + } + + /** + * Check if the operator pod in the given namespace is restarted based on podCreationTimestamp. + * + * @param namespace in which the operator pod is running + * @param timestamp the initial podCreationTimestamp + * @return true if the pod's creation timestamp is later than the initial PodCreationTimestamp + * @throws ApiException when query fails + */ + public static Boolean isOperatorPodRestarted(String namespace, DateTime timestamp) throws ApiException { + String labelSelector = String.format("weblogic.operatorName in (%s)", namespace); + V1Pod pod = getPod(namespace, labelSelector, "weblogic-operator-"); + if (pod != null) { + // get the podCondition with the 'Ready' type field + V1PodCondition v1PodReadyCondition = pod.getStatus().getConditions().stream() + .filter(v1PodCondition -> "Ready".equals(v1PodCondition.getType())) + .findAny() + .orElse(null); + + if (v1PodReadyCondition != null + && v1PodReadyCondition.getStatus().equalsIgnoreCase("true")) { + String podName = pod.getMetadata().getName(); + return isPodRestarted(podName, namespace, timestamp); + } + } + return false; + } } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Pod.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Pod.java index aad1bc5ecb0..734dd63e34d 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Pod.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Pod.java @@ -13,7 +13,7 @@ import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.SECONDS; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.awaitility.Awaitility.with; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -30,7 +30,7 @@ public static boolean verifyRollingRestartOccurred(Map pods, i // check the pods list is not empty if (pods.isEmpty()) { - logger.severe("The pods list is empty"); + getLogger().severe("The pods list is empty"); return false; } @@ -41,7 +41,7 @@ public static boolean verifyRollingRestartOccurred(Map pods, i for (Map.Entry entry : pods.entrySet()) { // check pods are replaced retry - .conditionEvaluationListener(condition -> logger.info("Waiting for pod {0} to be " + .conditionEvaluationListener(condition -> getLogger().info("Waiting for pod {0} to be " + "restarted in namespace {1} " + "(elapsed time {2}ms, remaining time {3}ms)", entry.getKey(), @@ -53,7 +53,7 @@ public static boolean verifyRollingRestartOccurred(Map pods, i // check pods are in ready status retry - .conditionEvaluationListener(condition -> logger.info("Waiting for pod {0} to be " + .conditionEvaluationListener(condition -> getLogger().info("Waiting for pod {0} to be " + "ready in namespace {1} " + "(elapsed time {2}ms, remaining time {3}ms)", entry.getKey(), @@ -88,19 +88,19 @@ private static Callable podRestarted(String podName, Map metadata.getMetadata()) .map(timeStamp -> timeStamp.getDeletionTimestamp()).orElse(null); if (deletionTimeStamp != null) { - logger.info("Pod {0} is getting replaced", entry.getKey()); + getLogger().info("Pod {0} is getting replaced", entry.getKey()); if (++terminatingPods > maxUnavailable) { - logger.severe("more than maxUnavailable {0} pod(s) are restarting", maxUnavailable); + getLogger().severe("more than maxUnavailable {0} pod(s) are restarting", maxUnavailable); throw new Exception("more than maxUnavailable pods are restarting"); } } if (podName.equals(entry.getKey())) { if (pod != null && pod.getMetadata().getCreationTimestamp() != null) { DateTime newCreationTimeStamp = pod.getMetadata().getCreationTimestamp(); - logger.info("Comparing creation timestamps old: {0} new {1}", + getLogger().info("Comparing creation timestamps old: {0} new {1}", entry.getValue(), newCreationTimeStamp); if (newCreationTimeStamp.isAfter(entry.getValue())) { - logger.info("Pod {0} is restarted", entry.getKey()); + getLogger().info("Pod {0} is restarted", entry.getKey()); podRestartStatus = true; } } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/RoleBinding.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/RoleBinding.java new file mode 100644 index 00000000000..e251d0f7f39 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/RoleBinding.java @@ -0,0 +1,39 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.assertions.impl; + +import java.util.List; + +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1RoleBinding; +import io.kubernetes.client.openapi.models.V1RoleBindingList; + +import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.listNamespacedRoleBinding; + +public class RoleBinding { + + /** + * Check whether the role binding exists in the specified namespace. + * + * @param name name of the role binding to check + * @param namespace the namespace in which to check the role binding existence + * @return true if the role binding exists, false otherwise + * @throws ApiException if Kubernetes client API call fails + */ + public static boolean roleBindingExists(String name, String namespace) throws ApiException { + V1RoleBindingList roleBindingList = listNamespacedRoleBinding(namespace); + List roleBindings = roleBindingList.getItems(); + + for (V1RoleBinding roleBinding : roleBindings) { + if (roleBinding.getMetadata() != null && roleBinding.getMetadata().getName() != null) { + if (roleBinding.getMetadata().getName().equals(name)) { + return true; + } + } + } + + return false; + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Voyager.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Voyager.java new file mode 100644 index 00000000000..c9606ec4fee --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/Voyager.java @@ -0,0 +1,36 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.assertions.impl; + +import java.util.concurrent.Callable; + +/** + * Assertions for Voyager ingress controller. + */ +public class Voyager { + + /** + * Check if the Voyager pod is running in a given namespace. + * + * @param namespace in which to check if the Voyager pod is running + * @param podName name of Voyager ingress controller pod or ingress resource pod + * @return true if the Voyager pod is running, false otherwise + */ + public static Callable isRunning(String namespace, String podName) { + String labelSelector = null; + return () -> Kubernetes.isPodRunning(namespace, labelSelector, podName); + } + + /** + * Check if the Voyager pod is ready in a given namespace. + * + * @param namespace in which to check the Voyager pod is ready + * @param podName name of Voyager ingress controller pod or ingress resource pod + * @return true if the Voyager pod is in the ready state, false otherwise + */ + public static Callable isReady(String namespace, String podName) { + String labelSelector = null; + return () -> Kubernetes.isPodReady(namespace, labelSelector, podName); + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/WitAssertion.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/WitAssertion.java index c936ed0a019..7795be63f9f 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/WitAssertion.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/assertions/impl/WitAssertion.java @@ -6,7 +6,7 @@ import oracle.weblogic.kubernetes.utils.ExecCommand; import oracle.weblogic.kubernetes.utils.ExecResult; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.assertj.core.api.Assertions.assertThat; /** @@ -21,7 +21,7 @@ public class WitAssertion { * @return true if the image does exist, false otherwise */ public static boolean doesImageExist(String imageName, String imageTag) { - logger.info("Checking if image " + imageName + ":" + imageTag + " exists."); + getLogger().info("Checking if image " + imageName + ":" + imageTag + " exists."); // verify the docker image is created Exception exception = null;; try { diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/ImageBuilders.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/ImageBuilders.java index b064a17213c..4d79040fbef 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/ImageBuilders.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/ImageBuilders.java @@ -15,12 +15,14 @@ import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.logging.Handler; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import oracle.weblogic.kubernetes.TestConstants; import oracle.weblogic.kubernetes.actions.impl.Operator; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import oracle.weblogic.kubernetes.utils.ExecCommand; import oracle.weblogic.kubernetes.utils.ExecResult; import org.junit.jupiter.api.extension.BeforeAllCallback; @@ -31,6 +33,11 @@ import static oracle.weblogic.kubernetes.TestConstants.JRF_BASE_IMAGE_NAME; import static oracle.weblogic.kubernetes.TestConstants.JRF_BASE_IMAGE_TAG; import static oracle.weblogic.kubernetes.TestConstants.KIND_REPO; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_APP_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_DOMAINTYPE; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_WDT_MODEL_FILE; import static oracle.weblogic.kubernetes.TestConstants.OCR_PASSWORD; import static oracle.weblogic.kubernetes.TestConstants.OCR_REGISTRY; import static oracle.weblogic.kubernetes.TestConstants.OCR_USERNAME; @@ -64,9 +71,11 @@ import static oracle.weblogic.kubernetes.actions.TestActions.dockerPush; import static oracle.weblogic.kubernetes.actions.TestActions.dockerTag; import static oracle.weblogic.kubernetes.assertions.TestAssertions.doesImageExist; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; import static oracle.weblogic.kubernetes.utils.FileUtils.checkDirectory; import static oracle.weblogic.kubernetes.utils.FileUtils.cleanupDirectory; +import static oracle.weblogic.kubernetes.utils.IstioUtils.installIstio; +import static oracle.weblogic.kubernetes.utils.IstioUtils.uninstallIstio; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.GLOBAL; @@ -78,12 +87,15 @@ public class ImageBuilders implements BeforeAllCallback, ExtensionContext.Store. private static final AtomicBoolean started = new AtomicBoolean(false); private static final CountDownLatch initializationLatch = new CountDownLatch(1); private static String operatorImage; + private static String miiBasicImage; private static String wdtBasicImage; private static Collection pushedImages = new ArrayList<>(); + @Override public void beforeAll(ExtensionContext context) { + LoggingFacade logger = getLogger(); /* The pattern is that we have initialization code that we want to run once to completion * before any tests are executed. This method will be called before every test method. Therefore, the * very first time this method is called we will do the initialization. Since we assume that the tests @@ -113,6 +125,13 @@ public void beforeAll(ExtensionContext context) { assertTrue(Operator.buildImage(operatorImage)); if (System.getenv("SKIP_BASIC_IMAGE_BUILD") == null) { + // build MII basic image + miiBasicImage = MII_BASIC_IMAGE_NAME + ":" + MII_BASIC_IMAGE_TAG; + assertTrue(createBasicImage(MII_BASIC_IMAGE_NAME, MII_BASIC_IMAGE_TAG, MII_BASIC_WDT_MODEL_FILE, + null, MII_BASIC_APP_NAME, MII_BASIC_IMAGE_DOMAINTYPE), + String.format("Failed to create the image %s using WebLogic Image Tool", + miiBasicImage)); + // build basic wdt-domain-in-image image wdtBasicImage = WDT_BASIC_IMAGE_NAME + ":" + WDT_BASIC_IMAGE_TAG; assertTrue(createBasicImage(WDT_BASIC_IMAGE_NAME, WDT_BASIC_IMAGE_TAG, WDT_BASIC_MODEL_FILE, @@ -127,6 +146,9 @@ public void beforeAll(ExtensionContext context) { * as docker images imagename:imagetag is not working and * the test fails even though the image exists. */ + assertTrue(doesImageExist(MII_BASIC_IMAGE_TAG), + String.format("Image %s doesn't exist", miiBasicImage)); + assertTrue(doesImageExist(WDT_BASIC_IMAGE_TAG), String.format("Image %s doesn't exist", wdtBasicImage)); @@ -135,17 +157,20 @@ public void beforeAll(ExtensionContext context) { assertTrue(dockerLogin(REPO_REGISTRY, REPO_USERNAME, REPO_PASSWORD), "docker login failed"); } } - // push the image if (!REPO_NAME.isEmpty()) { logger.info("docker push image {0} to {1}", operatorImage, REPO_NAME); assertTrue(dockerPush(operatorImage), String.format("docker push failed for image %s", operatorImage)); if (System.getenv("SKIP_BASIC_IMAGE_BUILD") == null) { + logger.info("docker push mii basic image {0} to registry", miiBasicImage); + assertTrue(dockerPush(miiBasicImage), String.format("docker push failed for image %s", miiBasicImage)); + logger.info("docker push wdt basic domain in image {0} to registry", wdtBasicImage); assertTrue(dockerPush(wdtBasicImage), String.format("docker push failed for image %s", wdtBasicImage)); } } + // The following code is for pulling WLS images if running tests in Kind cluster if (KIND_REPO != null) { // We can't figure out why the kind clusters can't pull images from OCR using the image pull secret. There @@ -164,6 +189,8 @@ public void beforeAll(ExtensionContext context) { assertTrue(dockerLogin(OCR_REGISTRY, OCR_USERNAME, OCR_PASSWORD), "docker login failed"); pullImageFromOcrAndPushToKind(images); } + logger.info("Installing istio before any test suites are run"); + installIstio(); } finally { // Initialization is done. Release all waiting other threads. The latch is now disabled so // other threads @@ -192,6 +219,10 @@ public static void registerPushedImage(String imageName) { @Override public void close() { + LoggingFacade logger = getLogger(); + logger.info("Cleanup istio after all test suites are run"); + uninstallIstio(); + logger.info("Cleanup images after all test suites are run"); // delete all the images from local repo @@ -208,9 +239,14 @@ public void close() { } } } + + for (Handler handler:logger.getUnderlyingLogger().getHandlers()) { + handler.close(); + } } private String getOcirToken() { + LoggingFacade logger = getLogger(); Path scriptPath = Paths.get(RESOURCE_DIR, "bash-scripts", "ocirtoken.sh"); String cmd = scriptPath.toFile().getAbsolutePath(); ExecResult result = null; @@ -229,6 +265,7 @@ private String getOcirToken() { } private void deleteImageOcir(String token, String imageName) { + LoggingFacade logger = getLogger(); int firstSlashIdx = imageName.indexOf('/'); String registry = imageName.substring(0, firstSlashIdx); int secondSlashIdx = imageName.indexOf('/', firstSlashIdx + 1); @@ -321,7 +358,7 @@ private void deleteImageOcir(String token, String imageName) { */ private boolean createBasicImage(String imageName, String imageTag, String modelFile, String varFile, String appName, String domainType) { - + LoggingFacade logger = getLogger(); final String image = imageName + ":" + imageTag; // build the model file list @@ -357,8 +394,8 @@ private boolean createBasicImage(String imageName, String imageTag, String model final List modelVarList = Collections.singletonList(MODEL_DIR + "/" + varFile); imageCreation = createImage( defaultWitParams() - .imageName(imageName) - .imageTag(WDT_BASIC_IMAGE_TAG) + .modelImageName(imageName) + .modelImageTag(WDT_BASIC_IMAGE_TAG) .modelFiles(modelList) .modelArchiveFiles(archiveList) .modelVariableFiles(modelVarList) @@ -367,6 +404,17 @@ private boolean createBasicImage(String imageName, String imageTag, String model .wdtVersion(WDT_VERSION) .env(env) .redirect(true)); + } else if (domainType.equalsIgnoreCase("mii")) { + imageCreation = createImage( + defaultWitParams() + .modelImageName(imageName) + .modelImageTag(MII_BASIC_IMAGE_TAG) + .modelFiles(modelList) + .modelArchiveFiles(archiveList) + .wdtModelOnly(true) + .wdtVersion(WDT_VERSION) + .env(env) + .redirect(true)); } return imageCreation; } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/IntegrationTestWatcher.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/IntegrationTestWatcher.java index f26159c8f05..5d3c11e79a8 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/IntegrationTestWatcher.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/IntegrationTestWatcher.java @@ -32,7 +32,7 @@ import org.junit.jupiter.api.extension.TestWatcher; import static oracle.weblogic.kubernetes.actions.TestActions.createUniqueNamespace; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; /** @@ -90,14 +90,14 @@ public Object resolveParameter(ParameterContext parameterContext, String namespace = assertDoesNotThrow(() -> createUniqueNamespace(), "Failed to create unique namespace due to ApiException"); namespaces.add(namespace); - logger.info("Created a new namespace called {0}", namespace); + getLogger().info("Created a new namespace called {0}", namespace); } if (this.namespaces == null) { this.namespaces = namespaces; } else { this.namespaces.addAll(namespaces); } - logger.info(this.namespaces.toString()); + getLogger().info(this.namespaces.toString()); return namespaces; } @@ -160,7 +160,7 @@ public void handleBeforeEachMethodExecutionException(ExtensionContext context, T @Override public void beforeTestExecution(ExtensionContext context) throws Exception { printHeader(String.format("Ending beforeEach for %s()", methodName), "-"); - logger.info("About to execute [{0}] in {1}()", context.getDisplayName(), methodName); + getLogger().info("About to execute [{0}] in {1}()", context.getDisplayName(), methodName); getStore(context).put(START_TIME, System.currentTimeMillis()); } @@ -174,8 +174,8 @@ public void afterTestExecution(ExtensionContext context) throws Exception { Method testMethod = context.getRequiredTestMethod(); long startTime = getStore(context).remove(START_TIME, long.class); long duration = System.currentTimeMillis() - startTime; - logger.info("Finished executing [{0}] {1}()", context.getDisplayName(), methodName); - logger.info("Method [{0}] took {1} ms.", testMethod.getName(), duration); + getLogger().info("Finished executing [{0}] {1}()", context.getDisplayName(), methodName); + getLogger().info("Method [{0}] took {1} ms.", testMethod.getName(), duration); } private ExtensionContext.Store getStore(ExtensionContext context) { @@ -273,11 +273,11 @@ public void testFailed(ExtensionContext context, Throwable cause) { printHeader(String.format("Test FAILED %s()", methodName), "!"); if (System.getenv("SLEEP_SECONDS_AFTER_FAILURE") != null) { int sleepSecs = Integer.parseInt(System.getenv("SLEEP_SECONDS_AFTER_FAILURE")); - logger.info("Sleeping for " + sleepSecs + " seconds to keep the env. for debugging"); + getLogger().info("Sleeping for " + sleepSecs + " seconds to keep the env. for debugging"); try { Thread.sleep(sleepSecs * 1000); } catch (InterruptedException ie) { - logger.info("Exception in testFailed sleep {0}", ie); + getLogger().info("Exception in testFailed sleep {0}", ie); } } @@ -309,9 +309,9 @@ public void afterAll(ExtensionContext context) { // set SKIP_CLEANUP env. var to skip cleanup, mainly used for debugging in local runs if (System.getenv("SKIP_CLEANUP") != null && System.getenv("SKIP_CLEANUP").toLowerCase().equals("true")) { - logger.info("Skipping cleanup after test class"); + getLogger().info("Skipping cleanup after test class"); } else { - logger.info("Starting cleanup after test class"); + getLogger().info("Starting cleanup after test class"); CleanupUtil.cleanup(namespaces); } } @@ -336,9 +336,9 @@ public void handleAfterAllMethodExecutionException(ExtensionContext context, Thr * @param failedStage the stage in which the test failed */ private void collectLogs(ExtensionContext extensionContext, String failedStage) { - logger.info("Collecting logs..."); + getLogger().info("Collecting logs..."); if (namespaces == null || namespaces.isEmpty()) { - logger.warning("Namespace list is empty, " + getLogger().warning("Namespace list is empty, " + "see if the methods in the tests is(are) annotated with Namespaces()"); return; } @@ -348,7 +348,7 @@ private void collectLogs(ExtensionContext extensionContext, String failedStage) extensionContext.getRequiredTestClass().getSimpleName(), getExtDir(extensionContext, failedStage))); } catch (IOException ex) { - logger.warning(ex.getMessage()); + getLogger().warning(ex.getMessage()); } for (var namespace : namespaces) { LoggingUtil.collectLogs((String)namespace, resultDir.toString()); @@ -382,6 +382,6 @@ private String getExtDir(ExtensionContext extensionContext, String failedStage) * @param rc repeater string */ private void printHeader(String message, String rc) { - logger.info("\n" + rc.repeat(message.length()) + "\n" + message + "\n" + rc.repeat(message.length()) + "\n"); + getLogger().info("\n" + rc.repeat(message.length()) + "\n" + message + "\n" + rc.repeat(message.length()) + "\n"); } } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/LoggedTest.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/LoggedTest.java deleted file mode 100644 index be559589348..00000000000 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/LoggedTest.java +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) 2020, Oracle Corporation and/or its affiliates. -// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. - -package oracle.weblogic.kubernetes.extensions; - -import oracle.weblogic.kubernetes.logging.LoggingFacade; -import oracle.weblogic.kubernetes.logging.LoggingFactory; -import org.junit.jupiter.api.TestInstance; - -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -public interface LoggedTest { - LoggingFacade logger = LoggingFactory.getLogger(LoggedTest.class); -} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/LoggingExtension.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/LoggingExtension.java new file mode 100644 index 00000000000..8cf6ffe378f --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/LoggingExtension.java @@ -0,0 +1,24 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.extensions; + +import oracle.weblogic.kubernetes.utils.ThreadSafeLogger; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.TestInstancePostProcessor; + +public class LoggingExtension implements TestInstancePostProcessor { + + @Override + public void postProcessTestInstance( + Object testInstance, ExtensionContext extensionContext) throws Exception { + + ThreadSafeLogger.globalLogger.info("Initializing logger in postProcessTestInstance for {0}", + testInstance.getClass().getSimpleName()); + + // initialize logger for each test + ThreadSafeLogger.init(testInstance.getClass().getSimpleName()); + + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/logging/LoggingFactory.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/logging/LoggingFactory.java index eb8dd930dcf..668e1f0cc63 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/logging/LoggingFactory.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/logging/LoggingFactory.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.logging.Handler; import java.util.logging.Logger; import io.kubernetes.client.openapi.JSON; @@ -43,11 +44,33 @@ public static LoggingFacade getLogger(Class clazz) { */ public static synchronized LoggingFacade getLogger(String name, String resourceBundleName) { - LoggingFacade lf = facade.get(resourceBundleName); + LoggingFacade lf = facade.get(name); if (lf == null) { Logger logger = Logger.getLogger(name, resourceBundleName); lf = new LoggingFacade(logger); - facade.put(resourceBundleName, lf); + facade.put(name, lf); + } + + return lf; + } + + /** + * Obtains a Logger from the underlying logging implementation and wraps it in a LoggingFacade. + * + * @param name the name of the logger to use + * @param resourceBundleName the resource bundle to use with this logger + * @param handler handler for the logger + * @return a logger for the caller to use + */ + public static synchronized LoggingFacade getLogger( + String name, String resourceBundleName, Handler handler) { + + LoggingFacade lf = facade.get(name); + if (lf == null) { + Logger logger = Logger.getLogger(name, resourceBundleName); + lf = new LoggingFacade(logger); + logger.addHandler(handler); + facade.put(name, lf); } return lf; diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/BuildApplication.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/BuildApplication.java index 66802a38f1e..83684538433 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/BuildApplication.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/BuildApplication.java @@ -8,36 +8,21 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; -import java.util.HashMap; -import java.util.List; import java.util.Map; -import io.kubernetes.client.custom.Quantity; import io.kubernetes.client.openapi.ApiException; import io.kubernetes.client.openapi.models.V1Container; import io.kubernetes.client.openapi.models.V1EnvVar; -import io.kubernetes.client.openapi.models.V1HostPathVolumeSource; -import io.kubernetes.client.openapi.models.V1Job; -import io.kubernetes.client.openapi.models.V1JobCondition; -import io.kubernetes.client.openapi.models.V1JobSpec; import io.kubernetes.client.openapi.models.V1LocalObjectReference; import io.kubernetes.client.openapi.models.V1ObjectMeta; -import io.kubernetes.client.openapi.models.V1PersistentVolume; -import io.kubernetes.client.openapi.models.V1PersistentVolumeClaim; -import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimSpec; -import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimVolumeSource; -import io.kubernetes.client.openapi.models.V1PersistentVolumeSpec; import io.kubernetes.client.openapi.models.V1Pod; import io.kubernetes.client.openapi.models.V1PodSpec; -import io.kubernetes.client.openapi.models.V1PodTemplateSpec; -import io.kubernetes.client.openapi.models.V1ResourceRequirements; import io.kubernetes.client.openapi.models.V1Secret; import io.kubernetes.client.openapi.models.V1SecretList; -import io.kubernetes.client.openapi.models.V1SecurityContext; -import io.kubernetes.client.openapi.models.V1Volume; -import io.kubernetes.client.openapi.models.V1VolumeMount; import oracle.weblogic.kubernetes.TestConstants; -import oracle.weblogic.kubernetes.actions.impl.Namespace; +import oracle.weblogic.kubernetes.actions.impl.Exec; +import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import org.awaitility.core.ConditionFactory; import static java.util.concurrent.TimeUnit.MINUTES; @@ -48,25 +33,19 @@ import static oracle.weblogic.kubernetes.TestConstants.OCR_REGISTRY; import static oracle.weblogic.kubernetes.TestConstants.OCR_SECRET_NAME; import static oracle.weblogic.kubernetes.TestConstants.OCR_USERNAME; -import static oracle.weblogic.kubernetes.TestConstants.PV_ROOT; import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_NAME; import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_TAG; -import static oracle.weblogic.kubernetes.actions.TestActions.createNamespacedJob; -import static oracle.weblogic.kubernetes.actions.TestActions.createPersistentVolume; -import static oracle.weblogic.kubernetes.actions.TestActions.createPersistentVolumeClaim; -import static oracle.weblogic.kubernetes.actions.TestActions.getJob; -import static oracle.weblogic.kubernetes.actions.TestActions.getPodLog; -import static oracle.weblogic.kubernetes.actions.TestActions.listPods; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WORK_DIR; import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.listSecrets; -import static oracle.weblogic.kubernetes.assertions.TestAssertions.jobCompleted; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.podReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.verifyDefaultTokenExists; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.apache.commons.io.FileUtils.copyDirectory; import static org.apache.commons.io.FileUtils.deleteDirectory; import static org.awaitility.Awaitility.with; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Utility class to build application. @@ -75,233 +54,181 @@ public class BuildApplication { private static String image; private static boolean isUseSecret; - private static final String APPLICATIONS_MOUNT_PATH = "/application"; - private static final String SCRIPTS_MOUNT_PATH = "/buildScripts"; + private static final String APPLICATIONS_PATH = "/u01/application"; private static final String BUILD_SCRIPT = "build_application.sh"; private static final Path BUILD_SCRIPT_SOURCE_PATH = Paths.get(RESOURCE_DIR, "bash-scripts", BUILD_SCRIPT); - private static final ConditionFactory withStandardRetryPolicy - = with().pollDelay(2, SECONDS) - .and().with().pollInterval(10, SECONDS) - .atMost(5, MINUTES).await(); - /** * Build application. * - * @param application path of the application source folder - * @param parameters system properties for ant - * @param targets ant targets to call - * @param namespace name of the namespace to use for pvc - */ - public static void buildApplication(Path application, Map parameters, - String targets, String namespace) { + *

    The appSrcPath, your application source directory is zipped up and copied to a WebLogic server pod for building. + * If your archives are placed under < application_source > /build after building, use build as the + * archiveDistDir param value. This method copies the folder archiveDistDir to local file system and absolute + * path of the archiveDistDir directory is returned by this method. + *

    Example Usage:

    + *
    {@literal
    +   *     HashMap  antParams = new HashMap<>();
    +   *     antParams.put("key","value");
    +   *
    +   *     Path archivesDir = BuildApplication.buildApplication(
    +   *         "/scratch/speriyat/weblogic-kubernetes-operator/new-integration-tests/src/test/resources/apps/clusterview",
    +   *         antParams,
    +   *         "clean build all" // these targets must be supported by your build file
    +   *         "build" // the directory your build system creates
    +   *         "ns-abcd" // your domain or operator namespace, so that the pods are cleaned up after test is done
    +   *     );
    +   *     }
    +   * The returned archivesDir location will be -
    +   * WORK_DIR/your_application_name/u01/application/archiveDistDir
    +   * All your built archives will be under the above directory
    +   * Example: /tmp/it-results/clusterview/u01/application/dist/clusterview.war
    +   * 
    + *

    + * + * @param appSrcPath path of the application source folder + * @param antParams ant parameters + * @param antTargets ant targets to call + * @param archiveDistDir location of the archive built inside source directory + * @param namespace name of the namespace to create the pod in + * @return Path path of the archive built + */ + public static Path buildApplication(Path appSrcPath, Map antParams, + String antTargets, String archiveDistDir, String namespace) { + final LoggingFacade logger = getLogger(); setImage(namespace); - // Copy the application source directory to PV_ROOT/applications/ - // This location is mounted in the build pod under /application - Path targetPath = Paths.get(PV_ROOT, "applications", application.getFileName().toString()); - logger.info("Copy the application {0} to PV hostpath {1}", application, targetPath); + // Path of temp location for application source directory + Path tempAppPath = Paths.get(WORK_DIR, "j2eeapplications", appSrcPath.getFileName().toString()); + // directory to copy archives built + Path destArchiveBaseDir = Paths.get(WORK_DIR, appSrcPath.getFileName().toString()); + Path destDir = null; + assertDoesNotThrow(() -> { - Files.createDirectories(targetPath); - deleteDirectory(targetPath.toFile()); - Files.createDirectories(targetPath); - copyDirectory(application.toFile(), targetPath.toFile()); - Files.copy(BUILD_SCRIPT_SOURCE_PATH, targetPath.resolve(BUILD_SCRIPT_SOURCE_PATH.getFileName())); - }); + // recreate WORK_DIR/j2eeapplications/ + logger.info("Deleting and recreating {0}", tempAppPath); + Files.createDirectories(tempAppPath); + deleteDirectory(tempAppPath.toFile()); + Files.createDirectories(tempAppPath); - // create the persistent volume to make the application archive accessible to pod - String uniqueName = Namespace.uniqueName(); - String pvName = namespace + "-build-pv-" + uniqueName; - String pvcName = namespace + "-build-pvc-" + uniqueName; + Files.createDirectories(destArchiveBaseDir); + deleteDirectory(destArchiveBaseDir.toFile()); + Files.createDirectories(destArchiveBaseDir); - assertDoesNotThrow(() -> createPV(targetPath, pvName), "Failed to create PV"); - createPVC(pvName, pvcName, namespace); + // copy the application source to WORK_DIR/j2eeapplications/ for zipping + logger.info("Copying {0} to {1}", appSrcPath, tempAppPath); + copyDirectory(appSrcPath.toFile(), tempAppPath.toFile()); + }); - // build application - build(parameters, targets, pvName, pvcName, namespace); - } + // zip up the application source to be copied to pod for building + Path zipFile = Paths.get(FileUtils.createZipFile(tempAppPath)); - /** - * Build application using a WebLogic image pod. - * - * @param parameters system properties for ant - * @param targets ant targets to call - * @param pvName name of the persistent volume to create domain in - * @param pvcName name of the persistent volume claim - * @param namespace name of the domain namespace in which the job is created - */ - private static void build(Map parameters, String targets, - String pvName, String pvcName, String namespace) { - logger.info("Preparing to run build job"); - V1Container jobCreationContainer = new V1Container() - .addCommandItem("/bin/sh") - .addArgsItem(APPLICATIONS_MOUNT_PATH + "/" + BUILD_SCRIPT); + // add ant properties as env variable in pod + V1Container buildContainer = new V1Container(); - // add ant properties to env - if (parameters != null) { + // set ZIP_FILE location as env variable in pod + buildContainer.addEnvItem(new V1EnvVar() + .name("ZIP_FILE") + .value(zipFile.getFileName().toString())); + + // set ant parameteres as env variable in pod + if (antParams != null) { StringBuilder params = new StringBuilder(); - parameters.entrySet().forEach((parameter) -> { + antParams.entrySet().forEach((parameter) -> { params.append("-D").append(parameter.getKey()).append("=").append(parameter.getValue()).append(" "); }); - jobCreationContainer = jobCreationContainer + buildContainer = buildContainer .addEnvItem(new V1EnvVar().name("sysprops").value(params.toString())); } - // add targets in env - if (targets != null) { - jobCreationContainer = jobCreationContainer - .addEnvItem(new V1EnvVar().name("targets").value(targets)); + // set add targets in env variable "targets" + if (antTargets != null) { + buildContainer = buildContainer + .addEnvItem(new V1EnvVar().name("targets").value(antTargets)); } - logger.info("Running a Kubernetes job to build application"); + //setup temporary WebLogic pod to build application + V1Pod webLogicPod = setupWebLogicPod(namespace, buildContainer); + try { - createBuildJob(pvName, pvcName, namespace, jobCreationContainer); - } catch (ApiException ex) { - logger.severe("Building application failed"); - fail("Halting test since build failed"); + //copy the zip file to /u01 location inside pod + Kubernetes.copyFileToPod(namespace, webLogicPod.getMetadata().getName(), + null, zipFile, Paths.get("/u01", zipFile.getFileName().toString())); + } catch (ApiException | IOException ioex) { + logger.info(ioex.getMessage()); + } + try { + //copy the build script to /u01 location inside pod + Kubernetes.copyFileToPod(namespace, webLogicPod.getMetadata().getName(), + null, BUILD_SCRIPT_SOURCE_PATH, Paths.get("/u01", BUILD_SCRIPT)); + } catch (ApiException | IOException ioex) { + logger.info(ioex.getMessage()); + } + try { + //Kubernetes.exec(webLogicPod, new String[]{"/bin/sh", "/u01/" + BUILD_SCRIPT}); + ExecResult exec = Exec.exec(webLogicPod, null, false, "/bin/sh", "/u01/" + BUILD_SCRIPT); + assertEquals(0, exec.exitValue()); + if (exec.stdout() != null) { + logger.info(exec.stdout()); + } + if (exec.stderr() != null) { + logger.info(exec.stderr()); + } + Kubernetes.copyDirectoryFromPod(webLogicPod, + Paths.get(APPLICATIONS_PATH, archiveDistDir).toString(), destArchiveBaseDir); + } catch (ApiException | IOException | InterruptedException ioex) { + logger.info(ioex.getMessage()); } + return destDir = Paths.get(destArchiveBaseDir.toString(), "u01/application", archiveDistDir); } + + /** - * Create a job to build application inside a WebLogic pod. + * Create a temporary WebLogic pod to build j2ee applications. * - * @param pvName name of the persistent volume containing application source - * @param pvcName name of the persistent volume claim - * @param buildScriptConfigMapName configmap holding build script files - * @param namespace name of the domain namespace in which the job is created - * @param jobContainer V1Container with job commands to build application - * @throws ApiException when Kubernetes cluster query fails + * @param namespace name of the namespace in which to create the temporary pod + * @return V1Pod created pod object + * @throws ApiException when create pod fails */ - private static void createBuildJob(String pvName, - String pvcName, String namespace, V1Container jobContainer) - throws ApiException { - logger.info("Running Kubernetes job to build application"); - String uniqueName = Namespace.uniqueName(); - String name = namespace + "-build-job-" + uniqueName; + private static V1Pod setupWebLogicPod(String namespace, V1Container container) { + final LoggingFacade logger = getLogger(); + ConditionFactory withStandardRetryPolicy = with().pollDelay(10, SECONDS) + .and().with().pollInterval(2, SECONDS) + .atMost(3, MINUTES).await(); + verifyDefaultTokenExists(); - V1Job jobBody = new V1Job() - .metadata( - new V1ObjectMeta() - .name(name) - .namespace(namespace)) - .spec(new V1JobSpec() - .backoffLimit(0) // try only once - .template(new V1PodTemplateSpec() - .spec(new V1PodSpec() - .initContainers(Arrays.asList(new V1Container() - .name("fix-pvc-owner") // change the ownership of the pv to opc:opc - .image(image) - .addCommandItem("/bin/sh") - .addArgsItem("-c") - .addArgsItem("chown -R 1000:1000 " + APPLICATIONS_MOUNT_PATH) - .volumeMounts(Arrays.asList( - new V1VolumeMount() - .name(pvName) - .mountPath(APPLICATIONS_MOUNT_PATH))) - .securityContext(new V1SecurityContext() - .runAsGroup(0L) - .runAsUser(0L)))) - .restartPolicy("Never") - .containers(Arrays.asList(jobContainer - .name("build-application-container") - .image(image) - .imagePullPolicy("IfNotPresent") - .volumeMounts(Arrays.asList( - new V1VolumeMount() - .name(pvName) - .mountPath(APPLICATIONS_MOUNT_PATH))))) // application source directory - .volumes(Arrays.asList(new V1Volume() - .name(pvName) - .persistentVolumeClaim( - new V1PersistentVolumeClaimVolumeSource() - .claimName(pvcName)))) - .imagePullSecrets(isUseSecret ? Arrays.asList( - new V1LocalObjectReference() - .name(OCR_SECRET_NAME)) - : null)))); - String jobName = assertDoesNotThrow(() - -> createNamespacedJob(jobBody), "Failed to create Job"); + final String podName = "weblogic-build-pod-" + namespace; + V1Pod podBody = new V1Pod() + .spec(new V1PodSpec() + .containers(Arrays.asList(container + .name("weblogic-container") + .image(image) + .imagePullPolicy("IfNotPresent") + .addCommandItem("sleep") + .addArgsItem("600"))) + .imagePullSecrets(isUseSecret + ? Arrays.asList(new V1LocalObjectReference() + .name(OCR_SECRET_NAME)) + : null)) // the persistent volume claim used by the test + .metadata(new V1ObjectMeta().name(podName)) + .apiVersion("v1") + .kind("Pod"); + V1Pod wlsPod = assertDoesNotThrow(() -> Kubernetes.createPod(namespace, podBody)); - logger.info("Checking if the build job {0} completed in namespace {1}", - jobName, namespace); withStandardRetryPolicy .conditionEvaluationListener( - condition -> logger.info("Waiting for job {0} to be completed in namespace {1} " - + "(elapsed time {2} ms, remaining time {3} ms)", - jobName, + condition -> logger.info("Waiting for {0} to be ready in namespace {1}, " + + "(elapsed time {2} , remaining time {3}", + podName, namespace, condition.getElapsedTimeInMS(), condition.getRemainingTimeInMS())) - .until(jobCompleted(jobName, null, namespace)); - - // check job status and fail test if the job failed to finish building - V1Job job = getJob(jobName, namespace); - if (job != null) { - V1JobCondition jobCondition = job.getStatus().getConditions().stream().filter( - v1JobCondition -> "Failed".equalsIgnoreCase(v1JobCondition.getType())) - .findAny() - .orElse(null); - if (jobCondition != null) { - logger.severe("Job {0} failed to finish build", jobName); - List pods = listPods(namespace, "job-name=" + jobName).getItems(); - if (!pods.isEmpty()) { - logger.severe(getPodLog(pods.get(0).getMetadata().getName(), namespace)); - fail("Build job failed"); - } - } - } + .until(podReady(podName, null, namespace)); - } - - private static void createPV(Path hostPath, String pvName) throws IOException { - logger.info("creating persistent volume"); - // a dummy label is added so that cleanup can delete all pvs - HashMap label = new HashMap(); - label.put("weblogic.domainUid", "buildjobs"); - - V1PersistentVolume v1pv = new V1PersistentVolume() - .spec(new V1PersistentVolumeSpec() - .addAccessModesItem("ReadWriteMany") - .storageClassName("weblogic-build-storage-class") - .volumeMode("Filesystem") - .putCapacityItem("storage", Quantity.fromString("2Gi")) - .persistentVolumeReclaimPolicy("Recycle") - .accessModes(Arrays.asList("ReadWriteMany")) - .hostPath(new V1HostPathVolumeSource() - .path(hostPath.toString()))) - .metadata(new V1ObjectMeta() - .name(pvName) - .labels(label)); - - boolean success = assertDoesNotThrow(() -> createPersistentVolume(v1pv), - "Failed to create persistent volume"); - assertTrue(success, "PersistentVolume creation failed"); - } - - private static void createPVC(String pvName, String pvcName, String namespace) { - logger.info("creating persistent volume claim"); - // a dummy label is added so that cleanup can delete all pvs - HashMap label = new HashMap(); - label.put("weblogic.domainUid", "buildjobs"); - - V1PersistentVolumeClaim v1pvc = new V1PersistentVolumeClaim() - .spec(new V1PersistentVolumeClaimSpec() - .addAccessModesItem("ReadWriteMany") - .storageClassName("weblogic-build-storage-class") - .volumeName(pvName) - .resources(new V1ResourceRequirements() - .putRequestsItem("storage", Quantity.fromString("2Gi")))) - .metadata(new V1ObjectMeta() - .name(pvcName) - .namespace(namespace) - .labels(label)); - - boolean success = assertDoesNotThrow(() -> createPersistentVolumeClaim(v1pvc), - "Failed to create persistent volume claim"); - assertTrue(success, "PersistentVolumeClaim creation failed"); + return wlsPod; } /** @@ -310,6 +237,7 @@ private static void createPVC(String pvName, String pvcName, String namespace) { * @param namespace namespace in which secrets needs to be created */ private static void setImage(String namespace) { + final LoggingFacade logger = getLogger(); //determine if the tests are running in Kind cluster. //if true use images from Kind registry String ocrImage = WLS_BASE_IMAGE_NAME + ":" + WLS_BASE_IMAGE_TAG; @@ -337,4 +265,5 @@ private static void setImage(String namespace) { } logger.info("Using image {0}", image); } -} \ No newline at end of file + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CleanupUtil.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CleanupUtil.java index b0d2cb03c98..d6d2959f5c9 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CleanupUtil.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CleanupUtil.java @@ -9,7 +9,7 @@ import java.util.concurrent.Callable; import io.kubernetes.client.openapi.ApiException; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Ingress; +import io.kubernetes.client.openapi.models.NetworkingV1beta1Ingress; import io.kubernetes.client.openapi.models.V1ConfigMap; import io.kubernetes.client.openapi.models.V1Deployment; import io.kubernetes.client.openapi.models.V1Job; @@ -26,11 +26,12 @@ import oracle.weblogic.kubernetes.actions.TestActions; import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import org.awaitility.core.ConditionFactory; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.SECONDS; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.awaitility.Awaitility.with; /** @@ -50,6 +51,7 @@ public class CleanupUtil { * @param namespaces list of namespaces */ public static void cleanup(List namespaces) { + LoggingFacade logger = getLogger(); try { // If namespace list is empty or null return if (namespaces == null || namespaces.isEmpty()) { @@ -117,6 +119,7 @@ public static void cleanup(List namespaces) { * @param namespace name of the namespace */ private static void deleteDomains(String namespace) { + LoggingFacade logger = getLogger(); try { for (var item : Kubernetes.listDomains(namespace).getItems()) { String domainUid = item.getMetadata().getName(); @@ -147,6 +150,7 @@ private static void uninstallWebLogicOperator(String namespace) { * @return true if no artifacts exists, otherwise false */ public static Callable nothingFoundInNamespace(String namespace) { + LoggingFacade logger = getLogger(); return () -> { boolean nothingFound = true; logger.info("Checking for " @@ -329,7 +333,7 @@ public static Callable nothingFoundInNamespace(String namespace) { try { if (!Kubernetes.listNamespacedIngresses(namespace).getItems().isEmpty()) { logger.info("Ingresses still exists!!!"); - List items = Kubernetes.listNamespacedIngresses(namespace).getItems(); + List items = Kubernetes.listNamespacedIngresses(namespace).getItems(); for (var item : items) { logger.info(item.getMetadata().getName()); } @@ -382,6 +386,7 @@ public static Callable nothingFoundInNamespace(String namespace) { * @return true if namespace was not found, otherwise false */ public static Callable namespaceNotFound(String namespace) { + LoggingFacade logger = getLogger(); return () -> { boolean notFound = true; // get namespaces @@ -406,6 +411,7 @@ public static Callable namespaceNotFound(String namespace) { * @param namespace name of the namespace */ public static void deleteNamespacedArtifacts(String namespace) { + LoggingFacade logger = getLogger(); logger.info("Deleting artifacts in namespace {0}", namespace); // Delete all Domain objects in the given namespace @@ -550,6 +556,7 @@ public static void deleteNamespacedArtifacts(String namespace) { * @param namespace name of the namespace */ public static void deleteNamespace(String namespace) { + LoggingFacade logger = getLogger(); try { Kubernetes.deleteNamespace(namespace); } catch (Exception ex) { @@ -558,4 +565,4 @@ public static void deleteNamespace(String namespace) { } } -} \ No newline at end of file +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonMiiTestUtils.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonMiiTestUtils.java new file mode 100644 index 00000000000..c39615bcfa3 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonMiiTestUtils.java @@ -0,0 +1,168 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.utils; + +import oracle.weblogic.domain.Domain; +import oracle.weblogic.kubernetes.logging.LoggingFacade; + +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDockerRegistrySecret; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +/** + * The common utility class for model-in-image tests. + */ +public class CommonMiiTestUtils { + /** + * Create a basic Kubernetes domain resource and wait until the domain is fully up. + * + * @param domainNamespace Kubernetes namespace that the pod is running in + * @param domainUid identifier of the domain + * @param imageName name of the image including its tag + * @param adminServerPodName name of the admin server pod + * @param managedServerPrefix prefix of the managed server pods + * @param replicaCount number of managed servers to start + */ + public static void createMiiDomainAndVerify( + String domainNamespace, + String domainUid, + String imageName, + String adminServerPodName, + String managedServerPrefix, + int replicaCount + ) { + LoggingFacade logger = getLogger(); + logger.info("Create the repo secret {0} to pull the image", REPO_SECRET_NAME); + assertDoesNotThrow(() -> createDockerRegistrySecret(domainNamespace), + String.format("createSecret failed for %s", REPO_SECRET_NAME)); + + // create secret for admin credentials + logger.info("Create secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + adminSecretName, + domainNamespace, + ADMIN_USERNAME_DEFAULT, + ADMIN_PASSWORD_DEFAULT), + String.format("createSecret failed for %s", adminSecretName)); + + // create encryption secret + logger.info("Create encryption secret"); + String encryptionSecretName = "encryptionsecret"; + assertDoesNotThrow(() -> createSecretWithUsernamePassword( + encryptionSecretName, + domainNamespace, + "weblogicenc", + "weblogicenc"), + String.format("createSecret failed for %s", encryptionSecretName)); + + // create the domain custom resource + logger.info("Create domain resource {0} object in namespace {1} and verify that it is created", + domainUid, domainNamespace); + Domain domain = createDomainResource( + domainUid, + domainNamespace, + imageName, + adminSecretName, + REPO_SECRET_NAME, + encryptionSecretName, + replicaCount); + + createDomainAndVerify(domain, domainNamespace); + + // check admin server pod is ready + logger.info("Wait for admin server pod {0} to be ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check managed server pods are ready + for (int i = 1; i <= replicaCount; i++) { + logger.info("Wait for managed server pod {0} to be ready in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkPodReady(managedServerPrefix + i, domainUid, domainNamespace); + } + + logger.info("Check admin service {0} is created in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check managed server services created + for (int i = 1; i <= replicaCount; i++) { + logger.info("Check managed server service {0} is created in namespace {1}", + managedServerPrefix + i, domainNamespace); + checkServiceExists(managedServerPrefix + i, domainNamespace); + } + } + + /** + * Create a domain object for a Kubernetes domain custom resource using the basic model-in-image image. + * + * @param domainResourceName name of the domain resource + * @param domNamespace Kubernetes namespace that the domain is hosted + * @param imageName name of the image including its tag + * @param adminSecretName name of the new WebLogic admin credentials secret + * @param repoSecretName name of the secret for pulling the WebLogic image + * @param encryptionSecretName name of the secret used to encrypt the models + * @param replicaCount number of managed servers to start + * @return domain object of the domain resource + */ + private static Domain createDomainResource( + String domainResourceName, + String domNamespace, + String imageName, + String adminSecretName, + String repoSecretName, + String encryptionSecretName, + int replicaCount) { + // create the domain CR + return new Domain() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new io.kubernetes.client.openapi.models.V1ObjectMeta() + .name(domainResourceName) + .namespace(domNamespace)) + .spec(new oracle.weblogic.domain.DomainSpec() + .domainUid(domainResourceName) + .domainHomeSourceType("FromModel") + .image(imageName) + .addImagePullSecretsItem(new io.kubernetes.client.openapi.models.V1LocalObjectReference() + .name(repoSecretName)) + .webLogicCredentialsSecret(new io.kubernetes.client.openapi.models.V1SecretReference() + .name(adminSecretName) + .namespace(domNamespace)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IF_NEEDED") + .serverPod(new oracle.weblogic.domain.ServerPod() + .addEnvItem(new io.kubernetes.client.openapi.models.V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new io.kubernetes.client.openapi.models.V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom "))) + .adminServer(new oracle.weblogic.domain.AdminServer() + .serverStartState("RUNNING") + .adminService(new oracle.weblogic.domain.AdminService() + .addChannelsItem(new oracle.weblogic.domain.Channel() + .channelName("default") + .nodePort(0)))) + .addClustersItem(new oracle.weblogic.domain.Cluster() + .clusterName("cluster-1") + .replicas(replicaCount) + .serverStartState("RUNNING")) + .configuration(new oracle.weblogic.domain.Configuration() + .model(new oracle.weblogic.domain.Model() + .domainType("WLS") + .runtimeEncryptionSecret(encryptionSecretName)) + .introspectorJobActiveDeadlineSeconds(300L))); + + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonPatchTestUtils.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonPatchTestUtils.java new file mode 100644 index 00000000000..301e03e0924 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonPatchTestUtils.java @@ -0,0 +1,183 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.utils; + +import io.kubernetes.client.custom.V1Patch; +import oracle.weblogic.kubernetes.logging.LoggingFacade; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.actions.TestActions.getDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.patchDomainCustomResource; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.domainResourceCredentialsSecretPatched; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.podRestartVersionUpdated; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertTrue; + + +/** + * The common utility class for domain patching tests. + */ +public class CommonPatchTestUtils { + private static org.awaitility.core.ConditionFactory withStandardRetryPolicy = + with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + /** + * Patch the domain resource with a new WebLogic admin credentials secret. + * + * @param domainResourceName name of the domain resource + * @param namespace Kubernetes namespace that the domain is hosted + * @param secretName name of the new WebLogic admin credentials secret + * @return restartVersion new restartVersion of the domain resource + */ + public static String patchDomainResourceWithNewAdminSecret( + String domainResourceName, + String namespace, + String secretName + ) { + LoggingFacade logger = getLogger(); + String patch = String.format( + "[\n {\"op\": \"replace\", \"path\": \"/spec/%s\", \"value\": \"%s\"}\n]\n", + "webLogicCredentialsSecret/name", secretName); + logger.info("Patch the domain resource {0} in namespace {1} with: {2}\n", + domainResourceName, namespace, patch); + + assertTrue(patchDomainCustomResource( + domainResourceName, + namespace, + new V1Patch(patch), + V1Patch.PATCH_FORMAT_JSON_PATCH), + String.format("Failed to patch the domain resource %s in namespace %s with %s: %s", + domainResourceName, namespace, "/spec/webLogicCredentialsSecret/name", secretName)); + + String oldVersion = assertDoesNotThrow( + () -> getDomainCustomResource(domainResourceName, namespace).getSpec().getRestartVersion(), + String.format("Failed to get the restartVersion of %s in namespace %s", domainResourceName, namespace)); + int newVersion = oldVersion == null ? 1 : Integer.valueOf(oldVersion) + 1; + logger.info("Update domain resource {0} in namespace {1} restartVersion from {2} to {3}", + domainResourceName, namespace, oldVersion, newVersion); + patch = + String.format("[\n {\"op\": \"replace\", \"path\": \"/spec/restartVersion\", \"value\": \"%s\"}\n]\n", + newVersion); + + logger.info("Patch the domain resource {0} in namespace {1} with: {2}\n", + domainResourceName, namespace, patch); + + assertTrue(patchDomainCustomResource( + domainResourceName, + namespace, + new V1Patch(patch), + V1Patch.PATCH_FORMAT_JSON_PATCH), + String.format("Failed to patch the domain resource %s in namespace %s with startVersion: %s", + domainResourceName, namespace, newVersion)); + + String updatedVersion = assertDoesNotThrow( + () -> getDomainCustomResource(domainResourceName, namespace).getSpec().getRestartVersion(), + String.format("Failed to get the restartVersion of %s in namespace %s", domainResourceName, namespace)); + logger.info("Current restartVersion is {0}", updatedVersion); + assertTrue(updatedVersion.equals(String.valueOf(newVersion)), + String.format("Failed to update the restartVersion of domain %s from %s to %s", + domainResourceName, + oldVersion, + newVersion)); + return String.valueOf(newVersion); + } + + /** + * Patch domain resource with a new WebLogic domain credentials secret and a new restartVersion, + * and verify if the domain spec has been correctly updated. + * + * @param domainUid name of the domain resource + * @param namespace Kubernetes namespace that the domain is hosted + * @param adminServerPodName name of the WebLogic admin server pod + * @param managedServerPrefix prefix of the managed server pods + * @param replicaCount number of managed servers to start + * @param secretName name of the secret that is used to patch the domain resource + * @return restartVersion of the domain resource + */ + public static String patchDomainWithNewSecretAndVerify( + final String domainUid, + final String namespace, + final String adminServerPodName, + final String managedServerPrefix, + final int replicaCount, + final String secretName + ) { + LoggingFacade logger = getLogger(); + logger.info( + "Patch domain resource {0} in namespace {1} to use the new secret {2}", + domainUid, namespace, secretName); + + String restartVersion = patchDomainResourceWithNewAdminSecret(domainUid, namespace, secretName); + + logger.info( + "Check that domain resource {0} in namespace {1} has been patched with new secret {2}", + domainUid, namespace, secretName); + checkDomainCredentialsSecretPatched(domainUid, namespace, secretName); + + // check and wait for the admin server pod to be patched with the new secret + logger.info( + "Check that admin server pod for domain resource {0} in namespace {1} has been patched with {2}: {3}", + domainUid, namespace, "/spec/webLogicCredentialsSecret/name", secretName); + + return restartVersion; + } + + /** + * Check that domain resource has been updated with the new WebLogic domain credentials secret. + * + * @param domainUid name of the domain resource + * @param namespace Kubernetes namespace that the domain is hosted + * @param newValue new secret name for the WebLogic domain credentials secret + */ + private static void checkDomainCredentialsSecretPatched( + String domainUid, + String namespace, + String newValue + ) { + LoggingFacade logger = getLogger(); + // check if domain resource has been patched with the new secret + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for domain {0} to be patched in namespace {1} " + + "(elapsed time {2}ms, remaining time {3}ms)", + domainUid, + namespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> domainResourceCredentialsSecretPatched(domainUid, namespace, newValue), + String.format( + "Domain %s in namespace %s is not patched with admin credentials secret %s", + domainUid, namespace, newValue))); + + } + + /** + * Check if the given server pod's domain restart version has been updated. + * + * @param podName name of the server pod + * @param domainUid the domain that the server pod belongs to + * @param namespace the Kubernetes namespace that the pod belongs to + * @param restartVersion the expected value of the restart version + */ + public static void checkPodRestartVersionUpdated( + String podName, + String domainUid, + String namespace, + String restartVersion) { + LoggingFacade logger = getLogger(); + logger.info("Check that weblogic.domainRestartVersion of pod {0} has been updated", podName); + boolean restartVersionUpdated = assertDoesNotThrow( + () -> podRestartVersionUpdated(podName, domainUid, namespace, restartVersion), + String.format("Failed to get weblogic.domainRestartVersion label of pod %s in namespace %s", + podName, namespace)); + assertTrue(restartVersionUpdated, + String.format("Label weblogic.domainRestartVersion of pod %s in namespace %s has not been updated", + podName, namespace)); + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonTestUtils.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonTestUtils.java index 4dbe9e9f523..3d7a01d4412 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonTestUtils.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonTestUtils.java @@ -9,34 +9,67 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.google.gson.JsonObject; +import io.kubernetes.client.custom.Quantity; +import io.kubernetes.client.openapi.ApiException; import io.kubernetes.client.openapi.models.V1ConfigMap; +import io.kubernetes.client.openapi.models.V1ConfigMapVolumeSource; +import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1ContainerPort; +import io.kubernetes.client.openapi.models.V1HostPathVolumeSource; import io.kubernetes.client.openapi.models.V1Job; +import io.kubernetes.client.openapi.models.V1JobCondition; +import io.kubernetes.client.openapi.models.V1JobSpec; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1ObjectReference; import io.kubernetes.client.openapi.models.V1PersistentVolume; import io.kubernetes.client.openapi.models.V1PersistentVolumeClaim; +import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimSpec; +import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimVolumeSource; +import io.kubernetes.client.openapi.models.V1PersistentVolumeSpec; +import io.kubernetes.client.openapi.models.V1Pod; +import io.kubernetes.client.openapi.models.V1PodSpec; +import io.kubernetes.client.openapi.models.V1PodTemplateSpec; +import io.kubernetes.client.openapi.models.V1ResourceRequirements; import io.kubernetes.client.openapi.models.V1Secret; +import io.kubernetes.client.openapi.models.V1SecurityContext; import io.kubernetes.client.openapi.models.V1ServiceAccount; +import io.kubernetes.client.openapi.models.V1ServiceAccountList; +import io.kubernetes.client.openapi.models.V1Volume; +import io.kubernetes.client.openapi.models.V1VolumeMount; import oracle.weblogic.domain.Domain; +import oracle.weblogic.kubernetes.TestConstants; import oracle.weblogic.kubernetes.actions.impl.GrafanaParams; import oracle.weblogic.kubernetes.actions.impl.NginxParams; import oracle.weblogic.kubernetes.actions.impl.OperatorParams; import oracle.weblogic.kubernetes.actions.impl.PrometheusParams; +import oracle.weblogic.kubernetes.actions.impl.VoyagerParams; import oracle.weblogic.kubernetes.actions.impl.primitive.Command; import oracle.weblogic.kubernetes.actions.impl.primitive.CommandParams; import oracle.weblogic.kubernetes.actions.impl.primitive.HelmParams; +import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; +import oracle.weblogic.kubernetes.actions.impl.primitive.WitParams; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import org.awaitility.core.ConditionFactory; import org.joda.time.DateTime; import static java.nio.file.Files.readString; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.APPSCODE_REPO_NAME; +import static oracle.weblogic.kubernetes.TestConstants.APPSCODE_REPO_URL; import static oracle.weblogic.kubernetes.TestConstants.DEFAULT_EXTERNAL_REST_IDENTITY_SECRET_NAME; import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_VERSION; import static oracle.weblogic.kubernetes.TestConstants.GEN_EXTERNAL_REST_IDENTITY_FILE; @@ -52,6 +85,7 @@ import static oracle.weblogic.kubernetes.TestConstants.OCR_USERNAME; import static oracle.weblogic.kubernetes.TestConstants.OPERATOR_CHART_DIR; import static oracle.weblogic.kubernetes.TestConstants.OPERATOR_RELEASE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.PV_ROOT; import static oracle.weblogic.kubernetes.TestConstants.REPO_DUMMY_VALUE; import static oracle.weblogic.kubernetes.TestConstants.REPO_EMAIL; import static oracle.weblogic.kubernetes.TestConstants.REPO_NAME; @@ -59,34 +93,61 @@ import static oracle.weblogic.kubernetes.TestConstants.REPO_REGISTRY; import static oracle.weblogic.kubernetes.TestConstants.REPO_SECRET_NAME; import static oracle.weblogic.kubernetes.TestConstants.REPO_USERNAME; +import static oracle.weblogic.kubernetes.TestConstants.RESULTS_ROOT; import static oracle.weblogic.kubernetes.TestConstants.STABLE_REPO_NAME; +import static oracle.weblogic.kubernetes.TestConstants.VOYAGER_CHART_NAME; +import static oracle.weblogic.kubernetes.TestConstants.VOYAGER_CHART_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.VOYAGER_RELEASE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.WDT_IMAGE_DOMAINHOME_BASE_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.ARCHIVE_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.MODEL_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WDT_VERSION; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WIT_BUILD_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_NAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WLS_BASE_IMAGE_TAG; +import static oracle.weblogic.kubernetes.actions.TestActions.archiveApp; +import static oracle.weblogic.kubernetes.actions.TestActions.buildAppArchive; +import static oracle.weblogic.kubernetes.actions.TestActions.buildCoherenceArchive; import static oracle.weblogic.kubernetes.actions.TestActions.createConfigMap; import static oracle.weblogic.kubernetes.actions.TestActions.createDockerConfigJson; import static oracle.weblogic.kubernetes.actions.TestActions.createDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.createImage; import static oracle.weblogic.kubernetes.actions.TestActions.createIngress; import static oracle.weblogic.kubernetes.actions.TestActions.createNamespacedJob; import static oracle.weblogic.kubernetes.actions.TestActions.createPersistentVolume; import static oracle.weblogic.kubernetes.actions.TestActions.createPersistentVolumeClaim; import static oracle.weblogic.kubernetes.actions.TestActions.createSecret; import static oracle.weblogic.kubernetes.actions.TestActions.createServiceAccount; +import static oracle.weblogic.kubernetes.actions.TestActions.defaultAppParams; import static oracle.weblogic.kubernetes.actions.TestActions.dockerLogin; import static oracle.weblogic.kubernetes.actions.TestActions.dockerPush; +import static oracle.weblogic.kubernetes.actions.TestActions.getJob; import static oracle.weblogic.kubernetes.actions.TestActions.getOperatorImageName; import static oracle.weblogic.kubernetes.actions.TestActions.getPodCreationTimestamp; +import static oracle.weblogic.kubernetes.actions.TestActions.getPodLog; +import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; import static oracle.weblogic.kubernetes.actions.TestActions.installGrafana; import static oracle.weblogic.kubernetes.actions.TestActions.installNginx; import static oracle.weblogic.kubernetes.actions.TestActions.installOperator; import static oracle.weblogic.kubernetes.actions.TestActions.installPrometheus; +import static oracle.weblogic.kubernetes.actions.TestActions.installVoyager; import static oracle.weblogic.kubernetes.actions.TestActions.listIngresses; +import static oracle.weblogic.kubernetes.actions.TestActions.listPods; import static oracle.weblogic.kubernetes.actions.TestActions.scaleCluster; import static oracle.weblogic.kubernetes.actions.TestActions.scaleClusterWithRestApi; +import static oracle.weblogic.kubernetes.actions.TestActions.scaleClusterWithWLDF; import static oracle.weblogic.kubernetes.actions.TestActions.upgradeOperator; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.credentialsNotValid; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.credentialsValid; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.doesImageExist; import static oracle.weblogic.kubernetes.assertions.TestAssertions.domainExists; import static oracle.weblogic.kubernetes.assertions.TestAssertions.isGrafanaReady; import static oracle.weblogic.kubernetes.assertions.TestAssertions.isHelmReleaseDeployed; import static oracle.weblogic.kubernetes.assertions.TestAssertions.isNginxReady; import static oracle.weblogic.kubernetes.assertions.TestAssertions.isPodRestarted; import static oracle.weblogic.kubernetes.assertions.TestAssertions.isPrometheusReady; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.isVoyagerReady; import static oracle.weblogic.kubernetes.assertions.TestAssertions.jobCompleted; import static oracle.weblogic.kubernetes.assertions.TestAssertions.operatorIsReady; import static oracle.weblogic.kubernetes.assertions.TestAssertions.podDoesNotExist; @@ -97,14 +158,18 @@ import static oracle.weblogic.kubernetes.assertions.TestAssertions.pvcExists; import static oracle.weblogic.kubernetes.assertions.TestAssertions.serviceDoesNotExist; import static oracle.weblogic.kubernetes.assertions.TestAssertions.serviceExists; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.utils.ExecCommand.exec; +import static oracle.weblogic.kubernetes.utils.FileUtils.checkDirectory; import static oracle.weblogic.kubernetes.utils.TestUtils.callWebAppAndCheckForServerNameInResponse; +import static oracle.weblogic.kubernetes.utils.TestUtils.callWebAppAndWaitTillReady; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.with; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; /** * The common utility class for tests. @@ -116,6 +181,10 @@ public class CommonTestUtils { .and().with().pollInterval(10, SECONDS) .atMost(5, MINUTES).await(); + private static ConditionFactory withQuickRetryPolicy = with().pollDelay(0, SECONDS) + .and().with().pollInterval(3, SECONDS) + .atMost(120, SECONDS).await(); + /** * Install WebLogic operator and wait up to five minutes until the operator pod is ready. * @@ -144,7 +213,7 @@ public static HelmParams installAndVerifyOperator(String opNamespace, boolean withRestAPI, int externalRestHttpsPort, String... domainNamespace) { - + LoggingFacade logger = getLogger(); // Create a service account for the unique opNamespace logger.info("Creating service account"); assertDoesNotThrow(() -> createServiceAccount(new V1ServiceAccount() @@ -228,7 +297,8 @@ public static HelmParams installAndVerifyOperator(String opNamespace, * @return true if successful */ public static boolean upgradeAndVerifyOperator(String opNamespace, - String... domainNamespace) { + String... domainNamespace) { + LoggingFacade logger = getLogger(); // Helm upgrade parameters HelmParams opHelmParams = new HelmParams() .releaseName(OPERATOR_RELEASE_NAME) @@ -262,7 +332,6 @@ public static boolean upgradeAndVerifyOperator(String opNamespace, return true; } - /** * Install NGINX and wait up to five minutes until the NGINX pod is ready. * @@ -274,10 +343,10 @@ public static boolean upgradeAndVerifyOperator(String opNamespace, public static HelmParams installAndVerifyNginx(String nginxNamespace, int nodeportshttp, int nodeportshttps) { - + LoggingFacade logger = getLogger(); // Helm install parameters HelmParams nginxHelmParams = new HelmParams() - .releaseName(NGINX_RELEASE_NAME) + .releaseName(NGINX_RELEASE_NAME + "-" + nginxNamespace.substring(3)) .namespace(nginxNamespace) .repoUrl(GOOGLE_REPO_URL) .repoName(STABLE_REPO_NAME) @@ -285,9 +354,13 @@ public static HelmParams installAndVerifyNginx(String nginxNamespace, // NGINX chart values to override NginxParams nginxParams = new NginxParams() - .helmParams(nginxHelmParams) - .nodePortsHttp(nodeportshttp) - .nodePortsHttps(nodeportshttps); + .helmParams(nginxHelmParams); + + if (nodeportshttp != 0 && nodeportshttps != 0) { + nginxParams + .nodePortsHttp(nodeportshttp) + .nodePortsHttps(nodeportshttps); + } // install NGINX assertThat(installNginx(nginxParams)) @@ -317,6 +390,64 @@ public static HelmParams installAndVerifyNginx(String nginxNamespace, return nginxHelmParams; } + /** + * Install Voyager and wait up to five minutes until the Voyager pod is ready. + * + * @param voyagerNamespace the namespace in which the Voyager will be installed + * @param cloudProvider the name of bare metal Kubernetes cluster + * @param enableValidatingWebhook whehter to enable validating webhook or not + * @return the Voyager Helm installation parameters + */ + public static HelmParams installAndVerifyVoyager(String voyagerNamespace, + String cloudProvider, + boolean enableValidatingWebhook) { + LoggingFacade logger = getLogger(); + final String voyagerPodNamePrefix = VOYAGER_CHART_NAME + "-release"; + + // Helm install parameters + HelmParams voyagerHelmParams = new HelmParams() + .releaseName(VOYAGER_RELEASE_NAME + "-" + voyagerNamespace.substring(3)) + .namespace(voyagerNamespace) + .repoUrl(APPSCODE_REPO_URL) + .repoName(APPSCODE_REPO_NAME) + .chartName(VOYAGER_CHART_NAME) + .chartVersion(VOYAGER_CHART_VERSION); + + // Voyager chart values to override + VoyagerParams voyagerParams = new VoyagerParams() + .helmParams(voyagerHelmParams) + .cloudProvider(cloudProvider) + .enableValidatingWebhook(enableValidatingWebhook); + + // install Voyager + assertThat(installVoyager(voyagerParams)) + .as("Test Voyager installation succeeds") + .withFailMessage("Voyager installation is failed") + .isTrue(); + + // verify that Voyager is installed + logger.info("Checking Voyager release {0} status in namespace {1}", + VOYAGER_RELEASE_NAME, voyagerNamespace); + assertTrue(isHelmReleaseDeployed(VOYAGER_RELEASE_NAME, voyagerNamespace), + String.format("Voyager release %s is not in deployed status in namespace %s", + VOYAGER_RELEASE_NAME, voyagerNamespace)); + logger.info("Voyager release {0} status is deployed in namespace {1}", + VOYAGER_RELEASE_NAME, voyagerNamespace); + + // wait until the Voyager pod is ready. + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info( + "Waiting for Voyager to be ready in namespace {0} (elapsed time {1}ms, remaining time {2}ms)", + voyagerNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> isVoyagerReady(voyagerNamespace, voyagerPodNamePrefix), + "isVoyagerReady failed with ApiException")); + + return voyagerHelmParams; + } + /** * Create a domain in the specified namespace and wait up to five minutes until the domain exists. * @@ -324,7 +455,7 @@ public static HelmParams installAndVerifyNginx(String nginxNamespace, * @param domainNamespace namespace in which the domain will be created */ public static void createDomainAndVerify(Domain domain, String domainNamespace) { - + LoggingFacade logger = getLogger(); // create the domain CR assertNotNull(domain, "domain is null"); assertNotNull(domain.getSpec(), "domain spec is null"); @@ -362,11 +493,137 @@ public static void createDomainAndVerify(Domain domain, String domainNamespace) public static List createIngressForDomainAndVerify(String domainUid, String domainNamespace, Map clusterNameMSPortMap) { + return createIngressForDomainAndVerify(domainUid, domainNamespace, 0, clusterNameMSPortMap, true); + } + + /** + * Create an ingress for the domain with domainUid in the specified namespace. + * + * @param domainUid WebLogic domainUid which is backend to the ingress to be created + * @param domainNamespace WebLogic domain namespace in which the domain exists + * @param clusterNameMSPortMap the map with key as cluster name and the value as managed server port of the cluster + * @param setIngressHost set specific host or set it to all + * @return list of ingress hosts + */ + public static List createIngressForDomainAndVerify(String domainUid, + String domainNamespace, + Map clusterNameMSPortMap, + boolean setIngressHost) { + + return createIngressForDomainAndVerify(domainUid, domainNamespace, 0, clusterNameMSPortMap, setIngressHost); + } + + /** + * Create an ingress for the domain with domainUid in the specified namespace. + * + * @param domainUid WebLogic domainUid which is backend to the ingress to be created + * @param domainNamespace WebLogic domain namespace in which the domain exists + * @param nodeport node port of the ingress controller + * @param clusterNameMSPortMap the map with key as cluster name and the value as managed server port of the cluster + * @return list of ingress hosts + */ + public static List createIngressForDomainAndVerify(String domainUid, + String domainNamespace, + int nodeport, + Map clusterNameMSPortMap) { + + return createIngressForDomainAndVerify(domainUid, domainNamespace, nodeport, clusterNameMSPortMap, true); + } + /** + * Create an ingress for the domain with domainUid in the specified namespace. + * + * @param domainUid WebLogic domainUid which is backend to the ingress to be created + * @param domainNamespace WebLogic domain namespace in which the domain exists + * @param nodeport node port of the ingress controller + * @param clusterNameMSPortMap the map with key as cluster name and the value as managed server port of the cluster + * @param setIngressHost if false does not set ingress host + * @return list of ingress hosts + */ + public static List createIngressForDomainAndVerify(String domainUid, + String domainNamespace, + int nodeport, + Map clusterNameMSPortMap, + boolean setIngressHost) { + + LoggingFacade logger = getLogger(); // create an ingress in domain namespace - String ingressName = domainUid + "-nginx"; + final String ingressNginxClass = "nginx"; + String ingressName = domainUid + "-" + ingressNginxClass; + + HashMap annotations = new HashMap<>(); + annotations.put("kubernetes.io/ingress.class", ingressNginxClass); + List ingressHostList = - createIngress(ingressName, domainNamespace, domainUid, clusterNameMSPortMap); + createIngress(ingressName, domainNamespace, domainUid, clusterNameMSPortMap, annotations, setIngressHost); + + assertNotNull(ingressHostList, + String.format("Ingress creation failed for domain %s in namespace %s", domainUid, domainNamespace)); + + // check the ingress was found in the domain namespace + assertThat(assertDoesNotThrow(() -> listIngresses(domainNamespace))) + .as("Test ingress {0} was found in namespace {1}", ingressName, domainNamespace) + .withFailMessage("Ingress {0} was not found in namespace {1}", ingressName, domainNamespace) + .contains(ingressName); + + logger.info("ingress {0} for domain {1} was created in namespace {2}", + ingressName, domainUid, domainNamespace); + + // check the ingress is ready to route the app to the server pod + if (nodeport != 0) { + for (String ingressHost : ingressHostList) { + String curlCmd = "curl --silent --show-error --noproxy '*' -H 'host: " + ingressHost + + "' http://" + K8S_NODEPORT_HOST + ":" + nodeport + + "/weblogic/ready --write-out %{http_code} -o /dev/null"; + + logger.info("Executing curl command {0}", curlCmd); + assertTrue(callWebAppAndWaitTillReady(curlCmd, 60)); + } + } + + return ingressHostList; + } + + /** + * Create an ingress for the domain with domainUid in a given namespace and verify. + * + * @param domainUid WebLogic domainUid which is backend to the ingress to be created + * @param domainNamespace WebLogic domain namespace in which the domain exists + * @param ingressName name of ingress to be created in a given domain + * @param clusterNameMSPortMap the map with key as cluster name and the value as managed server port of the cluster + * @return list of ingress hosts + */ + public static List installVoyagerIngressAndVerify(String domainUid, + String domainNamespace, + String ingressName, + Map clusterNameMSPortMap) { + LoggingFacade logger = getLogger(); + final String voyagerIngressName = VOYAGER_CHART_NAME + "-" + ingressName; + final String channelName = "tcp-80"; + final String ingressType = "NodePort"; + final String ingressAffinity = "cookie"; + final String ingressClass = "voyager"; + + // set the annotations for Voyager + HashMap annotations = new HashMap<>(); + annotations.put("ingress.appscode.com/type", ingressType); + annotations.put("ingress.appscode.com/affinity", ingressAffinity); + annotations.put("kubernetes.io/ingress.class", ingressClass); + + // create an ingress in domain namespace + List ingressHostList = + createIngress(ingressName, domainNamespace, domainUid, clusterNameMSPortMap, annotations, true); + + // wait until the Voyager ingress pod is ready. + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info( + "Waiting for Voyager ingress to be ready in namespace {0} (elapsed time {1}ms, remaining time {2}ms)", + domainUid, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> isVoyagerReady(domainNamespace, voyagerIngressName), + "isVoyagerReady failed with ApiException")); assertNotNull(ingressHostList, String.format("Ingress creation failed for domain %s in namespace %s", domainUid, domainNamespace)); @@ -377,6 +634,24 @@ public static List createIngressForDomainAndVerify(String domainUid, .withFailMessage("Ingress {0} was not found in namespace {1}", ingressName, domainNamespace) .contains(ingressName); + // get ingress service Nodeport + int ingressServiceNodePort = assertDoesNotThrow( + () -> getServiceNodePort(domainNamespace, voyagerIngressName, channelName), + "Getting admin server node port failed"); + logger.info("Node port for {0} is: {1} :", voyagerIngressName, ingressServiceNodePort); + + // check the ingress is ready to route the app to the server pod + if (ingressServiceNodePort != 0) { + for (String ingressHost : ingressHostList) { + String curlCmd = "curl --silent --show-error --noproxy '*' -H 'host: " + ingressHost + + "' http://" + K8S_NODEPORT_HOST + ":" + ingressServiceNodePort + + "/weblogic/ready --write-out %{http_code} -o /dev/null"; + + logger.info("Executing curl command {0}", curlCmd); + assertTrue(callWebAppAndWaitTillReady(curlCmd, 60)); + } + } + logger.info("ingress {0} for domain {1} was created in namespace {2}", ingressName, domainUid, domainNamespace); @@ -391,6 +666,7 @@ public static List createIngressForDomainAndVerify(String domainUid, * @param domainNamespace the domain namespace in which the domain exists */ public static void checkPodExists(String podName, String domainUid, String domainNamespace) { + LoggingFacade logger = getLogger(); withStandardRetryPolicy .conditionEvaluationListener( condition -> logger.info("Waiting for pod {0} to be created in namespace {1} " @@ -412,6 +688,7 @@ public static void checkPodExists(String podName, String domainUid, String domai * @param domainNamespace the domain namespace in which the domain exists */ public static void checkPodReady(String podName, String domainUid, String domainNamespace) { + LoggingFacade logger = getLogger(); withStandardRetryPolicy .conditionEvaluationListener( condition -> logger.info("Waiting for pod {0} to be ready in namespace {1} " @@ -422,7 +699,7 @@ public static void checkPodReady(String podName, String domainUid, String domain condition.getRemainingTimeInMS())) .until(assertDoesNotThrow(() -> podReady(podName, domainUid, domainNamespace), String.format("podReady failed with ApiException for pod %s in namespace %s", - podName, domainNamespace))); + podName, domainNamespace))); } /** @@ -439,15 +716,16 @@ public static void checkPodRestarted( String podName, DateTime lastCreationTime ) { + LoggingFacade logger = getLogger(); withStandardRetryPolicy .conditionEvaluationListener( condition -> logger.info("Waiting for pod {0} to be restarted in namespace {1} " - + "(elapsed time {2}ms, remaining time {3}ms)", - podName, - domNamespace, - condition.getElapsedTimeInMS(), - condition.getRemainingTimeInMS())) - .until(assertDoesNotThrow(() -> isPodRestarted(podName, domainUid, domNamespace, lastCreationTime), + + "(elapsed time {2}ms, remaining time {3}ms)", + podName, + domNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> isPodRestarted(podName, domNamespace, lastCreationTime), String.format( "pod %s has not been restarted in namespace %s", podName, domNamespace))); } @@ -459,6 +737,7 @@ public static void checkPodRestarted( * @param namespace the namespace in which to check for the service */ public static void checkServiceExists(String serviceName, String namespace) { + LoggingFacade logger = getLogger(); withStandardRetryPolicy .conditionEvaluationListener( condition -> logger.info("Waiting for service {0} to exist in namespace {1} " @@ -480,6 +759,7 @@ public static void checkServiceExists(String serviceName, String namespace) { * @param namespace the namespace in which to check whether the pod exists */ public static void checkPodDoesNotExist(String podName, String domainUid, String namespace) { + LoggingFacade logger = getLogger(); withStandardRetryPolicy .conditionEvaluationListener( condition -> logger.info("Waiting for pod {0} to be deleted in namespace {1} " @@ -500,6 +780,7 @@ public static void checkPodDoesNotExist(String podName, String domainUid, String * @param namespace the namespace in which to check the service does not exist */ public static void checkServiceDoesNotExist(String serviceName, String namespace) { + LoggingFacade logger = getLogger(); withStandardRetryPolicy .conditionEvaluationListener( condition -> logger.info("Waiting for service {0} to be deleted in namespace {1} " @@ -513,13 +794,302 @@ public static void checkServiceDoesNotExist(String serviceName, String namespace serviceName, namespace))); } + /** + * Create a Docker image for a model in image domain. + * + * @param miiImageNameBase the base mii image name used in local or to construct the image name in repository + * @param wdtModelFile the WDT model file used to build the Docker image + * @param appName the sample application name used to build sample app ear file in WDT model file + * @return image name with tag + */ + public static String createMiiImageAndVerify(String miiImageNameBase, + String wdtModelFile, + String appName) { + return createMiiImageAndVerify(miiImageNameBase, wdtModelFile, appName, + WLS_BASE_IMAGE_NAME, WLS_BASE_IMAGE_TAG, WLS); + } + + /** + * Create a Docker image for a model in image domain. + * + * @param miiImageNameBase the base mii image name used in local or to construct the image name in repository + * @param wdtModelFile the WDT model file used to build the Docker image + * @param appName the sample application name used to build sample app ear file in WDT model file + * @param baseImageName the WebLogic base image name to be used while creating mii image + * @param baseImageTag the WebLogic base image tag to be used while creating mii image + * @param domainType the type of the WebLogic domain, valid values are "WLS, "JRF", and "Restricted JRF" + * @return image name with tag + */ + public static String createMiiImageAndVerify(String miiImageNameBase, + String wdtModelFile, + String appName, + String baseImageName, + String baseImageTag, + String domainType) { + // build the model file list + final List modelList = Collections.singletonList(MODEL_DIR + "/" + wdtModelFile); + final List appSrcDirList = Collections.singletonList(appName); + + return createMiiImageAndVerify( + miiImageNameBase, modelList, appSrcDirList, baseImageName, baseImageTag, domainType, true); + } + + /** + * Create a Docker image for a model in image domain using multiple WDT model files and application ear files. + * + * @param miiImageNameBase the base mii image name used in local or to construct the image name in repository + * @param wdtModelList list of WDT model files used to build the Docker image + * @param appSrcDirList list of the sample application source directories used to build sample app ear files + * @return image name with tag + */ + public static String createMiiImageAndVerify(String miiImageNameBase, + List wdtModelList, + List appSrcDirList) { + return createMiiImageAndVerify( + miiImageNameBase, wdtModelList, appSrcDirList, WLS_BASE_IMAGE_NAME, WLS_BASE_IMAGE_TAG, WLS, true); + + } + + /** + * Create a Docker image for a model in image domain using multiple WDT model files and application ear files. + * + * @param miiImageNameBase the base mii image name used in local or to construct the image name in repository + * @param wdtModelList list of WDT model files used to build the Docker image + * @param appSrcDirList list of the sample application source directories used to build sample app ear files + * @param baseImageName the WebLogic base image name to be used while creating mii image + * @param baseImageTag the WebLogic base image tag to be used while creating mii image + * @param domainType the type of the WebLogic domain, valid values are "WLS, "JRF", and "Restricted JRF" + * @param oneArchiveContainsMultiApps whether one archive contains multiple apps + * @return image name with tag + */ + public static String createMiiImageAndVerify(String miiImageNameBase, + List wdtModelList, + List appSrcDirList, + String baseImageName, + String baseImageTag, + String domainType, + boolean oneArchiveContainsMultiApps) { + + return createImageAndVerify( + miiImageNameBase, wdtModelList, appSrcDirList, null, baseImageName, + baseImageTag, domainType, true, null, oneArchiveContainsMultiApps); + } + + /** + * Create an image with modelfile, application archive and property file. If the property file + * is needed to be updated with a property that has been created by the framework, it is copied + * onto RESULT_ROOT and updated. Hence the altModelDir. Call this method to create a domain home in image. + * @param imageNameBase - base image name used in local or to construct image name in repository + * @param wdtModelFile - model file used to build the image + * @param appName - application to be added to the image + * @param modelPropFile - property file to be used with the model file above + * @param altModelDir - directory where the property file is found if not in the default MODEL_DIR + * @return image name with tag + */ + public static String createImageAndVerify(String imageNameBase, + String wdtModelFile, + String appName, + String modelPropFile, + String altModelDir, + String domainHome) { + + final List wdtModelList = Collections.singletonList(MODEL_DIR + "/" + wdtModelFile); + final List appSrcDirList = Collections.singletonList(appName); + final List modelPropList = Collections.singletonList(altModelDir + "/" + modelPropFile); + + return createImageAndVerify( + imageNameBase, wdtModelList, appSrcDirList, modelPropList, WLS_BASE_IMAGE_NAME, + WLS_BASE_IMAGE_TAG, WLS, false, domainHome, false); + } + + /** + * Create an image from the wdt model, application archives and property file. Call this method + * to create a domain home in image. + * @param imageNameBase - base image name used in local or to construct image name in repository + * @param wdtModelFile - model file used to build the image + * @param appName - application to be added to the image + * @param modelPropFile - property file to be used with the model file above + * @return image name with tag + */ + public static String createImageAndVerify(String imageNameBase, + String wdtModelFile, + String appName, + String modelPropFile, + String domainHome) { + + final List wdtModelList = Collections.singletonList(MODEL_DIR + "/" + wdtModelFile); + final List appSrcDirList = Collections.singletonList(appName); + final List modelPropList = Collections.singletonList(MODEL_DIR + "/" + modelPropFile); + + return createImageAndVerify( + imageNameBase, wdtModelList, appSrcDirList, modelPropList, WLS_BASE_IMAGE_NAME, + WLS_BASE_IMAGE_TAG, WLS, false, domainHome, false); + } + + /** + * Create a Docker image for a model in image domain or domain home in image using multiple WDT model + * files and application ear files. + * @param imageNameBase - the base mii image name used in local or to construct the image name in repository + * @param wdtModelList - list of WDT model files used to build the Docker image + * @param appSrcDirList - list of the sample application source directories used to build sample app ear files + * @param modelPropList - the WebLogic base image name to be used while creating mii image + * @param baseImageName - the WebLogic base image name to be used while creating mii image + * @param baseImageTag - the WebLogic base image tag to be used while creating mii image + * @param domainType - the type of the WebLogic domain, valid values are "WLS, "JRF", and "Restricted JRF" + * @param modelType - create a model image only or domain in image. set to true for MII + * @return image name with tag + */ + public static String createImageAndVerify(String imageNameBase, + List wdtModelList, + List appSrcDirList, + List modelPropList, + String baseImageName, + String baseImageTag, + String domainType, + boolean modelType, + String domainHome, + boolean oneArchiveContainsMultiApps) { + + LoggingFacade logger = getLogger(); + + // create unique image name with date + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date date = new Date(); + final String imageTag = baseImageTag + "-" + dateFormat.format(date) + "-" + System.currentTimeMillis(); + // Add repository name in image name for Jenkins runs + final String imageName = REPO_NAME + imageNameBase; + final String image = imageName + ":" + imageTag; + + List archiveList = new ArrayList<>(); + if (appSrcDirList != null && appSrcDirList.size() != 0 && appSrcDirList.get(0) != null) { + List archiveAppsList = new ArrayList<>(); + List buildAppDirList = new ArrayList<>(appSrcDirList); + boolean buildCoherenceGar = false; + + for (String appSrcDir : appSrcDirList) { + if (appSrcDir.contains(".war") || appSrcDir.contains(".ear")) { + //remove from build + buildAppDirList.remove(appSrcDir); + archiveAppsList.add(appSrcDir); + } + + if (appSrcDir.contains("coherence")) { + buildCoherenceGar = true; + } + } + + if (archiveAppsList.size() != 0 && archiveAppsList.get(0) != null) { + assertTrue(archiveApp(defaultAppParams() + .srcDirList(archiveAppsList))); + //archive provided ear or war file + String appName = archiveAppsList.get(0).substring(archiveAppsList.get(0).lastIndexOf("/") + 1, + appSrcDirList.get(0).lastIndexOf(".")); + + // build the archive list + String zipAppFile = String.format("%s/%s.zip", ARCHIVE_DIR, appName); + archiveList.add(zipAppFile); + + } + + if (buildAppDirList.size() != 0 && buildAppDirList.get(0) != null) { + // build an application archive using what is in resources/apps/APP_NAME + String zipFile = ""; + if (oneArchiveContainsMultiApps) { + assertTrue(buildAppArchive(defaultAppParams() + .srcDirList(buildAppDirList)), + String.format("Failed to create app archive for %s", buildAppDirList.get(0))); + zipFile = String.format("%s/%s.zip", ARCHIVE_DIR, buildAppDirList.get(0)); + // build the archive list + archiveList.add(zipFile); + } else if (buildCoherenceGar) { + // build the Coherence GAR file + assertTrue(buildCoherenceArchive(defaultAppParams() + .srcDirList(buildAppDirList)), + String.format("Failed to create app archive for %s", buildAppDirList.get(0))); + zipFile = String.format("%s/%s.zip", ARCHIVE_DIR, buildAppDirList.get(0)); + // build the archive list + archiveList.add(zipFile); + } else { + for (String appName : buildAppDirList) { + assertTrue(buildAppArchive(defaultAppParams() + .srcDirList(Collections.singletonList(appName)) + .appName(appName)), + String.format("Failed to create app archive for %s", appName)); + zipFile = String.format("%s/%s.zip", ARCHIVE_DIR, appName); + // build the archive list + archiveList.add(zipFile); + } + } + } + } + + // Set additional environment variables for WIT + checkDirectory(WIT_BUILD_DIR); + Map env = new HashMap<>(); + env.put("WLSIMG_BLDDIR", WIT_BUILD_DIR); + + // For k8s 1.16 support and as of May 6, 2020, we presently need a different JDK for these + // tests and for image tool. This is expected to no longer be necessary once JDK 11.0.8 or + // the next JDK 14 versions are released. + String witJavaHome = System.getenv("WIT_JAVA_HOME"); + if (witJavaHome != null) { + env.put("JAVA_HOME", witJavaHome); + } + + // build an image using WebLogic Image Tool + logger.info("Creating image {0} using model directory {1}", image, MODEL_DIR); + boolean result = false; + if (!modelType) { //create a domain home in image image + result = createImage( + new WitParams() + .baseImageName(baseImageName) + .baseImageTag(baseImageTag) + .domainType(domainType) + .modelImageName(imageName) + .modelImageTag(imageTag) + .modelFiles(wdtModelList) + .modelVariableFiles(modelPropList) + .modelArchiveFiles(archiveList) + .domainHome(WDT_IMAGE_DOMAINHOME_BASE_DIR + "/" + domainHome) + .wdtModelOnly(modelType) + .wdtOperation("CREATE") + .wdtVersion(WDT_VERSION) + .env(env) + .redirect(true)); + } else { + result = createImage( + new WitParams() + .baseImageName(baseImageName) + .baseImageTag(baseImageTag) + .domainType(domainType) + .modelImageName(imageName) + .modelImageTag(imageTag) + .modelFiles(wdtModelList) + .modelVariableFiles(modelPropList) + .modelArchiveFiles(archiveList) + .wdtModelOnly(modelType) + .wdtVersion(WDT_VERSION) + .env(env) + .redirect(true)); + } + + assertTrue(result, String.format("Failed to create the image %s using WebLogic Image Tool", image)); + + // Check image exists using docker images | grep image tag. + assertTrue(doesImageExist(imageTag), + String.format("Image %s does not exist", image)); + + logger.info("Image {0} are created successfully", image); + return image; + } + /** * Create secret for OCR registry credentials in the specified namespace. * * @param namespace namespace in which the secret will be created */ public static void createOCRRepoSecret(String namespace) { - + LoggingFacade logger = getLogger(); logger.info("Creating image pull secret in namespace {0}", namespace); createDockerRegistrySecret(OCR_USERNAME, OCR_PASSWORD, OCR_EMAIL, OCR_REGISTRY, OCR_SECRET_NAME, namespace); } @@ -545,7 +1115,7 @@ public static void createDockerRegistrySecret(String namespace) { * @param namespace namespace in which to create the secret */ public static void createDockerRegistrySecret(String userName, String password, - String email, String registry, String secretName, String namespace) { + String email, String registry, String secretName, String namespace) { // Create registry secret in the namespace to pull the image from repository JsonObject dockerConfigJsonObject = createDockerConfigJson( @@ -572,6 +1142,7 @@ public static void createDockerRegistrySecret(String userName, String password, * @param dockerImage the Docker image to push to registry */ public static void dockerLoginAndPushImageToRegistry(String dockerImage) { + LoggingFacade logger = getLogger(); // push image, if necessary if (!REPO_NAME.isEmpty() && dockerImage.contains(REPO_NAME)) { // docker login, if necessary @@ -609,6 +1180,33 @@ public static void createSecretWithUsernamePassword(String secretName, assertTrue(secretCreated, String.format("create secret failed for %s", secretName)); } + /** + * Create a RCU secret with username, password and sys_username, sys_password in the specified namespace. + * + * @param secretName secret name to create + * @param namespace namespace in which the secret will be created + * @param username RCU schema username + * @param password RCU schema passowrd + * @param sysUsername DB sys username + * @param sysPassword DB sys password + */ + public static void createRcuSecretWithUsernamePassword(String secretName, String namespace, + String username, String password, String sysUsername, String sysPassword) { + Map secretMap = new HashMap<>(); + secretMap.put("username", username); + secretMap.put("password", password); + secretMap.put("sys_username", sysUsername); + secretMap.put("sys_password", sysPassword); + + boolean secretCreated = assertDoesNotThrow(() -> createSecret(new V1Secret() + .metadata(new V1ObjectMeta() + .name(secretName) + .namespace(namespace)) + .stringData(secretMap)), "Create secret failed with ApiException"); + assertTrue(secretCreated, String.format("create secret failed for %s", secretName)); + } + + /** Scale the WebLogic cluster to specified number of servers. * Verify the sample app can be accessed through NGINX if curlCmd is not null. * @@ -634,7 +1232,8 @@ public static void scaleAndVerifyCluster(String clusterName, List expectedServerNames) { scaleAndVerifyCluster(clusterName, domainUid, domainNamespace, manageServerPodNamePrefix, replicasBeforeScale, - replicasAfterScale, false, 0, "", "", curlCmd, expectedServerNames); + replicasAfterScale, false, 0, "", "", + false, "", "", 0, "", "", curlCmd, expectedServerNames); } /** @@ -651,6 +1250,12 @@ public static void scaleAndVerifyCluster(String clusterName, * @param externalRestHttpsPort the node port allocated for the external operator REST HTTPS interface * @param opNamespace the namespace of WebLogic operator * @param opServiceAccount the service account for operator + * @param withWLDF whether to use WLDF to scale cluster + * @param domainHomeLocation the domain home location of the domain + * @param scalingAction scaling action, accepted value: scaleUp or scaleDown + * @param scalingSize the number of servers to scale up or scale down + * @param myWebAppName the web app name deployed to the domain + * @param curlCmdForWLDFApp the curl command to call the web app used in the WLDF script * @param curlCmd the curl command to verify ingress controller can access the sample apps from all managed servers * in the cluster, if curlCmd is null, the method will not verify the accessibility of the sample app * through ingress controller @@ -667,9 +1272,15 @@ public static void scaleAndVerifyCluster(String clusterName, int externalRestHttpsPort, String opNamespace, String opServiceAccount, + boolean withWLDF, + String domainHomeLocation, + String scalingAction, + int scalingSize, + String myWebAppName, + String curlCmdForWLDFApp, String curlCmd, List expectedServerNames) { - + LoggingFacade logger = getLogger(); // get the original managed server pod creation timestamp before scale List listOfPodCreationTimestamp = new ArrayList<>(); for (int i = 1; i <= replicasBeforeScale; i++) { @@ -692,6 +1303,16 @@ public static void scaleAndVerifyCluster(String clusterName, .withFailMessage("Scaling cluster {0} of domain {1} in namespace {2} with REST API failed", clusterName, domainUid, domainNamespace) .isTrue(); + } else if (withWLDF) { + // scale the cluster using WLDF policy + assertThat(assertDoesNotThrow(() -> scaleClusterWithWLDF(clusterName, domainUid, domainNamespace, + domainHomeLocation, scalingAction, scalingSize, opNamespace, opServiceAccount, myWebAppName, + curlCmdForWLDFApp))) + .as("Verify scaling cluster {0} of domain {1} in namespace {2} with WLDF policy succeeds", + clusterName, domainUid, domainNamespace) + .withFailMessage("Scaling cluster {0} of domain {1} in namespace {2} with WLDF policy failed", + clusterName, domainUid, domainNamespace) + .isTrue(); } else { assertThat(assertDoesNotThrow(() -> scaleCluster(domainUid, domainNamespace, clusterName, replicasAfterScale))) .as("Verify scaling cluster {0} of domain {1} in namespace {2} succeeds", @@ -768,7 +1389,9 @@ public static void scaleAndVerifyCluster(String clusterName, logger.info("Checking that managed server pod {0} was deleted from namespace {1}", manageServerPodNamePrefix + i, domainNamespace); checkPodDoesNotExist(manageServerPodNamePrefix + i, domainUid, domainNamespace); - expectedServerNames.remove(clusterName + "-" + MANAGED_SERVER_NAME_BASE + i); + if (expectedServerNames != null) { + expectedServerNames.remove(clusterName + "-" + MANAGED_SERVER_NAME_BASE + i); + } } if (curlCmd != null && expectedServerNames != null) { @@ -800,7 +1423,7 @@ public static HelmParams installAndVerifyPrometheus(String promReleaseName, String promVersion, int promServerNodePort, int alertManagerNodePort) { - + LoggingFacade logger = getLogger(); // Helm install parameters HelmParams promHelmParams = new HelmParams() .releaseName(promReleaseName) @@ -859,11 +1482,11 @@ public static HelmParams installAndVerifyPrometheus(String promReleaseName, * @return the grafana Helm installation parameters */ public static HelmParams installAndVerifyGrafana(String grafanaReleaseName, - String grafanaNamespace, - String grafanaValueFile, - String grafanaVersion, - int grafanaNodePort) { - + String grafanaNamespace, + String grafanaValueFile, + String grafanaVersion, + int grafanaNodePort) { + LoggingFacade logger = getLogger(); // Helm install parameters HelmParams grafanaHelmParams = new HelmParams() .releaseName(grafanaReleaseName) @@ -900,7 +1523,7 @@ public static HelmParams installAndVerifyGrafana(String grafanaReleaseName, logger.info("Wait for the grafana pod is ready in namespace {0}", grafanaNamespace); withStandardRetryPolicy .conditionEvaluationListener( - condition -> logger.info("Waiting for prometheus to be running in namespace {0} " + condition -> logger.info("Waiting for grafana to be running in namespace {0} " + "(elapsed time {1}ms, remaining time {2}ms)", grafanaNamespace, condition.getElapsedTimeInMS(), @@ -925,7 +1548,7 @@ public static void createPVPVCAndVerify(V1PersistentVolume v1pv, V1PersistentVolumeClaim v1pvc, String labelSelector, String namespace) { - + LoggingFacade logger = getLogger(); assertNotNull(v1pv, "v1pv is null"); assertNotNull(v1pvc, "v1pvc is null"); @@ -1002,7 +1625,7 @@ public static void createConfigMapFromFiles(String configMapName, * @param namespace the namespace in which the job will be created */ public static void createJobAndWaitUntilComplete(V1Job jobBody, String namespace) { - + LoggingFacade logger = getLogger(); String jobName = assertDoesNotThrow(() -> createNamespacedJob(jobBody), "createNamespacedJob failed"); logger.info("Checking if the job {0} completed in namespace {1}", jobName, namespace); @@ -1025,6 +1648,7 @@ public static void createJobAndWaitUntilComplete(V1Job jobBody, String namespace * @return PodCreationTimestamp of the pod */ public static DateTime getPodCreationTime(String namespace, String podName) { + LoggingFacade logger = getLogger(); DateTime podCreationTime = assertDoesNotThrow(() -> getPodCreationTimestamp(namespace, "", podName), String.format("Couldn't get PodCreationTimestamp for pod %s", podName)); @@ -1036,13 +1660,57 @@ public static DateTime getPodCreationTime(String namespace, String podName) { return podCreationTime; } + /** + * Create a Kubernetes ConfigMap with the given parameters and verify that the operation succeeds. + * + * @param configMapName the name of the Kubernetes ConfigMap to be created + * @param domainUid the domain to which the cluster belongs + * @param namespace Kubernetes namespace that the domain is hosted + * @param modelFiles list of the names of the WDT mode files in the ConfigMap + */ + public static void createConfigMapAndVerify( + String configMapName, + String domainUid, + String namespace, + List modelFiles) { + LoggingFacade logger = getLogger(); + assertNotNull(configMapName, "ConfigMap name cannot be null"); + + Map labels = new HashMap<>(); + labels.put("weblogic.domainUid", domainUid); + + assertNotNull(configMapName, "ConfigMap name cannot be null"); + + logger.info("Create ConfigMap {0} that contains model files {1}", + configMapName, modelFiles); + + Map data = new HashMap<>(); + + for (String modelFile : modelFiles) { + addModelFile(data, modelFile); + } + + V1ObjectMeta meta = new V1ObjectMeta() + .labels(labels) + .name(configMapName) + .namespace(namespace); + V1ConfigMap configMap = new V1ConfigMap() + .data(data) + .metadata(meta); + + assertTrue(assertDoesNotThrow(() -> createConfigMap(configMap), + String.format("Create ConfigMap %s failed due to Kubernetes client ApiException", configMapName)), + String.format("Failed to create ConfigMap %s", configMapName)); + } + /** * A utility method to sed files. * * @throws java.io.IOException when copying files from source location to staging area fails */ public static void replaceStringInFile(String filePath, String oldValue, String newValue) - throws IOException { + throws IOException { + LoggingFacade logger = getLogger(); Path src = Paths.get(filePath); logger.info("Copying {0}", src.toString()); Charset charset = StandardCharsets.UTF_8; @@ -1052,6 +1720,22 @@ public static void replaceStringInFile(String filePath, String oldValue, String Files.write(src, content.getBytes(charset)); } + /** + * Read the content of a model file as a String and add it to a map. + */ + private static void addModelFile(Map data, String modelFileName) { + LoggingFacade logger = getLogger(); + logger.info("Add model file {0}", modelFileName); + String dsModelFile = String.format("%s/%s", MODEL_DIR, modelFileName); + + String cmData = assertDoesNotThrow(() -> Files.readString(Paths.get(dsModelFile)), + String.format("Failed to read model file %s", dsModelFile)); + assertNotNull(cmData, + String.format("Failed to read model file %s", dsModelFile)); + + data.put(modelFileName, cmData); + } + /** * Create an external REST Identity secret in the specified namespace. * @@ -1085,4 +1769,369 @@ private static boolean createExternalRestIdentitySecret(String namespace, String return Command.withParams(params).execute(); } + + /** + * Check that the given credentials are valid to access the WebLogic domain. + * + * @param podName name of the admin server pod + * @param namespace name of the namespace that the pod is running in + * @param username WebLogic admin username + * @param password WebLogic admin password + * @param expectValid true if the check expects a successful result + */ + public static void verifyCredentials( + String podName, + String namespace, + String username, + String password, + boolean expectValid) { + LoggingFacade logger = getLogger(); + String msg = expectValid ? "valid" : "invalid"; + logger.info("Check if the given WebLogic admin credentials are {0}", msg); + withQuickRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Checking that credentials {0}/{1} are {2}" + + "(elapsed time {3}ms, remaining time {4}ms)", + username, + password, + msg, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow( + expectValid + ? + () -> credentialsValid(K8S_NODEPORT_HOST, podName, namespace, username, password) + : + () -> credentialsNotValid(K8S_NODEPORT_HOST, podName, namespace, username, password), + String.format( + "Failed to validate credentials %s/%s on pod %s in namespace %s", + username, password, podName, namespace))); + } + + + /** + * Generate a text file in RESULTS_ROOT directory by replacing template value. + * @param inputTemplateFile input template file + * @param outputFile output file to be generated. This file will be copied to RESULTS_ROOT. If outputFile contains + * a directory, then the directory will created if it does not exist. + * example - crossdomxaction/istio-cdt-http-srvice.yaml + * @param templateMap map containing template variable(s) to be replaced + * @return path of the generated file - will be under RESULTS_ROOT + */ + public static Path generateFileFromTemplate( + String inputTemplateFile, String outputFile, + Map templateMap) throws IOException { + + LoggingFacade logger = getLogger(); + + Path targetFileParent = Paths.get(outputFile).getParent(); + if (targetFileParent != null) { + checkDirectory(targetFileParent.toString()); + } + Path srcFile = Paths.get(inputTemplateFile); + Path targetFile = Paths.get(RESULTS_ROOT, outputFile); + logger.info("Copying source file {0} to target file {1}", inputTemplateFile, targetFile.toString()); + + // Add the parent directory for the target file + Path parentDir = targetFile.getParent(); + Files.createDirectories(parentDir); + Files.copy(srcFile, targetFile, StandardCopyOption.REPLACE_EXISTING); + String out = targetFile.toString(); + for (Map.Entry entry : templateMap.entrySet()) { + logger.info("Replacing String {0} with the value {1}", entry.getKey(), entry.getValue()); + replaceStringInFile(out, entry.getKey(), entry.getValue()); + } + return targetFile; + } + + /** + * Check the application running in WebLogic server using host information in the header. + * @param url url to access the application + * @param hostHeader host information to be passed as http header + * @return true if curl command returns HTTP code 200 otherwise false + */ + public static boolean checkAppUsingHostHeader(String url, String hostHeader) { + LoggingFacade logger = getLogger(); + StringBuffer curlString = new StringBuffer("status=$(curl --user weblogic:welcome1 "); + StringBuffer headerString = null; + if (hostHeader != null) { + headerString = new StringBuffer("-H 'host: "); + headerString.append(hostHeader) + .append(" ' "); + } else { + headerString = new StringBuffer(""); + } + curlString.append(" --noproxy '*' ") + .append(" --silent --show-error ") + .append(headerString.toString()) + .append(url) + .append(" -o /dev/null") + .append(" -w %{http_code});") + .append("echo ${status}"); + logger.info("checkAppUsingHostInfo: curl command {0}", new String(curlString)); + withQuickRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for appliation to be ready {0} " + + "(elapsed time {1} ms, remaining time {2} ms)", + url, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> { + return () -> { + return exec(new String(curlString), true).stdout().contains("200"); + }; + })); + return true; + } + + /** Create a persistent volume. + * @param pvName name of the persistent volume to create + * @param domainUid domain UID + * @param className name of the class to call this method + */ + public static void createPV(String pvName, String domainUid, String className) { + + LoggingFacade logger = getLogger(); + logger.info("creating persistent volume for pvName {0}, domainUid: {1}, className: {2}", + pvName, domainUid, className); + Path pvHostPath = null; + // when tests are running in local box the PV directories need to exist + try { + pvHostPath = Files.createDirectories(Paths.get( + PV_ROOT, className, pvName)); + logger.info("Creating PV directory host path {0}", pvHostPath); + org.apache.commons.io.FileUtils.deleteDirectory(pvHostPath.toFile()); + Files.createDirectories(pvHostPath); + } catch (IOException ioex) { + logger.severe(ioex.getMessage()); + fail("Create persistent volume host path failed"); + } + + V1PersistentVolume v1pv = new V1PersistentVolume() + .spec(new V1PersistentVolumeSpec() + .addAccessModesItem("ReadWriteMany") + .storageClassName("weblogic-domain-storage-class") + .volumeMode("Filesystem") + .putCapacityItem("storage", Quantity.fromString("5Gi")) + .persistentVolumeReclaimPolicy("Recycle") + .accessModes(Arrays.asList("ReadWriteMany")) + .hostPath(new V1HostPathVolumeSource() + .path(pvHostPath.toString()))) + .metadata(new V1ObjectMeta() + .name(pvName) + .putLabelsItem("weblogic.resourceVersion", "domain-v2") + .putLabelsItem("weblogic.domainUid", domainUid)); + boolean success = assertDoesNotThrow(() -> createPersistentVolume(v1pv), + "Failed to create persistent volume"); + assertTrue(success, "PersistentVolume creation failed"); + } + + /** + * Create a persistent volume claim. + * + * @param pvName name of the persistent volume + * @param pvcName name of the persistent volume claim to create + * @param domainUid UID of the WebLogic domain + * @param namespace name of the namespace in which to create the persistent volume claim + */ + public static void createPVC(String pvName, String pvcName, String domainUid, String namespace) { + + LoggingFacade logger = getLogger(); + logger.info("creating persistent volume claim for pvName {0}, pvcName {1}, " + + "domainUid: {2}, namespace: {3}", pvName, pvcName, domainUid, namespace); + V1PersistentVolumeClaim v1pvc = new V1PersistentVolumeClaim() + .spec(new V1PersistentVolumeClaimSpec() + .addAccessModesItem("ReadWriteMany") + .storageClassName("weblogic-domain-storage-class") + .volumeName(pvName) + .resources(new V1ResourceRequirements() + .putRequestsItem("storage", Quantity.fromString("5Gi")))) + .metadata(new V1ObjectMeta() + .name(pvcName) + .namespace(namespace) + .putLabelsItem("weblogic.resourceVersion", "domain-v2") + .putLabelsItem("weblogic.domainUid", domainUid)); + + boolean success = assertDoesNotThrow(() -> createPersistentVolumeClaim(v1pvc), + "Failed to create persistent volume claim"); + assertTrue(success, "PersistentVolumeClaim creation failed"); + } + + /** + * Create configmap containing domain creation scripts. + * + * @param configMapName name of the configmap to create + * @param files files to add in configmap + * @param namespace name of the namespace in which to create configmap + * @param className name of the class to call this method + * @throws IOException when reading the domain script files fail + * @throws ApiException if create configmap fails + */ + public static void createConfigMapForDomainCreation(String configMapName, List files, + String namespace, String className) + throws ApiException, IOException { + + LoggingFacade logger = getLogger(); + logger.info("Creating configmap {0}, namespace {1}, className {2}", configMapName, namespace, className); + + Path domainScriptsDir = Files.createDirectories( + Paths.get(TestConstants.LOGS_DIR, className, namespace)); + + // add domain creation scripts and properties files to the configmap + Map data = new HashMap<>(); + for (Path file : files) { + logger.info("Adding file {0} in configmap", file); + data.put(file.getFileName().toString(), Files.readString(file)); + logger.info("Making a copy of file {0} to {1} for diagnostic purposes", file, + domainScriptsDir.resolve(file.getFileName())); + Files.copy(file, domainScriptsDir.resolve(file.getFileName())); + } + V1ObjectMeta meta = new V1ObjectMeta() + .name(configMapName) + .namespace(namespace); + V1ConfigMap configMap = new V1ConfigMap() + .data(data) + .metadata(meta); + + boolean cmCreated = assertDoesNotThrow(() -> createConfigMap(configMap), + String.format("Failed to create configmap %s with files %s", configMapName, files)); + assertTrue(cmCreated, String.format("Failed while creating ConfigMap %s", configMapName)); + } + + /** + * Create a job to create a domain in persistent volume. + * + * @param image image name used to create the domain + * @param isUseSecret true for non Kind Kubernetes cluster + * @param pvName name of the persistent volume to create domain in + * @param pvcName name of the persistent volume claim + * @param domainScriptCM configmap holding domain creation script files + * @param namespace name of the domain namespace in which the job is created + * @param jobContainer V1Container with job commands to create domain + */ + public static void createDomainJob(String image, boolean isUseSecret, String pvName, + String pvcName, String domainScriptCM, String namespace, V1Container jobContainer) { + + LoggingFacade logger = getLogger(); + logger.info("Running Kubernetes job to create domain for image: {1}, isUserSecret: {2} " + + " pvName: {3}, pvcName: {4}, domainScriptCM: {5}, namespace: {6}", image, isUseSecret, + pvName, pvcName, domainScriptCM, namespace); + V1Job jobBody = new V1Job() + .metadata( + new V1ObjectMeta() + .name("create-domain-onpv-job-" + pvName) // name of the create domain job + .namespace(namespace)) + .spec(new V1JobSpec() + .backoffLimit(0) // try only once + .template(new V1PodTemplateSpec() + .spec(new V1PodSpec() + .restartPolicy("Never") + .initContainers(Arrays.asList(new V1Container() + .name("fix-pvc-owner") // change the ownership of the pv to opc:opc + .image(image) + .addCommandItem("/bin/sh") + .addArgsItem("-c") + .addArgsItem("chown -R 1000:1000 /shared") + .volumeMounts(Arrays.asList( + new V1VolumeMount() + .name(pvName) + .mountPath("/shared"))) + .securityContext(new V1SecurityContext() + .runAsGroup(0L) + .runAsUser(0L)))) + .containers(Arrays.asList(jobContainer // container containing WLST or WDT details + .name("create-weblogic-domain-onpv-container") + .image(image) + .imagePullPolicy("Always") + .ports(Arrays.asList(new V1ContainerPort() + .containerPort(7001))) + .volumeMounts(Arrays.asList( + new V1VolumeMount() + .name("create-weblogic-domain-job-cm-volume") // domain creation scripts volume + .mountPath("/u01/weblogic"), // availble under /u01/weblogic inside pod + new V1VolumeMount() + .name(pvName) // location to write domain + .mountPath("/shared"))))) // mounted under /shared inside pod + .volumes(Arrays.asList( + new V1Volume() + .name(pvName) + .persistentVolumeClaim( + new V1PersistentVolumeClaimVolumeSource() + .claimName(pvcName)), + new V1Volume() + .name("create-weblogic-domain-job-cm-volume") + .configMap( + new V1ConfigMapVolumeSource() + .name(domainScriptCM)))) //config map containing domain scripts + .imagePullSecrets(isUseSecret ? Arrays.asList( + new V1LocalObjectReference() + .name(OCR_SECRET_NAME)) + : null)))); + String jobName = assertDoesNotThrow(() + -> createNamespacedJob(jobBody), "Failed to create Job"); + + logger.info("Checking if the domain creation job {0} completed in namespace {1}", + jobName, namespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for job {0} to be completed in namespace {1} " + + "(elapsed time {2} ms, remaining time {3} ms)", + jobName, + namespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(jobCompleted(jobName, null, namespace)); + + // check job status and fail test if the job failed to create domain + V1Job job = assertDoesNotThrow(() -> getJob(jobName, namespace), + "Getting the job failed"); + if (job != null) { + V1JobCondition jobCondition = job.getStatus().getConditions().stream().filter( + v1JobCondition -> "Failed".equalsIgnoreCase(v1JobCondition.getType())) + .findAny() + .orElse(null); + if (jobCondition != null) { + logger.severe("Job {0} failed to create domain", jobName); + List pods = assertDoesNotThrow(() -> listPods( + namespace, "job-name=" + jobName).getItems(), + "Listing pods failed"); + if (!pods.isEmpty()) { + String podLog = assertDoesNotThrow(() -> getPodLog(pods.get(0).getMetadata().getName(), namespace), + "Failed to get pod log"); + logger.severe(podLog); + fail("Domain create job failed"); + } + } + } + } + + /** + * Verify the default secret exists for the default service account. + * + */ + public static void verifyDefaultTokenExists() { + final LoggingFacade logger = getLogger(); + + ConditionFactory withStandardRetryPolicy + = with().pollDelay(0, SECONDS) + .and().with().pollInterval(5, SECONDS) + .atMost(5, MINUTES).await(); + + withStandardRetryPolicy.conditionEvaluationListener( + condition -> logger.info("Waiting for the default token to be available in default service account, " + + "elapsed time {0}, remaining time {1}", + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(() -> { + V1ServiceAccountList sas = Kubernetes.listServiceAccounts("default"); + for (V1ServiceAccount sa : sas.getItems()) { + if (sa.getMetadata().getName().equals("default")) { + List secrets = sa.getSecrets(); + return !secrets.isEmpty(); + } + } + return false; + }); + } + } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/DbUtils.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/DbUtils.java new file mode 100644 index 00000000000..93f9267a496 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/DbUtils.java @@ -0,0 +1,457 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.utils; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Callable; +import javax.net.ssl.SSLProtocolException; + +import io.kubernetes.client.custom.IntOrString; +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1ContainerPort; +import io.kubernetes.client.openapi.models.V1Deployment; +import io.kubernetes.client.openapi.models.V1DeploymentSpec; +import io.kubernetes.client.openapi.models.V1DeploymentStrategy; +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LabelSelector; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1Pod; +import io.kubernetes.client.openapi.models.V1PodCondition; +import io.kubernetes.client.openapi.models.V1PodList; +import io.kubernetes.client.openapi.models.V1PodSpec; +import io.kubernetes.client.openapi.models.V1PodTemplateSpec; +import io.kubernetes.client.openapi.models.V1ResourceRequirements; +import io.kubernetes.client.openapi.models.V1RollingUpdateDeployment; +import io.kubernetes.client.openapi.models.V1Service; +import io.kubernetes.client.openapi.models.V1ServicePort; +import io.kubernetes.client.openapi.models.V1ServiceSpec; +import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import org.awaitility.core.ConditionFactory; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.OCR_EMAIL; +import static oracle.weblogic.kubernetes.TestConstants.OCR_PASSWORD; +import static oracle.weblogic.kubernetes.TestConstants.OCR_REGISTRY; +import static oracle.weblogic.kubernetes.TestConstants.OCR_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.OCR_USERNAME; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; +import static oracle.weblogic.kubernetes.actions.TestActions.execCommand; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.podReady; +import static oracle.weblogic.kubernetes.assertions.impl.Kubernetes.getPod; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Utility class to start DB service and RCU schema. + */ +public class DbUtils { + + private static final String CREATE_REPOSITORY_SCRIPT = "createRepository.sh"; + private static final String PASSWORD_FILE = "pwd.txt"; + private static final String RCUTYPE = "fmw"; + private static final String RCUPODNAME = "rcu"; + private static final String SYSPASSWORD = "Oradoc_db1"; + + private static V1Service oracleDBService = null; + private static V1Deployment oracleDbDepl = null; + + private static ConditionFactory withStandardRetryPolicy = + with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(15, MINUTES).await(); + /** + * Start Oracle DB instance, create rcu pod and load database schema in the specified namespace. + * + * @param dbImage image name of database + * @param fmwImage image name of FMW + * @param rcuSchemaPrefix rcu SchemaPrefix + * @param dbNamespace namespace where DB and RCU schema are going to start + * @param dbPort NodePort of DB + * @param dbUrl URL of DB + * @throws Exception if any error occurs when setting up RCU database + */ + + public static void setupDBandRCUschema(String dbImage, String fmwImage, String rcuSchemaPrefix, String dbNamespace, + int dbPort, String dbUrl, boolean isUseSecret) throws ApiException { + LoggingFacade logger = getLogger(); + // create pull secrets when running in non Kind Kubernetes cluster + if (isUseSecret) { + CommonTestUtils.createDockerRegistrySecret(OCR_USERNAME, OCR_PASSWORD, + OCR_EMAIL, OCR_REGISTRY, OCR_SECRET_NAME, dbNamespace); + } + + logger.info("Start Oracle DB with dbImage: {0}, dbPort: {1}, dbNamespace: {2}, isUseSecret: {3}", + dbImage, dbPort, dbNamespace, isUseSecret); + startOracleDB(dbImage, dbPort, dbNamespace, isUseSecret); + logger.info("Create RCU schema with fmwImage: {0}, rcuSchemaPrefix: {1}, dbUrl: {2}, " + + " dbNamespace: {3}, isUseSecret {4}:", fmwImage, rcuSchemaPrefix, dbUrl, dbNamespace, isUseSecret); + createRcuSchema(fmwImage, rcuSchemaPrefix, dbUrl, dbNamespace, isUseSecret); + + } + + /** + * Start Oracle DB pod and service in the specified namespace. + * + * @param dbBaseImageName full image name for DB deployment + * @param dbPort NodePort of DB + * @param dbNamespace namespace where DB instance is going to start + */ + public static void startOracleDB(String dbBaseImageName, int dbPort, String dbNamespace, boolean isUseSecret) + throws ApiException { + LoggingFacade logger = getLogger(); + Map labels = new HashMap(); + labels.put("app", "database"); + + Map limits = new HashMap(); + limits.put("cpu", "2"); + limits.put("memory", "10Gi"); + limits.put("ephemeral-storage", "8Gi"); + Map requests = new HashMap(); + requests.put("cpu", "500m"); + requests.put("ephemeral-storage", "8Gi"); + + //create V1Service for Oracle DB + oracleDBService = new V1Service() + .apiVersion("v1") + .kind("Service") + .metadata(new V1ObjectMeta() + .name("oracledb") + .namespace(dbNamespace) + .labels(labels)) + .spec(new V1ServiceSpec() + .ports(Arrays.asList( + new V1ServicePort() + .name("tns") + .port(1521) + .protocol("TCP") + .targetPort(new IntOrString(1521)) + .nodePort(dbPort))) + .selector(labels) + .sessionAffinity("None") + .type("LoadBalancer")); + + logger.info("Create service for Oracle DB service in namespace {0}", dbNamespace); + boolean serviceCreated = assertDoesNotThrow(() -> Kubernetes.createService(oracleDBService), + String.format("Create service failed with ApiException for oracleDBService in namespace %s", + dbNamespace)); + assertTrue(serviceCreated, String.format( + "Create service failed for OracleDbService in namespace %s ", dbNamespace)); + + //create V1Deployment for Oracle DB + logger.info("Configure V1Deployment in namespace {0} using image {1}", dbNamespace, dbBaseImageName); + oracleDbDepl = new V1Deployment() + .apiVersion("apps/v1") + .kind("Deployment") + .metadata(new V1ObjectMeta() + .name("oracledb") + .namespace(dbNamespace) + .labels(labels)) + .spec(new V1DeploymentSpec() + .replicas(1) + .selector(new V1LabelSelector() + .matchLabels(labels)) + .strategy(new V1DeploymentStrategy() + .rollingUpdate(new V1RollingUpdateDeployment() + .maxSurge(new IntOrString(1)) + .maxUnavailable(new IntOrString(1))) + .type("RollingUpdate")) + .template(new V1PodTemplateSpec() + .metadata(new V1ObjectMeta() + .labels(labels)) + .spec(new V1PodSpec() + .containers(Arrays.asList( + new V1Container() + .addEnvItem(new V1EnvVar().name("DB_SID").value("devcdb")) + .addEnvItem(new V1EnvVar().name("DB_PDB").value("devpdb")) + .addEnvItem(new V1EnvVar().name("DB_DOMAIN").value("k8s")) + .addEnvItem(new V1EnvVar().name("DB_BUNDLE").value("basic")) + .image(dbBaseImageName) + .imagePullPolicy("IfNotPresent") + .name("oracledb") + .ports(Arrays.asList( + new V1ContainerPort() + .containerPort(1521) + .name("tns") + .protocol("TCP") + .hostPort(1521))) + .resources(new V1ResourceRequirements() + .limits(limits) + .requests(requests)) + .terminationMessagePath("/dev/termination-log") + .terminationMessagePolicy("File"))) + .dnsPolicy("ClusterFirst") + .restartPolicy("Always") + .schedulerName("default-scheduler") + .terminationGracePeriodSeconds(30L) + .imagePullSecrets(isUseSecret ? Arrays.asList( + new V1LocalObjectReference() + .name(OCR_SECRET_NAME)) + : null)))); + + logger.info("Create deployment for Oracle DB in namespace {0}", + dbNamespace); + boolean deploymentCreated = assertDoesNotThrow(() -> Kubernetes.createDeployment(oracleDbDepl), + String.format("Create deployment failed with ApiException for Oracle DB in namespace %s", + dbNamespace)); + assertTrue(deploymentCreated, String.format( + "Create deployment failed for oracleDbDepl in namespace %s ", + dbNamespace)); + + // sleep for a while to make sure the DB pod is created + try { + Thread.sleep(2 * 1000); + } catch (InterruptedException ie) { + // ignore + } + + // wait for the Oracle DB pod to be ready + String dbPodName = assertDoesNotThrow(() -> getPodNameOfDb(dbNamespace), + String.format("Get Oracle DB pod name failed with ApiException for oracleDBService in namespace %s", + dbNamespace)); + logger.info("Wait for the oracle Db pod: {0} ready in namespace {1}", dbPodName, dbNamespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for Oracle DB to be ready in namespace {0} " + + "(elapsed time {1}ms, remaining time {2}ms)", + dbNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> podIsReady(dbNamespace, "app=database", dbPodName), + "oracleDBService podReady failed with ApiException")); + + // check if DB is ready to be used by searching pod log + logger.info("Check for DB pod {0} log contains ready message in namespace {1}", + dbPodName, dbNamespace); + String msg = "The database is ready for use"; + checkDbReady(msg, dbPodName, dbNamespace); + + } + + /** + * Create a RCU schema in the namespace. + * + * @param fmwBaseImageName the FMW image name + * @param rcuPrefix prefix of RCU schema + * @param dbUrl URL of DB + * @param dbNamespace namespace of DB where RCU is + * @throws ApiException when create RCU pod fails + */ + public static void createRcuSchema(String fmwBaseImageName, String rcuPrefix, String dbUrl, + String dbNamespace, boolean isUseSecret) throws ApiException { + LoggingFacade logger = getLogger(); + logger.info("Create RCU pod for RCU prefix {0}", rcuPrefix); + assertDoesNotThrow(() -> createRcuPod(fmwBaseImageName, dbUrl, dbNamespace, isUseSecret), + String.format("Creating RCU pod failed with ApiException for image: %s, rcuPrefix: %s, dbUrl: %s, " + + "in namespace: %s", fmwBaseImageName, rcuPrefix, dbUrl, dbNamespace)); + + assertTrue(assertDoesNotThrow( + () -> createRcuRepository(dbNamespace, dbUrl, rcuPrefix), + String.format("createRcuRepository failed for dbNamespace: %s, dbUrl: %s, rcuPrefix: %s", + dbNamespace, dbUrl, rcuPrefix))); + } + + /** + * Create a RCU where createRepository script runs. + * + * @param fmwBaseImageName the FMW image name + * @param dbUrl URL of DB + * @param dbNamespace namespace of DB where RCU is + * @throws ApiException when create RCU pod fails + */ + public static V1Pod createRcuPod(String fmwBaseImageName, String dbUrl, String dbNamespace, boolean isUseSecret) + throws ApiException { + LoggingFacade logger = getLogger(); + ConditionFactory withStandardRetryPolicy = with().pollDelay(10, SECONDS) + .and().with().pollInterval(2, SECONDS) + .atMost(10, MINUTES).await(); + + Map labels = new HashMap(); + labels.put("ruc", "rcu"); + + V1Pod podBody = new V1Pod() + .apiVersion("v1") + .kind("Pod") + .metadata(new V1ObjectMeta() + .name(RCUPODNAME) + .namespace(dbNamespace) + .labels(labels)) + .spec(new V1PodSpec() + .containers(Arrays.asList( + new V1Container() + .name("rcu") + .image(fmwBaseImageName) + .imagePullPolicy("IfNotPresent") + .addArgsItem("sleep") + .addArgsItem("infinity"))) + .imagePullSecrets(isUseSecret ? Arrays.asList( + new V1LocalObjectReference() + .name(OCR_SECRET_NAME)) + : null)); + + V1Pod pvPod = Kubernetes.createPod(dbNamespace, podBody); + + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for {0} to be ready in namespace {1}, " + + "(elapsed time {2} , remaining time {3}", + RCUPODNAME, + dbNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(podReady(RCUPODNAME, null, dbNamespace)); + + return pvPod; + } + + /** + * Checks if a pod is ready in a given namespace. + * + * @param namespace in which to check if the pod is ready + * @param labelSelector the label the pod is decorated with + * @param podName name of the pod to check for + * @return true if the pod is in the ready condition, false otherwise + * @throws ApiException if Kubernetes client API call fails + */ + public static boolean isPodReady(String namespace, String labelSelector, String podName) throws ApiException { + LoggingFacade logger = getLogger(); + boolean status = false; + V1Pod pod = getPod(namespace, labelSelector, podName); + if (pod != null) { + + // get the podCondition with the 'Ready' type field + V1PodCondition v1PodReadyCondition = pod.getStatus().getConditions().stream() + .filter(v1PodCondition -> "Ready".equals(v1PodCondition.getType())) + .findAny() + .orElse(null); + + if (v1PodReadyCondition != null) { + status = v1PodReadyCondition.getStatus().equalsIgnoreCase("true"); + if (status) { + logger.info("Pod {0} is READY in namespace {1}", podName, namespace); + } + } + } else { + logger.info("Pod {0} does not exist in namespace {1}", podName, namespace); + } + return status; + } + + /** + * Check if Pod is ready. + * + * @param namespace in which to check if the pod is ready + * @param labelSelector the label the pod is decorated with + * @param podName name of the pod to check for + * @return true if the pod is in the ready condition, false otherwise + * @throws ApiException if Kubernetes client API call fails + */ + public static Callable podIsReady(String namespace, + String labelSelector, + String podName) throws ApiException { + return () -> isPodReady(namespace, labelSelector, podName); + } + + private static boolean createRcuRepository(String dbNamespace, String dbUrl, + String rcuSchemaPrefix) + throws ApiException, IOException { + LoggingFacade logger = getLogger(); + // copy the script and helper files into the RCU pod + Path createRepositoryScript = Paths.get(RESOURCE_DIR, "bash-scripts", CREATE_REPOSITORY_SCRIPT); + Path passwordFile = Paths.get(RESOURCE_DIR, "helper-files", PASSWORD_FILE); + Path podCreateRepositoryScript = Paths.get("/u01/oracle", CREATE_REPOSITORY_SCRIPT); + Path podPasswordFile = Paths.get("/u01/oracle", PASSWORD_FILE); + + logger.info("source file is: {0}, target file is: {1}", createRepositoryScript, podCreateRepositoryScript); + FileUtils.copyFileToPod(dbNamespace, RCUPODNAME, null, createRepositoryScript, podCreateRepositoryScript); + logger.info("source file is: {0}, target file is: {1}", passwordFile, podPasswordFile); + FileUtils.copyFileToPod(dbNamespace, RCUPODNAME, null, passwordFile, podPasswordFile); + + String createRepository = "/u01/oracle/createRepository.sh"; + logger.info("Running the createRepository command: {0}, dbUrl: {1}, rcuSchemaPrefix: {2}, RCU type: {3}, " + + "SYSPASSWORD: {4} ", createRepository, dbUrl, rcuSchemaPrefix, RCUTYPE, SYSPASSWORD); + + /* TODO The original code without encountering SSLProtocolException. Rollback to this oneWhen the bug is fixed. + ExecResult execResult = assertDoesNotThrow( + () -> execCommand(dbNamespace, RCUPODNAME, + null, true, "/bin/bash", createRepository, dbUrl, rcuSchemaPrefix, + RCUTYPE, SYSPASSWORD)); + logger.info("Inside RCU pod command createRepository return value: {0}", execResult.exitValue()); + if (execResult.exitValue() != 0) { + logger.info("Inside RCU pod command createRepository return error {0}", execResult.stderr()); + return false; + */ + try { + execCommand(dbNamespace, RCUPODNAME, + null, true, "/bin/bash", createRepository, dbUrl, rcuSchemaPrefix, + RCUTYPE, SYSPASSWORD); + + } catch (SSLProtocolException e) { + /* TODO For Api 8.0.2 it looks that there is a bug on the web socket code or a timing bug + where it doesn't properly handle closing a socket that has already been closed by the other + side. Sometimes on remote Jenkins cluster 10 when RCU creation is completed java.net.ssl.SSLProtocolException + is thrown. Ignore it for now */ + return true; + } catch (InterruptedException e) { + return false; + } catch (ApiException e) { + return false; + } + + return true; + } + + private static String getPodNameOfDb(String dbNamespace) throws ApiException { + + V1PodList pod = null; + pod = Kubernetes.listPods(dbNamespace, null); + + String podName = null; + + //There is only one pod in the given DB namespace + if (pod != null) { + podName = pod.getItems().get(0).getMetadata().getName(); + } + + return podName; + } + + private static boolean checkPodLogContains(String matchStr, String podName, String namespace) + throws ApiException { + + return Kubernetes.getPodLog(podName,namespace,null).contains(matchStr); + + } + + private static Callable podLogContains(String matchStr, String podName, String dbNamespace) + throws ApiException { + return () -> checkPodLogContains(matchStr, podName, dbNamespace); + } + + private static void checkDbReady(String matchStr, String podName, String dbNamespace) { + LoggingFacade logger = getLogger(); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for pod {0} log contain message {1} in namespace {2} " + + "(elapsed time {3}ms, remaining time {4}ms)", + podName, + matchStr, + dbNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(assertDoesNotThrow(() -> podLogContains(matchStr, podName, dbNamespace), + String.format("podLogContains failed with ApiException for pod %s in namespace %s", podName, dbNamespace))); + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/DeployUtil.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/DeployUtil.java index 6fc70cc8cc7..5d0c2d44614 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/DeployUtil.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/DeployUtil.java @@ -33,6 +33,7 @@ import io.kubernetes.client.openapi.models.V1VolumeMount; import oracle.weblogic.kubernetes.TestConstants; import oracle.weblogic.kubernetes.actions.impl.Namespace; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import org.awaitility.core.ConditionFactory; import static java.util.concurrent.TimeUnit.MINUTES; @@ -53,7 +54,8 @@ import static oracle.weblogic.kubernetes.actions.TestActions.listPods; import static oracle.weblogic.kubernetes.actions.TestActions.listSecrets; import static oracle.weblogic.kubernetes.assertions.TestAssertions.jobCompleted; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.utils.ExecCommand.exec; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.awaitility.Awaitility.with; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.fail; @@ -87,7 +89,7 @@ public class DeployUtil { */ public static void deployUsingWlst(String host, String port, String userName, String password, String targets, Path archivePath, String namespace) { - + final LoggingFacade logger = getLogger(); setImage(namespace); // create a temporary WebLogic domain property file @@ -141,6 +143,7 @@ public static void deployUsingWlst(String host, String port, String userName, * @param deployScriptConfigMapName configmap containing deployment scripts */ private static void deploy(String namespace, String deployScriptConfigMapName) { + LoggingFacade logger = getLogger(); logger.info("Preparing to run deploy job using WLST"); // create a V1Container with specific scripts and properties for creating domain V1Container jobCreationContainer = new V1Container() @@ -167,6 +170,7 @@ private static void deploy(String namespace, String deployScriptConfigMapName) { */ private static void createDeployJob(String deployScriptConfigMap, String namespace, V1Container jobContainer) throws ApiException { + LoggingFacade logger = getLogger(); logger.info("Running Kubernetes job to deploy application"); String uniqueName = Namespace.uniqueName(); String name = "wlst-deploy-job-" + uniqueName; @@ -238,6 +242,7 @@ private static void createDeployJob(String deployScriptConfigMap, String namespa * @param namespace namespace in which secrets needs to be created */ private static void setImage(String namespace) { + final LoggingFacade logger = getLogger(); //determine if the tests are running in Kind cluster. //if true use images from Kind registry String ocrImage = WLS_BASE_IMAGE_NAME + ":" + WLS_BASE_IMAGE_TAG; @@ -266,4 +271,57 @@ private static void setImage(String namespace) { logger.info("Using image {0}", image); } -} \ No newline at end of file + /** + * Deploy application to a cluster using REST API with curl utility. + * @param host name of the admin server host + * @param port node port of admin server + * @param userName admin server user name + * @param password admin server password + * @param cluster name of the cluster to deploy application + * @param archivePath local path of the application archive + * @param hostHeader name of the cluster to deploy application + * @param appName name of the application + * @return ExecResult + */ + public static ExecResult deployUsingRest(String host, String port, + String userName, String password, String cluster, + Path archivePath, String hostHeader, String appName) { + final LoggingFacade logger = getLogger(); + ExecResult result = null; + StringBuffer headerString = null; + if (hostHeader != null) { + headerString = new StringBuffer("-H 'host: "); + headerString.append(hostHeader) + .append(" ' "); + } else { + headerString = new StringBuffer(""); + } + StringBuffer curlString = new StringBuffer("status=$(curl --noproxy '*' "); + curlString.append(" --user " + userName + ":" + password); + curlString.append(" -w %{http_code} --show-error -o /dev/null ") + .append(headerString.toString()) + .append("-H X-Requested-By:MyClient ") + .append("-H Accept:application/json ") + .append("-H Content-Type:multipart/form-data ") + .append("-H Prefer:respond-async ") + .append("-F \"model={ name: '") + .append(appName) + .append("', targets: [ { identity: [ clusters, '") + .append(cluster + "' ] } ] }\" ") + .append(" -F \"sourcePath=@") + .append(archivePath.toString() + "\" ") + .append("-X POST http://" + host + ":" + port) + .append("/management/weblogic/latest/edit/appDeployments); ") + .append("echo ${status}"); + + logger.info("deployUsingRest: curl command {0}", new String(curlString)); + try { + result = exec(new String(curlString), true); + } catch (Exception ex) { + logger.info("deployUsingRest: caught unexpected exception {0}", ex); + return null; + } + return result; + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/FileUtils.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/FileUtils.java index 9d75478f49f..e44008b6c29 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/FileUtils.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/FileUtils.java @@ -5,24 +5,32 @@ import java.io.File; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.List; +import java.util.stream.Collectors; import java.util.stream.Stream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; -import oracle.weblogic.kubernetes.logging.LoggingFacade; -import oracle.weblogic.kubernetes.logging.LoggingFactory; +import io.kubernetes.client.openapi.ApiException; +import oracle.weblogic.kubernetes.assertions.impl.Kubernetes; import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.actions.TestActions.execCommand; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.apache.commons.io.FileUtils.cleanDirectory; /** * The utility class for file operations. */ public class FileUtils { - private static final LoggingFacade logger = LoggingFactory.getLogger(FileUtils.class); /** * Check if the required directories exist. @@ -35,7 +43,7 @@ public static void checkDirectory(String dir) { File file = new File(dir); if (!(file.exists() && file.isDirectory())) { file.mkdirs(); - logger.fine("Made a new directory {0}.", dir); + getLogger().fine("Made a new directory {0}.", dir); } } @@ -48,11 +56,11 @@ public static void checkDirectory(String dir) { public static void checkFile(String fileName) throws FileNotFoundException { File file = new File(fileName); if (!(file.exists() && file.isFile())) { - logger.warning("The expected file {0} was not found.", fileName); + getLogger().warning("The expected file {0} was not found.", fileName); throw new FileNotFoundException("The expected file " + fileName + " was not found."); } } - + /** * Check if the required file exists. * @@ -66,7 +74,7 @@ public static boolean doesFileExist(String fileName) { } return false; } - + /** * Remove the contents of the given directory. * @@ -75,7 +83,7 @@ public static boolean doesFileExist(String fileName) { */ public static void cleanupDirectory(String dir) throws IOException { File file = new File(dir); - logger.info("Cleaning up directory {0}.", dir); + getLogger().info("Cleaning up directory {0}.", dir); if (!file.exists()) { // nothing to do return; @@ -84,7 +92,7 @@ public static void cleanupDirectory(String dir) throws IOException { cleanDirectory(file); } - + /** * Copy files from source directory to destination directory. * @@ -101,18 +109,137 @@ public static void copyFolder(String srcDir, String destDir) throws IOException copy(source, destPath.resolve(srcPath.relativize(source))); } catch (IOException e) { String msg = String.format("Failed to copy file %s to %s", source, destDir); - logger.severe(msg, e); + getLogger().severe(msg, e); // cannot throw non runtime exception. the caller checks throwable throw new RuntimeException(msg); } }); } } - + + /** + * Copy a file to a pod in specified namespace. + * @param namespace namespace in which the pod exists + * @param pod name of pod where the file will be copied to + * @param container name of the container inside of the pod + * @param srcPath source location of the file + * @param destPath destination location of the file + * @throws ApiException if Kubernetes API client call fails + * @throws IOException if copy fails + */ + public static void copyFileToPod(String namespace, + String pod, + String container, + Path srcPath, + Path destPath) throws ApiException, IOException { + Kubernetes.copyFileToPod(namespace, pod, container, srcPath, destPath); + } + + /** + * Copy a directory to a pod in specified namespace. + * @param namespace namespace in which the pod exists + * @param pod name of pod where the file will be copied to + * @param container name of the container inside of the pod + * @param srcPath source location of the directory + * @param destPath destination location of the directory + * @throws ApiException if Kubernetes API client call fails + * @throws IOException if copy fails + */ + public static void copyFolderToPod(String namespace, + String pod, + String container, + Path srcPath, + Path destPath) throws ApiException, IOException { + + Stream walk = Files.walk(srcPath); + // find only regular files + List result = walk.filter(Files::isRegularFile) + .map(x -> x.toString()).collect(Collectors.toList()); + + result.forEach(fileOnHost -> { + // resolve the given path against this path. + Path fileInPod = destPath.resolve(srcPath.relativize(Paths.get(fileOnHost))); + getLogger().info("Copying {0} to {1} ", fileOnHost, fileInPod); + + try { + // copy each file to the pod. + Kubernetes.copyFileToPod(namespace, pod, container, Paths.get(fileOnHost), fileInPod); + getLogger().info("File {0} copied to {1} in Pod {2} in namespace {3} ", + fileOnHost, fileInPod, pod, namespace); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + }); + } + + /** + * Create a directory in a pod in specified namespace. + * @param namespace The Kubernetes namespace that the pod is in + * @param pod The name of the Kubernetes pod where the command is expected to run + * @param container The container in the Pod where the command is to be run. If no + * container name is provided than the first container in the Pod is used. + * @param redirectToStdout copy process output to stdout + * @param directoryToCreate namespace in which the pod exists + */ + public static void makeDirectories(String namespace, + String pod, + String container, + boolean redirectToStdout, + List directoryToCreate + ) throws IOException, ApiException, InterruptedException { + //Create directories. + directoryToCreate.forEach(newDir -> { + String mkCmd = "mkdir -p " + newDir; + getLogger().info("Newdir to make {0} ", mkCmd); + + try { + ExecResult execResult = execCommand(namespace, + pod, container, redirectToStdout,"/bin/sh", "-c", mkCmd); + getLogger().info("Directory created " + execResult.stdout()); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + }); + } + private static void copy(Path source, Path dest) throws IOException { - logger.finest("Copying {0} to {1} source.fileName = {2}", source, dest, source.getFileName()); + getLogger().finest("Copying {0} to {1} source.fileName = {2}", source, dest, source.getFileName()); if (!dest.toFile().isDirectory()) { Files.copy(source, dest, REPLACE_EXISTING); } } + + /** + * Create a zip file from a folder. + * + * @param dirPath folder to zip + * @return path of the zipfile + */ + public static String createZipFile(Path dirPath) { + String zipFileName = dirPath.toString().concat(".zip"); + try { + final ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zipFileName)); + Files.walkFileTree(dirPath, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) { + try { + Path targetFile = dirPath.relativize(file); + outputStream.putNextEntry(new ZipEntry(Paths.get(targetFile.toString()).toString())); + byte[] bytes = Files.readAllBytes(file); + outputStream.write(bytes, 0, bytes.length); + outputStream.closeEntry(); + } catch (IOException e) { + e.printStackTrace(); + } + return FileVisitResult.CONTINUE; + } + }); + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + return zipFileName; + } + } diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/IstioUtils.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/IstioUtils.java new file mode 100644 index 00000000000..8c7abb26894 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/IstioUtils.java @@ -0,0 +1,204 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.utils; + +import java.nio.file.Path; +import java.nio.file.Paths; + +import oracle.weblogic.kubernetes.actions.impl.primitive.Command; +import oracle.weblogic.kubernetes.logging.LoggingFacade; + +import static oracle.weblogic.kubernetes.TestConstants.ISTIO_VERSION; +import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WORK_DIR; +import static oracle.weblogic.kubernetes.actions.impl.primitive.Command.defaultCommandParams; +import static oracle.weblogic.kubernetes.utils.ExecCommand.exec; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * The istio utility class for tests. + */ +public class IstioUtils { + + /** + * Install istio. + */ + public static void installIstio() { + LoggingFacade logger = getLogger(); + Path istioInstallPath = + Paths.get(RESOURCE_DIR, "bash-scripts", "install-istio.sh"); + String installScript = istioInstallPath.toString(); + String command = + String.format("%s %s %s", installScript, ISTIO_VERSION, WORK_DIR); + logger.info("Istio installation command {0}", command); + assertTrue(() -> Command.withParams( + defaultCommandParams() + .command(command) + .redirect(false)) + .execute()); + } + + /** + * Uninstall istio. + */ + public static void uninstallIstio() { + LoggingFacade logger = getLogger(); + Path istioInstallPath = + Paths.get(RESOURCE_DIR, "bash-scripts", "uninstall-istio.sh"); + String installScript = istioInstallPath.toString(); + String command = + String.format("%s %s %s", installScript, ISTIO_VERSION, WORK_DIR); + logger.info("Istio uninstallation command {0}", command); + assertTrue(() -> Command.withParams( + defaultCommandParams() + .command(command) + .redirect(false)) + .execute()); + } + + /** + * Get the http ingress port of istio installation. + * @return ingress port for istio-ingressgateway + */ + public static int getIstioHttpIngressPort() { + LoggingFacade logger = getLogger(); + ExecResult result = null; + StringBuffer getIngressPort = null; + getIngressPort = new StringBuffer("kubectl -n istio-system get service istio-ingressgateway "); + getIngressPort.append("-o jsonpath='{.spec.ports[?(@.name==\"http2\")].nodePort}'"); + logger.info("getIngressPort: kubectl command {0}", new String(getIngressPort)); + try { + result = exec(new String(getIngressPort), true); + } catch (Exception ex) { + logger.info("Exception in getIngressPort() {0}", ex); + return 0; + } + logger.info("getIngressPort: kubectl returned {0}", result.toString()); + if (result.stdout() == null) { + return 0; + } else { + return new Integer(result.stdout()); + } + } + + /** + * Get the secure https ingress port of istio installation. + * @return secure ingress https port for istio-ingressgateway + */ + public static int getIstioSecureIngressPort() { + LoggingFacade logger = getLogger(); + ExecResult result = null; + StringBuffer getSecureIngressPort = null; + getSecureIngressPort = new StringBuffer("kubectl -n istio-system get service istio-ingressgateway "); + getSecureIngressPort.append("-o jsonpath='{.spec.ports[?(@.name==\"https\")].nodePort}'"); + logger.info("getSecureIngressPort: kubectl command {0}", new String(getSecureIngressPort)); + try { + result = exec(new String(getSecureIngressPort), true); + } catch (Exception ex) { + logger.info("Exception in getSecureIngressPort() {0}", ex); + return 0; + } + logger.info("getSecureIngressPort: kubectl returned {0}", result.toString()); + if (result.stdout() == null) { + return 0; + } else { + return new Integer(result.stdout()); + } + } + + /** + * Get the tcp ingress port of istio installation. + * @return tcp ingress port for istio-ingressgateway + */ + public static int getIstioTcpIngressPort() { + LoggingFacade logger = getLogger(); + ExecResult result = null; + StringBuffer getTcpIngressPort = null; + getTcpIngressPort = new StringBuffer("kubectl -n istio-system get service istio-ingressgateway "); + getTcpIngressPort.append("-o jsonpath='{.spec.ports[?(@.name==\"tcp\")].nodePort}'"); + logger.info("getTcpIngressPort: kubectl command {0}", new String(getTcpIngressPort)); + try { + result = exec(new String(getTcpIngressPort), true); + } catch (Exception ex) { + logger.info("Exception in getTcpIngressPort() {0}", ex); + return 0; + } + logger.info("getTcpIngressPort: kubectl returned {0}", result.toString()); + if (result.stdout() == null) { + return 0; + } else { + return new Integer(result.stdout()); + } + } + + /** + * Deploy the Http Istio Gateway and Istio virtual service. + * @param configPath path to k8s configuration file + * @return true if deployment is success otherwise false + */ + public static boolean deployHttpIstioGatewayAndVirtualservice(Path configPath) { + LoggingFacade logger = getLogger(); + ExecResult result = null; + StringBuffer deployIstioGateway = null; + deployIstioGateway = new StringBuffer("kubectl apply -f "); + deployIstioGateway.append(configPath); + logger.info("deployIstioGateway: kubectl command {0}", new String(deployIstioGateway)); + try { + result = exec(new String(deployIstioGateway), true); + } catch (Exception ex) { + logger.info("Exception in deployIstioGateway() {0}", ex); + return false; + } + logger.info("deployIstioHttpGateway: kubectl returned {0}", result.toString()); + return !(result.stdout().contains("Error")); + } + + /** + * Deploy the tcp Istio Gateway and Istio virtual service. + * @param configPath path to k8s configuration file + * @return true if deployment is success otherwise false + */ + public static boolean deployTcpIstioGatewayAndVirtualservice( + Path configPath) { + LoggingFacade logger = getLogger(); + ExecResult result = null; + StringBuffer deployIstioGateway = null; + deployIstioGateway = new StringBuffer("kubectl apply -f "); + deployIstioGateway.append(configPath); + logger.info("deployIstioGateway: kubectl command {0}", new String(deployIstioGateway)); + try { + result = exec(new String(deployIstioGateway), true); + } catch (Exception ex) { + logger.info("Exception in deployIstioGateway() {0}", ex); + return false; + } + logger.info("deployIstioTcpGateway: kubectl returned {0}", result.toString()); + return result.stdout().contains("istio-tcp-gateway created"); + } + + /** + * Deploy the Istio DestinationRule. + * @param configPath path to k8s configuration file + * @return true if deployment is success otherwise false + */ + public static boolean deployIstioDestinationRule( + Path configPath) { + LoggingFacade logger = getLogger(); + ExecResult result = null; + StringBuffer deployIstioGateway = null; + deployIstioGateway = new StringBuffer("kubectl apply -f "); + deployIstioGateway.append(configPath); + logger.info("deployIstioDestinationRule: kubectl command {0}", new String(deployIstioGateway)); + try { + result = exec(new String(deployIstioGateway), true); + } catch (Exception ex) { + logger.info("Exception in deployIstioDestinationRule() {0}", ex); + return false; + } + logger.info("deployIstioDestinationRule: kubectl returned {0}", result.toString()); + return result.stdout().contains("destination-rule created"); + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/LoggingUtil.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/LoggingUtil.java index 9b28dd4c37a..7f368ca3e5a 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/LoggingUtil.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/LoggingUtil.java @@ -30,14 +30,16 @@ import io.kubernetes.client.openapi.models.V1VolumeMount; import oracle.weblogic.kubernetes.TestConstants; import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import org.awaitility.core.ConditionFactory; +import org.awaitility.core.ConditionTimeoutException; import static io.kubernetes.client.util.Yaml.dump; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.SECONDS; import static oracle.weblogic.kubernetes.assertions.TestAssertions.podDoesNotExist; import static oracle.weblogic.kubernetes.assertions.TestAssertions.podReady; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.awaitility.Awaitility.with; /** @@ -55,6 +57,7 @@ public class LoggingUtil { * @param namespaces list of namespaces used by the test instance */ public static void generateLog(Object itInstance, List namespaces) { + LoggingFacade logger = getLogger(); logger.info("Generating logs..."); String resultDirExt = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); try { @@ -76,6 +79,7 @@ public static void generateLog(Object itInstance, List namespaces) { * @param resultDir existing directory to write log files */ public static void collectLogs(String namespace, String resultDir) { + LoggingFacade logger = getLogger(); logger.info("Collecting logs in namespace : {0}", namespace); // get events @@ -240,8 +244,14 @@ public static void collectLogs(String namespace, String resultDir) { for (var pod : Kubernetes.listPods(namespace, null).getItems()) { if (pod.getMetadata() != null) { String podName = pod.getMetadata().getName(); - writeToFile(Kubernetes.getPodLog(podName, namespace), resultDir, - namespace + ".pod." + podName + ".log"); + List containers = pod.getSpec().getContainers(); + logger.info("Found {0} container(s) in the pod {1}", containers.size(), podName); + for (var container : containers) { + String containerName = container.getName(); + writeToFile(Kubernetes.getPodLog(podName, namespace, containerName), resultDir, + namespace + ".pod." + podName + ".container." + containerName + ".log", false); + + } } } } catch (Exception ex) { @@ -259,10 +269,25 @@ public static void collectLogs(String namespace, String resultDir) { */ private static void writeToFile(Object obj, String resultDir, String fileName) throws IOException { + writeToFile(obj, resultDir, fileName, true); + } + + /** + * Write the YAML representation of object or String to a file in the resultDir. + * + * @param obj to write to the file as YAML or String + * @param resultDir directory in which to write the log file + * @param fileName name of the log file + * @param asYaml write as yaml or string + * @throws IOException when write fails + */ + private static void writeToFile(Object obj, String resultDir, String fileName, boolean asYaml) + throws IOException { + LoggingFacade logger = getLogger(); logger.info("Generating {0}", Paths.get(resultDir, fileName)); if (obj != null) { Files.write(Paths.get(resultDir, fileName), - dump(obj).getBytes(StandardCharsets.UTF_8) + (asYaml ? dump(obj).getBytes(StandardCharsets.UTF_8) : ((String)obj).getBytes(StandardCharsets.UTF_8)) ); } else { logger.info("Nothing to write in {0} list is empty", Paths.get(resultDir, fileName)); @@ -308,10 +333,10 @@ private static void copyFromPV( */ private static V1Pod setupPVPod(String namespace, String pvcName, String pvName) throws ApiException { - + final LoggingFacade logger = getLogger(); ConditionFactory withStandardRetryPolicy = with().pollDelay(10, SECONDS) .and().with().pollInterval(2, SECONDS) - .atMost(1, MINUTES).await(); + .atMost(3, MINUTES).await(); // Create the temporary pod with oraclelinux image // oraclelinux:7-slim is not useful, missing tar utility @@ -321,7 +346,7 @@ private static V1Pod setupPVPod(String namespace, String pvcName, String pvName) .containers(Arrays.asList( new V1Container() .name("pv-container") - .image("oraclelinux") + .image("oraclelinux:7") .imagePullPolicy("IfNotPresent") .volumeMounts(Arrays.asList( new V1VolumeMount() @@ -340,15 +365,19 @@ private static V1Pod setupPVPod(String namespace, String pvcName, String pvName) .kind("Pod"); V1Pod pvPod = Kubernetes.createPod(namespace, podBody); - withStandardRetryPolicy - .conditionEvaluationListener( - condition -> logger.info("Waiting for {0} to be ready in namespace {1}, " - + "(elapsed time {2} , remaining time {3}", - podName, - namespace, - condition.getElapsedTimeInMS(), - condition.getRemainingTimeInMS())) - .until(podReady(podName, null, namespace)); + try { + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for {0} to be ready in namespace {1}, " + + "(elapsed time {2} , remaining time {3}", + podName, + namespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(podReady(podName, null, namespace)); + } catch (ConditionTimeoutException ex) { + logger.warning("Condition not met", ex); + } return pvPod; } @@ -360,24 +389,28 @@ private static V1Pod setupPVPod(String namespace, String pvcName, String pvName) */ private static void cleanupPVPod(String namespace) throws ApiException { final String podName = "pv-pod-" + namespace; - + LoggingFacade logger = getLogger(); ConditionFactory withStandardRetryPolicy = with().pollDelay(5, SECONDS) .and().with().pollInterval(5, SECONDS) - .atMost(1, MINUTES).await(); + .atMost(3, MINUTES).await(); // Delete the temporary pod Kubernetes.deletePod(podName, namespace); // Wait for the pod to be deleted - withStandardRetryPolicy - .conditionEvaluationListener( - condition -> logger.info("Waiting for {0} to be deleted in namespace {1}, " - + "(elapsed time {2} , remaining time {3}", - podName, - namespace, - condition.getElapsedTimeInMS(), - condition.getRemainingTimeInMS())) - .until(podDoesNotExist(podName, null, namespace)); + try { + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for {0} to be deleted in namespace {1}, " + + "(elapsed time {2} , remaining time {3}", + podName, + namespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(podDoesNotExist(podName, null, namespace)); + } catch (ConditionTimeoutException ex) { + logger.warning("Condition not met", ex); + } } // The io.kubernetes.client.Copy.copyDirectoryFromPod(V1Pod pod, String srcPath, Path destination) @@ -395,6 +428,7 @@ private static void cleanupPVPod(String namespace) throws ApiException { */ private static void copyDirectoryFromPod(V1Pod pvPod, Path destinationPath) throws ApiException { + LoggingFacade logger = getLogger(); Future copyJob = null; try { Runnable copy = () -> { diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/MySQLDBUtils.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/MySQLDBUtils.java new file mode 100644 index 00000000000..e0325867892 --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/MySQLDBUtils.java @@ -0,0 +1,135 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.utils; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + +import io.kubernetes.client.custom.IntOrString; +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1ContainerPort; +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1EnvVarSource; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1Pod; +import io.kubernetes.client.openapi.models.V1PodSpec; +import io.kubernetes.client.openapi.models.V1Secret; +import io.kubernetes.client.openapi.models.V1SecretKeySelector; +import io.kubernetes.client.openapi.models.V1Service; +import io.kubernetes.client.openapi.models.V1ServicePort; +import io.kubernetes.client.openapi.models.V1ServiceSpec; +import oracle.weblogic.kubernetes.TestConstants; +import oracle.weblogic.kubernetes.actions.TestActions; +import oracle.weblogic.kubernetes.actions.impl.Namespace; +import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Utility class to create MySQL database. + */ +public class MySQLDBUtils { + + /** + * Create and start a MySQL database pod. + * + * @param name name of the db pod + * @param user username for the database + * @param password password for the database + * @param nodePort node port of db service + * @param namespace name of the namespace in which to create MySQL database + * @param mySQLImageVersion version of the MySQL db image to use, when null uses version from + * TestConstants.MYSQL_VERSION + */ + public static void createMySQLDB(String name, String user, String password, int nodePort, + String namespace, String mySQLImageVersion) { + + String uniqueName = Namespace.uniqueName(); + String secretName = name.concat("-secret-").concat(uniqueName); + String serviceName = name.concat("-external-").concat(uniqueName); + + createMySQLDBSecret(secretName, user, password, namespace); + createMySQLDBService(serviceName, name, namespace, nodePort); + startMySQLDB(name, secretName, namespace, + mySQLImageVersion != null ? mySQLImageVersion : TestConstants.MYSQL_VERSION); + + } + + //create the database pod + private static void startMySQLDB(String name, String secretName, String namespace, String mySQLVImageVersion) { + Map labels = new HashMap<>(); + labels.put("app", name); + V1Pod mysqlPod = new V1Pod() + .metadata(new V1ObjectMeta() + .name(name) + .namespace(namespace) + .labels(labels)) + .spec(new V1PodSpec() + .terminationGracePeriodSeconds(5L) + .containers(Arrays.asList(new V1Container() + .image("mysql:".concat(mySQLVImageVersion)) + .name("mysql") + .addEnvItem(new V1EnvVar() + .name("MYSQL_ROOT_PASSWORD") + .valueFrom(new V1EnvVarSource() + .secretKeyRef(new V1SecretKeySelector() + .name(secretName) + .key("root-password")))) + .ports(Arrays.asList(new V1ContainerPort() + .name("mysql") + .containerPort(3306)))))); + V1Pod pod = assertDoesNotThrow(() -> Kubernetes.createPod(namespace, mysqlPod)); + CommonTestUtils.checkPodReady(pod.getMetadata().getName(), null, namespace); + } + + //create services for MySQL database + private static void createMySQLDBService(String serviceName, String selectorName, String namespace, int port) { + + boolean service = false; + try { + Map selector = new HashMap<>(); + selector.put("app", selectorName); + service = TestActions.createService(new V1Service() + .metadata(new V1ObjectMeta() + .name(serviceName) + .namespace(namespace)) + .spec(new V1ServiceSpec() + .type("NodePort") + .ports(Arrays.asList(new V1ServicePort() + .port(3306) + .protocol("TCP") + .targetPort(new IntOrString(3306)) + .nodePort(port))) + .selector(selector))); + } catch (ApiException ex) { + Logger.getLogger(MySQLDBUtils.class.getName()).log(Level.SEVERE, null, ex); + } + assertTrue(service, "Service creation for mysql failed"); + } + + //create secrets + private static void createMySQLDBSecret(String secretName, String user, String password, String namespace) { + HashMap secrets = new HashMap<>(); + secrets.put("root-user", user); + secrets.put("root-password", password); + + boolean secret = false; + try { + secret = TestActions.createSecret( + new V1Secret() + .metadata(new V1ObjectMeta() + .name(secretName) + .namespace(namespace)) + .stringData(secrets)); + } catch (ApiException ex) { + Logger.getLogger(MySQLDBUtils.class.getName()).log(Level.SEVERE, null, ex); + } + assertTrue(secret, "Secret creation for mysql failed"); + } +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/OracleHttpClient.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/OracleHttpClient.java index ab55b2be03c..109da225f75 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/OracleHttpClient.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/OracleHttpClient.java @@ -12,7 +12,10 @@ import java.util.Map; import java.util.Map.Entry; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import oracle.weblogic.kubernetes.logging.LoggingFacade; + +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; + /** * A simple Http client. @@ -37,6 +40,7 @@ public class OracleHttpClient { */ public static HttpResponse get(String url, Map headers, boolean debug) throws IOException, InterruptedException { + LoggingFacade logger = getLogger(); HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(); requestBuilder .GET() diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/TestUtils.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/TestUtils.java index 8828a671823..be377025783 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/TestUtils.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/TestUtils.java @@ -12,8 +12,10 @@ import java.util.List; import java.util.concurrent.TimeUnit; +import oracle.weblogic.kubernetes.logging.LoggingFacade; + import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; /** * The utility class for tests. @@ -29,10 +31,10 @@ public class TestUtils { * @return true if the web app can hit all managed servers, false otherwise */ public static boolean callWebAppAndCheckForServerNameInResponse( - String curlCmd, - List managedServerNames, - int maxIterations) { - + String curlCmd, + List managedServerNames, + int maxIterations) { + LoggingFacade logger = getLogger(); // first map all server names with false HashMap managedServers = new HashMap<>(); managedServerNames.forEach(managedServerName -> @@ -103,7 +105,7 @@ public static boolean verifyClusterMemberCommunication( String curlCmd, List managedServerNames, int maxIterations) { - + LoggingFacade logger = getLogger(); // first map all server names with false HashMap managedServers = new HashMap<>(); managedServerNames.forEach(managedServerName @@ -160,6 +162,7 @@ public static boolean verifyClusterMemberCommunication( * @return the next free port number, if there is no free port between the range, return the ending point */ public static int getNextFreePort(int from, int to) { + LoggingFacade logger = getLogger(); int port; for (port = from; port < to; port++) { if (isLocalPortFree(port)) { @@ -181,6 +184,57 @@ public static String getDateAndTimeStamp() { return dateFormat.format(date) + "-" + System.currentTimeMillis(); } + /** + * Call a web app and wait for the response code 200. + * @param curlCmd curl command to call the web app + * @param maxIterations max iterations to call the curl command + * @return true if 200 response code is returned, false otherwise + */ + public static boolean callWebAppAndWaitTillReady(String curlCmd, int maxIterations) { + LoggingFacade logger = getLogger(); + ExecResult result = null; + String responseCode = ""; + + for (int i = 0; i < maxIterations; i++) { + try { + result = ExecCommand.exec(curlCmd); + responseCode = result.stdout().trim(); + + if (result.exitValue() != 0 || !responseCode.equals("200")) { + logger.info("callWebApp did not return 200 response code, got {0}, iteration {1} of {2}", + responseCode, i, maxIterations); + + try { + Thread.sleep(1000); + } catch (InterruptedException ignore) { + // ignore + } + } else if (responseCode.equals("200")) { + logger.info("callWebApp returned 200 response code, iteration {0}", i); + return true; + } + } catch (Exception e) { + logger.info("Got exception while running command: {0}", curlCmd); + logger.info(e.toString()); + if (result != null) { + logger.info("result.stdout: \n{0}", result.stdout()); + logger.info("result.stderr: \n{0}", result.stderr()); + logger.info("result.exitValue: \n{0}", result.exitValue()); + } + return false; + } + } + + logger.info("FAILURE: callWebApp did not return 200 response code, got {0}", responseCode); + if (result != null) { + logger.info("result.stdout: \n{0}", result.stdout()); + logger.info("result.stderr: \n{0}", result.stderr()); + logger.info("result.exitValue: \n{0}", result.exitValue()); + } + + return false; + } + /** * Check if the given port number is free. * @@ -188,6 +242,7 @@ public static String getDateAndTimeStamp() { * @return true if the port is free, false otherwise */ private static boolean isLocalPortFree(int port) { + LoggingFacade logger = getLogger(); Socket socket = null; try { socket = new Socket(K8S_NODEPORT_HOST, port); diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/ThreadSafeLogger.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/ThreadSafeLogger.java new file mode 100644 index 00000000000..bdb741f102b --- /dev/null +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/ThreadSafeLogger.java @@ -0,0 +1,55 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.utils; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.logging.FileHandler; +import java.util.logging.SimpleFormatter; + +import oracle.weblogic.kubernetes.TestConstants; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import oracle.weblogic.kubernetes.logging.LoggingFactory; + +public class ThreadSafeLogger { + private static InheritableThreadLocal localLogger = new InheritableThreadLocal(); + public static final LoggingFacade globalLogger = LoggingFactory.getLogger("GLOBAL", "OperatorIntegrationTests"); + + /** + * Create a logger and set it in thread local. + * @param loggerName name of the logger + */ + public static void init(String loggerName) { + try { + // create file handler + Path resultDir = Files.createDirectories(Paths.get(TestConstants.LOGS_DIR, + loggerName)); + FileHandler fileHandler = new FileHandler( + Paths.get(resultDir.toString(), loggerName + ".out").toString(), true); + SimpleFormatter formatter = new SimpleFormatter(); + fileHandler.setFormatter(formatter); + // create logger + LoggingFacade logger = LoggingFactory.getLogger( + loggerName, "OperatorIntegrationTests", fileHandler); + localLogger.set(logger); + } catch (IOException ioe) { + globalLogger.severe("Logger initialization failed with Exception {0}", ioe); + } + } + + /** + * Get logger from the current thread. + * @return logging facade with logger + */ + public static LoggingFacade getLogger() { + if (localLogger.get() != null) { + return localLogger.get(); + } else { + return globalLogger; + } + } + +} diff --git a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/WLSTUtils.java b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/WLSTUtils.java index e614422ea6a..a8c73c59c96 100644 --- a/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/WLSTUtils.java +++ b/new-integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/WLSTUtils.java @@ -24,6 +24,7 @@ import io.kubernetes.client.openapi.models.V1VolumeMount; import oracle.weblogic.kubernetes.TestConstants; import oracle.weblogic.kubernetes.actions.impl.Namespace; +import oracle.weblogic.kubernetes.logging.LoggingFacade; import org.awaitility.core.ConditionFactory; import static java.util.concurrent.TimeUnit.MINUTES; @@ -42,8 +43,8 @@ import static oracle.weblogic.kubernetes.actions.TestActions.listPods; import static oracle.weblogic.kubernetes.actions.TestActions.listSecrets; import static oracle.weblogic.kubernetes.assertions.TestAssertions.jobCompleted; -import static oracle.weblogic.kubernetes.extensions.LoggedTest.logger; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createConfigMapFromFiles; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.awaitility.Awaitility.with; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.fail; @@ -59,8 +60,8 @@ public class WLSTUtils { private static final ConditionFactory withStandardRetryPolicy = with().pollDelay(2, SECONDS) - .and().with().pollInterval(10, SECONDS) - .atMost(5, MINUTES).await(); + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); /** * Execute WLST script. @@ -70,7 +71,7 @@ public class WLSTUtils { * @param namespace namespace in which to run the job */ public static void executeWLSTScript(Path wlstScript, Path domainProperties, String namespace) { - + final LoggingFacade logger = getLogger(); setImage(namespace); String wlstScriptFileName = wlstScript.getFileName().toString(); @@ -109,7 +110,8 @@ public static void executeWLSTScript(Path wlstScript, Path domainProperties, Str * @throws ApiException when Kubernetes cluster query fails */ public static void createWLSTJob(String wlstJobName, String wlstScriptConfigMapName, String namespace, - V1Container jobContainer) throws ApiException { + V1Container jobContainer) throws ApiException { + LoggingFacade logger = getLogger(); logger.info("Running Kubernetes job to execute WLST script"); V1Job jobBody = new V1Job() @@ -146,7 +148,7 @@ public static void createWLSTJob(String wlstJobName, String wlstScriptConfigMapN withStandardRetryPolicy .conditionEvaluationListener( condition -> logger.info("Waiting for job {0} to be completed in namespace {1} " - + "(elapsed time {2} ms, remaining time {3} ms)", + + "(elapsed time {2} ms, remaining time {3} ms)", jobName, namespace, condition.getElapsedTimeInMS(), @@ -206,7 +208,7 @@ private static void setImage(String namespace) { } isUseSecret = true; } - logger.info("Using image {0}", image); + getLogger().info("Using image {0}", image); } } diff --git a/new-integration-tests/src/test/resources/apps/clusterview/src/java/oracle/weblogic/kubernetes/applications/clusterview/ClusterViewServlet.java b/new-integration-tests/src/test/resources/apps/clusterview/src/java/oracle/weblogic/kubernetes/applications/clusterview/ClusterViewServlet.java index 3ff417da46e..1e646cb0319 100644 --- a/new-integration-tests/src/test/resources/apps/clusterview/src/java/oracle/weblogic/kubernetes/applications/clusterview/ClusterViewServlet.java +++ b/new-integration-tests/src/test/resources/apps/clusterview/src/java/oracle/weblogic/kubernetes/applications/clusterview/ClusterViewServlet.java @@ -5,11 +5,18 @@ import java.io.IOException; import java.io.PrintWriter; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import javax.management.InstanceNotFoundException; +import javax.management.IntrospectionException; +import javax.management.MBeanAttributeInfo; +import javax.management.MBeanInfo; import javax.management.MBeanServer; import javax.management.MalformedObjectNameException; +import javax.management.ObjectInstance; import javax.management.ObjectName; +import javax.management.ReflectionException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NameNotFoundException; @@ -19,8 +26,10 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import weblogic.health.HealthState; import weblogic.management.jmx.MBeanServerInvocationHandler; +import weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean; import weblogic.management.mbeanservers.runtime.RuntimeServiceMBean; import weblogic.management.runtime.ClusterRuntimeMBean; import weblogic.management.runtime.ServerRuntimeMBean; @@ -33,23 +42,44 @@ public class ClusterViewServlet extends HttpServlet { Context ctx = null; MBeanServer localMBeanServer; ServerRuntimeMBean serverRuntime; + RuntimeServiceMBean runtimeService; + MBeanServer domainMBeanServer; + DomainRuntimeServiceMBean domainRuntimeServiceMbean; @Override public void init(ServletConfig config) throws ServletException { try { ctx = new InitialContext(); + System.out.println("ITTESTS:>>>>Looking up server runtime mbean server"); localMBeanServer = (MBeanServer) ctx.lookup("java:comp/env/jmx/runtime"); // get ServerRuntimeMBean ObjectName runtimeserviceObjectName = new ObjectName(RuntimeServiceMBean.OBJECT_NAME); - RuntimeServiceMBean runtimeService = (RuntimeServiceMBean) MBeanServerInvocationHandler + runtimeService = (RuntimeServiceMBean) MBeanServerInvocationHandler .newProxyInstance(localMBeanServer, runtimeserviceObjectName); serverRuntime = runtimeService.getServerRuntime(); + System.out.println("ITTESTS:>>>>Found server runtime mbean server for server: " + serverRuntime.getName()); + + try { + System.out.println("ITTESTS:>>>>Looking up domain runtime mbean in server : " + serverRuntime.getName()); + domainMBeanServer = (MBeanServer) ctx.lookup("java:comp/env/jmx/domainRuntime"); + ObjectName domainServiceObjectName = new ObjectName(DomainRuntimeServiceMBean.OBJECT_NAME); + domainRuntimeServiceMbean = (DomainRuntimeServiceMBean) MBeanServerInvocationHandler + .newProxyInstance(domainMBeanServer, domainServiceObjectName); + System.out.println("ITTESTS:>>>>Found domain runtime mbean in server : " + serverRuntime.getName()); + } catch (MalformedObjectNameException | NamingException ex) { + System.out.println("ITTESTS:>>>>Looking up domain runtime mbean in server : " + serverRuntime.getName() + " threw exception"); + Logger.getLogger(ClusterViewServlet.class.getName()).log(Level.SEVERE, null, ex); + } + try { + System.out.println("ITTESTS:>>>>Looking up server : " + serverRuntime.getName() +" in JNDI tree"); ctx.lookup(serverRuntime.getName()); } catch (NameNotFoundException nnfe) { + System.out.println("ITESTS:>>>>>>Server not found in JNDI tree, Binding " + serverRuntime.getName() + " in JNDI tree"); ctx.bind(serverRuntime.getName(), serverRuntime.getName()); + System.out.println("ITESTS:>>>>>>Bound " + serverRuntime.getName() + " in JNDI tree"); } - } catch (NamingException | MalformedObjectNameException ex) { + } catch (MalformedObjectNameException | NamingException ex) { Logger.getLogger(ClusterViewServlet.class.getName()).log(Level.SEVERE, null, ex); } } @@ -57,7 +87,9 @@ public void init(ServletConfig config) throws ServletException { @Override public void destroy() { try { + System.out.println("ITTESTS:>>>>Unbinding server : " + serverRuntime.getName()); ctx.unbind(serverRuntime.getName()); + System.out.println("ITTESTS:>>>>Closing context in server : " + serverRuntime.getName()); ctx.close(); } catch (NamingException ex) { Logger.getLogger(ClusterViewServlet.class.getName()).log(Level.SEVERE, null, ex); @@ -84,7 +116,22 @@ protected void processRequest(HttpServletRequest request, HttpServletResponse re out.println(""); out.println("
    ");
     
    -      out.println("ServerName:" + serverRuntime.getName());
    +      String queryServers = request.getParameter("queryServers");
    +      if (queryServers != null) {
    +        // print all mbeans and its attributes in the server runtime
    +        out.println("Querying server: " + localMBeanServer.toString());
    +        Set mbeans = localMBeanServer.queryMBeans(null, null);
    +        for (ObjectInstance mbeanInstance : mbeans) {
    +          out.println("
    ObjectName: " + mbeanInstance.getObjectName() + "
    "); + MBeanInfo mBeanInfo = localMBeanServer.getMBeanInfo(mbeanInstance.getObjectName()); + MBeanAttributeInfo[] attributes = mBeanInfo.getAttributes(); + for (MBeanAttributeInfo attribute : attributes) { + out.println("
    Type: " + attribute.getType() + "
    "); + out.println("
    Name: " + attribute.getName() + "
    "); + } + } + } + ClusterRuntimeMBean clusterRuntime = serverRuntime.getClusterRuntime(); //if the server is part of a cluster get its cluster details if (clusterRuntime != null) { @@ -92,21 +139,54 @@ protected void processRequest(HttpServletRequest request, HttpServletResponse re out.println("Alive:" + clusterRuntime.getAliveServerCount()); out.println("Health:" + clusterRuntime.getHealthState().getState()); out.println("Members:" + String.join(",", serverNames)); + out.println("ServerName:" + serverRuntime.getName()); + // lookup JNDI for other clustered servers bound in tree for (String serverName : serverNames) { try { - if (ctx.lookup(serverName).equals(serverName)) { + if (ctx.lookup(serverName) != null) { out.println("Bound:" + serverName); } - } catch (NamingException nex) { - out.println(nex.getMessage()); + } catch (NameNotFoundException nnfex) { + out.println(nnfex.getMessage()); } } } + String listServers = request.getParameter("listServers"); + if (listServers != null) { + ServerRuntimeMBean[] serverRuntimes = domainRuntimeServiceMbean.getServerRuntimes(); + for (ServerRuntimeMBean serverRuntime : serverRuntimes) { + out.println(serverRuntime.getName() + ":STATUS
    "); + int state = serverRuntime.getHealthState().getState(); + switch (state) { + case HealthState.HEALTH_OK: + out.print(serverRuntime.getName() + ":HEALTH_OK"); + break; + case HealthState.HEALTH_CRITICAL: + out.print(serverRuntime.getName() + ":HEALTH_CRITICAL"); + break; + case HealthState.HEALTH_FAILED: + out.print(serverRuntime.getName() + ":HEALTH_FAILED"); + break; + case HealthState.HEALTH_OVERLOADED: + out.print(serverRuntime.getName() + ":HEALTH_OVERLOADED"); + break; + case HealthState.HEALTH_WARN: + out.print(serverRuntime.getName() + ":HEALTH_WARN"); + break; + default: + out.print(serverRuntime.getName() + ":HEALTH_WARN"); + } + out.println("
    "); + } + } out.println("
    "); out.println(""); out.println(""); + } catch (NamingException | InstanceNotFoundException + | IntrospectionException | ReflectionException ex) { + Logger.getLogger(ClusterViewServlet.class.getName()).log(Level.SEVERE, null, ex); } } @@ -145,7 +225,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) */ @Override public String getServletInfo() { - return "Cluster Voew Servlet"; + return "Cluster View Servlet"; } } diff --git a/new-integration-tests/src/test/resources/apps/clusterview/src/java/oracle/weblogic/kubernetes/applications/clusterview/ConfigServlet.java b/new-integration-tests/src/test/resources/apps/clusterview/src/java/oracle/weblogic/kubernetes/applications/clusterview/ConfigServlet.java new file mode 100644 index 00000000000..96f6b19dd61 --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/clusterview/src/java/oracle/weblogic/kubernetes/applications/clusterview/ConfigServlet.java @@ -0,0 +1,284 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.applications.clusterview; + +import java.io.IOException; +import java.io.PrintWriter; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import weblogic.j2ee.descriptor.wl.JDBCConnectionPoolParamsBean; +import weblogic.j2ee.descriptor.wl.JDBCDataSourceParamsBean; +import weblogic.j2ee.descriptor.wl.JDBCDriverParamsBean; +import weblogic.j2ee.descriptor.wl.JDBCPropertyBean; +import weblogic.management.configuration.JDBCSystemResourceMBean; +import weblogic.management.configuration.ServerMBean; + +import weblogic.management.jmx.MBeanServerInvocationHandler; +import weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean; +import weblogic.management.mbeanservers.runtime.RuntimeServiceMBean; +import weblogic.management.runtime.JDBCDataSourceRuntimeMBean; +import weblogic.management.runtime.ServerRuntimeMBean; + +/** + * Servlet to print Server configuration and JDBC datasource parameters. + */ +public class ConfigServlet extends HttpServlet { + + Context ctx = null; + MBeanServer localMBeanServer; + MBeanServer domainMBeanServer; + ServerRuntimeMBean serverRuntime; + RuntimeServiceMBean runtimeService; + DomainRuntimeServiceMBean domainRuntimeServiceMbean; + + @Override + public void init(ServletConfig config) throws ServletException { + try { + ctx = new InitialContext(); + localMBeanServer = (MBeanServer) ctx.lookup("java:comp/env/jmx/runtime"); + // get ServerRuntimeMBean + ObjectName runtimeserviceObjectName = new ObjectName(RuntimeServiceMBean.OBJECT_NAME); + runtimeService = (RuntimeServiceMBean) MBeanServerInvocationHandler + .newProxyInstance(localMBeanServer, runtimeserviceObjectName); + serverRuntime = runtimeService.getServerRuntime(); + + domainMBeanServer = (MBeanServer) ctx.lookup("java:comp/env/jmx/domainRuntime"); + ObjectName domainServiceObjectName = new ObjectName(DomainRuntimeServiceMBean.OBJECT_NAME); + domainRuntimeServiceMbean = (DomainRuntimeServiceMBean) MBeanServerInvocationHandler + .newProxyInstance(domainMBeanServer, domainServiceObjectName); + + } catch (MalformedObjectNameException | NamingException ex) { + Logger.getLogger(ClusterViewServlet.class.getName()).log(Level.SEVERE, null, ex); + } + } + + @Override + public void destroy() { + try { + ctx.close(); + } catch (NamingException ex) { + Logger.getLogger(ClusterViewServlet.class.getName()).log(Level.SEVERE, null, ex); + } + } + + /** + * Processes requests for both HTTP GET and POST methods. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + protected void processRequest(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + response.setContentType("text/html;charset=UTF-8"); + try (PrintWriter out = response.getWriter()) { + + // check attributes of server configurations + String attributeTest = request.getParameter("attributeTest"); + if (attributeTest != null) { + printServerAttributes(request, out); + } + + // test JDBC connection pool + String dsTest = request.getParameter("dsTest"); + if (dsTest != null) { + testJdbcConnection(request, out); + } + + // print JDBC datasource parameters + String resTest = request.getParameter("resTest"); + if (resTest != null) { + printResourceAttributes(request, out); + } + + String restart = request.getParameter("restartDS"); + if (restart != null) { + restartJDBCResource(request, out); + } + + } + } + + private void printServerAttributes(HttpServletRequest request, PrintWriter out) { + String serverType = request.getParameter("serverType"); + String serverName = request.getParameter("serverName"); + ServerMBean serverConfiguration = getServerMBean(serverType, serverName); + out.println("MaxMessageSize=" + serverConfiguration.getMaxMessageSize()); + } + + private void printResourceAttributes(HttpServletRequest request, PrintWriter out) { + String resName = request.getParameter("resName"); + if (resName != null) { + JDBCSystemResourceMBean jdbcSystemResource = getJDBCSystemResource(resName); + JDBCConnectionPoolParamsBean connPool = jdbcSystemResource.getJDBCResource().getJDBCConnectionPoolParams(); + JDBCDriverParamsBean driverParams = jdbcSystemResource.getJDBCResource().getJDBCDriverParams(); + JDBCDataSourceParamsBean dsParams = jdbcSystemResource.getJDBCResource().getJDBCDataSourceParams(); + + //print connection pool parameters + getConnectionPoolAttributes(connPool, out); + + //print driver parameteres + getDriverParamAttributes(driverParams, out); + + try { + //print data source parameters + getAttributes(dsParams.getClass().getDeclaredMethods(), dsParams, out); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { + Logger.getLogger(ConfigServlet.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + + private void getAttributes(Method[] declaredMethods, Object obj, PrintWriter out) + throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { + + for (Method declaredMethod : declaredMethods) { + String name = declaredMethod.getName(); + if (name.startsWith("get")) { + declaredMethod.setAccessible(true); + out.println(name + ":" + declaredMethod.invoke(obj) + "
    "); + } + } + } + + private void getConnectionPoolAttributes(JDBCConnectionPoolParamsBean pool, PrintWriter out) { + try { + getAttributes(pool.getClass().getDeclaredMethods(), pool, out); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { + Logger.getLogger(ConfigServlet.class.getName()).log(Level.SEVERE, null, ex); + } + } + + private void getDriverParamAttributes(JDBCDriverParamsBean driverParams, PrintWriter out) { + out.println("driverName:" + driverParams.getDriverName() + "
    "); + out.println("Url:" + driverParams.getUrl() + "
    "); + JDBCPropertyBean[] properties = driverParams.getProperties().getProperties(); + for (JDBCPropertyBean property : properties) { + out.println("property:" + property.getName() + ":" + property.getValue() + "
    "); + } + } + + private void testJdbcConnection(HttpServletRequest request, PrintWriter out) { + + String dsName = request.getParameter("dsName"); + String serverName = request.getParameter("serverName"); + System.out.println("ITTESTS:>>>>Testing connection pool in datasource : " + dsName + " in server " + serverName); + try { + ServerRuntimeMBean serverRuntime = getServerRuntime(serverName); + JDBCDataSourceRuntimeMBean[] jdbcDataSourceRuntimeMBeans = serverRuntime.getJDBCServiceRuntime().getJDBCDataSourceRuntimeMBeans(); + System.out.println("ITTESTS:>>>>Getting datasource runtime mbeans"); + for (JDBCDataSourceRuntimeMBean jdbcDataSourceRuntimeMBean : jdbcDataSourceRuntimeMBeans) { + System.out.println("ITTESTS:>>>>Found JDBC datasource runtime mbean: " + jdbcDataSourceRuntimeMBean.getName()); + if (jdbcDataSourceRuntimeMBean.getName().equals(dsName)) { + System.out.println("ITTESTS:>>>>Testing connection pool for JDBC datasource runtime mbean: " + jdbcDataSourceRuntimeMBean.getName()); + String testPool = jdbcDataSourceRuntimeMBean.testPool(); + if (testPool == null) { + out.println("Connection successful"); + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + private void restartJDBCResource(HttpServletRequest request, PrintWriter out) { + String dsName = request.getParameter("dsName"); + String serverName = request.getParameter("serverName"); + + ServerRuntimeMBean serverRuntime = getServerRuntime(serverName); + JDBCDataSourceRuntimeMBean[] jdbcDataSourceRuntimeMBeans = serverRuntime.getJDBCServiceRuntime().getJDBCDataSourceRuntimeMBeans(); + for (JDBCDataSourceRuntimeMBean jdbcDataSourceRuntimeMBean : jdbcDataSourceRuntimeMBeans) { + if (jdbcDataSourceRuntimeMBean.getName().equals(dsName)) { + try { + String testPool = jdbcDataSourceRuntimeMBean.testPool(); + jdbcDataSourceRuntimeMBean.forceShutdown(); + TimeUnit.SECONDS.sleep(5); + jdbcDataSourceRuntimeMBean.start(); + } catch (Exception ex) { + Logger.getLogger(ConfigServlet.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + } + + private ServerMBean getServerMBean(String serverType, String serverName) { + if (serverType.equalsIgnoreCase("adminserver")) { + return runtimeService.getServerConfiguration(); + } else { + return domainRuntimeServiceMbean.findServerConfiguration(serverName); + } + } + + private ServerRuntimeMBean getServerRuntime(String serverName) { + ServerRuntimeMBean[] serverRuntimes = domainRuntimeServiceMbean.getServerRuntimes(); + System.out.println(); + for (ServerRuntimeMBean serverRuntime : serverRuntimes) { + System.out.println("ITTESTS:>>>>Found server runtime: " + serverRuntime.getName()); + if (serverRuntime.getName().equals(serverName)) { + return serverRuntime; + } + } + System.out.println("ITTESTS:>>>>No server runtime found for name: " + serverName); + return null; + } + + private JDBCSystemResourceMBean getJDBCSystemResource(String jdbcResourceName) { + return runtimeService.getDomainConfiguration().lookupJDBCSystemResource(jdbcResourceName); + } + + /** + * Handles the HTTP GET method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + processRequest(request, response); + } + + /** + * Handles the HTTP POST method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + processRequest(request, response); + } + + /** + * Returns a short description of the servlet. + * + * @return a String containing servlet description + */ + @Override + public String getServletInfo() { + return "Cluster View Servlet"; + } + +} diff --git a/new-integration-tests/src/test/resources/apps/clusterview/web/WEB-INF/web.xml b/new-integration-tests/src/test/resources/apps/clusterview/web/WEB-INF/web.xml index 1cf28ffb5b0..d2259259a75 100644 --- a/new-integration-tests/src/test/resources/apps/clusterview/web/WEB-INF/web.xml +++ b/new-integration-tests/src/test/resources/apps/clusterview/web/WEB-INF/web.xml @@ -7,11 +7,21 @@ Licensed under the Universal Permissive License v 1.0 as shown at https://oss.or ClusterViewServlet oracle.weblogic.kubernetes.applications.clusterview.ClusterViewServlet + 1 ClusterViewServlet /ClusterViewServlet + + ConfigServlet + oracle.weblogic.kubernetes.applications.clusterview.ConfigServlet + 1 + + + ConfigServlet + /ConfigServlet + 30 diff --git a/new-integration-tests/src/test/resources/apps/coherence-proxy-client/build.xml b/new-integration-tests/src/test/resources/apps/coherence-proxy-client/build.xml new file mode 100644 index 00000000000..84286a95541 --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/coherence-proxy-client/build.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/new-integration-tests/src/test/resources/apps/coherence-proxy-client/buildRunProxyClient.sh b/new-integration-tests/src/test/resources/apps/coherence-proxy-client/buildRunProxyClient.sh new file mode 100644 index 00000000000..ac599524a13 --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/coherence-proxy-client/buildRunProxyClient.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +usage() +{ + printf "\n" + echo 1>&2 "Usage: sh $0 operation proxy-host proxy-port" + printf "\n" + echo 1>&2 "e.g., to build and run proxy client to load cached: sh $0 /u01/oracle/app load hostname123 30305" + printf "\n" + echo 1>&2 "e.g., to build and run proxy client to validate cache: sh $0 /u01/oracle/app validate hostname123 30305" + printf "\n" +} + + +##### Main + +if [ $1 = "-h" ] || [ $# -eq 0 ]; then + usage + exit 0 +fi + +APP_DIR_INPOD=$1 +OP=$2 +PROXY_HOST=$3 +PROXY_PORT=$4 + +echo "App location in the pod: ${APP_DIR_INPOD}" +echo "Operation : ${OP}" +echo "PROXY_HOST : ${PROXY_HOST}" +echo "PROXY_PORT : ${PROXY_PORT}" + +source $ORACLE_HOME/wlserver/server/bin/setWLSEnv.sh + +cd ${APP_DIR_INPOD} + +echo -e "running ant build from ${APP_DIR_INPOD}" +ant + +# Proxy client will return exit code of 0 for success +echo -e "running proxy client" +java -Dtangosol.coherence.proxy.address=${PROXY_HOST} -Dtangosol.coherence.proxy.port=${PROXY_PORT} -cp ${ORACLE_HOME}/coherence/lib/coherence.jar:./target/proxy-client-1.0.jar cohapp.Main ${OP} +retVal=$? +if [ $retVal -eq 0 ] ; then + # echo the marker string that is expected by the integration test + echo "CACHE-SUCCESS" +fi + +exit $retVal \ No newline at end of file diff --git a/new-integration-tests/src/test/resources/apps/coherence-proxy-client/src/main/java/cohapp/CacheClient.java b/new-integration-tests/src/test/resources/apps/coherence-proxy-client/src/main/java/cohapp/CacheClient.java new file mode 100644 index 00000000000..a8d1ddd39f7 --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/coherence-proxy-client/src/main/java/cohapp/CacheClient.java @@ -0,0 +1,401 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package cohapp; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileWriter; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; + +import com.tangosol.net.CacheFactory; +import com.tangosol.net.ConfigurableCacheFactory; +import com.tangosol.net.NamedCache; + + +/** + * This test creates a coherence cluster. + */ +public class CacheClient { + + private static final String PREFIX = "Thread-"; + private static final int VALUE_SIZE = 1024; + private static final int NUM_ITEMS = 100 * 1000; // Total number of items, regardless of thread count + private static final int THREAD_COUNT = 1; + private static final int MAX_BATCH_SIZE = 1000; + + // For HA testing, delay between operations until we do failover then go fast. + private static volatile int delay = 0; + + // Debug + static AtomicInteger mapWriteCount = new AtomicInteger(); + + + private Path opConfigPath = null; + private Path clientCacheConfigPath = null; + + private static final String KEY = "testKey"; + private static final String VAL = "testVal"; + + private static final String CACHE_NAME = "test-cache-remote"; + + private static final String SUCCESS = "Success"; + private static final String FAILURE = "Failure"; + + /** + * Load cache. + */ + public void loadCache() { + try { + init(); + loadCacheInternal(); + } finally { + cleanup(); + } + } + + /** + * Validate cache. + */ + public void validateCache() { + try { + init(); + validateCacheInternal(); + } finally { + cleanup(); + } + } + + private void init() { + try { + // create a temp file to write cache config - this is needed to run jar from cmd line + Path path = FileSystems.getDefault().getPath("tmp-client-cache-config.xml"); + clientCacheConfigPath = path.toAbsolutePath(); + Files.deleteIfExists(clientCacheConfigPath); + PrintWriter writer = new PrintWriter(new FileWriter(new File(clientCacheConfigPath.toString()))); + + // get reader of cache config inside the jar + BufferedReader reader = new BufferedReader(new InputStreamReader( + this.getClass().getResourceAsStream("/client-cache-config.xml"))); + + String line; + while ((line = reader.readLine()) != null) { + writer.println(line); + } + writer.close(); + + } catch (Exception e) { + throw new IllegalStateException("Error accessing the client cache config file ", e); + } + + // This will prevent client from joining the cluster + System.setProperty("coherence.tcmp.enabled","fase"); + } + + private void cleanup() { + try { + Files.deleteIfExists(clientCacheConfigPath); + } catch (Exception e) { + // no-op + } + } + + private static String getStackTraceString(Exception e) { + StringWriter writer = new StringWriter(); + e.printStackTrace(new PrintWriter(writer)); + return writer.toString(); + } + + private void loadCacheInternal() { + + List threadList = new ArrayList<>(); + + // Clear the cache + NamedCache cache = getCcf().ensureCache(CACHE_NAME, this.getClass().getClassLoader()); + + cache = getCcf().ensureCache(CACHE_NAME, this.getClass().getClassLoader()); + System.out.println("Cache size = " + cache.size()); + + System.out.println("Clearing cache"); + cache.clear(); + + // System.exit(0); + + System.out.println("Loading cache"); + final Instant startInstant = Instant.now(); + // Load the cache + for (int i = 0; i < THREAD_COUNT; i++) { + CacheThread t = + new WriteThread( + new ThreadConfig( + this.getClass().getClassLoader(), + "Write", + getCcf(), + CACHE_NAME, + PREFIX + i, + NUM_ITEMS / THREAD_COUNT)); + t.setDaemon(true); + t.start(); + threadList.add(t); + } + waitForAllThread(threadList); + + + cache = getCcf().ensureCache(CACHE_NAME, this.getClass().getClassLoader()); + System.out.println("Cache size = " + cache.size()); + + Instant finishInstant = Instant.now(); + Duration duration = Duration.between(startInstant, finishInstant); + + System.out.println("SUCCESS Load Test - elaspsed Time = " + duration.getSeconds() + " seconds"); + } + + private void validateCacheInternal() { + + List threadList = new ArrayList<>(); + + final Instant startInstant = Instant.now(); + + // Verify the cache + threadList.clear(); + for (int i = 0; i < THREAD_COUNT; i++) { + CacheThread t = + new ValidateThread( + new ThreadConfig( + this.getClass().getClassLoader(), + "Validate", + getCcf(), + CACHE_NAME, + PREFIX + i, + NUM_ITEMS / THREAD_COUNT)); + t.setDaemon(true); + t.start(); + threadList.add(t); + } + waitForAllThread(threadList); + + Instant finishInstant = Instant.now(); + Duration duration = Duration.between(startInstant, finishInstant); + + System.out.println("SUCCESS Validate Test - elaspsed Time = " + duration.getSeconds() + " seconds"); + } + + /** + * Return the CCF which has the CloudQuorumPolicy configured for all distributed services. + * + * @return the CCF + */ + private ConfigurableCacheFactory getCcf() { + + ConfigurableCacheFactory ccf = + CacheFactory.getCacheFactoryBuilder() + .getConfigurableCacheFactory( + clientCacheConfigPath.toString(), getClass().getClassLoader()); + + return ccf; + } + + private void waitForAllThread(List threadList) { + for (CacheThread thread : threadList) { + try { + thread.join(); + ThreadConfig config = thread.config; + System.out.println(config.operation + " " + config.prefix + " has terminated"); + if (thread.isError()) { + String msg = "Fatal Error in thread " + config.prefix + " for operation " + + config.operation + "\n" + thread.error; + System.out.println(msg); + throw new RuntimeException(msg); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + } + + /** Inner class CacheThread. */ + private abstract static class CacheThread extends Thread { + + final ThreadConfig config; + + volatile String error = null; + + String getError() { + return error; + } + + CacheThread(ThreadConfig config) { + this.config = config; + } + + boolean isError() { + return error != null; + } + + NamedCache ensureTestCache(ConfigurableCacheFactory ccf, String cacheName) { + NamedCache cache = null; + final int maxEnsureRetry = 200; + int count = 0; + while (cache == null) { + try { + Thread.sleep(1000); + cache = ccf.ensureCache(cacheName, config.loader); + System.out.println("Successfully Created Named Cache"); + } catch (Exception e) { + if (++count == maxEnsureRetry) { + throw new RuntimeException("Unable to create Named Cache after many retries"); + } + System.out.println("Error creating Named Cache, retrying"); + } + } + + return cache; + } + + public void run() { + + final int maxOpRetry = 10; + int opRetry = 0; + + // Fill value buff + StringBuffer valBuf = new StringBuffer(VALUE_SIZE); + for (int i = 0; i < VALUE_SIZE; i++) { + valBuf.append('a'); + } + + try { + System.out.println("Running " + config.operation + " thread " + config.prefix); + NamedCache cache = ensureTestCache(config.ccf, config.cacheName); + int count = 0; + while (count < config.numItems) { + // Load map with a batch of values + Map map = new HashMap<>(MAX_BATCH_SIZE); + int remaining = config.numItems - count; + final int batchSize = remaining > MAX_BATCH_SIZE ? MAX_BATCH_SIZE : remaining; + for (int i = 0; i < batchSize; i++) { + + // replace the leading chars in the array with the count + String valStr = String.valueOf(count); + valBuf.replace(0,valStr.length(),valStr); + + map.put(config.prefix + "-" + count, valBuf.toString()); + count++; + } + try { + // System.out.println("Key = " + key); + error = doCacheOperation(cache, map); + if (error != null) { + return; + } + if (delay > 0) { + Thread.sleep(delay); + } + } catch (Exception e) { + System.out.println( + config.prefix + " Exception accessing the cache : " + e.getMessage()); + + System.out.println(getStackTraceString(e)); + + if (++opRetry == maxOpRetry) { + error = "ERROR: Reached retry limit for operation " + config.operation; + return; + } + + System.out.println("Calling ensureCache again for " + config.prefix); + try { + config.ccf.releaseCache(cache); + } catch (Exception e1) { + // ignore + } + + cache = ensureTestCache(config.ccf, config.cacheName); + delay = 0; + + // Adjust count since the last operator failed + count -= batchSize; + } + } + } catch (Exception e) { + error = getStackTraceString(e); + return; + } + + System.out.println("Finished running " + config.operation + " thread " + config.prefix); + } + + abstract String doCacheOperation(NamedCache cache, Map map); + } + + /** Write the data to the cache. */ + private static class WriteThread extends CacheThread { + + private WriteThread(ThreadConfig config) { + super(config); + } + + @Override + String doCacheOperation(NamedCache cache, Map map) { + // System.out.println("Writing Map " + mapWriteCount.incrementAndGet()); + cache.putAll(map); + return null; + } + } + + /* Read and Validate the data in the Cache */ + private static class ValidateThread extends CacheThread { + + private ValidateThread(ThreadConfig config) { + super(config); + } + + @Override + String doCacheOperation(NamedCache cache, Map map) { + + // System.out.println("Validating Map " + mapWriteCount.incrementAndGet()); + Map outMap = cache.getAll(map.keySet()); + if (!map.equals(outMap)) { + error = "Validation Error: Cache data doesn't match"; + return error; + } + return null; + } + } + + private static class ThreadConfig { + final ClassLoader loader; + final String operation; + final ConfigurableCacheFactory ccf; + final String cacheName; + final String prefix; + final int numItems; + + ThreadConfig( + ClassLoader loader, + String operation, + ConfigurableCacheFactory ccf, + String cacheName, + String prefix, + int numItems) { + + this.loader = loader; + this.operation = operation; + this.ccf = ccf; + this.cacheName = cacheName; + this.prefix = prefix; + this.numItems = numItems; + } + } +} \ No newline at end of file diff --git a/new-integration-tests/src/test/resources/apps/coherence-proxy-client/src/main/java/cohapp/Main.java b/new-integration-tests/src/test/resources/apps/coherence-proxy-client/src/main/java/cohapp/Main.java new file mode 100644 index 00000000000..e5efdf2f63f --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/coherence-proxy-client/src/main/java/cohapp/Main.java @@ -0,0 +1,38 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package cohapp; + +import static java.lang.System.exit; + +public class Main { + + /** + * main. + * @param args arguments + */ + public static void main(String[] args) { + + try { + if (args.length == 1) { + String arg = args[0]; + + CacheClient client = new CacheClient(); + + if (arg.compareToIgnoreCase("load") == 0) { + client.loadCache(); + exit(0); + } else if (arg.compareToIgnoreCase("validate") == 0) { + client.validateCache(); + exit(0); + } + } + System.out.println("Param must be load or validate "); + exit(1); + + } catch (Exception e) { + System.out.println("Error executing cache test: " + e.getMessage()); + exit(1); + } + } +} diff --git a/new-integration-tests/src/test/resources/apps/coherence-proxy-client/src/main/resources/client-cache-config.xml b/new-integration-tests/src/test/resources/apps/coherence-proxy-client/src/main/resources/client-cache-config.xml new file mode 100644 index 00000000000..d43cb1e4190 --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/coherence-proxy-client/src/main/resources/client-cache-config.xml @@ -0,0 +1,39 @@ + + + + + + + + + + ccs + + + + * + remote-scheme + + + + + + remote-scheme + wildcard-dist-service + + + + +
    127.0.0.1
    + 9000 +
    +
    +
    +
    +
    +
    +
    diff --git a/new-integration-tests/src/test/resources/apps/coherence-proxy-server/META-INF/coherence-application.xml b/new-integration-tests/src/test/resources/apps/coherence-proxy-server/META-INF/coherence-application.xml new file mode 100644 index 00000000000..4b835b03dc5 --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/coherence-proxy-server/META-INF/coherence-application.xml @@ -0,0 +1,8 @@ + + + + META-INF/server-cache-config.xml + diff --git a/new-integration-tests/src/test/resources/apps/coherence-proxy-server/META-INF/server-cache-config.xml b/new-integration-tests/src/test/resources/apps/coherence-proxy-server/META-INF/server-cache-config.xml new file mode 100644 index 00000000000..7119c2f7a1e --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/coherence-proxy-server/META-INF/server-cache-config.xml @@ -0,0 +1,53 @@ + + + + + + + * + wildcard-dist-scheme + + + + + + + wildcard-dist-scheme + wildcard-dist-service + + + + true + + + + ccs-proxy-scheme + ccs-proxy-service + + + + +
    0.0.0.0
    + 9000 +
    +
    +
    + + + true + + + client + true +
    + + +
    +
    diff --git a/new-integration-tests/src/test/resources/apps/opensessionapp/META-INF/MANIFEST.MF b/new-integration-tests/src/test/resources/apps/opensessionapp/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..6352cd4a88f --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/opensessionapp/META-INF/MANIFEST.MF @@ -0,0 +1,4 @@ +Manifest-Version: 1.0 +Ant-Version: Apache Ant 1.9.8 +Created-By: 1.8.0_131-b11 (Oracle Corporation) + diff --git a/new-integration-tests/src/test/resources/apps/opensessionapp/META-INF/application.xml b/new-integration-tests/src/test/resources/apps/opensessionapp/META-INF/application.xml new file mode 100644 index 00000000000..a2830e54976 --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/opensessionapp/META-INF/application.xml @@ -0,0 +1,15 @@ + + + + JSP 2.0 Expression Language Example + JSP 2.0 Expression Language Example + + + opensession + opensession + + + diff --git a/new-integration-tests/src/test/resources/apps/opensessionapp/META-INF/weblogic-application.xml b/new-integration-tests/src/test/resources/apps/opensessionapp/META-INF/weblogic-application.xml new file mode 100644 index 00000000000..90f03062d3c --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/opensessionapp/META-INF/weblogic-application.xml @@ -0,0 +1,7 @@ + + + + diff --git a/new-integration-tests/src/test/resources/apps/opensessionapp/opensession/WEB-INF/web.xml b/new-integration-tests/src/test/resources/apps/opensessionapp/opensession/WEB-INF/web.xml new file mode 100644 index 00000000000..74f0d1785cd --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/opensessionapp/opensession/WEB-INF/web.xml @@ -0,0 +1,12 @@ + + + + Open Session Web Application + + + index.jsp + + diff --git a/new-integration-tests/src/test/resources/apps/opensessionapp/opensession/WEB-INF/weblogic.xml b/new-integration-tests/src/test/resources/apps/opensessionapp/opensession/WEB-INF/weblogic.xml new file mode 100644 index 00000000000..4d3a21dc77e --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/opensessionapp/opensession/WEB-INF/weblogic.xml @@ -0,0 +1,13 @@ + + + + weblogic.xml for memory replication + + 10 + 10 + + + diff --git a/new-integration-tests/src/test/resources/apps/opensessionapp/opensession/index.jsp b/new-integration-tests/src/test/resources/apps/opensessionapp/opensession/index.jsp new file mode 100644 index 00000000000..edd37c4a5f0 --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/opensessionapp/opensession/index.jsp @@ -0,0 +1,20 @@ +<%-- +Copyright (c) 2020, Oracle Corporation and/or its affiliates. +Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +--%> +<%@ page import="java.net.InetAddress" %> +<%@ page import="javax.servlet.http.Cookie" %> + +OpenSessionApp + +

    Welcome to Open Session Application !

    + +
    +<% + out.println("

    Server Name: " + System.getProperty("weblogic.Name") + "

    "); +%> + + + + + diff --git a/new-integration-tests/src/test/resources/apps/sessmigr-app/sessmigr-war/index.jsp b/new-integration-tests/src/test/resources/apps/sessmigr-app/sessmigr-war/index.jsp index 62923f9c5df..cca0402b1fb 100644 --- a/new-integration-tests/src/test/resources/apps/sessmigr-app/sessmigr-war/index.jsp +++ b/new-integration-tests/src/test/resources/apps/sessmigr-app/sessmigr-war/index.jsp @@ -2,91 +2,61 @@ Copyright (c) 2020, Oracle Corporation and/or its affiliates. Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. --%> -<%@ page contentType="text/html; charset=utf-8" %> +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ page import="javax.servlet.http.HttpSession, weblogic.servlet.internal.MembershipControllerImpl, weblogic.servlet.internal.session.RSID, - weblogic.servlet.spi.WebServerRegistry" %> + weblogic.servlet.spi.WebServerRegistry" +%> <%! String getPrimaryServer(String sessionId) { MembershipControllerImpl cluster = (MembershipControllerImpl) WebServerRegistry.getInstance().getClusterProvider(); RSID rsid = new RSID(sessionId, cluster.getClusterMembers()); - if (rsid.getPrimary() == null) { return "No Primary"; } - return rsid.getPrimary().getServerName(); } - String getSecondaryServer(String sessionId) { MembershipControllerImpl cluster = (MembershipControllerImpl) WebServerRegistry.getInstance().getClusterProvider(); RSID rsid = new RSID(sessionId, cluster.getClusterMembers()); - if (rsid.getSecondary() == null) { return "No Secondary"; } - return rsid.getSecondary().getServerName(); } %> <% - HttpSession currentSession = request.getSession(true); - - if (currentSession != null) { - if (request.getParameter("delayTime") != null) { - try { - Integer ival = (Integer)currentSession.getAttribute("simplesession.counter"); - if (ival == null) { - // Initialize the counter - ival = new Integer(1); - } else { - // Increment the counter - ival = new Integer(ival.intValue() + 1); - } - // Set the new attribute value in the session - currentSession.setAttribute("simplesession.counter", ival); - - currentSession.setMaxInactiveInterval(Integer.valueOf(request.getParameter("delayTime"))); - out.println( - "Starting to sleep : " - + (Integer.valueOf(request.getParameter("delayTime"))) - + ""); - Thread.sleep(Integer.valueOf(request.getParameter("delayTime"))); - out.println("Ending to sleep"); - } catch (Exception ex) { - // just ignore - } - } - + if (session != null) { if (request.getParameter("invalidate") != null) { - currentSession.invalidate(); + session.invalidate(); out.println("Your session is invalidated"); } else { if (request.getParameter("setCounter") != null) { - currentSession.setAttribute("count", Integer.valueOf(request.getParameter("setCounter"))); + session.setAttribute("count", Integer.valueOf(request.getParameter("setCounter"))); } else if (request.getParameter("getCounter") != null) { - currentSession.setAttribute("count", ((Integer) currentSession.getAttribute("count"))); - } else if (request.getParameter("setCounter") == null && currentSession.isNew()) { - currentSession.setAttribute("count", new Integer(1)); + session.setAttribute("count", ((Integer) session.getAttribute("count"))); + } else if (request.getParameter("setCounter") == null && session.isNew()) { + session.setAttribute("count", new Integer(1)); } else { - int count = ((Integer) currentSession.getAttribute("count")).intValue(); - currentSession.setAttribute("count", new Integer(++count)); + int count = ((Integer) session.getAttribute("count")).intValue(); + session.setAttribute("count", new Integer(++count)); } - out.println( - "" + currentSession.getCreationTime() + ""); - out.println("" + currentSession.getId() + ""); - out.println("" + getPrimaryServer(currentSession.getId()) + ""); - out.println("" + getSecondaryServer(currentSession.getId()) + ""); + "" + session.getCreationTime() + ""); + out.println("" + session.getId() + ""); + out.println("" + getPrimaryServer(session.getId()) + ""); + out.println("" + getSecondaryServer(session.getId()) + ""); out.println( - "" + currentSession.getAttribute("count") + ""); + "" + session.getAttribute("count") + ""); } } else { + out.println("NA"); + out.println("NA"); out.println("NA"); out.println("NA"); out.println("00"); } -%> +%> \ No newline at end of file diff --git a/new-integration-tests/src/test/resources/apps/stickysess-app/META-INF/MANIFEST.MF b/new-integration-tests/src/test/resources/apps/stickysess-app/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..8a636006c23 --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/stickysess-app/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: 1.8.0_201 (Oracle Corporation) + diff --git a/new-integration-tests/src/test/resources/apps/stickysess-app/META-INF/application.xml b/new-integration-tests/src/test/resources/apps/stickysess-app/META-INF/application.xml new file mode 100644 index 00000000000..360d5fb6c2c --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/stickysess-app/META-INF/application.xml @@ -0,0 +1,15 @@ + + + + JSP 2.0 Expression Language Example + JSP 2.0 Expression Language Example + + + stickysess-war + stickysess-war + + + diff --git a/new-integration-tests/src/test/resources/apps/stickysess-app/META-INF/weblogic-application.xml b/new-integration-tests/src/test/resources/apps/stickysess-app/META-INF/weblogic-application.xml new file mode 100644 index 00000000000..90f03062d3c --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/stickysess-app/META-INF/weblogic-application.xml @@ -0,0 +1,7 @@ + + + + diff --git a/new-integration-tests/src/test/resources/apps/stickysess-app/stickysess-war/WEB-INF/web.xml b/new-integration-tests/src/test/resources/apps/stickysess-app/stickysess-war/WEB-INF/web.xml new file mode 100644 index 00000000000..8640ebd65af --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/stickysess-app/stickysess-war/WEB-INF/web.xml @@ -0,0 +1,7 @@ + + + + diff --git a/new-integration-tests/src/test/resources/apps/stickysess-app/stickysess-war/WEB-INF/weblogic.xml b/new-integration-tests/src/test/resources/apps/stickysess-app/stickysess-war/WEB-INF/weblogic.xml new file mode 100644 index 00000000000..84a9831aa25 --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/stickysess-app/stickysess-war/WEB-INF/weblogic.xml @@ -0,0 +1,15 @@ + + + + weblogic.xml for memory persistence + + replicated_if_clustered + + + 1 + true + + diff --git a/new-integration-tests/src/test/resources/apps/stickysess-app/stickysess-war/index.jsp b/new-integration-tests/src/test/resources/apps/stickysess-app/stickysess-war/index.jsp new file mode 100644 index 00000000000..2e1693f2533 --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/stickysess-app/stickysess-war/index.jsp @@ -0,0 +1,53 @@ +<%-- +Copyright (c) 2020, Oracle Corporation and/or its affiliates. +Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +--%> +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page import="java.security.AccessController, + javax.servlet.http.HttpSession, + weblogic.management.provider.ManagementService, + weblogic.security.acl.internal.AuthenticatedSubject, + weblogic.security.service.PrivilegedActions" %> +<%! + public String getServerName() { + AuthenticatedSubject kernelId = + (AuthenticatedSubject) + AccessController.doPrivileged(PrivilegedActions.getKernelIdentityAction()); + + String myServerName = ManagementService.getRuntimeAccess(kernelId).getServerName(); + + return myServerName; + } +%> +<% + if (session != null) { + out.println("" + session.getCreationTime() + ""); + out.println("" + session.getId() + ""); + out.println("" + getServerName() + ""); + + if (request.getParameter("getCounter") != null) { + if (session.isNew()) { + out.println("0"); + } else { + out.println( + "" + session.getAttribute("count") + ""); + } + } else { + if (request.getParameter("setCounter") != null) { + session.setAttribute("count", Integer.valueOf(request.getParameter("setCounter"))); + } else if (request.getParameter("setCounter") == null && session.isNew()) { + session.setAttribute("count", new Integer(1)); + } else { + int count = ((Integer) session.getAttribute("count")).intValue(); + session.setAttribute("count", new Integer(++count)); + } + + out.println("" + session.getAttribute("count") + ""); + } + } else { + out.println("NA"); + out.println("NA"); + out.println("NA"); + out.println("00"); + } +%> \ No newline at end of file diff --git a/new-integration-tests/src/test/resources/apps/txforward/TxForward/WebContent/META-INF/MANIFEST.MF b/new-integration-tests/src/test/resources/apps/txforward/TxForward/WebContent/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..5e9495128c0 --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/txforward/TxForward/WebContent/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/new-integration-tests/src/test/resources/apps/txforward/TxForward/WebContent/META-INF/application.xml b/new-integration-tests/src/test/resources/apps/txforward/TxForward/WebContent/META-INF/application.xml new file mode 100644 index 00000000000..02cbdf5bae5 --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/txforward/TxForward/WebContent/META-INF/application.xml @@ -0,0 +1,14 @@ + + + + TxForwardEAR + + + TxForward.war + TxForward + + + \ No newline at end of file diff --git a/new-integration-tests/src/test/resources/apps/txforward/TxForward/WebContent/META-INF/weblogic-application.xml b/new-integration-tests/src/test/resources/apps/txforward/TxForward/WebContent/META-INF/weblogic-application.xml new file mode 100644 index 00000000000..45186abe1df --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/txforward/TxForward/WebContent/META-INF/weblogic-application.xml @@ -0,0 +1,11 @@ + + + + + example.LifecycleListenerImpl + lib/remotesync.jar + + \ No newline at end of file diff --git a/new-integration-tests/src/test/resources/apps/txforward/TxForward/src/example/TxForward.java b/new-integration-tests/src/test/resources/apps/txforward/TxForward/src/example/TxForward.java new file mode 100644 index 00000000000..ba601c9afa2 --- /dev/null +++ b/new-integration-tests/src/test/resources/apps/txforward/TxForward/src/example/TxForward.java @@ -0,0 +1,74 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package example; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Arrays; + +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.transaction.HeuristicMixedException; +import javax.transaction.HeuristicRollbackException; +import javax.transaction.NotSupportedException; +import javax.transaction.RollbackException; +import javax.transaction.SystemException; + +import weblogic.transaction.Transaction; +import weblogic.transaction.TransactionHelper; +import weblogic.transaction.TransactionManager; + +/** + * Servlet implementation class TxForward + */ +@WebServlet("/TxForward") +public class TxForward extends HttpServlet { + private static final long serialVersionUID = 1L; + private TransactionManager tm = (TransactionManager) + TransactionHelper.getTransactionHelper().getTransactionManager(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + PrintWriter out = response.getWriter(); + + String urlsParam = request.getParameter("urls"); + if (urlsParam == null) return; + String[] urls = urlsParam.split(","); + + try { + RemoteSync remoteSync = (RemoteSync) + new InitialContext().lookup(RemoteSync.JNDINAME); + tm.begin(); + Transaction tx = (Transaction) tm.getTransaction(); + out.println("
    ");
    +      out.println(Utils.getLocalServerID() + " started " + 
    +          tx.getXid().toString());
    +//      out.println(remoteSync.register());
    +      out.println(Utils.getLocalServerID() + " invoking registerAndForward() urls=" + Arrays.toString(urls));
    +      out.println(remoteSync.registerAndForward(urls));
    +      tm.commit();
    +      out.println(Utils.getLocalServerID() + " committed " + tx);
    +    } catch (NamingException | NotSupportedException | SystemException | 
    +        SecurityException | IllegalStateException | RollbackException | 
    +        HeuristicMixedException | HeuristicRollbackException e) {
    +      throw new ServletException(e);
    +    } 
    +	}
    +	/**
    +	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    +	 */
    +	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    +		// TODO Auto-generated method stub
    +		doGet(request, response);
    +	}
    +
    +}
    diff --git a/new-integration-tests/src/test/resources/apps/txforward/build.xml b/new-integration-tests/src/test/resources/apps/txforward/build.xml
    new file mode 100644
    index 00000000000..8cc3851c39a
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/apps/txforward/build.xml
    @@ -0,0 +1,102 @@
    +
    +
    +
    +	
    +		ant script to build an application to test cross domain transaction
    +	
    +
    +	
    +
    +	
    +	
    +	
    +
    +       
    +           
    +        
    +
    +	
    +		
    +		
    +		
    +	
    +
    +	
    +		
    +		
    +		
    +		
    +	
    +	
    +
    +	
    +	
    +		
    +		
    +		
    +		
    +		
    +		
    +			
    +		
    +		
    +			
    +			
    +		
    +		
    +			
    +			
    +			
    +		
    +		
    +		
    +		
    +	
    +
    +	
    +		
    +		
    +			
    +				
    +			
    +		
    +		
    +		
    +		
    +			
    +		
    +		
    +		
    +	
    +
    +	
    +		
    +		
    +			
    +				
    +			
    +		
    +		
    +		
    +		
    +			
    +		
    +		
    +	
    +
    +	
    +		
    +			
    +				
    +			
    +		
    +		
    +		
    +	
    +
    diff --git a/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/META-INF/MANIFEST.MF b/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/META-INF/MANIFEST.MF
    new file mode 100644
    index 00000000000..58630c02ef4
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/META-INF/MANIFEST.MF
    @@ -0,0 +1,2 @@
    +Manifest-Version: 1.0
    +
    diff --git a/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/LifecycleListenerImpl.java b/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/LifecycleListenerImpl.java
    new file mode 100644
    index 00000000000..83213c87114
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/LifecycleListenerImpl.java
    @@ -0,0 +1,21 @@
    +// Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +package example;
    +
    +import weblogic.application.ApplicationException;
    +import weblogic.application.ApplicationLifecycleEvent;
    +import weblogic.application.ApplicationLifecycleListener;
    +
    +public class LifecycleListenerImpl extends ApplicationLifecycleListener {
    +
    +  public void preStart(ApplicationLifecycleEvent evt)
    +      throws ApplicationException {
    +    super.preStart(evt);
    +    try {
    +      RemoteSyncImpl.main(null);
    +    } catch (Exception e) {
    +      throw new ApplicationException(e);
    +    }
    +  }
    +}
    \ No newline at end of file
    diff --git a/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/RemoteSync.java b/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/RemoteSync.java
    new file mode 100644
    index 00000000000..8963e6c49a5
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/RemoteSync.java
    @@ -0,0 +1,13 @@
    +// Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +package example;
    +
    +import java.rmi.Remote;
    +import java.rmi.RemoteException;
    +
    +public interface RemoteSync extends Remote {
    +  public static final String JNDINAME = "txforward.RemoteSync";
    +  String register() throws RemoteException;
    +  String registerAndForward(String[] urls) throws RemoteException;
    +}
    diff --git a/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/RemoteSyncImpl.java b/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/RemoteSyncImpl.java
    new file mode 100644
    index 00000000000..6b4225a8133
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/RemoteSyncImpl.java
    @@ -0,0 +1,109 @@
    +// Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +package example;
    +
    +import java.rmi.RemoteException;
    +import java.util.Arrays;
    +
    +import javax.naming.Context;
    +import javax.transaction.RollbackException;
    +import javax.transaction.Synchronization;
    +import javax.transaction.SystemException;
    +
    +import weblogic.jndi.Environment;
    +import weblogic.transaction.Transaction;
    +import weblogic.transaction.TransactionHelper;
    +
    +public class RemoteSyncImpl implements RemoteSync {
    +  
    +  public String register() throws RemoteException {
    +    Transaction tx = (Transaction) 
    +        TransactionHelper.getTransactionHelper().getTransaction();
    +    if (tx == null) return Utils.getLocalServerID() + 
    +        " no transaction, Synchronization not registered";
    +    try {
    +      Synchronization sync = new SynchronizationImpl(tx);
    +      tx.registerSynchronization(sync);
    +      return Utils.getLocalServerID() + " " + tx.getXid().toString() + 
    +          " registered " + sync;
    +    } catch (IllegalStateException | RollbackException | 
    +        SystemException e) {
    +      throw new RemoteException(
    +          "error registering Synchronization callback with " + 
    +      tx.getXid().toString(), e);
    +    }
    +  }
    +  
    +  public String registerAndForward(String[] urls) throws RemoteException {
    +    StringBuilder trace = new StringBuilder();
    +    
    +    Transaction tx = (Transaction) TransactionHelper.getTransactionHelper().getTransaction();
    +    String xid = (tx != null) ? tx.getXid().toString() : "notx";
    +    
    +    if (tx != null) {
    +      try {
    +        tx.registerSynchronization(new SynchronizationImpl(tx));
    +      } catch (Exception e) {
    +        e.printStackTrace();
    +      }
    +    }
    +
    +    String serverID = Utils.getLocalServerID();
    +    
    +    String rmsg = serverID + " " + xid + " registerAndForward() urls=" + Arrays.toString(urls);
    +    trace.append(rmsg);
    +//    System.out.println(rmsg);
    +    
    +    if (urls != null && urls.length > 0) {
    +      trace.append("\n");
    +      try {
    +        Context ctx = Utils.getContext(urls[0]);
    +        RemoteSync remoteSync = (RemoteSync) ctx.lookup(JNDINAME);
    +        if (remoteSync != null) {
    +          String smsg = serverID + " " + xid + " invoking registerAndForward() on " + urls[0];
    +          trace.append(smsg).append("\n");
    +//          System.out.println(smsg);
    +          String[] remainingUrls = Arrays.copyOfRange(urls, 1, urls.length);
    +          trace.append(remoteSync.registerAndForward(remainingUrls));
    +        }
    +      } catch (RemoteException re) {
    +        throw re;
    +      } catch (Exception e) {
    +        throw new RemoteException("failed to propagate from " + serverID + " to " + urls[0] + ": " + e.toString());
    +      }
    +    }
    +    
    +    return trace.toString();
    +  }
    +
    +  class SynchronizationImpl implements Synchronization {
    +    Transaction tx;
    +    
    +    SynchronizationImpl(Transaction tx) {
    +      this.tx = tx;
    +    }
    +    
    +    public void afterCompletion(int arg0) {
    +      System.out.println(Utils.getLocalServerID() + " " + 
    +          tx.getXid().toString() + " afterCompletion()");
    +    }
    +
    +    public void beforeCompletion() {
    +      System.out.println(Utils.getLocalServerID() + " " + 
    +          tx.getXid().toString() + " beforeCompletion()");
    +    }
    +  }
    +  
    +  // create and bind remote object in local JNDI
    +  public static void main(String[] args) throws Exception {
    +    RemoteSyncImpl remoteSync = new RemoteSyncImpl();
    +    Environment env = new Environment();
    +    env.setCreateIntermediateContexts(true);
    +    env.setReplicateBindings(false);
    +    Context ctx = env.getInitialContext();
    +    ctx.rebind(JNDINAME, remoteSync);
    +    System.out.println("bound " + remoteSync);
    +  }
    +}
    +
    diff --git a/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/Utils.java b/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/Utils.java
    new file mode 100644
    index 00000000000..ac4915f668d
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/apps/txforward/remotesync/src/example/Utils.java
    @@ -0,0 +1,32 @@
    +// Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +package example;
    +
    +import java.util.Hashtable;
    +
    +import javax.naming.Context;
    +import javax.naming.InitialContext;
    +import javax.naming.NamingException;
    +
    +public class Utils {
    +
    +  public static Context getContext(String url) throws NamingException {
    +    Hashtable env = new Hashtable();
    +    env.put(Context.INITIAL_CONTEXT_FACTORY, 
    +        "weblogic.jndi.WLInitialContextFactory");
    +    env.put(Context.PROVIDER_URL, url); 
    +    return new InitialContext(env);
    +  }
    +
    +  public static String getLocalServerID() {
    +    return "[" + getDomainName() + "+"
    +        + System.getProperty("weblogic.Name") + "]";
    +  }
    +  
    +  private static String getDomainName() {
    +    String domainName = System.getProperty("weblogic.Domain");
    +    if (domainName == null) domainName = System.getenv("DOMAIN_NAME");
    +    return domainName;
    +  }
    +}
    diff --git a/new-integration-tests/src/test/resources/bash-scripts/build_application.sh b/new-integration-tests/src/test/resources/bash-scripts/build_application.sh
    index 72db5c01c61..02edf24f5fd 100644
    --- a/new-integration-tests/src/test/resources/bash-scripts/build_application.sh
    +++ b/new-integration-tests/src/test/resources/bash-scripts/build_application.sh
    @@ -14,11 +14,11 @@ function usage {
     MW_HOME=/u01/oracle
     WL_HOME=${MW_HOME}/wlserver
     
    -if [ -z ${targets+x} ]; then
    +if [ -z ${targets+x} ]; then 
     targets=""
     fi
     
    -if [ -z ${sysprops+x} ]; then
    +if [ -z ${sysprops+x} ]; then 
     sysprops=""
     fi
     
    @@ -26,8 +26,15 @@ fi
     echo "Setting up build environment"
     source ${WL_HOME}/server/bin/setWLSEnv.sh
     
    -# call ant all to build
    -cd /application
    +# create /u01/application
    +mkdir /u01/application
    +cd /u01/application
    +#unzip the source application archive
    +unzip /u01/$ZIP_FILE
    +
    +# call ant to build
    +pwd
    +ls
    +echo "ant ${sysprops} ${targets}"
     ant ${sysprops} ${targets}
     
    -chmod -R 777 *
    \ No newline at end of file
    diff --git a/new-integration-tests/src/test/resources/bash-scripts/callpyscript.sh b/new-integration-tests/src/test/resources/bash-scripts/callpyscript.sh
    new file mode 100755
    index 00000000000..d44929f85dc
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/bash-scripts/callpyscript.sh
    @@ -0,0 +1,12 @@
    +#!/bin/sh
    +# Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +ARG="$*"
    +ENVSCRIPT=`find /u01 . -name setDomainEnv.sh -print`
    +echo Sourcing $ENVSCRIPT
    +. $ENVSCRIPT || exit 1
    +echo "$@"
    +echo Calling java weblogic.WLST $ARG
    +eval java weblogic.WLST $ARG || exit 1
    +
    diff --git a/new-integration-tests/src/test/resources/bash-scripts/createRepository.sh b/new-integration-tests/src/test/resources/bash-scripts/createRepository.sh
    new file mode 100755
    index 00000000000..037946f1200
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/bash-scripts/createRepository.sh
    @@ -0,0 +1,69 @@
    +#!/bin/bash
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +. /u01/oracle/wlserver/server/bin/setWLSEnv.sh
    +
    +echo "Check if the DB Service is ready to accept request "
    +connectString=${1:-oracle-db.default.svc.cluster.local:1521/devpdb.k8s}
    +schemaPrefix=${2:-domain1}
    +rcuType=${3:-fmw}
    +sysPassword=${4:-Oradoc_db1}
    +
    +echo "DB Connection String [$connectString], schemaPrefix [${schemaPrefix}] rcuType [${rcuType}]"
    +
    +max=100
    +counter=0
    +while [ $counter -le ${max} ]
    +do
    + java utils.dbping ORACLE_THIN "sys as sysdba" ${sysPassword} ${connectString} > dbping.err 2>&1
    + [[ $? == 0 ]] && break;
    + ((counter++))
    + echo "[$counter/${max}] Retrying the DB Connection ..."
    + sleep 10
    +done
    +
    +if [ $counter -gt ${max} ]; then
    + echo "[ERROR] Oracle DB Service is not ready after [${max}] iterations ..."
    + cat dbping.err
    + exit -1
    +else
    + java utils.dbping ORACLE_THIN "sys as sysdba" ${sysPassword} ${connectString}
    +fi
    +
    +# SOA needs extra component(s) SOAINFRA ESS (optional)
    +# SOA needs variables param(s) SOA_PROFILE_TYPE=SMALL,HEALTHCARE_INTEGRATION=NO
    +
    +case $rcuType in
    + fmw)
    +   extComponents=""
    +   extVariables=""
    +   echo "Creating RCU Schema for FMW Domain ..."
    +   ;;
    + soa|soaosb|osb)
    +   extComponents="-component SOAINFRA"
    +   extVariables="-variables SOA_PROFILE_TYPE=SMALL,HEALTHCARE_INTEGRATION=NO"
    +   echo "Creating RCU Schema for SOA Domain [$rcuType] ..."
    +   ;;
    + soaess|soaessosb)
    +    extComponents="-component SOAINFRA -component ESS"
    +    extVariables="-variables SOA_PROFILE_TYPE=SMALL,HEALTHCARE_INTEGRATION=NO"
    +    echo "Creating RCU Schema for SOA Domain w/ESS [$rcuType] ..."
    +  ;;
    +  * )
    +    echo "[ERROR] Unknown RCU Schema Type [$rcuType]"
    +    echo "Supported values: fmw(default),soa,osb,soaosb,soaess,soaessosb"
    +    exit -1
    +  ;;
    +esac
    +
    +echo "Extra RCU Schema Component Choosen[${extComponents}]" 
    +echo "Extra RCU Schema Variable Choosen[${extVariables}]" 
    +
    +/u01/oracle/oracle_common/bin/rcu -silent -createRepository \
    + -databaseType ORACLE -connectString ${connectString} \
    + -dbUser sys  -dbRole sysdba -useSamePasswordForAllSchemaUsers true \
    + -selectDependentsForComponents true \
    + -schemaPrefix ${schemaPrefix} ${extComponents} ${extVariables} \
    + -component MDS -component IAU -component IAU_APPEND -component IAU_VIEWER \
    + -component OPSS -component WLS -component STB  < /u01/oracle/pwd.txt
    diff --git a/new-integration-tests/src/test/resources/bash-scripts/install-istio.sh b/new-integration-tests/src/test/resources/bash-scripts/install-istio.sh
    new file mode 100755
    index 00000000000..513d930ff81
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/bash-scripts/install-istio.sh
    @@ -0,0 +1,69 @@
    +#!/bin/bash
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +# Description:
    +#
    +#  This script install a given version of istio using Helm v3.x
    +#  Default istio version is 1.5.4 
    +#  https://istio.io/docs/setup/install/istioctl/
    +#  https://istio.io/latest/docs/setup/install/standalone-operator/
    +
    +# Usage:
    +#
    +#  $0 [istio-version] [install-dir]
    +
    +# Define functions
    +
    +function install_istio {
    +
    +version=$1
    +workdir=$2
    +
    +istiodir=${workdir}/istio-${version}
    +echo "Installing Istio version [${version}] in location [${istiodir}]"
    +
    +helm repo add istio.io https://storage.googleapis.com/istio-release/releases/${version}/charts/
    +
    +kubectl delete namespace istio-system --ignore-not-found
    +kubectl create namespace istio-system
    +
    +( cd $workdir;  
    +  curl -L https://istio.io/downloadIstio | ISTIO_VERSION=${version} sh 
    +)
    +
    +( cd ${istiodir}
    +  helm template istio-init install/kubernetes/helm/istio-init --namespace istio-system | kubectl apply -f -
    +  kubectl -n istio-system wait --for=condition=complete job --all
    +  helm template istio install/kubernetes/helm/istio --namespace istio-system | kubectl apply -f -
    +)
    +}
    +
    +
    +# MAIN
    +version=${1:-1.5.4}
    +workdir=${2:-`pwd`}
    +
    +if [ ! -d ${workdir} ]; then 
    +  mkdir -p $workdir
    +fi
    +
    +istiodir=${workdir}/istio-${version}
    +if [ -d ${istiodir} ]; then 
    +   echo "Istio version [${version}] alreday installed at [${istiodir}]"
    +   exit 0 
    +else 
    +   install_istio ${version} ${workdir}
    +   # Additional check for Istio Service. 
    +   # Make sure a not-null Service Port returned.
    +   HTTP2_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
    +   if [ -z ${HTTP2_PORT} ]; then 
    +     echo "Istio installation fails"
    +     echo "Istio Http2 NodePort Service is not listening"
    +     exit -1
    +   else 
    +     echo "Istio installation is SUCCESS"
    +     echo "Http2 NodePort Service is listening on port [${HTTP2_PORT}]"
    +     exit 0
    +   fi
    +fi
    diff --git a/new-integration-tests/src/test/resources/bash-scripts/uninstall-istio.sh b/new-integration-tests/src/test/resources/bash-scripts/uninstall-istio.sh
    new file mode 100755
    index 00000000000..7d5d69f5176
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/bash-scripts/uninstall-istio.sh
    @@ -0,0 +1,49 @@
    +#!/bin/bash
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +# Description:
    +#
    +#  This script uninstall a given version of istio using Helm v3.x
    +#  Default istio version is 1.5.4 
    +#  https://istio.io/docs/setup/install/istioctl/
    +#  https://istio.io/latest/docs/setup/install/standalone-operator/
    +
    +# Usage:
    +#
    +#  $0 [istio-version] [install-dir]
    +
    +# Define functions
    +
    +function uninstall_istio {
    +
    +version=$1
    +workdir=$2
    +
    +istiodir=${workdir}/istio-${version}
    +
    +echo "Uninstalling Istio version [${version}] from location [${istiodir}]"
    +
    +( cd ${istiodir}
    +  helm template istio-init install/kubernetes/helm/istio-init --namespace istio-system | kubectl delete -f -
    +  kubectl -n istio-system wait --for=condition=complete job --all
    +  helm template istio install/kubernetes/helm/istio --namespace istio-system | kubectl delete -f -
    +)
    +kubectl delete namespace istio-system --ignore-not-found
    +rm -rf ${istiodir}
    +}
    +
    +# MAIN
    +version=${1:-1.5.4}
    +workdir=${2:-`pwd`}
    +
    +istiodir=${workdir}/istio-${version}
    +
    +if [ ! -d ${istiodir} ]; then
    + echo "Istio version [${version}] is NOT installed at location [${istiodir}]"
    + exit 0
    +fi
    +   uninstall_istio ${version} ${workdir}
    +   exit 0 
    +fi
    +
    diff --git a/new-integration-tests/src/test/resources/bash-scripts/wdt-create-domain-onpv.sh b/new-integration-tests/src/test/resources/bash-scripts/wdt-create-domain-onpv.sh
    index 810aa15de97..a0e3f1da444 100644
    --- a/new-integration-tests/src/test/resources/bash-scripts/wdt-create-domain-onpv.sh
    +++ b/new-integration-tests/src/test/resources/bash-scripts/wdt-create-domain-onpv.sh
    @@ -45,7 +45,7 @@
     #                  default:  weblogic-deploy.zip
     #
     #   WDT_INSTALL_ZIP_URL   URL for downloading WDT install zip
    -#                  default:  https://github.com/oracle/weblogic-deploy-tooling/releases/download/weblogic-deploy-tooling-1.7.0/$WDT_INSTALL_ZIP_FILE
    +#                  default:  https://github.com/oracle/weblogic-deploy-tooling/releases/download/weblogic-deploy-tooling-1.9.1/$WDT_INSTALL_ZIP_FILE
     #
     #   https_proxy    Proxy for downloading WDT_INSTALL_ZIP_URL.
     #                  default: "http://www-proxy-hqdc.us.oracle.com:80"
    @@ -60,7 +60,7 @@
     #                  of WDT log files.
     #                  default:  /shared/wdt
     #   WDT_VERSION    WDT version to download.
    -#                  default:  1.7.0
    +#                  default:  latest
     #
     #   DOMAIN_HOME_DIR  Target location for generated domain. 
     #
    diff --git a/new-integration-tests/src/test/resources/configfiles/configoverridesset1/config.xml b/new-integration-tests/src/test/resources/configfiles/configoverridesset1/config.xml
    new file mode 100644
    index 00000000000..fbf413d11fe
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/configfiles/configoverridesset1/config.xml
    @@ -0,0 +1,11 @@
    +
    +
    +
    +    
    +        admin-server
    +        9999999
    +    
    +
    diff --git a/new-integration-tests/src/test/resources/configfiles/configoverridesset1/config1.xml b/new-integration-tests/src/test/resources/configfiles/configoverridesset1/config1.xml
    new file mode 100644
    index 00000000000..4f1a0394715
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/configfiles/configoverridesset1/config1.xml
    @@ -0,0 +1,11 @@
    +
    +
    +
    +    
    +        admin-server
    +        88888888
    +    
    +
    diff --git a/new-integration-tests/src/test/resources/configfiles/configoverridesset1/jdbc-JdbcTestDataSource-0.xml b/new-integration-tests/src/test/resources/configfiles/configoverridesset1/jdbc-JdbcTestDataSource-0.xml
    new file mode 100644
    index 00000000000..13baa4ce33c
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/configfiles/configoverridesset1/jdbc-JdbcTestDataSource-0.xml
    @@ -0,0 +1,18 @@
    +
    +
    +
    +    JdbcTestDataSource-0
    +    
    +        2
    +        12
    +        true
    +        7
    +        120
    +    
    +
    diff --git a/new-integration-tests/src/test/resources/configfiles/configoverridesset1/jdbc-JdbcTestDataSource-1.xml b/new-integration-tests/src/test/resources/configfiles/configoverridesset1/jdbc-JdbcTestDataSource-1.xml
    new file mode 100644
    index 00000000000..7c9625cc148
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/configfiles/configoverridesset1/jdbc-JdbcTestDataSource-1.xml
    @@ -0,0 +1,29 @@
    +
    +
    +
    +    JdbcTestDataSource-1
    +    
    +        4
    +        10
    +        true
    +        8
    +        60
    +    
    +    
    +        JDBC_URL
    +        com.mysql.cj.jdbc.Driver
    +        
    +            
    +                user
    +                ${secret:mydomain-mysql-secret.dbusername}
    +            
    +        
    +        ${secret:mydomain-mysql-secret.dbpassword:encrypt}
    +    
    +
    diff --git a/new-integration-tests/src/test/resources/configfiles/configoverridesset1/version.txt b/new-integration-tests/src/test/resources/configfiles/configoverridesset1/version.txt
    new file mode 100644
    index 00000000000..cd5ac039d67
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/configfiles/configoverridesset1/version.txt
    @@ -0,0 +1 @@
    +2.0
    diff --git a/new-integration-tests/src/test/resources/exporter/exporter-config.yaml b/new-integration-tests/src/test/resources/exporter/exporter-config.yaml
    new file mode 100644
    index 00000000000..9a77a44bffc
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/exporter/exporter-config.yaml
    @@ -0,0 +1,61 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +query_sync:
    +  url: http://coordinator:8999/
    +  refreshInterval: 5
    +restPort: 8001
    +metricsNameSnakeCase: true
    +queries:
    +  - key: name
    +    keyName: location
    +    prefix: wls_server_
    +    applicationRuntimes:
    +      key: name
    +      keyName: app
    +      componentRuntimes:
    +        prefix: wls_webapp_config_
    +        type: WebAppComponentRuntime
    +        key: name
    +        values: [deploymentState, contextRoot, sourceInfo, sessionsOpenedTotalCount, openSessionsCurrentCount, openSessionsHighCount]
    +        servlets:
    +          prefix: wls_servlet_
    +          key: servletName
    +  - JVMRuntime:
    +      prefix: wls_jvm_
    +      key: name
    +  - executeQueueRuntimes:
    +      prefix: wls_socketmuxer_
    +      key: name
    +      values: [pendingRequestCurrentCount]
    +  - workManagerRuntimes:
    +      prefix: wls_workmanager_
    +      key: name
    +      values: [stuckThreadCount, pendingRequests, completedRequests]
    +  - threadPoolRuntime:
    +      prefix: wls_threadpool_
    +      key: name
    +      values: [executeThreadTotalCount, queueLength, stuckThreadCount, hoggingThreadCount]
    +  - JMSRuntime:
    +      key: name
    +      keyName: jmsruntime
    +      prefix: wls_jmsruntime_
    +      JMSServers:
    +        prefix: wls_jms_
    +        key: name
    +        keyName: jmsserver
    +        destinations:
    +          prefix: wls_jms_dest_
    +          key: name
    +          keyName: destination
    +
    +  - persistentStoreRuntimes:
    +      prefix: wls_persistentstore_
    +      key: name
    +  - JDBCServiceRuntime:
    +      JDBCDataSourceRuntimeMBeans:
    +        prefix: wls_datasource_
    +        key: name
    +  - JTARuntime:
    +      prefix: wls_jta_
    +      key: name
    \ No newline at end of file
    diff --git a/new-integration-tests/src/test/resources/exporter/rest_webapp.yml b/new-integration-tests/src/test/resources/exporter/rest_domainqualtrue.yaml
    similarity index 92%
    rename from new-integration-tests/src/test/resources/exporter/rest_webapp.yml
    rename to new-integration-tests/src/test/resources/exporter/rest_domainqualtrue.yaml
    index 8952668033e..fe590d1dad8 100644
    --- a/new-integration-tests/src/test/resources/exporter/rest_webapp.yml
    +++ b/new-integration-tests/src/test/resources/exporter/rest_domainqualtrue.yaml
    @@ -4,7 +4,9 @@
     query_sync:
       url: http://coordinator:8999/
       refreshInterval: 5
    -metricsNameSnakeCase: true
    +metricsNameSnakeCase: false
    +domainQualifier: true
    +
     restPort: 8001
     queries:
       - applicationRuntimes:
    @@ -16,6 +18,6 @@ queries:
             key: name
             values: [deploymentState, contextRoot, sourceInfo, openSessionsHighCount, openSessionsCurrentCount, sessionsOpenedTotalCount, sessionCookieMaxAgeSecs, sessionInvalidationIntervalSecs, sessionTimeoutSecs, singleThreadedServletPoolSize, sessionIDLength, servletReloadCheckSecs, jSPPageCheckSecs]
             servlets:
    -          prefix: weblogic_servlet_
    +          prefix: wls_servlet_
               key: servletName
               values: [invocationTotalCount, reloadTotal, executionTimeAverage, poolMaxCapacity, executionTimeTotal, reloadTotalCount, executionTimeHigh, executionTimeLow]
    diff --git a/new-integration-tests/src/test/resources/exporter/rest_dublicatedval.yaml b/new-integration-tests/src/test/resources/exporter/rest_dublicatedval.yaml
    new file mode 100644
    index 00000000000..e393b3f9951
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/exporter/rest_dublicatedval.yaml
    @@ -0,0 +1,21 @@
    +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +query_sync:
    +  url: http://coordinator:8999/
    +  refreshInterval: 5
    +metricsNameSnakeCase: true
    +restPort: 8001
    +queries:
    +- applicationRuntimes:
    +    key: name
    +    keyName: app
    +    componentRuntimes:
    +      type: WebAppComponentRuntime
    +      prefix: webapp_config_
    +      key: name
    +      values: [deploymentState, deploymentState, contextRoot, sourceInfo, openSessionsHighCount, openSessionsCurrentCount, sessionsOpenedTotalCount, sessionCookieMaxAgeSecs, sessionInvalidationIntervalSecs, sessionTimeoutSecs, singleThreadedServletPoolSize, sessionIDLength, servletReloadCheckSecs, jSPPageCheckSecs]
    +      servlets:
    +        prefix: wls_servlet_
    +        key: servletName
    +        values: [invocationTotalCount, reloadTotal, executionTimeAverage, poolMaxCapacity, executionTimeTotal, reloadTotalCount, executionTimeHigh, executionTimeLow]
    diff --git a/new-integration-tests/src/test/resources/exporter/rest_empty.yaml b/new-integration-tests/src/test/resources/exporter/rest_empty.yaml
    new file mode 100644
    index 00000000000..b66fbd7e6be
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/exporter/rest_empty.yaml
    @@ -0,0 +1,2 @@
    +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    diff --git a/new-integration-tests/src/test/resources/exporter/rest_jvm.yaml b/new-integration-tests/src/test/resources/exporter/rest_jvm.yaml
    new file mode 100644
    index 00000000000..dc6dd2a155f
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/exporter/rest_jvm.yaml
    @@ -0,0 +1,12 @@
    +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +query_sync:
    +  url: http://coordinator:8999/
    +  refreshInterval: 5
    +metricsNameSnakeCase: true
    +restPort: 8001
    +queries:
    +- JVMRuntime:
    +    key: name
    +    values: [heapFreeCurrent, heapFreePercent, heapSizeCurrent, heapSizeMax, uptime, processCpuLoad]
    diff --git a/new-integration-tests/src/test/resources/exporter/rest_notyaml.yaml b/new-integration-tests/src/test/resources/exporter/rest_notyaml.yaml
    new file mode 100644
    index 00000000000..95e98ac139f
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/exporter/rest_notyaml.yaml
    @@ -0,0 +1,20 @@
    +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +restPort: 8001
    +query_sync:
    +  url: http://coordinator:8999/
    +  refreshInterval: 5
    +metricsNameSnakeCase: true
    +queries:
    +applicationRuntimes
    +    key name
    +    keyName app
    +    componentRuntimes
    +      type: WebAppComponentRuntime
    +      prefix: webapp_config_
    +      key: name
    +      values: [deploymentState, contextRoot, sourceInfo, openSessionsHighCount, openSessionsCurrentCount, sessionsOpenedTotalCount, sessionCookieMaxAgeSecs, sessionInvalidationIntervalSecs, sessionTimeoutSecs, singleThreadedServletPoolSize, sessionIDLength, servletReloadCheckSecs, jSPPageCheckSecs]
    +      servlets:
    +        prefix: wls_servlet_
    +        key: servletName
    +        values: [invocationTotalCount, reloadTotal, executionTimeAverage, poolMaxCapacity, executionTimeTotal, reloadTotalCount, executionTimeHigh, executionTimeLow]
    diff --git a/new-integration-tests/src/test/resources/exporter/rest_notyamlformat.yaml b/new-integration-tests/src/test/resources/exporter/rest_notyamlformat.yaml
    new file mode 100644
    index 00000000000..497f7bf1c36
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/exporter/rest_notyamlformat.yaml
    @@ -0,0 +1,4 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +just text
    diff --git a/new-integration-tests/src/test/resources/exporter/rest_oneattribval.yaml b/new-integration-tests/src/test/resources/exporter/rest_oneattribval.yaml
    new file mode 100644
    index 00000000000..3737b2af0c0
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/exporter/rest_oneattribval.yaml
    @@ -0,0 +1,17 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +query_sync:
    +  url: http://coordinator:8999/
    +  refreshInterval: 5
    +metricsNameSnakeCase: true
    +restPort: 8001
    +queries:
    +- applicationRuntimes:
    +    key: name
    +    keyName: app
    +    componentRuntimes:
    +      servlets:
    +        prefix: wls_servlet_
    +        key: servletName
    +        values: [invocationTotalCount]
    diff --git a/new-integration-tests/src/test/resources/exporter/rest_snakecasefalse.yaml b/new-integration-tests/src/test/resources/exporter/rest_snakecasefalse.yaml
    new file mode 100644
    index 00000000000..78a2b7032cf
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/exporter/rest_snakecasefalse.yaml
    @@ -0,0 +1,20 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +query_sync:
    +  url: http://coordinator:8999/
    +  refreshInterval: 5
    +restPort: 8001
    +queries:
    +- applicationRuntimes:
    +    key: name
    +    keyName: app
    +    componentRuntimes:
    +      type: WebAppComponentRuntime
    +      prefix: webapp_config_
    +      key: name
    +      values: [deploymentState, contextRoot, sourceInfo, openSessionsHighCount, openSessionsCurrentCount, sessionsOpenedTotalCount, sessionCookieMaxAgeSecs, sessionInvalidationIntervalSecs, sessionTimeoutSecs, singleThreadedServletPoolSize, sessionIDLength, servletReloadCheckSecs, jSPPageCheckSecs]
    +      servlets:
    +        prefix: wls_servlet_
    +        key: servletName
    +        values: [invocationTotalCount, reloadTotal, executionTimeAverage, poolMaxCapacity, executionTimeTotal, reloadTotalCount, executionTimeHigh, executionTimeLow]
    diff --git a/new-integration-tests/src/test/resources/exporter/rest_snakecasetrue.yaml b/new-integration-tests/src/test/resources/exporter/rest_snakecasetrue.yaml
    new file mode 100644
    index 00000000000..d7cc28d3440
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/exporter/rest_snakecasetrue.yaml
    @@ -0,0 +1,21 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +query_sync:
    +  url: http://coordinator:8999/
    +  refreshInterval: 5
    +metricsNameSnakeCase: true
    +restPort: 8001
    +queries:
    +- applicationRuntimes:
    +    key: name
    +    keyName: app
    +    componentRuntimes:
    +      type: WebAppComponentRuntime
    +      prefix: webapp_config_
    +      key: name
    +      values: [deploymentState, contextRoot, sourceInfo, openSessionsHighCount, openSessionsCurrentCount, sessionsOpenedTotalCount, sessionCookieMaxAgeSecs, sessionInvalidationIntervalSecs, sessionTimeoutSecs, singleThreadedServletPoolSize, sessionIDLength, servletReloadCheckSecs, jSPPageCheckSecs]
    +      servlets:
    +        prefix: wls_servlet_
    +        key: servletName
    +        values: [invocationTotalCount, reloadTotal, executionTimeAverage, poolMaxCapacity, executionTimeTotal, reloadTotalCount, executionTimeHigh, executionTimeLow]
    diff --git a/new-integration-tests/src/test/resources/exporter/rest_twoattribs.yaml b/new-integration-tests/src/test/resources/exporter/rest_twoattribs.yaml
    new file mode 100644
    index 00000000000..c4d597afc08
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/exporter/rest_twoattribs.yaml
    @@ -0,0 +1,17 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +query_sync:
    +  url: http://coordinator:8999/
    +  refreshInterval: 5
    +metricsNameSnakeCase: true
    +restPort: 8001
    +queries:
    +- applicationRuntimes:
    +    key: name
    +    keyName: app
    +    componentRuntimes:
    +      servlets:
    +        prefix: wls_servlet_
    +        key: servletName
    +        values: [invocationTotalCount, executionTimeAverage]
    diff --git a/new-integration-tests/src/test/resources/exporter/rest_webapp.yaml b/new-integration-tests/src/test/resources/exporter/rest_webapp.yaml
    new file mode 100644
    index 00000000000..d7cc28d3440
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/exporter/rest_webapp.yaml
    @@ -0,0 +1,21 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +query_sync:
    +  url: http://coordinator:8999/
    +  refreshInterval: 5
    +metricsNameSnakeCase: true
    +restPort: 8001
    +queries:
    +- applicationRuntimes:
    +    key: name
    +    keyName: app
    +    componentRuntimes:
    +      type: WebAppComponentRuntime
    +      prefix: webapp_config_
    +      key: name
    +      values: [deploymentState, contextRoot, sourceInfo, openSessionsHighCount, openSessionsCurrentCount, sessionsOpenedTotalCount, sessionCookieMaxAgeSecs, sessionInvalidationIntervalSecs, sessionTimeoutSecs, singleThreadedServletPoolSize, sessionIDLength, servletReloadCheckSecs, jSPPageCheckSecs]
    +      servlets:
    +        prefix: wls_servlet_
    +        key: servletName
    +        values: [invocationTotalCount, reloadTotal, executionTimeAverage, poolMaxCapacity, executionTimeTotal, reloadTotalCount, executionTimeHigh, executionTimeLow]
    diff --git a/new-integration-tests/src/test/resources/exporter/rest_workmanagers.yaml b/new-integration-tests/src/test/resources/exporter/rest_workmanagers.yaml
    new file mode 100755
    index 00000000000..1df6ac985e6
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/exporter/rest_workmanagers.yaml
    @@ -0,0 +1,15 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +query_sync:
    +  url: http://coordinator:8999/
    +  refreshInterval: 5
    +metricsNameSnakeCase: true
    +restPort: 8001
    +queries:
    +- applicationRuntimes:
    +    key: name
    +    workManagerRuntimes:
    +      prefix: workmanager_
    +      key: applicationName
    +      values: [pendingRequests, completedRequests, stuckThreadCount]
    diff --git a/new-integration-tests/src/test/resources/exporter/rest_wseeclient.yaml b/new-integration-tests/src/test/resources/exporter/rest_wseeclient.yaml
    new file mode 100644
    index 00000000000..091913b3cb1
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/exporter/rest_wseeclient.yaml
    @@ -0,0 +1,25 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +query_sync:
    +  url: http://coordinator:8999/
    +  refreshInterval: 5
    +metricsNameSnakeCase: true
    +restPort: 8001
    +queries:
    +- applicationRuntimes:
    +    key: name
    +    keyName: app
    +    componentRuntimes:
    +      key: name
    +      keyName: componentRuntime
    +      wseeClientRuntimes:
    +        key: name
    +        port:
    +          key: name
    +          keyName: wseeClientPort
    +          operations:
    +            prefix: weblogic_wsee_client_
    +            key: name
    +            keyName: operations
    +            values: [lastInvocationTime, responseErrorCount, responseTimeHigh, responseTimeTotal, responseCount, responseTimeAverage]
    diff --git a/new-integration-tests/src/test/resources/helper-files/pwd.txt b/new-integration-tests/src/test/resources/helper-files/pwd.txt
    new file mode 100644
    index 00000000000..000fba91d85
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/helper-files/pwd.txt
    @@ -0,0 +1,2 @@
    +Oradoc_db1
    +Oradoc_db1
    \ No newline at end of file
    diff --git a/new-integration-tests/src/test/resources/istio/istio-cdt-http-template-service.yaml b/new-integration-tests/src/test/resources/istio/istio-cdt-http-template-service.yaml
    new file mode 100644
    index 00000000000..68ad0ee0946
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/istio/istio-cdt-http-template-service.yaml
    @@ -0,0 +1,50 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +apiVersion: networking.istio.io/v1alpha3
    +kind: Gateway
    +metadata:
    +  name: istio-cdt-http-gateway
    +  namespace: NAMESPACE
    +spec:
    +  selector:
    +    istio: ingressgateway
    +  servers:
    +    - hosts:
    +        - 'domain1-NAMESPACE.org'
    +      port:
    +        name: http
    +        number: 80
    +        protocol: HTTP
    +---
    +apiVersion: networking.istio.io/v1alpha3
    +kind: VirtualService
    +metadata:
    +  name: istio-cdt-http-virtualservice
    +  namespace: NAMESPACE
    +spec:
    +  gateways:
    +    - istio-cdt-http-gateway
    +  hosts:
    +    - 'domain1-NAMESPACE.org'
    +  http:
    +    - match:
    +        - uri:
    +            prefix: /console
    +        - uri:
    +            prefix: /TxForward
    +        - port: 7001
    +      route:
    +        - destination:
    +            host: ADMIN_SERVICE
    +            port:
    +              number: 7001
    +
    +    - match:
    +        - uri:
    +            prefix: /TxForward
    +        - port: 8001
    +      route:
    +        - destination:
    +            host: CLUSTER_SERVICE
    +            port:
    +              number: 8001
    \ No newline at end of file
    diff --git a/new-integration-tests/src/test/resources/istio/istio-dr-template.yaml b/new-integration-tests/src/test/resources/istio/istio-dr-template.yaml
    new file mode 100644
    index 00000000000..6f7787f1e72
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/istio/istio-dr-template.yaml
    @@ -0,0 +1,17 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +apiVersion: networking.istio.io/v1alpha3
    +kind: DestinationRule
    +metadata:
    +  name: "NAMESPACE-destination-rule"
    +  namespace: "NAMESPACE"
    +spec:
    +  host: "*.NAMESPACE.svc.cluster.local"
    +  trafficPolicy:
    +    portLevelSettings:
    +    - port:
    +        number: 7001
    +      tls: {}
    +    tls:
    +      mode: ISTIO_MUTUAL
    diff --git a/new-integration-tests/src/test/resources/istio/istio-http-template.yaml b/new-integration-tests/src/test/resources/istio/istio-http-template.yaml
    new file mode 100644
    index 00000000000..90552059716
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/istio/istio-http-template.yaml
    @@ -0,0 +1,51 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +apiVersion: networking.istio.io/v1alpha3
    +kind: Gateway
    +metadata:
    +  name: NAMESPACE-istio-http-gateway
    +  namespace: NAMESPACE
    +spec:
    +  selector:
    +    istio: ingressgateway
    +  servers:
    +    - hosts:
    +        - 'NAMESPACE.org'
    +      port:
    +        name: http
    +        number: 80
    +        protocol: HTTP
    +---
    +apiVersion: networking.istio.io/v1alpha3
    +kind: VirtualService
    +metadata:
    +  name: NAMESPACE-istio-http-virtualservice
    +  namespace: NAMESPACE
    +spec:
    +  gateways:
    +    - NAMESPACE-istio-http-gateway
    +  hosts:
    +    - 'NAMESPACE.org'
    +  http:
    +    - match:
    +        - uri:
    +            prefix: /console
    +        - uri:
    +            prefix: /management
    +        - port: 7001
    +      route:
    +        - destination:
    +            host: ADMIN_SERVICE
    +            port:
    +              number: 7001
    +
    +    - match:
    +        - uri:
    +            prefix: /testwebapp
    +        - port: 8001
    +      route:
    +        - destination:
    +            host: CLUSTER_SERVICE
    +            port:
    +              number: 8001
    diff --git a/new-integration-tests/src/test/resources/istio/istio-tcp-template.yaml b/new-integration-tests/src/test/resources/istio/istio-tcp-template.yaml
    new file mode 100644
    index 00000000000..bd650107eca
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/istio/istio-tcp-template.yaml
    @@ -0,0 +1,37 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +apiVersion: networking.istio.io/v1alpha3
    +kind: Gateway
    +metadata:
    +  name: NAMESPACE-istio-tcp-gateway
    +  namespace: NAMESPACE
    +spec:
    +  selector:
    +    istio: ingressgateway
    +  servers:
    +    - hosts:
    +        - 'NAMESPACE.org'
    +      port:
    +        name: tcp
    +        number: TCP_PORT
    +        protocol: TCP
    +---
    +apiVersion: networking.istio.io/v1alpha3
    +kind: VirtualService
    +metadata:
    +  name: NAMESPACE-istio-tcp-virtualservice
    +  namespace: NAMESPACE
    +spec:
    +  gateways:
    +    - NAMESPACE-istio-tcp-gateway
    +  hosts:
    +    - 'NAMESPACE.org'
    +  tcp:
    +    - match:
    +        - port: TCP_PORT
    +      route:
    +        - destination:
    +            host: ADMIN_SERVICE
    +            port:
    +              number: TCP_PORT
    diff --git a/new-integration-tests/src/test/resources/junit-platform.properties b/new-integration-tests/src/test/resources/junit-platform.properties
    new file mode 100644
    index 00000000000..ac7d795a0f5
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/junit-platform.properties
    @@ -0,0 +1,5 @@
    +junit.jupiter.execution.parallel.enabled = ${PARALLEL_CLASSES}
    +junit.jupiter.execution.parallel.mode.default = same_thread
    +junit.jupiter.execution.parallel.mode.classes.default = concurrent
    +junit.jupiter.execution.parallel.config.strategy=fixed
    +junit.jupiter.execution.parallel.config.fixed.parallelism=${NUMBER_OF_THREADS}
    \ No newline at end of file
    diff --git a/new-integration-tests/src/test/resources/python-scripts/create-jdbc-resource.py b/new-integration-tests/src/test/resources/python-scripts/create-jdbc-resource.py
    new file mode 100644
    index 00000000000..b6e99d0b17c
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/python-scripts/create-jdbc-resource.py
    @@ -0,0 +1,51 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +  
    +def createDataSource(dsName, dsURL, dsDriver, dsUser, dsPassword, dsTarget):
    +    cd('/')
    +    cmo.createJDBCSystemResource(dsName)
    +    cd('/JDBCSystemResources/'+dsName+'/JDBCResource/'+dsName)
    +    cmo.setName(dsName)
    +    
    +    cd('/JDBCSystemResources/'+dsName+'/JDBCResource/'+dsName+'/JDBCDataSourceParams/'+dsName)
    +    set('JNDINames',jarray.array([String('jdbc/'+dsName)], String))
    +    
    +    cd('/JDBCSystemResources/'+dsName+'/JDBCResource/'+dsName)
    +    cmo.setDatasourceType('GENERIC')
    +    
    +    cd('/JDBCSystemResources/'+dsName+'/JDBCResource/'+dsName+'/JDBCDriverParams/'+dsName)
    +    cmo.setUrl(dsURL)
    +    
    +    cmo.setDriverName(dsDriver)
    +    set('Password', dsPassword)
    +    
    +    cd('/JDBCSystemResources/'+dsName+'/JDBCResource/'+dsName+'/JDBCConnectionPoolParams/'+dsName)
    +    cmo.setTestTableName('SQL SELECT 1\r\n\r\n')
    +    
    +    cd('/JDBCSystemResources/'+dsName+'/JDBCResource/'+dsName+'/JDBCDriverParams/'+dsName+'/Properties/'+dsName)
    +    cmo.createProperty('user')
    +    
    +    cd('/JDBCSystemResources/'+dsName+'/JDBCResource/'+dsName+'/JDBCDriverParams/'+dsName+'/Properties/'+dsName+'/Properties/user')
    +    cmo.setValue(dsUser)
    +    
    +    cd('/JDBCSystemResources/'+dsName+'/JDBCResource/'+dsName+'/JDBCDataSourceParams/'+dsName)
    +    cmo.setGlobalTransactionsProtocol('OnePhaseCommit')
    +    
    +    cd('/JDBCSystemResources/'+dsName)
    +    set('Targets',jarray.array([ObjectName('com.bea:Name=' + dsTarget + ',Type=Cluster')], ObjectName))
    +
    +if __name__== "main":
    +  admin_t3_url = 't3://'+admin_host+':'+admin_port
    +  try:
    +    connect(admin_username, admin_password, admin_t3_url)
    +    edit()
    +    startEdit()
    +    createDataSource(dsName, dsUrl, dsDriver, dsUser, dsPassword, dsTarget)
    +    activate()
    +    disconnect()
    +    exit()
    +  except:
    +    print 'Creating JDBC datasource failed'
    +    print dumpStack()
    +    apply(traceback.print_exception, sys.exc_info())
    +    exit(exitcode=1)
    \ No newline at end of file
    diff --git a/new-integration-tests/src/test/resources/python-scripts/introspect_version_script.py b/new-integration-tests/src/test/resources/python-scripts/introspect_version_script.py
    index 0feddf33553..831dc94237e 100644
    --- a/new-integration-tests/src/test/resources/python-scripts/introspect_version_script.py
    +++ b/new-integration-tests/src/test/resources/python-scripts/introspect_version_script.py
    @@ -45,6 +45,39 @@ def change_admin_port():
         apply(traceback.print_exception, sys.exc_info())
         exit(exitcode=1)
     
    +def create_static_cluster():
    +  try:    
    +    connect_to_adminserver()
    +    edit()
    +    startEdit()
    +    cd('/')
    +    cmo.createCluster(cluster_name)
    +    cd('/Clusters/' + cluster_name)
    +    cmo.setClusterMessagingMode('unicast')
    +
    +    for count in range(1, int(server_count) + 1):
    +      server = server_prefix + str(count)
    +      cd('/')
    +      cmo.createServer(server)
    +
    +      cd('/Servers/' + server)
    +      cmo.setListenAddress('')
    +      cmo.setListenPort(8001)
    +      cmo.setCluster(getMBean('/Clusters/' + cluster_name))
    +
    +    save()
    +    activate()
    +    disconnect()
    +  except NameError, e:
    +    print('Apparently properties not set.')
    +    print('Please check the property: ', sys.exc_info()[0], sys.exc_info()[1])
    +    exit(exitcode=1)
    +  except:
    +    print 'Creating new cluster ' + cluster_name + ' failed'
    +    print dumpStack()
    +    apply(traceback.print_exception, sys.exc_info())
    +    exit(exitcode=1)
    +
     def connect_to_adminserver():
       try:
         if connected == 'false':    
    @@ -73,4 +106,6 @@ def get_admin_server_name():
         change_server_count()
       if(test_name == 'change_admin_port'):
         change_admin_port()
    +  if(test_name == 'create_cluster'):
    +    create_static_cluster()
       exit()
    diff --git a/new-integration-tests/src/test/resources/python-scripts/jrf-wlst-create-domain-onpv.py b/new-integration-tests/src/test/resources/python-scripts/jrf-wlst-create-domain-onpv.py
    new file mode 100644
    index 00000000000..e56cf144005
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/python-scripts/jrf-wlst-create-domain-onpv.py
    @@ -0,0 +1,236 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +import os
    +import sys
    +
    +import com.oracle.cie.domain.script.jython.WLSTException as WLSTException
    +
    +class Infra12213Provisioner:
    +
    +    MACHINES = {
    +        'machine1' : {
    +            'NMType': 'SSL',
    +            'ListenAddress': 'localhost',
    +            'ListenPort': 5658
    +        }
    +    }
    +
    +    JRF_12213_TEMPLATES = {
    +        'baseTemplate' : '@@ORACLE_HOME@@/wlserver/common/templates/wls/wls.jar',
    +        'extensionTemplates' : [
    +            '@@ORACLE_HOME@@/oracle_common/common/templates/wls/oracle.jrf_template.jar',
    +            '@@ORACLE_HOME@@/oracle_common/common/templates/wls/oracle.jrf.ws.async_template.jar',
    +            '@@ORACLE_HOME@@/oracle_common/common/templates/wls/oracle.wsmpm_template.jar',
    +            '@@ORACLE_HOME@@/oracle_common/common/templates/wls/oracle.ums_template.jar',
    +            '@@ORACLE_HOME@@/em/common/templates/wls/oracle.em_wls_template.jar'
    +        ],
    +        'serverGroupsToTarget' : [ 'JRF-MAN-SVR', 'WSMPM-MAN-SVR' ]
    +    }
    +
    +    def __init__(self, oracleHome, javaHome, domainParentDir, adminListenPort, adminName, managedNameBase, managedServerPort, prodMode, managedCount, clusterName):
    +        self.oracleHome = self.validateDirectory(oracleHome)
    +        self.javaHome = self.validateDirectory(javaHome)
    +        self.domainParentDir = self.validateDirectory(domainParentDir, create=True)
    +        return
    +
    +    def createInfraDomain(self, domainName, user, password, db, dbPrefix, dbPassword, adminListenPort, adminName,
    +                          managedNameBase, managedServerPort, prodMode, managedCount, clusterName,
    +                          exposeAdminT3Channel=None, t3ChannelPublicAddress=None, t3ChannelPort=None):
    +        domainHome = self.createBaseDomain(domainName, user, password, adminListenPort, adminName, managedNameBase,
    +                                           managedServerPort, prodMode, managedCount, clusterName
    +                                           )
    +        self.extendDomain(domainHome, db, dbPrefix, dbPassword, exposeAdminT3Channel, t3ChannelPublicAddress,
    +                          t3ChannelPort)
    +
    +    def createBaseDomain(self, domainName, user, password, adminListenPort, adminName, managedNameBase, managedServerPort, prodMode, managedCount, clusterName):
    +        baseTemplate = self.replaceTokens(self.JRF_12213_TEMPLATES['baseTemplate'])
    +
    +        readTemplate(baseTemplate)
    +        setOption('DomainName', domainName)
    +        setOption('JavaHome', self.javaHome)
    +        if (prodMode == 'true'):
    +            setOption('ServerStartMode', 'prod')
    +        else:
    +            setOption('ServerStartMode', 'dev')
    +        set('Name', domainName)
    +
    +        admin_port = int(adminListenPort)
    +        ms_port    = int(managedServerPort)
    +        ms_count   = int(managedCount)
    +
    +        # Create Admin Server
    +        # =======================
    +        print 'Creating Admin Server...'
    +        cd('/Servers/AdminServer')
    +        #set('ListenAddress', '%s-%s' % (domain_uid, admin_server_name_svc))
    +        set('ListenPort', admin_port)
    +        set('Name', adminName)
    +
    +        # Define the user password for weblogic
    +        # =====================================
    +        cd('/Security/' + domainName + '/User/weblogic')
    +        set('Name', user)
    +        set('Password', password)
    +
    +        # Create a cluster
    +        # ======================
    +        print 'Creating cluster...'
    +        cd('/')
    +        cl=create(clusterName, 'Cluster')
    +
    +        # Create managed servers
    +        for index in range(0, ms_count):
    +            cd('/')
    +            msIndex = index+1
    +            cd('/')
    +            name = '%s%s' % (managedNameBase, msIndex)
    +            create(name, 'Server')
    +            cd('/Servers/%s/' % name )
    +            print('managed server name is %s' % name);
    +            set('ListenPort', ms_port)
    +            set('NumOfRetriesBeforeMSIMode', 0)
    +            set('RetryIntervalBeforeMSIMode', 1)
    +            set('Cluster', clusterName)
    +
    +        # Create Node Manager
    +        # =======================
    +        print 'Creating Node Managers...'
    +        for machine in self.MACHINES:
    +            cd('/')
    +            create(machine, 'Machine')
    +            cd('Machine/' + machine)
    +            create(machine, 'NodeManager')
    +            cd('NodeManager/' + machine)
    +            for param in self.MACHINES[machine]:
    +                set(param, self.MACHINES[machine][param])
    +
    +
    +        setOption('OverwriteDomain', 'true')
    +        domainHome = self.domainParentDir + '/' + domainName
    +        print 'Will create Base domain at ' + domainHome
    +
    +        print 'Writing base domain...'
    +        writeDomain(domainHome)
    +        closeTemplate()
    +        print 'Base domain created at ' + domainHome
    +        return domainHome
    +
    +
    +    def extendDomain(self, domainHome, db, dbPrefix, dbPassword, exposeAdminT3Channel, t3ChannelPublicAddress,
    +                     t3ChannelPort):
    +        print 'Extending domain at ' + domainHome
    +        print 'Database  ' + db
    +        readDomain(domainHome)
    +        setOption('AppDir', self.domainParentDir + '/applications')
    +
    +        print 'ExposeAdminT3Channel %s with %s:%s ' % (exposeAdminT3Channel, t3ChannelPublicAddress, t3ChannelPort)
    +        if 'true' == exposeAdminT3Channel:
    +            self.enable_admin_channel(t3ChannelPublicAddress, t3ChannelPort)
    +
    +        print 'Applying JRF templates...'
    +        for extensionTemplate in self.JRF_12213_TEMPLATES['extensionTemplates']:
    +            addTemplate(self.replaceTokens(extensionTemplate))
    +
    +        print 'Extension Templates added'
    +
    +        print 'Configuring the Service Table DataSource...'
    +        fmwDb = 'jdbc:oracle:thin:@' + db
    +        print 'fmwDatabase  ' + fmwDb
    +        cd('/JDBCSystemResource/LocalSvcTblDataSource/JdbcResource/LocalSvcTblDataSource')
    +        cd('JDBCDriverParams/NO_NAME_0')
    +        set('DriverName', 'oracle.jdbc.OracleDriver')
    +        set('URL', fmwDb)
    +        set('PasswordEncrypted', dbPassword)
    +
    +        stbUser = dbPrefix + '_STB'
    +        cd('Properties/NO_NAME_0/Property/user')
    +        set('Value', stbUser)
    +
    +        print 'Getting Database Defaults...'
    +        getDatabaseDefaults()
    +
    +        print 'Targeting Server Groups...'
    +        managedName= '%s%s' % (managedNameBase, 1)
    +        print "Set CoherenceClusterSystemResource to defaultCoherenceCluster for server:" + managedName
    +        serverGroupsToTarget = list(self.JRF_12213_TEMPLATES['serverGroupsToTarget'])
    +        cd('/')
    +        setServerGroups(managedName, serverGroupsToTarget)
    +        print "Set CoherenceClusterSystemResource to defaultCoherenceCluster for server:" + managedName
    +        cd('/Servers/' + managedName)
    +        set('CoherenceClusterSystemResource', 'defaultCoherenceCluster')
    +
    +        print 'Targeting Cluster ...'
    +        cd('/')
    +        print "Set CoherenceClusterSystemResource to defaultCoherenceCluster for cluster:" + clusterName
    +        cd('/Cluster/' + clusterName)
    +        set('CoherenceClusterSystemResource', 'defaultCoherenceCluster')
    +        print "Set WLS clusters as target of defaultCoherenceCluster:" + clusterName
    +        cd('/CoherenceClusterSystemResource/defaultCoherenceCluster')
    +        set('Target', clusterName)
    +
    +        print 'Preparing to update domain...'
    +        updateDomain()
    +        print 'Domain updated successfully'
    +        closeDomain()
    +        return
    +
    +
    +    ###########################################################################
    +    # Helper Methods                                                          #
    +    ###########################################################################
    +
    +    def validateDirectory(self, dirName, create=False):
    +        directory = os.path.realpath(dirName)
    +        if not os.path.exists(directory):
    +            if create:
    +                os.makedirs(directory)
    +            else:
    +                message = 'Directory ' + directory + ' does not exist'
    +                raise WLSTException(message)
    +        elif not os.path.isdir(directory):
    +            message = 'Directory ' + directory + ' is not a directory'
    +            raise WLSTException(message)
    +        return self.fixupPath(directory)
    +
    +
    +    def fixupPath(self, path):
    +        result = path
    +        if path is not None:
    +            result = path.replace('\\', '/')
    +        return result
    +
    +
    +    def replaceTokens(self, path):
    +        result = path
    +        if path is not None:
    +            result = path.replace('@@ORACLE_HOME@@', oracleHome)
    +        return result
    +
    +    def enable_admin_channel(self, admin_channel_address, admin_channel_port):
    +        if admin_channel_address == None or admin_channel_port == 'None':
    +            return
    +        cd('/')
    +        admin_server_name = get('AdminServerName')
    +        print('setting admin server t3channel for ' + admin_server_name)
    +        cd('/Servers/' + admin_server_name)
    +        create('T3Channel', 'NetworkAccessPoint')
    +        cd('/Servers/' + admin_server_name + '/NetworkAccessPoint/T3Channel')
    +        set('ListenPort', int(admin_channel_port))
    +        set('PublicPort', int(admin_channel_port))
    +        set('PublicAddress', admin_channel_address)
    +
    +#############################
    +# Entry point to the script #
    +#############################
    +
    +script_name = 'jrf-wlst-create-domain-onpv.py'
    +
    +def usage():
    +  print 'Call script as: '
    +  print 'wlst.sh ' + script_name + ' -skipWLSModuleScanning -loadProperties domain.properties'
    +
    +provisioner = Infra12213Provisioner(oracleHome, javaHome, domainParentDir, adminListenPort, adminName, managedNameBase, managedServerPort, prodMode, managedCount, clusterName)
    +provisioner.createInfraDomain(domainName, domainUser, domainPassword, rcuDb, rcuSchemaPrefix, rcuSchemaPassword,
    +                              adminListenPort, adminName, managedNameBase, managedServerPort, prodMode, managedCount,
    +                              clusterName, exposeAdminT3Channel, t3ChannelPublicAddress, t3ChannelPort)
    \ No newline at end of file
    diff --git a/new-integration-tests/src/test/resources/python-scripts/wldf.py b/new-integration-tests/src/test/resources/python-scripts/wldf.py
    new file mode 100644
    index 00000000000..735d798bee9
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/python-scripts/wldf.py
    @@ -0,0 +1,122 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +from java.util import Properties
    +import sys, socket
    +import os
    +import time as systime
    +
    +k8s_master_host=os.environ.get('KUBERNETES_SERVICE_HOST')
    +k8s_master_port=os.environ.get('KUBERNETES_SERVICE_PORT')
    +k8s_master="https://"+k8s_master_host+":"+k8s_master_port
    +operator_cert_data=os.environ.get('INTERNAL_OPERATOR_CERT')
    +domain_home=os.environ.get('DOMAIN_HOME')
    +
    +adminUsername=sys.argv[1]
    +adminPassword=sys.argv[2]
    +adminUrl=sys.argv[3]
    +scaleAction=sys.argv[4]
    +domainUid=sys.argv[5]
    +clusterName=sys.argv[6]
    +domainNamespace=sys.argv[7]
    +opNamespace=sys.argv[8]
    +operator_service_account=sys.argv[9]
    +scaling_size=sys.argv[10]
    +myAppName=sys.argv[11]
    +
    +wldfname = 'Scaling' + clusterName
    +scriptAction = 'ScriptAction' + scaleAction
    +connect(adminUsername,adminPassword,adminUrl)
    +print "Looking up WLDF System Resource: " + wldfname
    +
    +edit()
    +startEdit()
    +
    +wldfSysResource=cmo.lookupWLDFSystemResource(wldfname)
    +if(wldfSysResource != None):
    +  print "Deleting the existing WLDFSystemResource ..."
    +  cmo.destroyWLDFSystemResource(getMBean('WLDFSystemResources/' + wldfname))
    +  save()
    +  activate(block='true')
    +
    +startEdit()
    +as_bean=getMBean('/Servers/admin-server')
    +wldfSysResource=cmo.createWLDFSystemResource(wldfname)
    +wldfSysResource.addTarget(as_bean)
    +wldfResource = wldfSysResource.getWLDFResource()
    +print('Configuring New WLDF System Resource');
    +
    +wn1 = wldfResource.getWatchNotification()
    +scriptAct = wn1.createScriptAction(scriptAction)
    +scriptAct.setEnabled(true)
    +scriptAct.setTimeout(0)
    +scriptAct.setWorkingDirectory(domain_home + '/bin/scripts')
    +scriptAct.setPathToScript(domain_home + '/bin/scripts/scalingAction.sh')
    +props = Properties()
    +props.setProperty("INTERNAL_OPERATOR_CERT",  operator_cert_data);
    +scriptAct.setEnvironment(props)
    +
    +params=['--action=%s' %scaleAction]
    +params.append('--domain_uid=%s' %domainUid)
    +params.append('--cluster_name=%s' %clusterName)
    +params.append('--wls_domain_namespace=%s' %domainNamespace)
    +params.append('--operator_namespace=%s' %opNamespace)
    +params.append('--operator_service_account=%s' %operator_service_account)
    +params.append('--scaling_size=%s' %scaling_size)
    +params.append('--kubernetes_master=%s' %k8s_master)
    +scriptAct.setParameters(params)
    +
    +wh1 = wn1.createWatch('myScalePolicy')
    +wh1.setRuleType('Harvester')
    +wh1.setExpressionLanguage('EL')
    +wh1.setEnabled(true)
    +wh1.setRuleExpression("wls:ClusterGenericMetricRule('" + clusterName + "','com.bea:Type=WebAppComponentRuntime,ApplicationRuntime=" + myAppName + ",*','OpenSessionsCurrentCount','>=',0.01,5,'1 seconds','10 seconds')")
    +wh1.getSchedule().setMinute("*");
    +wh1.getSchedule().setSecond("*/15");
    +wh1.setAlarmType('AutomaticReset');
    +wh1.setAlarmResetPeriod(60000)
    +wh1.addNotification(scriptAct)
    +
    +save()
    +activate(block='true')
    +
    +print "verify the policy and script action is enabled"
    +cd("WLDFSystemResources/" + wldfname + "/WLDFResource/" + wldfname + "/WatchNotification/" + wldfname + "/Watches/myScalePolicy")
    +maxwait=300
    +isEnabled=cmo.isEnabled()
    +
    +while(isEnabled != 1) and (maxwait > 0):
    +  print isEnabled
    +  maxwait -= 1
    +  systime.sleep(1)
    +  isEnabled=cmo.isEnabled()
    +
    +print "myScalePolicy is enabled"
    +
    +cd("/WLDFSystemResources/" + wldfname + "/WLDFResource/" + wldfname + "/WatchNotification/" + wldfname + "/ScriptActions/" + scriptAction)
    +isEnabled = cmo.isEnabled()
    +
    +while(isEnabled != 1) and (maxwait > 0):
    +  print isEnabled
    +  maxwait -= 1
    +  systime.sleep(1)
    +  isEnabled=cmo.isEnabled()
    +
    +print "scriptAction " + scriptAction + " is enabled"
    +
    +print "wait for harvester watch to become active"
    +
    +domainRuntime()
    +
    +cd('ServerRuntimes/admin-server/WLDFRuntime/WLDFRuntime/WLDFWatchNotificationRuntime/WatchNotification')
    +
    +numWatchEval=cmo.getTotalHarvesterWatchEvaluations()
    +
    +while(numWatchEval < 1) and (maxwait > 0):
    +  print numWatchEval
    +  maxwait -= 1
    +  systime.sleep(1)
    +  numWatchEval=cmo.getTotalHarvesterWatchEvaluations()
    +
    +print "wldf.py done numWatchEval is ", numWatchEval, " maxwait is ", maxwait
    +
    diff --git a/new-integration-tests/src/test/resources/python-scripts/wlst-create-istio-domain-onpv.py b/new-integration-tests/src/test/resources/python-scripts/wlst-create-istio-domain-onpv.py
    new file mode 100644
    index 00000000000..a747b9554f1
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/python-scripts/wlst-create-istio-domain-onpv.py
    @@ -0,0 +1,114 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +import sys, traceback
    +
    +script_name = 'wlst-create-istio-domain-onpv.py'
    +
    +def usage():
    +  print 'Call script as: '
    +  print 'wlst.sh ' + script_name + ' -skipWLSModuleScanning -loadProperties domain.properties'
    +
    +def toDNS1123Legal(address):
    +  return address.lower().replace('_','-')
    +
    +def create_domain():
    +  # Open default domain template
    +  # ============================
    +  print('Reading default domain template')
    +  readTemplate("/u01/oracle/wlserver/common/templates/wls/wls.jar")
    +
    +  print('Set domain name')
    +  set('Name', domain_name)
    +  setOption('DomainName', domain_name)
    +
    +  print('Configuring the Administration Server')
    +  cd('/Servers/AdminServer')
    +  set('ListenPort', int(admin_server_port))
    +  set('Name', admin_server_name)
    +
    +  # from create-weblogic-domain/domain-home-on-pv/wlst/istio-fix-domain.py
    +  print('Configuring network access point T3Channel for istio')
    +  cd('/Servers/' + admin_server_name)
    +  create('T3Channel', 'NetworkAccessPoint')
    +  cd('/Servers/%s/NetworkAccessPoints/T3Channel' % admin_server_name)
    +  set('PublicPort', int(admin_t3_channel_port))
    +  set('PublicAddress', toDNS1123Legal(domain_uid + '-' + admin_server_name))
    +  set('ListenAddress', '127.0.0.1')
    +  set('ListenPort', int(admin_t3_channel_port))
    +
    +  print('Set the admin user username and password')  
    +  cd('/Security/%s/User/weblogic' % domain_name)
    +  cmo.setName(admin_username)
    +  cmo.setPassword(admin_password)
    +
    +  print('Set option to overwrite the domain  ')
    +  setOption('OverwriteDomain', 'true')
    +
    +
    +  print('Configuring a dynamic cluster %s ' % cluster_name)
    +  cd('/')
    +  cl=create(cluster_name, 'Cluster') 
    +
    +  template_name = cluster_name + "-template"
    +  print('Creating server template: %s ' % template_name)
    +  st=create(template_name, 'ServerTemplate')
    +  print('Done creating server template: %s' % template_name)
    +  cd('/ServerTemplates/%s' % template_name)
    +  print('Set managed server port in template')
    +  cmo.setListenPort(int(managed_server_port))
    +  cmo.setCluster(cl)
    +
    +  template_channel_name = "ms-nap"
    +  print('Creating server template NAP: %s' % cluster_name + "-NAP")
    +  create(template_channel_name, 'NetworkAccessPoint')
    +  cd('NetworkAccessPoints/%s' % template_channel_name)
    +  #set('PublicPort', int(managed_server_port) + 10)
    +  set('ListenPort', int(managed_server_port) + 10)
    +  print('Done creating server template NAP: %s' % cluster_name + "-NAP")
    +  print('Done setting attributes for server template: %s' % template_name);
    +
    +  cd('/Clusters/%s' % cluster_name)
    +  create(cluster_name, 'DynamicServers')
    +  cd('DynamicServers/%s' % cluster_name)
    +  set('ServerTemplate', st)
    +  set('ServerNamePrefix', managed_server_name_base)
    +  set('DynamicClusterSize', int(number_of_ms))
    +  set('MaxDynamicClusterSize', int(number_of_ms))
    +  set('CalculatedListenPorts', false)
    +
    +  print('Done setting attributes for Dynamic Cluster: %s' % cluster_name);
    +
    +  print('Writing domain in disk %s' % domain_path + os.path.sep + domain_name)
    +  writeDomain(domain_path + os.path.sep + domain_name)
    +  closeTemplate()
    +  print('Domain Created')
    +
    +  print('Update domain to enable production mode')
    +  readDomain(domain_path + os.path.sep + domain_name)
    +  cd('/')
    +  if production_mode_enabled == "true":
    +    cmo.setProductionModeEnabled(true)
    +  else: 
    +    cmo.setProductionModeEnabled(false)
    +  updateDomain()
    +  closeDomain()
    +  print 'Domain Updated'
    +
    +
    +def main():
    +  try:
    +    #Create domain offline    
    +    create_domain()
    +  except NameError, e:
    +    print('Apparently properties not set.')
    +    print('Please check the property: ', sys.exc_info()[0], sys.exc_info()[1])
    +    usage()
    +    exit(exitcode=1)
    +  except:
    +    apply(traceback.print_exception, sys.exc_info())
    +    exit(exitcode=1)
    +
    +#call main()
    +main()
    +exit()
    diff --git a/new-integration-tests/src/test/resources/wdt-models/coherence-wdt-config.properties b/new-integration-tests/src/test/resources/wdt-models/coherence-wdt-config.properties
    new file mode 100644
    index 00000000000..168c424be7a
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/wdt-models/coherence-wdt-config.properties
    @@ -0,0 +1,6 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +AdminUserName=weblogic
    +AdminPassword=welcome1
    +DomainHome=/u01/oracle/user_projects/domains/coh-domain1
    \ No newline at end of file
    diff --git a/new-integration-tests/src/test/resources/wdt-models/coherence-wdt-config.yaml b/new-integration-tests/src/test/resources/wdt-models/coherence-wdt-config.yaml
    new file mode 100644
    index 00000000000..61b4bf89e19
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/wdt-models/coherence-wdt-config.yaml
    @@ -0,0 +1,56 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +domainInfo:
    +    AdminUserName: '@@PROP:AdminUserName@@'
    +    AdminPassword: '@@PROP:AdminPassword@@'
    +    ServerStartMode: 'prod'
    +topology:
    +    AdminServerName: 'admin-server'
    +    ProductionModeEnabled: true
    +    Log:
    +        FileName: domain1.log
    +    NMProperties:
    +        JavaHome: /usr/java/jdk1.8.0_211
    +        LogFile: '@@PROP:DomainHome@@/nodemanager/nodemanager.log'
    +        DomainsFile: '@@PROP:DomainHome@@/nodemanager/nodemanager.domains'
    +        NodeManagerHome: '@@PROP:DomainHome@@/nodemanager'
    +        weblogic.StartScriptName: startWebLogic.sh
    +    Cluster:
    +        'cluster-1':
    +            CoherenceClusterSystemResource: CoherenceCluster
    +            DynamicServers:
    +                ServerNamePrefix: 'managed-server'
    +                MaxDynamicClusterSize: 5
    +                CalculatedListenPorts: false
    +                MaximumDynamicServerCount: 5
    +                ServerTemplate: 'cluster-1-template'
    +                DynamicClusterSize: 5
    +    Server:
    +        'admin-server':
    +            NetworkAccessPoint:
    +                T3Channel:
    +                    PublicPort: 30012
    +                    ListenPort: 30012
    +                    PublicAddress: kubernetes
    +    ServerTemplate:
    +        'cluster-1-template':
    +            ListenPort: 8001
    +            Cluster: 'cluster-1'
    +            JTAMigratableTarget:
    +                Cluster: 'cluster-1'
    +            SSL:
    +                ListenPort: 8100
    +resources:
    +    CoherenceClusterSystemResource:
    +        CoherenceCluster:
    +            CoherenceResource:
    +                CoherenceClusterParams:
    +                    ClusteringMode: unicast
    +                    ClusterListenPort: 7574
    +appDeployments:
    +    Application:
    +        'coh-proxy':
    +            SourcePath: 'wlsdeploy/applications/coherence-proxy-server.gar'
    +            ModuleType: gar
    +            Target: 'cluster-1'
    diff --git a/new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain1.properties b/new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain1.properties
    new file mode 100644
    index 00000000000..64c25b13bb4
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain1.properties
    @@ -0,0 +1,7 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +DOMAIN_NAME=domain1
    +ADMIN_USERNAME=weblogic
    +ADMIN_PASSWORD=welcome1
    +
    diff --git a/new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain1.yaml b/new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain1.yaml
    new file mode 100644
    index 00000000000..5e0971a1524
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain1.yaml
    @@ -0,0 +1,35 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +domainInfo:
    +  AdminUserName: '@@PROP:ADMIN_USERNAME@@'
    +  AdminPassword: '@@PROP:ADMIN_PASSWORD@@'
    +  ServerStartMode: 'prod'
    +
    +topology:
    +  Name: '@@PROP:DOMAIN_NAME@@'
    +  AdminServerName: "admin-server"
    +  Cluster:
    +    "cluster-1":
    +      DynamicServers:
    +        ServerTemplate:  "cluster-1-template"
    +        ServerNamePrefix: "managed-server"
    +        DynamicClusterSize: 5
    +        MaxDynamicClusterSize: 5
    +        CalculatedListenPorts: false
    +  Server:
    +    "admin-server":
    +      ListenPort: 7001
    +      ExternalDNSName: '@@PROP:DOMAIN_NAME@@-admin-server.@@PROP:NAMESPACE@@'
    +  ServerTemplate:
    +    "cluster-1-template":
    +      Cluster: "cluster-1"
    +      ListenPort : 8001
    +      ExternalDNSName: '@@PROP:DOMAIN_NAME@@-managed-server${id}.@@PROP:NAMESPACE@@'
    +
    +appDeployments:
    +  Application:
    +    txforward:
    +      SourcePath: "wlsdeploy/applications/txforward.ear"
    +      ModuleType: ear
    +      Target: 'admin-server,cluster-1'
    diff --git a/new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain2.properties b/new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain2.properties
    new file mode 100644
    index 00000000000..d935e6be940
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain2.properties
    @@ -0,0 +1,6 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +DOMAIN_NAME=domain2
    +ADMIN_USERNAME=weblogic
    +ADMIN_PASSWORD=welcome1
    diff --git a/new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain2.yaml b/new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain2.yaml
    new file mode 100644
    index 00000000000..5e0971a1524
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/wdt-models/model-crossdomaintransaction-domain2.yaml
    @@ -0,0 +1,35 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +domainInfo:
    +  AdminUserName: '@@PROP:ADMIN_USERNAME@@'
    +  AdminPassword: '@@PROP:ADMIN_PASSWORD@@'
    +  ServerStartMode: 'prod'
    +
    +topology:
    +  Name: '@@PROP:DOMAIN_NAME@@'
    +  AdminServerName: "admin-server"
    +  Cluster:
    +    "cluster-1":
    +      DynamicServers:
    +        ServerTemplate:  "cluster-1-template"
    +        ServerNamePrefix: "managed-server"
    +        DynamicClusterSize: 5
    +        MaxDynamicClusterSize: 5
    +        CalculatedListenPorts: false
    +  Server:
    +    "admin-server":
    +      ListenPort: 7001
    +      ExternalDNSName: '@@PROP:DOMAIN_NAME@@-admin-server.@@PROP:NAMESPACE@@'
    +  ServerTemplate:
    +    "cluster-1-template":
    +      Cluster: "cluster-1"
    +      ListenPort : 8001
    +      ExternalDNSName: '@@PROP:DOMAIN_NAME@@-managed-server${id}.@@PROP:NAMESPACE@@'
    +
    +appDeployments:
    +  Application:
    +    txforward:
    +      SourcePath: "wlsdeploy/applications/txforward.ear"
    +      ModuleType: ear
    +      Target: 'admin-server,cluster-1'
    diff --git a/new-integration-tests/src/test/resources/wdt-models/model-multiclusterdomain-sampleapp-wls.yaml b/new-integration-tests/src/test/resources/wdt-models/model-multiclusterdomain-sampleapp-wls.yaml
    index 1810772b129..886fd814e1f 100644
    --- a/new-integration-tests/src/test/resources/wdt-models/model-multiclusterdomain-sampleapp-wls.yaml
    +++ b/new-integration-tests/src/test/resources/wdt-models/model-multiclusterdomain-sampleapp-wls.yaml
    @@ -41,3 +41,8 @@ appDeployments:
                 SourcePath: "wlsdeploy/applications/sample-app.ear"
                 ModuleType: ear
                 Target: 'cluster-1,cluster-2'
    +
    +        opensessionapp:
    +            SourcePath: "wlsdeploy/applications/opensessionapp.ear"
    +            ModuleType: ear
    +            Target: 'cluster-1,cluster-2'
    \ No newline at end of file
    diff --git a/new-integration-tests/src/test/resources/wdt-models/model.monexp.yaml b/new-integration-tests/src/test/resources/wdt-models/model.monexp.yaml
    index 9c4a920f2dd..ef6420990d4 100644
    --- a/new-integration-tests/src/test/resources/wdt-models/model.monexp.yaml
    +++ b/new-integration-tests/src/test/resources/wdt-models/model.monexp.yaml
    @@ -27,7 +27,7 @@ topology:
     
     appDeployments:
       Application:
    -    wlsexporter:
    +    "wls-exporter":
           SourcePath: "wlsdeploy/applications/wls-exporter.war"
           ModuleType: war
           Target: 'cluster-1'
    diff --git a/new-integration-tests/src/test/resources/wdt-models/model.stickysess.yaml b/new-integration-tests/src/test/resources/wdt-models/model.stickysess.yaml
    new file mode 100644
    index 00000000000..4e3d97b9f2d
    --- /dev/null
    +++ b/new-integration-tests/src/test/resources/wdt-models/model.stickysess.yaml
    @@ -0,0 +1,33 @@
    +# Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +domainInfo:
    +    AdminUserName: '@@SECRET:__weblogic-credentials__:username@@'
    +    AdminPassword: '@@SECRET:__weblogic-credentials__:password@@'
    +    ServerStartMode: 'prod'
    +
    +topology:
    +    Name: "wls-sessmigr-domain-1"
    +    AdminServerName: "admin-server"
    +    Cluster:
    +        "cluster-1":
    +            DynamicServers:
    +                ServerTemplate:  "cluster-1-template"
    +                ServerNamePrefix: "managed-server"
    +                DynamicClusterSize: 5
    +                MaxDynamicClusterSize: 5
    +                CalculatedListenPorts: false
    +    Server:
    +        "admin-server":
    +            ListenPort: 7001
    +    ServerTemplate:
    +        "cluster-1-template":
    +            Cluster: "cluster-1"
    +            ListenPort : 8001
    +
    +appDeployments:
    +    Application:
    +        myear:
    +            SourcePath: "wlsdeploy/applications/stickysess-app.ear"
    +            ModuleType: ear
    +            Target: 'cluster-1'
    diff --git a/operator/pom.xml b/operator/pom.xml
    index dff5489df80..33ce5b8cc24 100644
    --- a/operator/pom.xml
    +++ b/operator/pom.xml
    @@ -7,7 +7,7 @@
       
         oracle.kubernetes
         operator-parent
    -    2.6.0
    +    3.0.0
       
     
       weblogic-kubernetes-operator
    @@ -280,11 +280,7 @@
         
         
           org.glassfish
    -      javax.json
    -    
    -    
    -      joda-time
    -      joda-time
    +      jakarta.json
         
         
           org.apache.commons
    @@ -321,10 +317,6 @@
           javax
           javaee-web-api
         
    -    
    -      org.slf4j
    -      slf4j-api
    -    
     
         
         
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/ConfigMapWatcher.java b/operator/src/main/java/oracle/kubernetes/operator/ConfigMapWatcher.java
    index 21eca042452..6c05212905f 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/ConfigMapWatcher.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/ConfigMapWatcher.java
    @@ -59,4 +59,9 @@ public WatchI initiateWatch(WatchBuilder watchBuilder) throws ApiEx
             .withLabelSelector(LabelConstants.CREATEDBYOPERATOR_LABEL)
             .createConfigMapWatch(ns);
       }
    +
    +  @Override
    +  public String getNamespace() {
    +    return ns;
    +  }
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/DomainProcessor.java b/operator/src/main/java/oracle/kubernetes/operator/DomainProcessor.java
    index 8c994791d9e..b02d19832e6 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/DomainProcessor.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/DomainProcessor.java
    @@ -13,11 +13,9 @@
     
     public interface DomainProcessor {
     
    -  public void makeRightDomainPresence(
    -      DomainPresenceInfo info,
    -      boolean explicitRecheck,
    -      boolean isDeleting,
    -      boolean isWillInterrupt);
    +  MakeRightDomainOperation createMakeRightOperation(DomainPresenceInfo liveInfo);
    +
    +  MakeRightDomainOperation createMakeRightOperation(Domain liveDomain);
     
       public void dispatchDomainWatch(Watch.Response item);
     
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/DomainProcessorDelegate.java b/operator/src/main/java/oracle/kubernetes/operator/DomainProcessorDelegate.java
    index f3fd8701e97..dda27a2583d 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/DomainProcessorDelegate.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/DomainProcessorDelegate.java
    @@ -8,6 +8,7 @@
     
     import io.kubernetes.client.openapi.models.V1SubjectRulesReviewStatus;
     import oracle.kubernetes.operator.helpers.KubernetesVersion;
    +import oracle.kubernetes.operator.helpers.SemanticVersion;
     import oracle.kubernetes.operator.work.FiberGate;
     import oracle.kubernetes.operator.work.Step;
     
    @@ -45,6 +46,13 @@ public interface DomainProcessorDelegate {
        */
       KubernetesVersion getVersion();
     
    +  /**
    +   * Returns the version of the operator.
    +   *
    +   * @return an object that represents the semantic version
    +   */
    +  SemanticVersion getProductVersion();
    +
       /**
        * Creates a new FiberGate.
        *
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/DomainProcessorImpl.java b/operator/src/main/java/oracle/kubernetes/operator/DomainProcessorImpl.java
    index cfc54a521c6..c701831f9cc 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/DomainProcessorImpl.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/DomainProcessorImpl.java
    @@ -7,14 +7,13 @@
     import java.util.Collection;
     import java.util.List;
     import java.util.Map;
    +import java.util.Objects;
     import java.util.Optional;
     import java.util.concurrent.ConcurrentHashMap;
    -import java.util.concurrent.ConcurrentMap;
     import java.util.concurrent.ScheduledFuture;
     import java.util.concurrent.TimeUnit;
     import java.util.concurrent.atomic.AtomicInteger;
     import java.util.function.BiConsumer;
    -import javax.annotation.Nullable;
     
     import io.kubernetes.client.openapi.models.V1ConfigMap;
     import io.kubernetes.client.openapi.models.V1ContainerState;
    @@ -42,6 +41,7 @@
     import oracle.kubernetes.operator.helpers.PodHelper;
     import oracle.kubernetes.operator.helpers.ResponseStep;
     import oracle.kubernetes.operator.helpers.ServiceHelper;
    +import oracle.kubernetes.operator.logging.LoggingContext;
     import oracle.kubernetes.operator.logging.LoggingFacade;
     import oracle.kubernetes.operator.logging.LoggingFactory;
     import oracle.kubernetes.operator.logging.LoggingFilter;
    @@ -64,8 +64,11 @@
     import oracle.kubernetes.weblogic.domain.model.AdminService;
     import oracle.kubernetes.weblogic.domain.model.Channel;
     import oracle.kubernetes.weblogic.domain.model.Domain;
    -import oracle.kubernetes.weblogic.domain.model.DomainSpec;
     
    +import static oracle.kubernetes.operator.DomainStatusUpdater.INSPECTING_DOMAIN_PROGRESS_REASON;
    +import static oracle.kubernetes.operator.LabelConstants.INTROSPECTION_STATE_LABEL;
    +import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_INTROSPECT_REQUESTED;
    +import static oracle.kubernetes.operator.ProcessingConstants.MAKE_RIGHT_DOMAIN_OPERATION;
     import static oracle.kubernetes.operator.helpers.LegalNames.toJobIntrospectorName;
     
     public class DomainProcessorImpl implements DomainProcessor {
    @@ -74,11 +77,10 @@ public class DomainProcessorImpl implements DomainProcessor {
     
       private static final Map makeRightFiberGates = new ConcurrentHashMap<>();
       private static final Map statusFiberGates = new ConcurrentHashMap<>();
    -  // Map from namespace to map of domainUID to Domain
    -  private static Map> DOMAINS =
    -        new ConcurrentHashMap<>();
    -  private static final ConcurrentMap>>
    -        statusUpdaters = new ConcurrentHashMap<>();
    +
    +  @SuppressWarnings("FieldMayBeFinal") // Map namespace to map of domainUID to Domain; tests may replace this value.
    +  private static Map> DOMAINS = new ConcurrentHashMap<>();
    +  private static final Map>> statusUpdaters = new ConcurrentHashMap<>();
       private final DomainProcessorDelegate delegate;
     
       public DomainProcessorImpl(DomainProcessorDelegate delegate) {
    @@ -89,7 +91,7 @@ private static DomainPresenceInfo getExistingDomainPresenceInfo(String ns, Strin
         return DOMAINS.computeIfAbsent(ns, k -> new ConcurrentHashMap<>()).get(domainUid);
       }
     
    -  private static void registerDomainPresenceInfo(DomainPresenceInfo info) {
    +  static void registerDomainPresenceInfo(DomainPresenceInfo info) {
         DOMAINS
               .computeIfAbsent(info.getNamespace(), k -> new ConcurrentHashMap<>())
               .put(info.getDomainUid(), info);
    @@ -112,7 +114,7 @@ private static void registerStatusUpdater(
       }
     
       private static void unregisterStatusUpdater(String ns, String domainUid) {
    -    ConcurrentMap> map = statusUpdaters.get(ns);
    +    Map> map = statusUpdaters.get(ns);
         if (map != null) {
           ScheduledFuture existing = map.remove(domainUid);
           if (existing != null) {
    @@ -123,7 +125,7 @@ private static void unregisterStatusUpdater(String ns, String domainUid) {
     
       private static void onEvent(V1Event event) {
         V1ObjectReference ref = event.getInvolvedObject();
    -    if (ref == null) {
    +    if (ref == null || ref.getName() == null) {
           return;
         }
     
    @@ -158,34 +160,52 @@ private static Step readExistingPods(DomainPresenceInfo info) {
       // pre-conditions: DomainPresenceInfo SPI
       // "principal"
       static Step bringAdminServerUp(
    -        DomainPresenceInfo info, PodAwaiterStepFactory podAwaiterStepFactory, Step next) {
    -    return Step.chain(bringAdminServerUpSteps(info, podAwaiterStepFactory, next));
    +        DomainPresenceInfo info, PodAwaiterStepFactory podAwaiterStepFactory) {
    +    return bringAdminServerUpSteps(info, podAwaiterStepFactory);
       }
     
    -  private static Step[] domainIntrospectionSteps(Step next) {
    -    List resources = new ArrayList<>();
    -    resources.add(JobHelper.deleteDomainIntrospectorJobStep(null));
    -    resources.add(JobHelper.createDomainIntrospectorJobStep(next));
    -    return resources.toArray(new Step[0]);
    +  private static Step domainIntrospectionSteps(DomainPresenceInfo info) {
    +    return Step.chain(
    +          ConfigMapHelper.readIntrospectionVersionStep(info.getNamespace(), info.getDomainUid()),
    +          new IntrospectionRequestStep(info),
    +          JobHelper.deleteDomainIntrospectorJobStep(null),
    +          JobHelper.createDomainIntrospectorJobStep(null));
       }
     
    -  private static Step[] bringAdminServerUpSteps(
    -        DomainPresenceInfo info, PodAwaiterStepFactory podAwaiterStepFactory, Step next) {
    -    List resources = new ArrayList<>();
    -    resources.add(new BeforeAdminServiceStep(null));
    -    resources.add(PodHelper.createAdminPodStep(null));
    +  private static class IntrospectionRequestStep extends Step {
    +
    +    private final String requestedIntrospectVersion;
    +
    +    public IntrospectionRequestStep(DomainPresenceInfo info) {
    +      this.requestedIntrospectVersion = info.getDomain().getIntrospectVersion();
    +    }
    +
    +    @Override
    +    public NextAction apply(Packet packet) {
    +      if (!Objects.equals(requestedIntrospectVersion, packet.get(INTROSPECTION_STATE_LABEL))) {
    +        packet.put(DOMAIN_INTROSPECT_REQUESTED, Optional.ofNullable(requestedIntrospectVersion).orElse("0"));
    +      }
    +      return doNext(packet);
    +    }
    +  }
    +
    +  private static Step bringAdminServerUpSteps(
    +        DomainPresenceInfo info, PodAwaiterStepFactory podAwaiterStepFactory) {
    +    List steps = new ArrayList<>();
    +    steps.add(new BeforeAdminServiceStep(null));
    +    steps.add(PodHelper.createAdminPodStep(null));
     
         Domain dom = info.getDomain();
         AdminServer adminServer = dom.getSpec().getAdminServer();
         AdminService adminService = adminServer != null ? adminServer.getAdminService() : null;
         List channels = adminService != null ? adminService.getChannels() : null;
         if (channels != null && !channels.isEmpty()) {
    -      resources.add(ServiceHelper.createForExternalServiceStep(null));
    +      steps.add(ServiceHelper.createForExternalServiceStep(null));
         }
     
    -    resources.add(ServiceHelper.createForServerStep(null));
    -    resources.add(new WatchPodReadyAdminStep(podAwaiterStepFactory, next));
    -    return resources.toArray(new Step[0]);
    +    steps.add(ServiceHelper.createForServerStep(null));
    +    steps.add(new WatchPodReadyAdminStep(podAwaiterStepFactory, null));
    +    return Step.chain(steps.toArray(new Step[0]));
       }
     
       private static Step bringManagedServersUp(Step next) {
    @@ -205,17 +225,19 @@ private FiberGate getStatusFiberGate(String ns) {
        * @param ns namespace
        */
       public void stopNamespace(String ns) {
    -    Map map = DOMAINS.get(ns);
    -    if (map != null) {
    -      for (DomainPresenceInfo dpi : map.values()) {
    -        Domain dom = dpi.getDomain();
    -        DomainPresenceInfo value =
    -            (dom != null)
    -                ? new DomainPresenceInfo(dom)
    -                : new DomainPresenceInfo(dpi.getNamespace(), dpi.getDomainUid());
    -        value.setDeleting(true);
    -        value.setPopulated(true);
    -        makeRightDomainPresence(value, true, true, false);
    +    try (LoggingContext stack = LoggingContext.setThreadContext().namespace(ns)) {
    +      Map map = DOMAINS.get(ns);
    +      if (map != null) {
    +        for (DomainPresenceInfo dpi : map.values()) {
    +          Domain dom = dpi.getDomain();
    +          DomainPresenceInfo value =
    +              (dom != null)
    +                  ? new DomainPresenceInfo(dom)
    +                  : new DomainPresenceInfo(dpi.getNamespace(), dpi.getDomainUid());
    +          value.setDeleting(true);
    +          value.setPopulated(true);
    +          createMakeRightOperation(value).withExplicitRecheck().forDeletion().execute();
    +        }
           }
         }
       }
    @@ -231,8 +253,10 @@ public void reportSuspendedFibers() {
                 gate.getCurrentFibers().forEach(
                     (key, fiber) -> {
                       Optional.ofNullable(fiber.getSuspendedStep()).ifPresent(suspendedStep -> {
    -                    LOGGER.fine("Namespace: " + namespace + ", DomainUid: " + key
    -                        + ", Fiber: " + fiber.toString() + " is SUSPENDED at " + suspendedStep.getName());
    +                    try (LoggingContext stack
    +                             = LoggingContext.setThreadContext().namespace(namespace).domainUid(getDomainUid(fiber))) {
    +                      LOGGER.fine("Fiber is SUSPENDED at " + suspendedStep.getName());
    +                    }
                       });
                     });
               };
    @@ -241,6 +265,13 @@ public void reportSuspendedFibers() {
         }
       }
     
    +  private String getDomainUid(Fiber fiber) {
    +    return Optional.ofNullable(fiber)
    +          .map(Fiber::getPacket)
    +          .map(p -> p.getSpi(DomainPresenceInfo.class))
    +          .map(DomainPresenceInfo::getDomainUid).orElse("");
    +  }
    +
       /**
        * Dispatch pod watch event.
        * @param item watch event
    @@ -276,7 +307,7 @@ private void processServerPodWatch(V1Pod pod, String watchType) {
             boolean removed = info.deleteServerPodFromEvent(serverName, pod);
             if (removed && info.isNotDeleting() && !info.isServerPodBeingDeleted(serverName)) {
               LOGGER.info(MessageKeys.POD_DELETED, domainUid, getNamespace(pod), serverName);
    -          makeRightDomainPresence(info, true, false, true);
    +          createMakeRightOperation(info).interrupt().withExplicitRecheck().execute();
             }
             break;
     
    @@ -347,7 +378,7 @@ public void dispatchServiceWatch(Watch.Response item) {
           case "DELETED":
             boolean removed = ServiceHelper.deleteFromEvent(info, item.object);
             if (removed && info.isNotDeleting()) {
    -          makeRightDomainPresence(info, true, false, true);
    +          createMakeRightOperation(info).interrupt().withExplicitRecheck().execute();
             }
             break;
           default:
    @@ -360,7 +391,7 @@ public void dispatchServiceWatch(Watch.Response item) {
        */
       public void dispatchConfigMapWatch(Watch.Response item) {
         V1ConfigMap c = item.object;
    -    if (c != null) {
    +    if (c != null && c.getMetadata() != null) {
           switch (item.type) {
             case "MODIFIED":
             case "DELETED":
    @@ -400,26 +431,15 @@ public void dispatchEventWatch(Watch.Response item) {
        * @param item An item received from a Watch response.
        */
       public void dispatchDomainWatch(Watch.Response item) {
    -    Domain d;
    -    String domainUid;
         switch (item.type) {
           case "ADDED":
    -        d = item.object;
    -        domainUid = d.getDomainUid();
    -        LOGGER.info(MessageKeys.WATCH_DOMAIN, domainUid);
    -        makeRightDomainPresence(new DomainPresenceInfo(d), true, false, true);
    +        handleAddedDomain(item.object);
             break;
           case "MODIFIED":
    -        d = item.object;
    -        domainUid = d.getDomainUid();
    -        LOGGER.fine(MessageKeys.WATCH_DOMAIN, domainUid);
    -        makeRightDomainPresence(new DomainPresenceInfo(d), false, false, true);
    +        handleModifiedDomain(item.object);
             break;
           case "DELETED":
    -        d = item.object;
    -        domainUid = d.getDomainUid();
    -        LOGGER.info(MessageKeys.WATCH_DOMAIN_DELETED, domainUid);
    -        makeRightDomainPresence(new DomainPresenceInfo(d), true, true, true);
    +        handleDeletedDomain(item.object);
             break;
     
           case "ERROR":
    @@ -427,6 +447,21 @@ public void dispatchDomainWatch(Watch.Response item) {
         }
       }
     
    +  private void handleAddedDomain(Domain domain) {
    +    LOGGER.info(MessageKeys.WATCH_DOMAIN, domain.getDomainUid());
    +    createMakeRightOperation(new DomainPresenceInfo(domain)).interrupt().withExplicitRecheck().execute();
    +  }
    +
    +  private void handleModifiedDomain(Domain domain) {
    +    LOGGER.fine(MessageKeys.WATCH_DOMAIN, domain.getDomainUid());
    +    createMakeRightOperation(new DomainPresenceInfo(domain)).interrupt().execute();
    +  }
    +
    +  private void handleDeletedDomain(Domain domain) {
    +    LOGGER.info(MessageKeys.WATCH_DOMAIN_DELETED, domain.getDomainUid());
    +    createMakeRightOperation(new DomainPresenceInfo(domain)).interrupt().forDeletion().withExplicitRecheck().execute();
    +  }
    +
       private void scheduleDomainStatusUpdating(DomainPresenceInfo info) {
         final OncePerMessageLoggingFilter loggingFilter = new OncePerMessageLoggingFilter();
     
    @@ -496,93 +531,174 @@ private void logThrowable(Throwable throwable) {
         }
       }
     
    +  @Override
    +  public MakeRightDomainOperationImpl createMakeRightOperation(DomainPresenceInfo liveInfo) {
    +    return new MakeRightDomainOperationImpl(liveInfo);
    +  }
    +
    +  @Override
    +  public MakeRightDomainOperation createMakeRightOperation(Domain liveDomain) {
    +    return createMakeRightOperation(new DomainPresenceInfo(liveDomain));
    +  }
    +
       /**
    -   * Begin activity to align domain status with domain resource.
    -   * @param info domain presence info
    -   * @param explicitRecheck if explicit recheck
    -   * @param isDeleting if is deleting domain
    -   * @param isWillInterrupt if will interrupt already running activities
    +   * A factory which creates and executes steps to align the cached domain status with the value read from Kubernetes.
        */
    -  public void makeRightDomainPresence(
    -      DomainPresenceInfo info,
    -      boolean explicitRecheck,
    -      boolean isDeleting,
    -      boolean isWillInterrupt) {
    -    Domain domain = info.getDomain();
    -    String ns = info.getNamespace();
    -    String domainUid = info.getDomainUid();
    +  class MakeRightDomainOperationImpl implements MakeRightDomainOperation {
    +
    +    private final DomainPresenceInfo liveInfo;
    +    private boolean explicitRecheck;
    +    private boolean deleting;
    +    private boolean willInterrupt;
    +    private boolean inspectionRun;
    +
    +    /**
    +     * Create the operation.
    +     * @param liveInfo domain presence info read from Kubernetes
    +     */
    +    MakeRightDomainOperationImpl(DomainPresenceInfo liveInfo) {
    +      this.liveInfo = liveInfo;
    +    }
    +
    +    /**
    +     * Modifies the factory to run even if the domain spec is unchanged.
    +     * @return the updated factory
    +     */
    +    @Override
    +    public MakeRightDomainOperation withExplicitRecheck() {
    +      explicitRecheck = true;
    +      return this;
    +    }
     
    -    if (delegate.isNamespaceRunning(ns)) {
    -      DomainPresenceInfo existing = getExistingDomainPresenceInfo(ns, domainUid);
    -      if (existing != null) {
    -        Domain current = existing.getDomain();
    -        if (current != null) {
    -          // Is this an outdated watch event?
    -          if (domain != null
    -              && KubernetesUtils.isFirstNewer(current.getMetadata(), domain.getMetadata())) {
    -            LOGGER.fine(MessageKeys.NOT_STARTING_DOMAINUID_THREAD, domainUid);
    -            return;
    -          }
    +    /**
    +     * Modifies the factory to handle shutting down the domain.
    +     * @return the updated factory
    +     */
    +    @Override
    +    public MakeRightDomainOperation forDeletion() {
    +      deleting = true;
    +      return this;
    +    }
     
    -          // TODO, RJE: now that we are switching to updating domain status using the separate
    -          // status-specific endpoint, Kubernetes guarantees that changes to the main endpoint
    -          // will only be for metadata and spec, so we can know that we have an important
    -          // change just by looking at metadata.generation.
    -
    -          // Has the spec actually changed? We will get watch events for status updates
    -          DomainSpec spec = domain != null ? domain.getSpec() : null;
    -          if (!explicitRecheck && spec != null && spec.equals(current.getSpec())) {
    -            // nothing in the spec has changed, but status likely did; update current
    -            existing.setDomain(domain);
    -            LOGGER.fine(MessageKeys.NOT_STARTING_DOMAINUID_THREAD, domainUid);
    -            return;
    -          }
    -        }
    -      }
    +    /**
    +     * Modifies the factory to handle shutting down the domain if the 'deleting' flag is set.
    +     * @param deleting if true, indicates that the domain is being shut down
    +     * @return the updated factory
    +     */
    +    @Override
    +    public MakeRightDomainOperation withDeleting(boolean deleting) {
    +      this.deleting = deleting;
    +      return this;
    +    }
     
    -      internalMakeRightDomainPresence(info, isDeleting, isWillInterrupt);
    +    /**
    +     * Modifies the factory to indicate that it should interrupt any current make-right thread.
    +     * @return the updated factory
    +     */
    +    @Override
    +    public MakeRightDomainOperation interrupt() {
    +      willInterrupt = true;
    +      return this;
         }
    -  }
     
    -  private void internalMakeRightDomainPresence(
    -      @Nullable DomainPresenceInfo info, boolean isDeleting, boolean isWillInterrupt) {
    -    if (info == null) {
    -      return;
    +    @Override
    +    public void execute() {
    +      if (!delegate.isNamespaceRunning(getNamespace())) {
    +        return;
    +      }
    +      if (isShouldContinue()) {
    +        internalMakeRightDomainPresence();
    +      } else {
    +        LOGGER.fine(MessageKeys.NOT_STARTING_DOMAINUID_THREAD, getDomainUid());
    +      }
         }
     
    -    String ns = info.getNamespace();
    -    String domainUid = info.getDomainUid();
    -    Domain dom = info.getDomain();
    -    if (isDeleting || delegate.isNamespaceRunning(ns)) {
    -      LOGGER.fine(MessageKeys.PROCESSING_DOMAIN, domainUid);
    -      Step strategy =
    -          new StartPlanStep(
    -              info, isDeleting ? createDomainDownPlan(info) : createDomainUpPlan(info));
    -      if (!isDeleting && dom != null) {
    -        strategy = DomainValidationSteps.createDomainValidationSteps(ns, strategy);
    +    @Override
    +    public void setInspectionRun() {
    +      inspectionRun = true;
    +    }
    +
    +    @Override
    +    public boolean wasInspectionRun() {
    +      return inspectionRun;
    +    }
    +
    +    private boolean isShouldContinue() {
    +      DomainPresenceInfo cachedInfo = getExistingDomainPresenceInfo(getNamespace(), getDomainUid());
    +      if (cachedInfo == null || cachedInfo.getDomain() == null) {
    +        return true;
    +      } else if (isCachedInfoNewer(liveInfo, cachedInfo)) {
    +        return false;  // we have already cached this
    +      } else if (explicitRecheck || isSpecChanged(liveInfo, cachedInfo)) {
    +        return true;
           }
    +      cachedInfo.setDomain(getDomain());
    +      return false;
    +    }
    +
    +    private void internalMakeRightDomainPresence() {
    +      LOGGER.fine(MessageKeys.PROCESSING_DOMAIN, getDomainUid());
     
    -      PodAwaiterStepFactory pw = delegate.getPodAwaiterStepFactory(info.getNamespace());
    -      V1SubjectRulesReviewStatus srrs = delegate.getSubjectRulesReviewStatus(info.getNamespace());
           Packet packet = new Packet();
    +      packet.put(MAKE_RIGHT_DOMAIN_OPERATION, this);
           packet
               .getComponents()
               .put(
                   ProcessingConstants.DOMAIN_COMPONENT_NAME,
    -              Component.createFor(info, delegate.getVersion(),
    -                  PodAwaiterStepFactory.class, pw,
    -                  V1SubjectRulesReviewStatus.class, srrs));
    +              Component.createFor(liveInfo, delegate.getVersion(),
    +                  PodAwaiterStepFactory.class, delegate.getPodAwaiterStepFactory(getNamespace()),
    +                  V1SubjectRulesReviewStatus.class, delegate.getSubjectRulesReviewStatus(getNamespace())));
    +
           runDomainPlan(
    -          dom,
    -          domainUid,
    -          ns,
    -          new StepAndPacket(strategy, packet),
    -          isDeleting,
    -          isWillInterrupt);
    +            getDomain(),
    +            getDomainUid(),
    +            getNamespace(),
    +            new StepAndPacket(createSteps(), packet),
    +            deleting,
    +            willInterrupt);
    +    }
    +
    +    private Domain getDomain() {
    +      return liveInfo.getDomain();
    +    }
    +
    +    private String getDomainUid() {
    +      return liveInfo.getDomainUid();
    +    }
    +
    +    private String getNamespace() {
    +      return liveInfo.getNamespace();
    +    }
    +
    +    @Override
    +    public Step createSteps() {
    +      Step strategy =
    +            new StartPlanStep(liveInfo, deleting ? createDomainDownPlan(liveInfo) : createDomainUpPlan(liveInfo));
    +      if (deleting || getDomain() == null) {
    +        return strategy;
    +      } else {
    +        return DomainValidationSteps.createDomainValidationSteps(getNamespace(), strategy);
    +      }
         }
       }
     
    -  private Step readExistingServices(DomainPresenceInfo info) {
    +  private static boolean isSpecChanged(DomainPresenceInfo liveInfo, DomainPresenceInfo cachedInfo) {
    +    // TODO, RJE: now that we are switching to updating domain status using the separate
    +    // status-specific endpoint, Kubernetes guarantees that changes to the main endpoint
    +    // will only be for metadata and spec, so we can know that we have an important
    +    // change just by looking at metadata.generation.
    +    return Optional.ofNullable(liveInfo.getDomain())
    +          .map(Domain::getSpec)
    +          .map(spec -> !spec.equals(cachedInfo.getDomain().getSpec()))
    +          .orElse(true);
    +  }
    +
    +  private static boolean isCachedInfoNewer(DomainPresenceInfo liveInfo, DomainPresenceInfo cachedInfo) {
    +    return liveInfo.getDomain() != null
    +        && KubernetesUtils.isFirstNewer(cachedInfo.getDomain().getMetadata(), liveInfo.getDomain().getMetadata());
    +  }
    +
    +  private static Step readExistingServices(DomainPresenceInfo info) {
         return new CallBuilder()
             .withLabelSelectors(
                 LabelConstants.forDomainUidSelector(info.getDomainUid()),
    @@ -632,23 +748,25 @@ public void onThrowable(Packet packet, Throwable throwable) {
                         () -> {
                           DomainPresenceInfo existing = getExistingDomainPresenceInfo(ns, domainUid);
                           if (existing != null) {
    -                        existing.setPopulated(false);
    -                        // proceed only if we have not already retried max number of times
    -                        int retryCount = existing.incrementAndGetFailureCount();
    -                        LOGGER.fine(
    -                            "Failure count for DomainPresenceInfo: "
    -                                + existing
    -                                + " is now: "
    -                                + retryCount);
    -                        if (retryCount <= DomainPresence.getDomainPresenceFailureRetryMaxCount()) {
    -                          makeRightDomainPresence(existing, true, isDeleting, false);
    -                        } else {
    -                          LOGGER.severe(
    -                              MessageKeys.CANNOT_START_DOMAIN_AFTER_MAX_RETRIES,
    -                              domainUid,
    -                              ns,
    -                              DomainPresence.getDomainPresenceFailureRetryMaxCount(),
    -                              throwable);
    +                        try (LoggingContext stack = LoggingContext.setThreadContext().namespace(ns)) {
    +                          existing.setPopulated(false);
    +                          // proceed only if we have not already retried max number of times
    +                          int retryCount = existing.incrementAndGetFailureCount();
    +                          LOGGER.fine(
    +                              "Failure count for DomainPresenceInfo: "
    +                                  + existing
    +                                  + " is now: "
    +                                  + retryCount);
    +                          if (retryCount <= DomainPresence.getDomainPresenceFailureRetryMaxCount()) {
    +                            createMakeRightOperation(existing).withDeleting(isDeleting).withExplicitRecheck().execute();
    +                          } else {
    +                            LOGGER.severe(
    +                                MessageKeys.CANNOT_START_DOMAIN_AFTER_MAX_RETRIES,
    +                                domainUid,
    +                                ns,
    +                                DomainPresence.getDomainPresenceFailureRetryMaxCount(),
    +                                throwable);
    +                          }
                             }
                           }
                         },
    @@ -665,30 +783,25 @@ public void onThrowable(Packet packet, Throwable throwable) {
       }
     
       Step createDomainUpPlan(DomainPresenceInfo info) {
    -    Domain dom = info.getDomain();
         Step managedServerStrategy =
             bringManagedServersUp(DomainStatusUpdater.createEndProgressingStep(new TailStep()));
     
    -    Step strategy =
    +    Step domainUpStrategy =
             Step.chain(
    -            domainIntrospectionSteps(
    -                new DomainStatusStep(
    -                    info,
    -                    bringAdminServerUp(
    -                        info,
    -                        delegate.getPodAwaiterStepFactory(info.getNamespace()),
    -                        managedServerStrategy))));
    -
    -    strategy =
    -        DomainStatusUpdater.createProgressingStep(
    -            DomainStatusUpdater.INSPECTING_DOMAIN_PROGRESS_REASON,
    -            true,
    -            DomainPresenceStep.createDomainPresenceStep(dom, strategy, managedServerStrategy));
    +            domainIntrospectionSteps(info),
    +            new DomainStatusStep(info, null),
    +            bringAdminServerUp(info, delegate.getPodAwaiterStepFactory(info.getNamespace())),
    +            managedServerStrategy);
     
         return Step.chain(
    -        new UpHeadStep(info),
    -        ConfigMapHelper.readExistingSituConfigMap(info.getNamespace(), info.getDomainUid()),
    -        strategy);
    +          createDomainUpInitialStep(info),
    +          ConfigMapHelper.readExistingIntrospectorConfigMap(info.getNamespace(), info.getDomainUid()),
    +          DomainStatusUpdater.createProgressingStep(INSPECTING_DOMAIN_PROGRESS_REASON,true, null),
    +          DomainPresenceStep.createDomainPresenceStep(info.getDomain(), domainUpStrategy, managedServerStrategy));
    +  }
    +
    +  Step createDomainUpInitialStep(DomainPresenceInfo info) {
    +    return new UpHeadStep(info);
       }
     
       private Step createDomainDownPlan(DomainPresenceInfo info) {
    @@ -757,7 +870,7 @@ public NextAction apply(Packet packet) {
         }
       }
     
    -  private class StartPlanStep extends Step {
    +  private static class StartPlanStep extends Step {
         private final DomainPresenceInfo info;
     
         StartPlanStep(DomainPresenceInfo info, Step next) {
    @@ -776,7 +889,7 @@ public NextAction apply(Packet packet) {
         }
       }
     
    -  private class ServiceListStep extends ResponseStep {
    +  private static class ServiceListStep extends ResponseStep {
         private final DomainPresenceInfo info;
     
         ServiceListStep(DomainPresenceInfo info) {
    @@ -804,7 +917,7 @@ public NextAction onSuccess(Packet packet, CallResponse callRespo
         }
       }
     
    -  private class UpHeadStep extends Step {
    +  private static class UpHeadStep extends Step {
         private final DomainPresenceInfo info;
     
         UpHeadStep(DomainPresenceInfo info) {
    @@ -838,7 +951,7 @@ public NextAction apply(Packet packet) {
         }
       }
     
    -  private class DownHeadStep extends Step {
    +  private static class DownHeadStep extends Step {
         private final DomainPresenceInfo info;
         private final String ns;
     
    @@ -860,7 +973,7 @@ public NextAction apply(Packet packet) {
         }
       }
     
    -  private class DomainStatusUpdate {
    +  private static class DomainStatusUpdate {
         private final Domain domain;
         private final V1Pod pod;
         private final String domainUid;
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/DomainSourceType.java b/operator/src/main/java/oracle/kubernetes/operator/DomainSourceType.java
    index 06323417e89..72eebd39752 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/DomainSourceType.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/DomainSourceType.java
    @@ -4,6 +4,35 @@
     package oracle.kubernetes.operator;
     
     public enum DomainSourceType {
    -  Image,
    -  PersistentVolume
    +  Image {
    +    @Override
    +    public String getDefaultDomainHome(String uid) {
    +      return "/u01/oracle/user_projects/domains";
    +    }
    +  },
    +  PersistentVolume {
    +    @Override
    +    public boolean hasLogHomeByDefault() {
    +      return true;
    +    }
    +
    +    @Override
    +    public String getDefaultDomainHome(String uid) {
    +      return "/shared/domains/" + uid;
    +    }
    +  },
    +  FromModel {
    +    @Override
    +    public String getDefaultDomainHome(String uid) {
    +      return "/u01/domains/" + uid;
    +    }
    +
    +  };
    +
    +  public boolean hasLogHomeByDefault() {
    +    return false;
    +  }
    +
    +  public abstract String getDefaultDomainHome(String uid);
    +
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/DomainStatusUpdater.java b/operator/src/main/java/oracle/kubernetes/operator/DomainStatusUpdater.java
    index fe5497bc4f2..c7818fed6cb 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/DomainStatusUpdater.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/DomainStatusUpdater.java
    @@ -25,10 +25,8 @@
     import oracle.kubernetes.operator.calls.FailureStatusSource;
     import oracle.kubernetes.operator.calls.UnrecoverableErrorBuilder;
     import oracle.kubernetes.operator.helpers.CallBuilder;
    -import oracle.kubernetes.operator.helpers.CrdHelper;
     import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
     import oracle.kubernetes.operator.helpers.DomainPresenceInfo.ServerStartupInfo;
    -import oracle.kubernetes.operator.helpers.KubernetesVersion;
     import oracle.kubernetes.operator.helpers.PodHelper;
     import oracle.kubernetes.operator.helpers.ResponseStep;
     import oracle.kubernetes.operator.logging.LoggingFacade;
    @@ -70,6 +68,10 @@ public class DomainStatusUpdater {
       public static final String MANAGED_SERVERS_STARTING_PROGRESS_REASON = "ManagedServersStarting";
       public static final String SERVERS_READY_REASON = "ServersReady";
       public static final String ALL_STOPPED_AVAILABLE_REASON = "AllServersStopped";
    +  public static final String BAD_DOMAIN = "ErrBadDomain";
    +  public static final String ERR_INTROSPECTOR = "ErrIntrospector";
    +  public static final String BAD_TOPOLOGY = "BadTopology";
    +  
       private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
       private static final String TRUE = "True";
       private static final String FALSE = "False";
    @@ -188,44 +190,19 @@ private Step createDomainStatusReplaceStep(DomainStatusUpdaterContext context, D
           if (LOGGER.isFinerEnabled()) {
             LOGGER.finer("status change: " + createPatchString(context, newStatus));
           }
    -      /* MARKER-2.6.0-ONLY */
    -      boolean useDomainStatusEndpoint = Main.useDomainStatusEndpoint.get();
    -      /* END-2.6.0-ONLY */
           Domain oldDomain = context.getDomain();
           Domain newDomain = new Domain()
               .withKind(KubernetesConstants.DOMAIN)
    -          .withApiVersion(oldDomain.getApiVersion())
    +          .withApiVersion(KubernetesConstants.API_VERSION_WEBLOGIC_ORACLE)
               .withMetadata(oldDomain.getMetadata())
    -          /* MARKER-2.6.0-ONLY */
    -          // WAS .withSpec(null)
    -          .withSpec(useDomainStatusEndpoint ? null : oldDomain.getSpec())
    -          /* END-2.6.0-ONLY */
    +          .withSpec(null)
               .withStatus(newStatus);
     
    -      /* MARKER-2.6.0-ONLY */
    -      /* WAS
           return new CallBuilder().replaceDomainStatusAsync(
                 context.getDomainName(),
                 context.getNamespace(),
                 newDomain,
                 createResponseStep(context, getNext()));
    -       */
    -      if (useDomainStatusEndpoint) {
    -        return new CallBuilder()
    -            .replaceDomainStatusAsync(
    -                context.getDomainName(),
    -                context.getNamespace(),
    -                newDomain,
    -                createResponseStep(context, newStatus, useDomainStatusEndpoint, getNext()));
    -      } else {
    -        return new CallBuilder()
    -            .replaceDomainAsync(
    -                context.getDomainName(),
    -                context.getNamespace(),
    -                newDomain,
    -                createResponseStep(context, newStatus, useDomainStatusEndpoint, getNext()));
    -      }
    -      /* END-2.6.0-ONLY */
         }
     
         private String createPatchString(DomainStatusUpdaterContext context, DomainStatus newStatus) {
    @@ -234,57 +211,27 @@ private String createPatchString(DomainStatusUpdaterContext context, DomainStatu
           return builder.build().toString();
         }
     
    -    private ResponseStep createResponseStep(DomainStatusUpdaterContext context,
    -                                                    /* MARKER-2.6.0-ONLY */
    -                                                    DomainStatus newStatus, boolean useDomainStatusEndpoint,
    -                                                    /* END-2.6.0-ONLY */
    -                                                    Step next) {
    -      return new StatusReplaceResponseStep(this,
    -          /* MARKER-2.6.0-ONLY */
    -          newStatus,
    -          useDomainStatusEndpoint,
    -          /* END-2.6.0-ONLY */
    -          context, next);
    +    private ResponseStep createResponseStep(DomainStatusUpdaterContext context, Step next) {
    +      return new StatusReplaceResponseStep(this, context, next);
         }
       }
     
       static class StatusReplaceResponseStep extends DefaultResponseStep {
         private final DomainStatusUpdaterStep updaterStep;
         private final DomainStatusUpdaterContext context;
    -    /* MARKER-2.6.0-ONLY */
    -    private final DomainStatus newStatus;
    -    private final boolean useDomainStatusEndpoint;
    -    /* END-2.6.0-ONLY */
     
         public StatusReplaceResponseStep(DomainStatusUpdaterStep updaterStep,
    -                                     /* MARKER-2.6.0-ONLY */
    -                                     DomainStatus newStatus,
    -                                     boolean useDomainStatusEndpoint,
    -                                     /* END-2.6.0-ONLY */
                                          DomainStatusUpdaterContext context, Step nextStep) {
           super(nextStep);
           this.updaterStep = updaterStep;
           this.context = context;
    -      /* MARKER-2.6.0-ONLY */
    -      this.newStatus = newStatus;
    -      this.useDomainStatusEndpoint = useDomainStatusEndpoint;
    -      /* END-2.6.0-ONLY */
         }
     
         @Override
         public NextAction onSuccess(Packet packet, CallResponse callResponse) {
    -      /* MARKER-2.6.0-ONLY */
    -      // If the 3.0.0 operator updated the CRD to use status endpoint while this operator is running
    -      // then these domain replace calls will succeed, but the proposed domain status will have been
    -      // ignored. Check if the status on the returned domain is expected
    -      if (!useDomainStatusEndpoint
    -          && (callResponse.getResult() == null || !newStatus.equals(callResponse.getResult().getStatus()))) {
    -        LOGGER.info(MessageKeys.DOMAIN_STATUS_IGNORED);
    -        return doNext(CrdHelper.createDomainCrdStep(packet.getSpi(KubernetesVersion.class),
    -            createRetry(context, getNext())), packet);
    -      }
    -      /* END-2.6.0-ONLY */
    -      packet.getSpi(DomainPresenceInfo.class).setDomain(callResponse.getResult());
    +      if (callResponse.getResult() != null) {
    +        packet.getSpi(DomainPresenceInfo.class).setDomain(callResponse.getResult());
    +      }
           return doNext(packet);
         }
     
    @@ -298,7 +245,7 @@ public NextAction onFailure(Packet packet, CallResponse callResponse) {
         }
     
         public Step createRetry(DomainStatusUpdaterContext context, Step next) {
    -      return Step.chain(createDomainRefreshStep(context), updaterStep, next);
    +      return Step.chain(createDomainRefreshStep(context), updaterStep);
         }
     
         private Step createDomainRefreshStep(DomainStatusUpdaterContext context) {
    @@ -586,13 +533,17 @@ private Collection getClusterNames() {
           }
     
           private Integer getClusterMaximumSize(String clusterName) {
    -        return getDomainConfig().map(config -> Optional.ofNullable(config.getClusterConfig(clusterName)))
    -            .map(cluster -> cluster.map(WlsClusterConfig::getMaxClusterSize).orElse(0)).get();
    +        return getDomainConfig()
    +              .map(config -> config.getClusterConfig(clusterName))
    +              .map(WlsClusterConfig::getMaxClusterSize)
    +              .orElse(0);
           }
     
           private Integer getClusterMinimumSize(String clusterName) {
    -        return getDomainConfig().map(config -> Optional.ofNullable(config.getClusterConfig(clusterName)))
    -                .map(cluster -> cluster.map(WlsClusterConfig::getMinClusterSize).orElse(0)).get();
    +        return getDomainConfig()
    +              .map(config -> config.getClusterConfig(clusterName))
    +              .map(WlsClusterConfig::getMinClusterSize)
    +              .orElse(0);
           }
     
           private Integer getClusterSizeGoal(String clusterName) {
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/DomainWatcher.java b/operator/src/main/java/oracle/kubernetes/operator/DomainWatcher.java
    index 0b259be5e24..aa27babc35d 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/DomainWatcher.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/DomainWatcher.java
    @@ -57,4 +57,9 @@ public static DomainWatcher create(
       public WatchI initiateWatch(WatchBuilder watchBuilder) throws ApiException {
         return watchBuilder.createDomainWatch(ns);
       }
    +
    +  @Override
    +  public String getNamespace() {
    +    return ns;
    +  }
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/EventWatcher.java b/operator/src/main/java/oracle/kubernetes/operator/EventWatcher.java
    index f88f77d802c..210403329aa 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/EventWatcher.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/EventWatcher.java
    @@ -62,4 +62,9 @@ public static EventWatcher create(
       public WatchI initiateWatch(WatchBuilder watchBuilder) throws ApiException {
         return watchBuilder.withFieldSelector(fieldSelector).createEventWatch(ns);
       }
    +
    +  @Override
    +  public String getNamespace() {
    +    return ns;
    +  }
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/IntrospectorConfigMapKeys.java b/operator/src/main/java/oracle/kubernetes/operator/IntrospectorConfigMapKeys.java
    new file mode 100644
    index 00000000000..3a55d9df5dd
    --- /dev/null
    +++ b/operator/src/main/java/oracle/kubernetes/operator/IntrospectorConfigMapKeys.java
    @@ -0,0 +1,31 @@
    +// Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +package oracle.kubernetes.operator;
    +
    +/**
    + * Keys in the generated introspector config map.
    + */
    +public interface IntrospectorConfigMapKeys {
    +
    +  /** The topology generated from the WebLogic domain. */
    +  String TOPOLOGY_YAML = "topology.yaml";
    +
    +  /** An MD5 has of the Model-in-Image secrets. */
    +  String SECRETS_MD_5 = "secrets.md5";
    +
    +  /** A hash computed from the WebLogic domain. */
    +  String DOMAINZIP_HASH = "domainzip_hash";
    +
    +  /** The last value of the restartVersion field from the domain resource. */
    +  String DOMAIN_RESTART_VERSION = "weblogic.domainRestartVersion";
    +
    +  /** A hash of the Model-in-Image inputs. */
    +  String DOMAIN_INPUTS_HASH = "weblogic.domainInputsHash";
    +
    +  /**
    +   * The prefix for a number of keys which may appear in the introspector config map.
    +   * They are not preserved from one update to another.
    +   */
    +  String SIT_CONFIG_FILE_PREFIX = "Sit-Cfg";
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/JobWatcher.java b/operator/src/main/java/oracle/kubernetes/operator/JobWatcher.java
    index 47cf95edd45..d570b07b530 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/JobWatcher.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/JobWatcher.java
    @@ -82,6 +82,11 @@ static void removeNamespace(String ns) {
       private static String getNamespace(Domain domain) {
         return domain.getMetadata().getNamespace();
       }
    +  
    +  @Override
    +  public String getNamespace() {
    +    return namespace;
    +  }
     
       /**
        * Creates a new JobWatcher and caches it by namespace.
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/KubernetesConstants.java b/operator/src/main/java/oracle/kubernetes/operator/KubernetesConstants.java
    index 7f280be5caf..68a5870edf9 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/KubernetesConstants.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/KubernetesConstants.java
    @@ -16,7 +16,9 @@ public interface KubernetesConstants {
       String DOMAIN_PLURAL = "domains";
       String DOMAIN_SINGULAR = "domain";
       String DOMAIN_SHORT = "dom";
    -  String DOMAIN_VERSION = "v7";
    +  String DOMAIN_VERSION = "v8";
    +
    +  String API_VERSION_WEBLOGIC_ORACLE = DOMAIN_GROUP + "/" + DOMAIN_VERSION;
     
       String DOMAIN_PATH = "/apis/" + DOMAIN_GROUP + "/" + DOMAIN_VERSION + "/namespaces/{namespace}/" + DOMAIN_PLURAL;
       String DOMAIN_SPECIFIC_PATH = DOMAIN_PATH + "/{name}";
    @@ -26,10 +28,11 @@ public interface KubernetesConstants {
       boolean DEFAULT_HTTP_ACCESS_LOG_IN_LOG_HOME = true;
       boolean DEFAULT_INCLUDE_SERVER_OUT_IN_POD_LOG = true;
       boolean DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE = true;
    +  int DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP = 0;
     
       String CONTAINER_NAME = "weblogic-server";
     
    -  String DOMAIN_CONFIG_MAP_NAME = "weblogic-domain-cm";
    +  String SCRIPT_CONFIG_MAP_NAME = "weblogic-scripts-cm";
       String DOMAIN_DEBUG_CONFIG_MAP_SUFFIX = "-weblogic-domain-debug-cm";
       String INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX = "-weblogic-domain-introspect-cm";
     
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/LabelConstants.java b/operator/src/main/java/oracle/kubernetes/operator/LabelConstants.java
    index bde308bd95f..7c5e2df5bc4 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/LabelConstants.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/LabelConstants.java
    @@ -5,7 +5,7 @@
     
     public interface LabelConstants {
     
    -  String RESOURCE_VERSION_LABEL = "weblogic.resourceVersion";
    +  String OPERATOR_VERISON = "weblogic.operatorVersion";
       String DOMAINUID_LABEL = "weblogic.domainUID";
       String DOMAINNAME_LABEL = "weblogic.domainName";
       String DOMAINHOME_LABEL = "weblogic.domainHome";
    @@ -18,6 +18,9 @@ public interface LabelConstants {
       String DOMAINRESTARTVERSION_LABEL = "weblogic.domainRestartVersion";
       String CLUSTERRESTARTVERSION_LABEL = "weblogic.clusterRestartVersion";
       String SERVERRESTARTVERSION_LABEL = "weblogic.serverRestartVersion";
    +  String MODEL_IN_IMAGE_MODEL_SECRETS_HASH = "weblogic.modelInImageModelSecretsHash";
    +  String MODEL_IN_IMAGE_DOMAINZIP_HASH = "weblogic.modelInImageDomainZipHash";
    +  String INTROSPECTION_STATE_LABEL = "weblogic.introspectVersion";
     
       static String forDomainUidSelector(String uid) {
         return String.format("%s=%s", DOMAINUID_LABEL, uid);
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/Main.java b/operator/src/main/java/oracle/kubernetes/operator/Main.java
    index e9d51fa311a..9799ce7cbae 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/Main.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/Main.java
    @@ -40,6 +40,7 @@
     import io.kubernetes.client.openapi.models.V1SubjectRulesReviewStatus;
     import io.kubernetes.client.util.Watch;
     import oracle.kubernetes.operator.calls.CallResponse;
    +import oracle.kubernetes.operator.calls.FailureStatusSourceException;
     import oracle.kubernetes.operator.helpers.CallBuilder;
     import oracle.kubernetes.operator.helpers.CallBuilderFactory;
     import oracle.kubernetes.operator.helpers.ClientPool;
    @@ -50,7 +51,9 @@
     import oracle.kubernetes.operator.helpers.KubernetesVersion;
     import oracle.kubernetes.operator.helpers.PodHelper;
     import oracle.kubernetes.operator.helpers.ResponseStep;
    +import oracle.kubernetes.operator.helpers.SemanticVersion;
     import oracle.kubernetes.operator.helpers.ServiceHelper;
    +import oracle.kubernetes.operator.logging.LoggingContext;
     import oracle.kubernetes.operator.logging.LoggingFacade;
     import oracle.kubernetes.operator.logging.LoggingFactory;
     import oracle.kubernetes.operator.logging.MessageKeys;
    @@ -105,23 +108,7 @@ public class Main {
       private static final Engine engine = new Engine(wrappedExecutorService);
       private static String principal;
       private static KubernetesVersion version = null;
    -
    -  /* MARKER-2.6.0-ONLY */
    -  // This is needed only for 2.6.0 -- do not forward port to 3.x
    -  // In 3.0.0, we are switching the CRD to enable the domain status endpoint. This means that all updates to the
    -  // domain status must be made against that REST endpoint and that (according to the K8s doc) attempts to
    -  // update the domain status through the normal endpoint will be ignored.
    -  //
    -  // However, for Kubernetes versions less than 1.16, the 2.6.0 CRD needs to remain
    -  // unchanged for interoperability with 2.5.0. Therefore, 2.6.0 will detect if a 3.x operator has changed the
    -  // CRD and modify its behavior. This provides an upgrade path from 2.x to 3.x, which is that all operators
    -  // must be updated to 2.6.0 before a 3.0.0 operator is introduced to the cluster, but if this strategy is used
    -  // then 2.5.0 is compatible with 2.6.0 and 2.6.0 is compatible with 3.0.0.
    -  //
    -  // When running on 1.16 and above, 2.6.0 will also create a CRD with the status endpoint enabled since there is
    -  // no need to be compatible with 2.5.0.
    -  public static AtomicBoolean useDomainStatusEndpoint = new AtomicBoolean(false);
    -  /* END-2.6.0-ONLY */
    +  private static SemanticVersion productVersion = null;
     
       static {
         try {
    @@ -166,6 +153,9 @@ public static void main(String[] args) {
           buildProps.load(stream);
     
           String operatorVersion = buildProps.getProperty("git.build.version");
    +      if (operatorVersion != null) {
    +        productVersion = new SemanticVersion(operatorVersion);
    +      }
           String operatorImpl =
               buildProps.getProperty("git.branch")
                   + "."
    @@ -213,8 +203,9 @@ private static void begin() {
           if (!isDedicated()) {
             strategy = Step.chain(strategy, readExistingNamespaces(targetNamespaces));
           } else {
    -        strategy = Step.chain(strategy, CrdHelper.createDomainCrdStep(version,
    -            new StartNamespacesStep(targetNamespaces, false)));
    +        strategy = Step.chain(strategy, CrdHelper.createDomainCrdStep(
    +                version, productVersion,
    +                new StartNamespacesStep(targetNamespaces, false)));
           }
           runSteps(
               strategy,
    @@ -284,13 +275,21 @@ private static AtomicBoolean isNamespaceStopping(String ns) {
         return namespaceStoppingMap.computeIfAbsent(ns, (key) -> new AtomicBoolean(false));
       }
     
    +  private static void runSteps(Step firstStep, Packet packet) {
    +    runSteps(firstStep, packet, null);
    +  }
    +
       private static void runSteps(Step firstStep) {
    -    runSteps(firstStep, null);
    +    runSteps(firstStep, new Packet(), null);
       }
     
       private static void runSteps(Step firstStep, Runnable completionAction) {
    +    runSteps(firstStep, new Packet(), completionAction);
    +  }
    +
    +  private static void runSteps(Step firstStep, Packet packet, Runnable completionAction) {
         Fiber f = engine.createFiber();
    -    f.start(firstStep, new Packet(), andThenDo(completionAction));
    +    f.start(firstStep, packet, andThenDo(completionAction));
       }
     
       private static NullCompletionCallback andThenDo(Runnable completionAction) {
    @@ -412,7 +411,7 @@ private static Collection getTargetNamespaces() {
         return isDedicated()
             ? Collections.singleton(operatorNamespace)
             : getTargetNamespaces(Optional.ofNullable(getHelmVariable.apply("OPERATOR_TARGET_NAMESPACES"))
    -        .orElse(tuningAndConfig.get("targetNamespaces")), operatorNamespace);
    +            .orElse(tuningAndConfig.get("targetNamespaces")), operatorNamespace);
       }
     
       public static boolean isDedicated() {
    @@ -534,9 +533,8 @@ private static void dispatchNamespaceWatch(Watch.Response item) {
               // will continue to be handled in recheckDomain method, which periodically
               // checks for new domain resources in the target name spaces.
               if (!delegate.isNamespaceRunning(ns)) {
    -            runSteps(Step.chain(
    -                ConfigMapHelper.createScriptConfigMapStep(operatorNamespace, ns),
    -                createConfigMapStep(ns)));
    +            runSteps(getScriptCreationSteps(ns), createPacketWithLoggingContext(ns));
    +
                 namespaceStoppingMap.put(ns, new AtomicBoolean(false));
               }
               break;
    @@ -557,6 +555,21 @@ private static void dispatchNamespaceWatch(Watch.Response item) {
         }
       }
     
    +  private static Packet createPacketWithLoggingContext(String ns) {
    +    Packet packet = new Packet();
    +    packet.getComponents().put(
    +        LoggingContext.LOGGING_CONTEXT_KEY,
    +        Component.createFor(new LoggingContext().namespace(ns)));
    +    return packet;
    +  }
    +
    +  private static Step getScriptCreationSteps(String ns) {
    +    try (LoggingContext stack = LoggingContext.setThreadContext().namespace(ns)) {
    +      return Step.chain(
    +          ConfigMapHelper.createScriptConfigMapStep(operatorNamespace, ns), createConfigMapStep(ns));
    +    }
    +  }
    +
       private static class WrappedThreadFactory implements ThreadFactory {
         private final ThreadFactory delegate = ThreadFactorySingleton.getInstance();
     
    @@ -589,11 +602,11 @@ public NextAction apply(Packet packet) {
           // check for any existing resources and add the watches on them
           // this would happen when the Domain was running BEFORE the Operator starts up
           Collection startDetails = new ArrayList<>();
    +
           for (String ns : targetNamespaces) {
    -        startDetails.add(
    -            new StepAndPacket(
    -                action(ns),
    -                packet.clone()));
    +        try (LoggingContext stack = LoggingContext.setThreadContext().namespace(ns)) {
    +          startDetails.add(new StepAndPacket(action(ns), packet.clone()));
    +        }
           }
           return doForkJoin(getNext(), packet, startDetails);
         }
    @@ -664,6 +677,13 @@ public NextAction apply(Packet packet) {
           // the health check helper.
           NamespaceStatus nss = namespaceStatuses.computeIfAbsent(
               ns != null ? ns : operatorNamespace, (key) -> new NamespaceStatus());
    +
    +      // we don't have the domain presence information yet
    +      // we add a logging context to pass the namespace information to the LoggingFormatter
    +      packet.getComponents().put(
    +          LoggingContext.LOGGING_CONTEXT_KEY,
    +          Component.createFor(
    +              new LoggingContext().namespace(ns != null ? ns : operatorNamespace)));
           V1SubjectRulesReviewStatus srrs = nss.getRulesReviewStatus().updateAndGet(prev -> {
             if (prev != null) {
               return prev;
    @@ -732,17 +752,17 @@ public NextAction onSuccess(Packet packet, CallResponse callResponse
                         return v;
                       });
               info.setPopulated(true);
    -          dp.makeRightDomainPresence(info, true, false, false);
    +          dp.createMakeRightOperation(info).withExplicitRecheck().execute();
             }
           }
     
           dpis.forEach(
    -          (key, value) -> {
    -            if (!domainUids.contains(key)) {
    +          (uid, info) -> {
    +            if (!domainUids.contains(uid)) {
                   // This is a stranded DomainPresenceInfo.
    -              value.setDeleting(true);
    -              value.setPopulated(true);
    -              dp.makeRightDomainPresence(value, true, true, false);
    +              info.setDeleting(true);
    +              info.setPopulated(true);
    +              dp.createMakeRightOperation(info).withExplicitRecheck().forDeletion().execute();
                 }
               });
     
    @@ -892,8 +912,8 @@ public NextAction onFailure(Packet packet, CallResponse callRes
         @Override
         protected NextAction onFailureNoRetry(Packet packet, CallResponse callResponse) {
           return isNotAuthorizedOrForbidden(callResponse)
    -          ? doNext(createDomainCrdAndStartNamespaces(targetNamespaces), packet) :
    -          super.onFailureNoRetry(packet, callResponse);
    +          ? doNext(createDomainCrdAndStartNamespaces(targetNamespaces), packet) : 
    +            super.onFailureNoRetry(packet, callResponse);
         }
     
         @Override
    @@ -902,7 +922,7 @@ public NextAction onSuccess(Packet packet, CallResponse callRes
           // don't bother processing pre-existing events
           String intialResourceVersion = getInitialResourceVersion(result);
           List nsList = getExistingNamespaces(result);
    -
    +      
           Set namespacesToStart = new TreeSet<>(targetNamespaces);
           for (String ns : targetNamespaces) {
             if (!nsList.contains(ns)) {
    @@ -913,23 +933,25 @@ public NextAction onSuccess(Packet packet, CallResponse callRes
           Step strategy = null;
           if (!namespacesToStart.isEmpty()) {
             strategy = Step.chain(createDomainCrdAndStartNamespaces(namespacesToStart),
    -            new CreateNamespaceWatcherStep(intialResourceVersion));
    +          new CreateNamespaceWatcherStep(intialResourceVersion));
           } else {
    -        strategy = CrdHelper.createDomainCrdStep(version,
    +        strategy = CrdHelper.createDomainCrdStep(
    +          version, productVersion,
                 new CreateNamespaceWatcherStep(intialResourceVersion));
           }
           return doNext(strategy, packet);
         }
    -
    +    
         private Step createDomainCrdAndStartNamespaces(Collection namespacesToStart) {
    -      return CrdHelper.createDomainCrdStep(version,
    -          new StartNamespacesStep(namespacesToStart, false));
    +      return CrdHelper.createDomainCrdStep(
    +          version, productVersion,
    +            new StartNamespacesStep(namespacesToStart, false));
         }
     
         private String getInitialResourceVersion(V1NamespaceList result) {
           return result != null ? result.getMetadata().getResourceVersion() : "";
         }
    -
    +    
         private List getExistingNamespaces(V1NamespaceList result) {
           List namespaces = new ArrayList<>();
           if (result != null) {
    @@ -940,7 +962,7 @@ private List getExistingNamespaces(V1NamespaceList result) {
           return namespaces;
         }
       }
    -
    +  
       private static class CreateNamespaceWatcherStep extends Step {
         private final String initialResourceVersion;
     
    @@ -955,7 +977,7 @@ public NextAction apply(Packet packet) {
           }
           return doNext(packet);
         }
    -  }
    +  }  
     
       private static class NullCompletionCallback implements CompletionCallback {
         private final Runnable completionAction;
    @@ -973,7 +995,11 @@ public void onCompletion(Packet packet) {
     
         @Override
         public void onThrowable(Packet packet, Throwable throwable) {
    -      LOGGER.severe(MessageKeys.EXCEPTION, throwable);
    +      if (throwable instanceof FailureStatusSourceException) {
    +        ((FailureStatusSourceException) throwable).log();
    +      } else {
    +        LOGGER.severe(MessageKeys.EXCEPTION, throwable);
    +      }
         }
       }
     
    @@ -1008,6 +1034,11 @@ public KubernetesVersion getVersion() {
           return version;
         }
     
    +    @Override
    +    public SemanticVersion getProductVersion() {
    +      return productVersion;
    +    }
    +
         @Override
         public FiberGate createFiberGate() {
           return new FiberGate(Main.engine);
    @@ -1024,4 +1055,4 @@ public ScheduledFuture scheduleWithFixedDelay(
           return Main.engine.getExecutor().scheduleWithFixedDelay(command, initialDelay, delay, unit);
         }
       }
    -}
    \ No newline at end of file
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/MakeRightDomainOperation.java b/operator/src/main/java/oracle/kubernetes/operator/MakeRightDomainOperation.java
    new file mode 100644
    index 00000000000..c9cf811dee4
    --- /dev/null
    +++ b/operator/src/main/java/oracle/kubernetes/operator/MakeRightDomainOperation.java
    @@ -0,0 +1,72 @@
    +// Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +package oracle.kubernetes.operator;
    +
    +import java.util.Optional;
    +
    +import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
    +import oracle.kubernetes.operator.work.Packet;
    +import oracle.kubernetes.operator.work.Step;
    +import oracle.kubernetes.weblogic.domain.model.Domain;
    +
    +import static oracle.kubernetes.operator.ProcessingConstants.MAKE_RIGHT_DOMAIN_OPERATION;
    +
    +/**
    + * Defines the operation to bring a running domain into compliance with its domain resource and introspection result.
    + */
    +public interface MakeRightDomainOperation {
    +
    +  /**
    +   * Defines the operation as pertaining to the deletion of a domain.
    +   * @return The make right domain operation for deletion
    +   */
    +  MakeRightDomainOperation forDeletion();
    +
    +  MakeRightDomainOperation withExplicitRecheck();
    +
    +  MakeRightDomainOperation withDeleting(boolean deleting);
    +
    +  MakeRightDomainOperation interrupt();
    +
    +  void execute();
    +
    +  Step createSteps();
    +
    +  void setInspectionRun();
    +
    +  boolean wasInspectionRun();
    +
    +  private static boolean wasInspectionRun(Packet packet) {
    +    return fromPacket(packet).map(MakeRightDomainOperation::wasInspectionRun).orElse(false);
    +  }
    +
    +  static void recordInspection(Packet packet) {
    +    fromPacket(packet).ifPresent(MakeRightDomainOperation::setInspectionRun);
    +  }
    +
    +  static boolean isInspectionRequired(Packet packet) {
    +    return domainRequiresIntrospectionInCurrentMakeRight(packet) && !wasInspectionRun(packet);
    +  }
    +
    +  /**
    +   * Returns true if the packet contains info about a domain that requires introspection in a sequences of steps
    +   * before server pods are created or modified.
    +   * @return true, if the domain requires introspection
    +   */
    +  private static boolean domainRequiresIntrospectionInCurrentMakeRight(Packet packet) {
    +    return Optional.ofNullable(packet.getSpi(DomainPresenceInfo.class))
    +          .map(DomainPresenceInfo::getDomain)
    +          .map(Domain::isNewIntrospectionRequiredForNewServers)
    +          .orElse(false);
    +  }
    +
    +  static Step createStepsToRerunWithIntrospection(Packet packet) {
    +    packet.put(ProcessingConstants.DOMAIN_INTROSPECT_REQUESTED, "MII");
    +    return fromPacket(packet).map(MakeRightDomainOperation::createSteps).orElse(null);
    +  }
    +
    +  private static Optional fromPacket(Packet packet) {
    +    return Optional.ofNullable((MakeRightDomainOperation) packet.get(MAKE_RIGHT_DOMAIN_OPERATION));
    +  }
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/ModelInImageDomainType.java b/operator/src/main/java/oracle/kubernetes/operator/ModelInImageDomainType.java
    new file mode 100644
    index 00000000000..51810f38b85
    --- /dev/null
    +++ b/operator/src/main/java/oracle/kubernetes/operator/ModelInImageDomainType.java
    @@ -0,0 +1,10 @@
    +// Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates.
    +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +package oracle.kubernetes.operator;
    +
    +public enum ModelInImageDomainType {
    +  WLS,
    +  RestrictedJRF,
    +  JRF;
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/NamespaceWatcher.java b/operator/src/main/java/oracle/kubernetes/operator/NamespaceWatcher.java
    index bb5a7877a02..3d7e56b3254 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/NamespaceWatcher.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/NamespaceWatcher.java
    @@ -54,4 +54,9 @@ public WatchI initiateWatch(WatchBuilder watchBuilder) throws ApiEx
         return watchBuilder
             .createNamespacesWatch();
       }
    +
    +  @Override
    +  public String getNamespace() {
    +    return null;
    +  }
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/OverrideDistributionStrategy.java b/operator/src/main/java/oracle/kubernetes/operator/OverrideDistributionStrategy.java
    new file mode 100644
    index 00000000000..7cac972037c
    --- /dev/null
    +++ b/operator/src/main/java/oracle/kubernetes/operator/OverrideDistributionStrategy.java
    @@ -0,0 +1,10 @@
    +// Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +package oracle.kubernetes.operator;
    +
    +public enum OverrideDistributionStrategy {
    +  DYNAMIC, ON_RESTART;
    +
    +  public static final OverrideDistributionStrategy DEFAULT = DYNAMIC;
    +}
    \ No newline at end of file
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/PodWatcher.java b/operator/src/main/java/oracle/kubernetes/operator/PodWatcher.java
    index 4f3bfbd5ff4..ba20079ea84 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/PodWatcher.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/PodWatcher.java
    @@ -15,8 +15,13 @@
     import javax.annotation.Nonnull;
     
     import io.kubernetes.client.openapi.ApiException;
    +import io.kubernetes.client.openapi.models.V1ContainerState;
    +import io.kubernetes.client.openapi.models.V1ContainerStateTerminated;
    +import io.kubernetes.client.openapi.models.V1ContainerStateWaiting;
    +import io.kubernetes.client.openapi.models.V1ContainerStatus;
     import io.kubernetes.client.openapi.models.V1ObjectMeta;
     import io.kubernetes.client.openapi.models.V1Pod;
    +import io.kubernetes.client.openapi.models.V1PodStatus;
     import io.kubernetes.client.util.Watch;
     import oracle.kubernetes.operator.TuningParameters.WatchTuning;
     import oracle.kubernetes.operator.builders.WatchBuilder;
    @@ -30,12 +35,13 @@
     import oracle.kubernetes.operator.watcher.WatchListener;
     import oracle.kubernetes.operator.work.Step;
     
    +import static oracle.kubernetes.operator.helpers.LegalNames.DOMAIN_INTROSPECTOR_JOB_SUFFIX;
    +
     /**
      * Watches for changes to pods.
      */
     public class PodWatcher extends Watcher implements WatchListener, PodAwaiterStepFactory {
       private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
    -
       private final String namespace;
       private final WatchListener listener;
     
    @@ -122,6 +128,11 @@ public WatchI initiateWatch(WatchBuilder watchBuilder) throws ApiExceptio
             .createPodWatch(namespace);
       }
     
    +  @Override
    +  public String getNamespace() {
    +    return namespace;
    +  }
    +
       /**
        * Receive response.
        * @param item item
    @@ -136,6 +147,12 @@ public void receivedResponse(Watch.Response item) {
         switch (item.type) {
           case "ADDED":
           case "MODIFIED":
    +        if (podName.contains(DOMAIN_INTROSPECTOR_JOB_SUFFIX) && isFailed(pod)) {
    +          LOGGER.info(MessageKeys.INTROSPECTOR_POD_FAILED,
    +              pod.getMetadata().getName(),
    +              pod.getMetadata().getNamespace(),
    +              pod.getStatus().toString());
    +        }
             copyOf(getOnModifiedCallbacks(podName)).forEach(c -> c.accept(pod));
             break;
           case "DELETED":
    @@ -148,6 +165,52 @@ public void receivedResponse(Watch.Response item) {
         LOGGER.exiting();
       }
     
    +  /**
    +   * Test if pod is failed.
    +   * @param pod pob
    +   * @return true, if failed
    +   */
    +  private static boolean isFailed(V1Pod pod) {
    +    if (pod == null) {
    +      return false;
    +    }
    +
    +    V1PodStatus status = pod.getStatus();
    +    LOGGER.fine(
    +        "PodWatcher.isFailed status of pod " + pod.getMetadata().getName() + ": " + status);
    +    if (status != null) {
    +      java.util.List conStatuses = status.getContainerStatuses();
    +      if (conStatuses != null) {
    +        for (V1ContainerStatus conStatus : conStatuses) {
    +          if (!isReady(conStatus)
    +              && (getContainerStateWaitingMessage(conStatus) != null
    +              || getContainerStateTerminatedReason(conStatus).contains("Error"))) {
    +            return true;
    +          }
    +        }
    +      }
    +    }
    +    return false;
    +  }
    +
    +  private static boolean isReady(V1ContainerStatus conStatus) {
    +    return Optional.ofNullable(conStatus).map(V1ContainerStatus::getReady).orElse(false);
    +  }
    +
    +  private static String getContainerStateTerminatedReason(V1ContainerStatus conStatus) {
    +    return Optional.of(conStatus)
    +        .map(V1ContainerStatus::getState)
    +        .map(V1ContainerState::getTerminated)
    +        .map(V1ContainerStateTerminated::getReason).orElse("");
    +  }
    +
    +  private static String getContainerStateWaitingMessage(V1ContainerStatus conStatus) {
    +    return Optional.of(conStatus)
    +        .map(V1ContainerStatus::getState)
    +        .map(V1ContainerState::getWaiting)
    +        .map(V1ContainerStateWaiting::getMessage).orElse(null);
    +  }
    +
       // make a copy to avoid concurrent modification
       private  Collection copyOf(Collection collection) {
         return new ArrayList<>(collection);
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/ProcessingConstants.java b/operator/src/main/java/oracle/kubernetes/operator/ProcessingConstants.java
    index c87739cb525..20ae72ce24c 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/ProcessingConstants.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/ProcessingConstants.java
    @@ -6,30 +6,38 @@
     /** Constants used in asynchronous processing. */
     public interface ProcessingConstants {
     
    -  public static final String MAIN_COMPONENT_NAME = "main";
    -  public static final String DOMAIN_COMPONENT_NAME = "domain";
    -  public static final String FIBER_COMPONENT_NAME = "fiber";
    -  public static final String PODWATCHER_COMPONENT_NAME = "podWatcher";
    +  String MAIN_COMPONENT_NAME = "main";
    +  String DOMAIN_COMPONENT_NAME = "domain";
    +  String FIBER_COMPONENT_NAME = "fiber";
    +  String PODWATCHER_COMPONENT_NAME = "podWatcher";
     
    -  public static final String SERVER_SCAN = "serverScan";
    -  public static final String ENVVARS = "envVars";
    +  /** key to an object of type WlsServerConfig. */
    +  String SERVER_SCAN = "serverScan";
    +  String ENVVARS = "envVars";
     
    -  public static final String SERVER_NAME = "serverName";
    -  public static final String CLUSTER_NAME = "clusterName";
    +  String SERVER_NAME = "serverName";
    +  String CLUSTER_NAME = "clusterName";
     
    -  public static final String SERVERS_TO_ROLL = "roll";
    +  String SERVERS_TO_ROLL = "roll";
     
    -  public static final String SCRIPT_CONFIG_MAP = "scriptConfigMap";
    -  public static final String SERVER_STATE_MAP = "serverStateMap";
    -  public static final String SERVER_HEALTH_MAP = "serverHealthMap";
    +  String SCRIPT_CONFIG_MAP = "scriptConfigMap";
    +  String SERVER_STATE_MAP = "serverStateMap";
    +  String SERVER_HEALTH_MAP = "serverHealthMap";
     
    -  public static final String DOMAIN_TOPOLOGY = "domainTopology";
    -  public static final String JOB_POD_NAME = "jobPodName";
    -  public static final String DOMAIN_INTROSPECTOR_JOB = "domainIntrospectorJob";
    -  public static final String DOMAIN_INTROSPECTOR_LOG_RESULT = "domainIntrospectorLogResult";
    -  public static final String SIT_CONFIG_MAP = "sitConfigMap";
    -  public static final String DOMAIN_RESTART_VERSION = "weblogic.domainRestartVersion";
    -  public static final String REMAINING_SERVERS_HEALTH_TO_READ = "serverHealthRead";
    +  String DOMAIN_TOPOLOGY = "domainTopology";
    +  String JOB_POD_NAME = "jobPodName";
    +  String DOMAIN_INTROSPECTOR_JOB = "domainIntrospectorJob";
    +  String DOMAIN_INTROSPECTOR_LOG_RESULT = "domainIntrospectorLogResult";
    +  String DOMAIN_INTROSPECT_REQUESTED = "domainIntrospectRequested";
    +  String REMAINING_SERVERS_HEALTH_TO_READ = "serverHealthRead";
     
    -  public static final String ENCODED_CREDENTIALS = "encodedCredentials";
    +  String ENCODED_CREDENTIALS = "encodedCredentials";
    +  String DOMAIN_VALIDATION_ERRORS = "domainValidationErrors";
    +
    +  String INTROSPECTOR_JOB_FAILURE_LOGGED = "introspectorJobfailureLogged";
    +
    +  String WAIT_FOR_POD_READY = "waitForPodReady";
    +
    +  /** Key to an object of type MakeRightDomainOperation. */
    +  String MAKE_RIGHT_DOMAIN_OPERATION = "makeRightOp";
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/ServerStatusReader.java b/operator/src/main/java/oracle/kubernetes/operator/ServerStatusReader.java
    index 2e5f35386ef..beb012b45a7 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/ServerStatusReader.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/ServerStatusReader.java
    @@ -7,21 +7,25 @@
     import java.io.InputStreamReader;
     import java.io.Reader;
     import java.util.Collection;
    +import java.util.Optional;
     import java.util.concurrent.ConcurrentHashMap;
     import java.util.concurrent.ConcurrentMap;
     import java.util.concurrent.TimeUnit;
     import java.util.concurrent.atomic.AtomicInteger;
     import java.util.function.Function;
     import java.util.stream.Collectors;
    +import javax.annotation.Nonnull;
     
     import com.google.common.io.CharStreams;
     import io.kubernetes.client.openapi.ApiClient;
     import io.kubernetes.client.openapi.ApiException;
    +import io.kubernetes.client.openapi.models.V1ObjectMeta;
     import io.kubernetes.client.openapi.models.V1Pod;
     import oracle.kubernetes.operator.helpers.ClientPool;
     import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
     import oracle.kubernetes.operator.helpers.LastKnownStatus;
     import oracle.kubernetes.operator.helpers.PodHelper;
    +import oracle.kubernetes.operator.logging.LoggingContext;
     import oracle.kubernetes.operator.logging.LoggingFacade;
     import oracle.kubernetes.operator.logging.LoggingFactory;
     import oracle.kubernetes.operator.logging.MessageKeys;
    @@ -42,8 +46,8 @@
     /** Creates an asynchronous step to read the WebLogic server state from a particular pod. */
     public class ServerStatusReader {
       private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
    -  private static KubernetesExecFactory EXEC_FACTORY = new KubernetesExecFactoryImpl();
    -  private static Function STEP_FACTORY = ReadHealthStep::createReadHealthStep;
    +  private static final KubernetesExecFactory EXEC_FACTORY = new KubernetesExecFactoryImpl();
    +  private static final Function STEP_FACTORY = ReadHealthStep::createReadHealthStep;
     
       private ServerStatusReader() {
       }
    @@ -167,46 +171,51 @@ public NextAction apply(Packet packet) {
                 String state = null;
                 ClientPool helper = ClientPool.getInstance();
                 ApiClient client = helper.take();
    -            try {
    -              KubernetesExec kubernetesExec = EXEC_FACTORY.create(client, pod, CONTAINER_NAME);
    -              kubernetesExec.setStdin(stdin);
    -              kubernetesExec.setTty(tty);
    -              proc = kubernetesExec.exec("/weblogic-operator/scripts/readState.sh");
    -
    -              try (final Reader reader = new InputStreamReader(proc.getInputStream())) {
    -                state = CharStreams.toString(reader);
    -              }
    +            try (LoggingContext stack = LoggingContext.setThreadContext().namespace(getNamespace(pod))) {
    +              try {
    +                KubernetesExec kubernetesExec = EXEC_FACTORY.create(client, pod, CONTAINER_NAME);
    +                kubernetesExec.setStdin(stdin);
    +                kubernetesExec.setTty(tty);
    +                proc = kubernetesExec.exec("/weblogic-operator/scripts/readState.sh");
    +
    +                try (final Reader reader = new InputStreamReader(proc.getInputStream())) {
    +                  state = CharStreams.toString(reader);
    +                }
     
    -              if (proc.waitFor(timeoutSeconds, TimeUnit.SECONDS)) {
    -                int exitValue = proc.exitValue();
    -                LOGGER.fine("readState exit: " + exitValue + ", readState for " + pod.getMetadata().getName());
    -                if (exitValue == 1 || exitValue == 2) {
    -                  state =
    -                      PodHelper.isDeleting(pod)
    -                          ? WebLogicConstants.SHUTDOWN_STATE
    -                          : WebLogicConstants.STARTING_STATE;
    -                } else if (exitValue != 0) {
    -                  state = WebLogicConstants.UNKNOWN_STATE;
    +                if (proc.waitFor(timeoutSeconds, TimeUnit.SECONDS)) {
    +                  int exitValue = proc.exitValue();
    +                  LOGGER.fine("readState exit: " + exitValue + ", readState for " + pod.getMetadata().getName());
    +                  if (exitValue == 1 || exitValue == 2) {
    +                    state =
    +                        PodHelper.isDeleting(pod)
    +                            ? WebLogicConstants.SHUTDOWN_STATE
    +                            : WebLogicConstants.STARTING_STATE;
    +                  } else if (exitValue != 0) {
    +                    state = WebLogicConstants.UNKNOWN_STATE;
    +                  }
    +                }
    +              } catch (InterruptedException ignore) {
    +                Thread.currentThread().interrupt();
    +              } catch (IOException | ApiException e) {
    +                LOGGER.warning(MessageKeys.EXCEPTION, e);
    +              } finally {
    +                helper.recycle(client);
    +                if (proc != null) {
    +                  proc.destroy();
                     }
                   }
    -            } catch (InterruptedException ignore) {
    -              Thread.currentThread().interrupt();
    -            } catch (IOException | ApiException e) {
    -              LOGGER.warning(MessageKeys.EXCEPTION, e);
    -            } finally {
    -              helper.recycle(client);
    -              if (proc != null) {
    -                proc.destroy();
    -              }
    +              LOGGER.fine("readState: " + state + " for " + pod.getMetadata().getName());
    +              state = chooseStateOrLastKnownServerStatus(lastKnownStatus, state);
    +              serverStateMap.put(serverName, state);
                 }
    -
    -            LOGGER.fine("readState: " + state + " for " + pod.getMetadata().getName());
    -            state = chooseStateOrLastKnownServerStatus(lastKnownStatus, state);
    -            serverStateMap.put(serverName, state);
                 fiber.resume(packet);
               });
         }
     
    +    private String getNamespace(@Nonnull V1Pod pod) {
    +      return Optional.ofNullable(pod.getMetadata()).map(V1ObjectMeta::getNamespace).orElse(null);
    +    }
    +
         private String chooseStateOrLastKnownServerStatus(
             LastKnownStatus lastKnownStatus, String state) {
           if (state != null) {
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/ServiceWatcher.java b/operator/src/main/java/oracle/kubernetes/operator/ServiceWatcher.java
    index d4655fc4975..b8d36e8663b 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/ServiceWatcher.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/ServiceWatcher.java
    @@ -59,4 +59,9 @@ public WatchI initiateWatch(WatchBuilder watchBuilder) throws ApiExce
             .withLabelSelectors(LabelConstants.DOMAINUID_LABEL, LabelConstants.CREATEDBYOPERATOR_LABEL)
             .createServiceWatch(ns);
       }
    +
    +  @Override
    +  public String getNamespace() {
    +    return ns;
    +  }
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/TuningParameters.java b/operator/src/main/java/oracle/kubernetes/operator/TuningParameters.java
    index a9a399c19f1..4f484a295e0 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/TuningParameters.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/TuningParameters.java
    @@ -175,10 +175,18 @@ public boolean equals(Object o) {
       public static class WatchTuning {
         public final int watchLifetime;
         public final int watchMinimumDelay;
    +    public final int watchBackstopRecheckDelay;
     
    -    public WatchTuning(int watchLifetime, int watchMinimumDelay) {
    +    /**
    +     * Create watch tuning.
    +     * @param watchLifetime Watch lifetime
    +     * @param watchMinimumDelay Minimum delay before accepting new events to prevent hot loops
    +     * @param watchBackstopRecheckDelay Recheck delay for get while waiting for a status to backstop missed watch events
    +     */
    +    public WatchTuning(int watchLifetime, int watchMinimumDelay, int watchBackstopRecheckDelay) {
           this.watchLifetime = watchLifetime;
           this.watchMinimumDelay = watchMinimumDelay;
    +      this.watchBackstopRecheckDelay = watchBackstopRecheckDelay;
         }
     
         @Override
    @@ -186,12 +194,14 @@ public String toString() {
           return new ToStringBuilder(this)
               .append("watchLifetime", watchLifetime)
               .append("watchMinimumDelay", watchMinimumDelay)
    +          .append("watchBackstopRecheckDelay", watchBackstopRecheckDelay)
               .toString();
         }
     
         @Override
         public int hashCode() {
    -      return new HashCodeBuilder().append(watchLifetime).append(watchMinimumDelay).toHashCode();
    +      return new HashCodeBuilder()
    +              .append(watchLifetime).append(watchMinimumDelay).append(watchBackstopRecheckDelay).toHashCode();
         }
     
         @Override
    @@ -206,6 +216,7 @@ public boolean equals(Object o) {
           return new EqualsBuilder()
               .append(watchLifetime, wt.watchLifetime)
               .append(watchMinimumDelay, wt.watchMinimumDelay)
    +          .append(watchBackstopRecheckDelay, wt.watchBackstopRecheckDelay)
               .isEquals();
         }
       }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/TuningParametersImpl.java b/operator/src/main/java/oracle/kubernetes/operator/TuningParametersImpl.java
    index 4d282cb7568..b164d961303 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/TuningParametersImpl.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/TuningParametersImpl.java
    @@ -66,7 +66,8 @@ private void update() {
         WatchTuning watch =
             new WatchTuning(
                 (int) readTuningParameter("watchLifetime", 300),
    -            (int) readTuningParameter("watchMinimumDelay", 5));
    +            (int) readTuningParameter("watchMinimumDelay", 5),
    +            (int) readTuningParameter("watchBackstopRecheckDelaySeconds", 5));
     
         PodTuning pod =
             new PodTuning(
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/VersionConstants.java b/operator/src/main/java/oracle/kubernetes/operator/VersionConstants.java
    deleted file mode 100644
    index a80dfe1db6a..00000000000
    --- a/operator/src/main/java/oracle/kubernetes/operator/VersionConstants.java
    +++ /dev/null
    @@ -1,12 +0,0 @@
    -// Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates.
    -// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    -
    -package oracle.kubernetes.operator;
    -
    -public interface VersionConstants {
    -  String OPERATOR_V1 = "operator-v1";
    -  String OPERATOR_V2 = "operator-v2";
    -  String DOMAIN_V1 = "domain-v1";
    -  String DOMAIN_V2 = "domain-v2";
    -  String DEFAULT_DOMAIN_VERSION = DOMAIN_V2;
    -}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/WaitForReadyStep.java b/operator/src/main/java/oracle/kubernetes/operator/WaitForReadyStep.java
    index c5ac261d030..cb2fb56655b 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/WaitForReadyStep.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/WaitForReadyStep.java
    @@ -3,6 +3,8 @@
     
     package oracle.kubernetes.operator;
     
    +import java.util.Optional;
    +import java.util.concurrent.TimeUnit;
     import java.util.concurrent.atomic.AtomicBoolean;
     import java.util.function.Consumer;
     
    @@ -21,6 +23,14 @@
      * @param  the type of resource handled by this step
      */
     abstract class WaitForReadyStep extends Step {
    +  private static final int DEFAULT_RECHECK_SECONDS = 5;
    +
    +  static int getWatchBackstopRecheckDelaySeconds() {
    +    return Optional.ofNullable(TuningParameters.getInstance())
    +            .map(parameters -> parameters.getWatchTuning().watchBackstopRecheckDelay)
    +            .orElse(DEFAULT_RECHECK_SECONDS);
    +  }
    +
       private final T initialResource;
     
       /**
    @@ -146,11 +156,15 @@ private void checkUpdatedResource(Packet packet, AsyncFiber fiber, Callback call
         fiber
             .createChildFiber()
             .start(
    -            createReadAsyncStep(getName(), getNamespace(), resumeIfReady(callback)),
    +            createReadAndIfReadyCheckStep(callback),
                 packet.clone(),
                 null);
       }
     
    +  private Step createReadAndIfReadyCheckStep(Callback callback) {
    +    return createReadAsyncStep(getName(), getNamespace(), resumeIfReady(callback));
    +  }
    +
       private String getNamespace() {
         return getMetadata(initialResource).getNamespace();
       }
    @@ -165,8 +179,10 @@ private DefaultResponseStep resumeIfReady(Callback callback) {
           public NextAction onSuccess(Packet packet, CallResponse callResponse) {
             if (isReady(callResponse.getResult())) {
               callback.proceedFromWait(callResponse.getResult());
    +          return doNext(packet);
             }
    -        return doNext(packet);
    +        return doDelay(createReadAndIfReadyCheckStep(callback), packet,
    +                getWatchBackstopRecheckDelaySeconds(), TimeUnit.SECONDS);
           }
         };
       }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/Watcher.java b/operator/src/main/java/oracle/kubernetes/operator/Watcher.java
    index 8ba3c296818..d6384c2814f 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/Watcher.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/Watcher.java
    @@ -4,6 +4,8 @@
     package oracle.kubernetes.operator;
     
     import java.lang.reflect.Method;
    +import java.math.BigInteger;
    +import java.util.Optional;
     import java.util.concurrent.ThreadFactory;
     import java.util.concurrent.atomic.AtomicBoolean;
     
    @@ -14,6 +16,8 @@
     import oracle.kubernetes.operator.TuningParameters.WatchTuning;
     import oracle.kubernetes.operator.builders.WatchBuilder;
     import oracle.kubernetes.operator.builders.WatchI;
    +import oracle.kubernetes.operator.helpers.KubernetesUtils;
    +import oracle.kubernetes.operator.logging.LoggingContext;
     import oracle.kubernetes.operator.logging.LoggingFacade;
     import oracle.kubernetes.operator.logging.LoggingFactory;
     import oracle.kubernetes.operator.logging.MessageKeys;
    @@ -31,11 +35,11 @@
     abstract class Watcher {
       static final String HAS_NEXT_EXCEPTION_MESSAGE = "IO Exception during hasNext method.";
       private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
    -  private static final long IGNORED_RESOURCE_VERSION = 0;
    +  private static final String IGNORED_RESOURCE_VERSION = "0";
     
       private final AtomicBoolean isDraining = new AtomicBoolean(false);
       private final WatchTuning tuning;
    -  private Long resourceVersion;
    +  private String resourceVersion;
       private final AtomicBoolean stopping;
       private WatchListener listener;
       private Thread thread = null;
    @@ -50,8 +54,7 @@ abstract class Watcher {
        * @param stopping an atomic boolean to watch to determine when to stop the watcher
        */
       Watcher(String resourceVersion, WatchTuning tuning, AtomicBoolean stopping) {
    -    this.resourceVersion =
    -        !isNullOrEmpty(resourceVersion) ? Long.parseLong(resourceVersion) : 0;
    +    this.resourceVersion = resourceVersion;
         this.tuning = tuning;
         this.stopping = stopping;
       }
    @@ -142,7 +145,7 @@ private void watchForEvents() {
         try (WatchI watch =
             initiateWatch(
                 new WatchBuilder()
    -                .withResourceVersion(resourceVersion.toString())
    +                .withResourceVersion(resourceVersion)
                     .withTimeoutSeconds(tuning.watchLifetime))) {
           while (hasNext(watch)) {
             Watch.Response item = watch.next();
    @@ -154,10 +157,12 @@ private void watchForEvents() {
               continue;
             }
     
    -        if (isError(item)) {
    -          handleErrorResponse(item);
    -        } else {
    -          handleRegularUpdate(item);
    +        try (LoggingContext stack = LoggingContext.setThreadContext().namespace(getNamespace())) {
    +          if (isError(item)) {
    +            handleErrorResponse(item);
    +          } else {
    +            handleRegularUpdate(item);
    +          }
             }
           }
         } catch (Throwable ex) {
    @@ -183,6 +188,13 @@ private boolean hasNext(WatchI watch) {
        */
       public abstract WatchI initiateWatch(WatchBuilder watchBuilder) throws ApiException;
     
    +  /**
    +   * Gets the Kubernetes namespace associated with the watcher.
    +   *
    +   * @return String object or null if the watcher is not namespaced
    +   */
    +  public abstract String getNamespace();
    +
       private boolean isError(Watch.Response item) {
         return item.type.equalsIgnoreCase("ERROR");
       }
    @@ -201,27 +213,24 @@ private void handleErrorResponse(Watch.Response item) {
           // The kubernetes client parsing logic can mistakenly parse a status as a type
           // with similar fields, such as V1ConfigMap. In this case, the actual status is
           // not available to our layer, so respond defensively by resetting resource version.
    -      resourceVersion = 0L;
    +      resourceVersion = IGNORED_RESOURCE_VERSION;
         } else if (status.getCode() == HTTP_GONE) {
           resourceVersion = computeNextResourceVersionFromMessage(status);
         }
       }
     
    -  private long computeNextResourceVersionFromMessage(V1Status status) {
    +  private String computeNextResourceVersionFromMessage(V1Status status) {
         String message = status.getMessage();
         if (message != null) {
           int index1 = message.indexOf('(');
           if (index1 > 0) {
             int index2 = message.indexOf(')', index1 + 1);
             if (index2 > 0) {
    -          String val = message.substring(index1 + 1, index2);
    -          if (!isNullOrEmpty(val)) {
    -            return Long.parseLong(val);
    -          }
    +          return message.substring(index1 + 1, index2);
             }
           }
         }
    -    return 0L;
    +    return IGNORED_RESOURCE_VERSION;
       }
     
       /**
    @@ -236,32 +245,37 @@ private void trackResourceVersion(String type, Object object) {
         updateResourceVersion(getNewResourceVersion(type, object));
       }
     
    -  private long getNewResourceVersion(String type, Object object) {
    -    long newResourceVersion = getResourceVersionFromMetadata(object);
    +  private String getNewResourceVersion(String type, Object object) {
    +    String newResourceVersion = getResourceVersionFromMetadata(object);
         if (type.equalsIgnoreCase("DELETED")) {
    -      return 1 + newResourceVersion;
    -    } else {
    -      return newResourceVersion;
    +      BigInteger biResourceVersion = KubernetesUtils.getResourceVersion(newResourceVersion);
    +      if (biResourceVersion.compareTo(BigInteger.ZERO) > 0) {
    +        return biResourceVersion.add(BigInteger.ONE).toString();
    +      }
         }
    +    return newResourceVersion;
       }
     
    -  private long getResourceVersionFromMetadata(Object object) {
    +  private String getResourceVersionFromMetadata(Object object) {
         try {
           Method getMetadata = object.getClass().getDeclaredMethod("getMetadata");
    -      V1ObjectMeta metadata = (V1ObjectMeta) getMetadata.invoke(object);
    -      String val = metadata.getResourceVersion();
    -      return !isNullOrEmpty(val) ? Long.parseLong(val) : 0;
    +      return Optional.ofNullable((V1ObjectMeta) getMetadata.invoke(object))
    +              .map(V1ObjectMeta::getResourceVersion).orElse(IGNORED_RESOURCE_VERSION);
         } catch (Exception e) {
           LOGGER.warning(MessageKeys.EXCEPTION, e);
           return IGNORED_RESOURCE_VERSION;
         }
       }
     
    -  private void updateResourceVersion(long newResourceVersion) {
    -    if (resourceVersion == 0) {
    -      resourceVersion = newResourceVersion;
    -    } else if (newResourceVersion > resourceVersion) {
    +  private void updateResourceVersion(String newResourceVersion) {
    +    if (isNullOrEmpty(resourceVersion) || resourceVersion.equals(IGNORED_RESOURCE_VERSION)) {
           resourceVersion = newResourceVersion;
    +    } else {
    +      BigInteger biNewResourceVersion = KubernetesUtils.getResourceVersion(newResourceVersion);
    +      BigInteger biResourceVersion = KubernetesUtils.getResourceVersion(resourceVersion);
    +      if (biNewResourceVersion.compareTo(biResourceVersion) > 0) {
    +        resourceVersion = newResourceVersion;
    +      }
         }
       }
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/calls/AsyncRequestStep.java b/operator/src/main/java/oracle/kubernetes/operator/calls/AsyncRequestStep.java
    index df504e9395e..9f87c494d2e 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/calls/AsyncRequestStep.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/calls/AsyncRequestStep.java
    @@ -19,6 +19,7 @@
     import oracle.kubernetes.operator.helpers.CallBuilder;
     import oracle.kubernetes.operator.helpers.ClientPool;
     import oracle.kubernetes.operator.helpers.ResponseStep;
    +import oracle.kubernetes.operator.logging.LoggingContext;
     import oracle.kubernetes.operator.logging.LoggingFacade;
     import oracle.kubernetes.operator.logging.LoggingFactory;
     import oracle.kubernetes.operator.logging.MessageKeys;
    @@ -28,6 +29,7 @@
     import oracle.kubernetes.operator.work.Packet;
     import oracle.kubernetes.operator.work.Step;
     
    +import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_COMPONENT_NAME;
     import static oracle.kubernetes.operator.calls.CallResponse.createFailure;
     import static oracle.kubernetes.operator.calls.CallResponse.createSuccess;
     import static oracle.kubernetes.operator.logging.MessageKeys.ASYNC_SUCCESS;
    @@ -137,7 +139,7 @@ class AsyncRequestStepProcessing {
         public AsyncRequestStepProcessing(Packet packet, RetryStrategy retry, String cont) {
           this.packet = packet;
           retryStrategy = Optional.ofNullable(retry)
    -          .orElse(new DefaultRetryStrategy(maxRetryCount, AsyncRequestStep.this, AsyncRequestStep.this));
    +            .orElse(new DefaultRetryStrategy(maxRetryCount, AsyncRequestStep.this, AsyncRequestStep.this));
           this.cont = Optional.ofNullable(cont).orElse("");
           client = helper.take();
         }
    @@ -171,23 +173,25 @@ void onFailure(AsyncFiber fiber, ApiException ae, int statusCode, Map {
               try {
                 CancellableCall cc = processing.createCall(fiber);
    -            scheduleTimeoutCheck(fiber, timeoutSeconds, () -> processing.handleTimeout(fiber, cc));
    +            scheduleTimeoutCheck(fiber, timeoutSeconds, () -> processing.handleTimeout(requestParams, fiber, cc));
               } catch (ApiException t) {
                 logAsyncFailure(t, t.getResponseBody());
                 processing.resumeAfterThrowable(fiber);
    @@ -363,17 +377,16 @@ public NextAction doPotentialRetry(Step conflictStep, Packet packet, int statusC
             }
     
             NextAction na = new NextAction();
    -        if (statusCode == 0 && retryCount <= maxRetryCount) {
    -          na.invoke(Optional.ofNullable(conflictStep).orElse(retryStep), packet);
    +        if (!retriesLeft()) {
    +          return null;
    +        } else if (statusCode == 0) {
    +          na.invoke(retryStep, packet);
             } else {
               LOGGER.finer(MessageKeys.ASYNC_RETRY, identityHash(), String.valueOf(waitTime));
               na.delay(retryStep, packet, waitTime, TimeUnit.MILLISECONDS);
             }
             return na;
    -      } else if (statusCode == 409 /* Conflict */ && conflictStep != null) {
    -        // Conflict is an optimistic locking failure.  Therefore, we can't
    -        // simply retry the request.  Instead, application code needs to rebuild
    -        // the request based on latest contents.  If provided, a conflict step will do that.
    +      } else if (isRestartableConflict(conflictStep, statusCode)) {
     
             // exponential back-off
             long waitTime = Math.min((2 << ++retryCount) * SCALE, MAX) + (R.nextInt(HIGH - LOW) + LOW);
    @@ -388,6 +401,17 @@ public NextAction doPotentialRetry(Step conflictStep, Packet packet, int statusC
           return null;
         }
     
    +    // Conflict is an optimistic locking failure.  Therefore, we can't
    +    // simply retry the request.  Instead, application code needs to rebuild
    +    // the request based on latest contents.  If provided, a conflict step will do that.
    +    private boolean isRestartableConflict(Step conflictStep, int statusCode) {
    +      return statusCode == 409 /* Conflict */ && conflictStep != null;
    +    }
    +
    +    private boolean retriesLeft() {
    +      return retryCount <= maxRetryCount;
    +    }
    +
         @Override
         public void reset() {
           retryCount = 0;
    @@ -417,13 +441,21 @@ public void onDownloadProgress(long bytesRead, long contentLength, boolean done)
         @Override
         public void onFailure(
             ApiException ae, int statusCode, Map> responseHeaders) {
    -      processing.onFailure(fiber, ae, statusCode, responseHeaders);
    +      // make sure that the domain namespace is added to the thread local so that
    +      // it can be passed to the LoggingFormatter
    +      try (LoggingContext stack = LoggingContext.setThreadContext().namespace(requestParams.namespace)) {
    +        processing.onFailure(fiber, ae, statusCode, responseHeaders);
    +      }
         }
     
         @Override
         public void onSuccess(
             T result, int statusCode, Map> responseHeaders) {
    -      processing.onSuccess(fiber, result, statusCode, responseHeaders);
    +      // make sure that the domain namespace is added to the thread local so that
    +      // it can be passed to the LoggingFormatter
    +      try (LoggingContext stack = LoggingContext.setThreadContext().namespace(requestParams.namespace)) {
    +        processing.onSuccess(fiber, result, statusCode, responseHeaders);
    +      }
         }
       }
    -}
    \ No newline at end of file
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/calls/FailureStatusSourceException.java b/operator/src/main/java/oracle/kubernetes/operator/calls/FailureStatusSourceException.java
    index c2f7782b2b6..aa88d338152 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/calls/FailureStatusSourceException.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/calls/FailureStatusSourceException.java
    @@ -16,7 +16,7 @@ public FailureStatusSourceException(FailureStatusSource failureStatusSource) {
         this(failureStatusSource, null);
       }
     
    -  public FailureStatusSourceException(FailureStatusSource failureStatusSource, Exception cause) {
    +  public FailureStatusSourceException(FailureStatusSource failureStatusSource, Throwable cause) {
         super(cause);
         this.failureStatusSource = failureStatusSource;
       }
    @@ -29,6 +29,7 @@ public FailureStatusSource getFailureStatusSource() {
        * Log the exception.
        */
       public void log() {
    +    Throwable cause = getCause();
         LOGGER.severe(MessageKeys.CALL_FAILED, failureStatusSource.getMessage(), failureStatusSource.getReason());
         LOGGER.fine(MessageKeys.EXCEPTION, getCause());
       }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/calls/OtherUnrecoverableErrorBuilder.java b/operator/src/main/java/oracle/kubernetes/operator/calls/OtherUnrecoverableErrorBuilder.java
    deleted file mode 100644
    index 48562539c48..00000000000
    --- a/operator/src/main/java/oracle/kubernetes/operator/calls/OtherUnrecoverableErrorBuilder.java
    +++ /dev/null
    @@ -1,59 +0,0 @@
    -// Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    -// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    -
    -package oracle.kubernetes.operator.calls;
    -
    -import io.kubernetes.client.openapi.ApiException;
    -
    -/**
    - * A builder for 'forbidden' and other unrecoverable async results.
    - */
    -public class OtherUnrecoverableErrorBuilder implements FailureStatusSource {
    -  private final String message;
    -  private final int code;
    -
    -  private OtherUnrecoverableErrorBuilder(CallResponse callResponse) {
    -    this.message = callResponse.getRequestParams().toString(false)
    -        + ": " + callResponse.getE().getMessage();
    -    this.code = callResponse.getStatusCode();
    -  }
    -
    -  /**
    -   * Create a ForbiddenErrorBuilder from the provided failed call.
    -   * @param callResponse the failed call
    -   * @return the ForbiddenErrorBuilder
    -   */
    -  public static OtherUnrecoverableErrorBuilder fromFailedCall(CallResponse callResponse) {
    -    return new OtherUnrecoverableErrorBuilder(callResponse);
    -  }
    -
    -  public static boolean isUnrecoverable(ApiException e) {
    -    int code = e.getCode();
    -    return code == 400 || code == 401 || code == 403 || code == 404 || code == 405 || code == 410;
    -  }
    -
    -  @Override
    -  public String getMessage() {
    -    return message;
    -  }
    -
    -  @Override
    -  public String getReason() {
    -    switch (code) {
    -      case 400:
    -        return "Bad Request";
    -      case 401:
    -        return "Unauthorized";
    -      case 403:
    -        return "Forbidden";
    -      case 404:
    -        return "Not Found";
    -      case 405:
    -        return "Method Not Allowed";
    -      case 410:
    -        return "Gone";
    -      default:
    -        return String.valueOf(code);
    -    }
    -  }
    -}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/calls/UnrecoverableErrorBuilder.java b/operator/src/main/java/oracle/kubernetes/operator/calls/UnrecoverableErrorBuilder.java
    index 3068ef18092..e8ac98985fa 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/calls/UnrecoverableErrorBuilder.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/calls/UnrecoverableErrorBuilder.java
    @@ -4,12 +4,12 @@
     package oracle.kubernetes.operator.calls;
     
     import io.kubernetes.client.openapi.ApiException;
    -import oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder;
    +import oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl;
     
     public class UnrecoverableErrorBuilder {
     
       /**
    -   * Returns true if the specified call response indicates an unprocessable entity response from Kubernetes.
    +   * Returns true if the specified call response indicates an unrecoverable response from Kubernetes.
        * @param callResponse the response from a Kubernetes call
        * @param  call response type
        * @return true if an unprocessable entity failure has been reported
    @@ -19,7 +19,7 @@ public static  boolean isAsyncCallFailure(CallResponse callResponse) {
       }
     
       private static boolean isUnrecoverable(ApiException e) {
    -    return OtherUnrecoverableErrorBuilder.isUnrecoverable(e) || UnprocessableEntityBuilder.isUnprocessableEntity(e);
    +    return UnrecoverableErrorBuilderImpl.isUnrecoverable(e);
       }
     
       /**
    @@ -28,12 +28,7 @@ private static boolean isUnrecoverable(ApiException e) {
        * @return status source object
        */
       public static FailureStatusSource fromFailedCall(CallResponse callResponse) {
    -    ApiException apiException = callResponse.getE();
    -    if (UnprocessableEntityBuilder.isUnprocessableEntity(apiException)) {
    -      return UnprocessableEntityBuilder.fromFailedCall(callResponse);
    -    } else {
    -      return OtherUnrecoverableErrorBuilder.fromFailedCall(callResponse);
    -    }
    +    return UnrecoverableErrorBuilderImpl.fromFailedCall(callResponse);
       }
     
       /**
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/calls/unprocessable/UnprocessableEntityBuilder.java b/operator/src/main/java/oracle/kubernetes/operator/calls/unprocessable/UnprocessableEntityBuilder.java
    deleted file mode 100644
    index ad94edbd27e..00000000000
    --- a/operator/src/main/java/oracle/kubernetes/operator/calls/unprocessable/UnprocessableEntityBuilder.java
    +++ /dev/null
    @@ -1,82 +0,0 @@
    -// Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates.
    -// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    -
    -package oracle.kubernetes.operator.calls.unprocessable;
    -
    -import java.util.Collections;
    -
    -import com.google.gson.Gson;
    -import io.kubernetes.client.openapi.ApiException;
    -import oracle.kubernetes.operator.calls.CallResponse;
    -import oracle.kubernetes.operator.calls.FailureStatusSource;
    -
    -public class UnprocessableEntityBuilder implements FailureStatusSource {
    -  static final int HTTP_UNPROCESSABLE_ENTITY = 422;
    -
    -  private final String message;
    -  private final ErrorBody errorBody;
    -
    -  /**
    -   * Create an UnprocessableEntityBuilder from the provided failed call.
    -   * @param callResponse the failed call
    -   * @return the UnprocessableEntityBuilder
    -   */
    -  public static UnprocessableEntityBuilder fromFailedCall(CallResponse callResponse) {
    -    ApiException apiException = callResponse.getE();
    -    if (apiException.getCode() != HTTP_UNPROCESSABLE_ENTITY) {
    -      throw new IllegalArgumentException("Is not unprocessable entity exception");
    -    }
    -
    -    return new UnprocessableEntityBuilder(callResponse);
    -  }
    -
    -  private UnprocessableEntityBuilder(CallResponse callResponse) {
    -    message = callResponse.getRequestParams().toString(false);
    -    errorBody = new Gson().fromJson(callResponse.getE().getResponseBody(), ErrorBody.class);
    -  }
    -
    -  public static boolean isUnprocessableEntity(ApiException exception) {
    -    return exception.getCode() == HTTP_UNPROCESSABLE_ENTITY;
    -  }
    -
    -  public UnprocessableEntityBuilder() {
    -    message = "";
    -    errorBody = new ErrorBody();
    -  }
    -
    -  @Override
    -  public String getMessage() {
    -    return message + ": " + errorBody.getMessage();
    -  }
    -
    -  @Override
    -  public String getReason() {
    -    return errorBody.getDetails().getCauses()[0].getReason();
    -  }
    -
    -  /**
    -   * Build with reason.
    -   * @param reason reason
    -   * @return builder
    -   */
    -  public UnprocessableEntityBuilder withReason(String reason) {
    -    if (errorBody.getDetails() == null) {
    -      errorBody.addDetails();
    -    }
    -    errorBody.getDetails().addCause(new Cause().withReason(reason));
    -    return this;
    -  }
    -
    -  public UnprocessableEntityBuilder withMessage(String message) {
    -    errorBody.setMessage(message);
    -    return this;
    -  }
    -
    -  public ApiException build() {
    -    return new ApiException(HTTP_UNPROCESSABLE_ENTITY, Collections.emptyMap(), createMessageBody());
    -  }
    -
    -  private String createMessageBody() {
    -    return new Gson().toJson(errorBody);
    -  }
    -}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/calls/unprocessable/UnrecoverableErrorBuilderImpl.java b/operator/src/main/java/oracle/kubernetes/operator/calls/unprocessable/UnrecoverableErrorBuilderImpl.java
    new file mode 100644
    index 00000000000..514ec038281
    --- /dev/null
    +++ b/operator/src/main/java/oracle/kubernetes/operator/calls/unprocessable/UnrecoverableErrorBuilderImpl.java
    @@ -0,0 +1,110 @@
    +// Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates.
    +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +package oracle.kubernetes.operator.calls.unprocessable;
    +
    +import java.util.Collections;
    +
    +import com.google.gson.Gson;
    +import io.kubernetes.client.openapi.ApiException;
    +import oracle.kubernetes.operator.calls.CallResponse;
    +import oracle.kubernetes.operator.calls.FailureStatusSource;
    +
    +public class UnrecoverableErrorBuilderImpl implements FailureStatusSource {
    +  private final String message;
    +  private final int code;
    +  private final ErrorBody errorBody;
    +
    +  /**
    +   * Create an UnrecoverableErrorBuilder from the provided failed call.
    +   * @param callResponse the failed call
    +   * @return the FailureStatusSource
    +   */
    +  public static FailureStatusSource fromFailedCall(CallResponse callResponse) {
    +    return new UnrecoverableErrorBuilderImpl(callResponse);
    +  }
    +
    +  private UnrecoverableErrorBuilderImpl(CallResponse callResponse) {
    +    message = callResponse.getRequestParams().toString(false);
    +    code = callResponse.getStatusCode();
    +    ErrorBody eb = new Gson().fromJson(callResponse.getE().getResponseBody(), ErrorBody.class);
    +    if (eb == null) {
    +      eb = new ErrorBody();
    +      eb.setMessage(callResponse.getE().getMessage());
    +      eb.addDetails();
    +      eb.getDetails().addCause(new Cause().withReason(getReasonCode()));
    +    }
    +    errorBody = eb;
    +  }
    +
    +  private String getReasonCode() {
    +    switch (code) {
    +      case 400:
    +        return "BadRequest";
    +      case 401:
    +        return "Unauthorized";
    +      case 403:
    +        return "Forbidden";
    +      case 404:
    +        return "NotFound";
    +      case 405:
    +        return "MethodNotAllowed";
    +      case 410:
    +        return "Gone";
    +      case 500:
    +        return "ServerError";
    +      default:
    +        return String.valueOf(code);
    +    }
    +  }
    +
    +  public static boolean isUnrecoverable(ApiException e) {
    +    int code = e.getCode();
    +    return code == 400 || code == 401 || code == 403 || code == 404 || code == 405 || code == 410 || code == 500;
    +  }
    +
    +  /**
    +   * Create unrecoverable error builder.
    +   */
    +  public UnrecoverableErrorBuilderImpl() {
    +    message = "";
    +    code = 500;
    +    errorBody = new ErrorBody();
    +  }
    +
    +  @Override
    +  public String getMessage() {
    +    return message + ": " + errorBody.getMessage();
    +  }
    +
    +  @Override
    +  public String getReason() {
    +    return errorBody.getDetails().getCauses()[0].getReason();
    +  }
    +
    +  /**
    +   * Build with reason.
    +   * @param reason reason
    +   * @return builder
    +   */
    +  public UnrecoverableErrorBuilderImpl withReason(String reason) {
    +    if (errorBody.getDetails() == null) {
    +      errorBody.addDetails();
    +    }
    +    errorBody.getDetails().addCause(new Cause().withReason(reason));
    +    return this;
    +  }
    +
    +  public UnrecoverableErrorBuilderImpl withMessage(String message) {
    +    errorBody.setMessage(message);
    +    return this;
    +  }
    +
    +  public ApiException build() {
    +    return new ApiException(code, Collections.emptyMap(), createMessageBody());
    +  }
    +
    +  private String createMessageBody() {
    +    return new Gson().toJson(errorBody);
    +  }
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/AuthenticationProxy.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/AuthenticationProxy.java
    index 306f528c9f0..fd8fba31493 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/AuthenticationProxy.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/AuthenticationProxy.java
    @@ -56,14 +56,6 @@ public V1TokenReviewStatus check(String principal, String token) {
       }
     
       private V1TokenReview prepareTokenReview(String token) {
    -    LOGGER.entering();
    -    V1TokenReviewSpec spec = new V1TokenReviewSpec();
    -    spec.setToken(token);
    -    V1TokenReview tokenReview = new V1TokenReview();
    -    tokenReview.setSpec(spec);
    -    // Can't just log token review since it prints out the token, which is sensitive data.
    -    // It doesn't contain any other useful data, so don't log any return info.
    -    LOGGER.exiting();
    -    return tokenReview;
    +    return new V1TokenReview().spec(new V1TokenReviewSpec().token(token));
       }
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/BasePodStepContext.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/BasePodStepContext.java
    index 3214b388096..6e140260724 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/BasePodStepContext.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/BasePodStepContext.java
    @@ -3,6 +3,7 @@
     
     package oracle.kubernetes.operator.helpers;
     
    +import java.util.HashMap;
     import java.util.List;
     import java.util.Map;
     import java.util.Optional;
    @@ -11,18 +12,160 @@
     import io.kubernetes.client.openapi.models.V1EnvVar;
     import io.kubernetes.client.openapi.models.V1Pod;
     import io.kubernetes.client.openapi.models.V1PodSpec;
    +import io.kubernetes.client.openapi.models.V1Toleration;
     import oracle.kubernetes.operator.KubernetesConstants;
    +import oracle.kubernetes.operator.TuningParameters;
    +import oracle.kubernetes.weblogic.domain.model.ServerSpec;
     
     public abstract class BasePodStepContext extends StepContextBase {
    +
    +  BasePodStepContext(DomainPresenceInfo info) {
    +    super(info);
    +  }
    +
       final  T updateForDeepSubstitution(V1PodSpec podSpec, T target) {
         return getContainer(podSpec)
    -        .map(
    -            c -> {
    -              return doDeepSubstitution(augmentSubVars(deepSubVars(c.getEnv())), target);
    -            })
    +        .map(c -> doDeepSubstitution(augmentSubVars(deepSubVars(c.getEnv())), target))
             .orElse(target);
       }
     
    +  abstract ServerSpec getServerSpec();
    +
    +  abstract String getContainerName();
    +
    +  abstract List getContainerCommand();
    +
    +  abstract List getContainers();
    +
    +  protected V1Container createContainer(TuningParameters tuningParameters) {
    +    return new V1Container()
    +        .name(getContainerName())
    +        .image(getServerSpec().getImage())
    +        .imagePullPolicy(getServerSpec().getImagePullPolicy())
    +        .command(getContainerCommand())
    +        .env(getEnvironmentVariables(tuningParameters))
    +        .resources(getServerSpec().getResources())
    +        .securityContext(getServerSpec().getContainerSecurityContext());
    +  }
    +
    +  protected V1PodSpec createPodSpec(TuningParameters tuningParameters) {
    +    return new V1PodSpec()
    +        .containers(getContainers())
    +        .addContainersItem(createContainer(tuningParameters))
    +        .affinity(getServerSpec().getAffinity())
    +        .nodeSelector(getServerSpec().getNodeSelectors())
    +        .serviceAccountName(getServerSpec().getServiceAccountName())
    +        .nodeName(getServerSpec().getNodeName())
    +        .schedulerName(getServerSpec().getSchedulerName())
    +        .priorityClassName(getServerSpec().getPriorityClassName())
    +        .runtimeClassName(getServerSpec().getRuntimeClassName())
    +        .tolerations(getTolerations())
    +        .restartPolicy(getServerSpec().getRestartPolicy())
    +        .securityContext(getServerSpec().getPodSecurityContext())
    +        .imagePullSecrets(getServerSpec().getImagePullSecrets());
    +  }
    +
    +  private List getTolerations() {
    +    List tolerations = getServerSpec().getTolerations();
    +    return tolerations.isEmpty() ? null : tolerations;
    +  }
    +
    +
    +  /**
    +   * Abstract method to be implemented by subclasses to return a list of configured and additional
    +   * environment variables to be set up in the pod.
    +   *
    +   * @param tuningParameters TuningParameters that can be used when obtaining
    +   * @return A list of configured and additional environment variables
    +   */
    +  abstract List getConfiguredEnvVars(TuningParameters tuningParameters);
    +
    +  /**
    +   * Return a list of environment variables to be set up in the pod. This method does some
    +   * processing of the list of environment variables such as token substitution before returning the
    +   * list.
    +   *
    +   * @param tuningParameters TuningParameters containing parameters that may be used in environment
    +   *     variables
    +   * @return A List of environment variables to be set up in the pod
    +   */
    +  final List getEnvironmentVariables(TuningParameters tuningParameters) {
    +
    +    List vars = getConfiguredEnvVars(tuningParameters);
    +
    +    addDefaultEnvVarIfMissing(
    +        vars, "USER_MEM_ARGS", "-Djava.security.egd=file:/dev/./urandom");
    +
    +    hideAdminUserCredentials(vars);
    +    return doDeepSubstitution(varsToSubVariables(vars), vars);
    +  }
    +
    +  protected void addEnvVar(List vars, String name, String value) {
    +    vars.add(new V1EnvVar().name(name).value(value));
    +  }
    +
    +  protected void addEnvVarIfTrue(boolean condition, List vars, String name) {
    +    if (condition) {
    +      addEnvVar(vars, name, "true");
    +    }
    +  }
    +
    +  protected boolean hasEnvVar(List vars, String name) {
    +    for (V1EnvVar var : vars) {
    +      if (name.equals(var.getName())) {
    +        return true;
    +      }
    +    }
    +    return false;
    +  }
    +
    +  protected void addDefaultEnvVarIfMissing(List vars, String name, String value) {
    +    if (!hasEnvVar(vars, name)) {
    +      addEnvVar(vars, name, value);
    +    }
    +  }
    +
    +  protected V1EnvVar findEnvVar(List vars, String name) {
    +    for (V1EnvVar var : vars) {
    +      if (name.equals(var.getName())) {
    +        return var;
    +      }
    +    }
    +    return null;
    +  }
    +
    +  protected void addOrReplaceEnvVar(List vars, String name, String value) {
    +    V1EnvVar var = findEnvVar(vars, name);
    +    if (var != null) {
    +      var.value(value);
    +    } else {
    +      addEnvVar(vars, name, value);
    +    }
    +  }
    +
    +  // Hide the admin account's user name and password.
    +  // Note: need to use null v.s. "" since if you upload a "" to kubectl then download it,
    +  // it comes back as a null and V1EnvVar.equals returns false even though it's supposed to
    +  // be the same value.
    +  // Regardless, the pod ends up with an empty string as the value (v.s. thinking that
    +  // the environment variable hasn't been set), so it honors the value (instead of using
    +  // the default, e.g. 'weblogic' for the user name).
    +  protected void hideAdminUserCredentials(List vars) {
    +    addEnvVar(vars, "ADMIN_USERNAME", null);
    +    addEnvVar(vars, "ADMIN_PASSWORD", null);
    +  }
    +
    +  protected Map varsToSubVariables(List vars) {
    +    Map substitutionVariables = new HashMap<>();
    +    if (vars != null) {
    +      for (V1EnvVar envVar : vars) {
    +        substitutionVariables.put(envVar.getName(), envVar.getValue());
    +      }
    +    }
    +
    +    return substitutionVariables;
    +  }
    +
       final Map deepSubVars(List envVars) {
         return varsToSubVariables(envVars);
       }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/CallBuilder.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/CallBuilder.java
    index ca9f412339c..16ae9e1f073 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/CallBuilder.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/CallBuilder.java
    @@ -151,6 +151,15 @@ public  T execute(
                       requestParams.namespace,
                       (V1ConfigMap) requestParams.body,
                       callback));
    +  private final CallFactory patchConfigMap =
    +      (requestParams, usage, cont, callback) ->
    +          wrap(
    +              patchConfigMapAsync(
    +                  usage,
    +                  requestParams.name,
    +                  requestParams.namespace,
    +                  (V1Patch) requestParams.body,
    +                  callback));
       private final CallFactory createPod =
           (requestParams, usage, cont, callback) ->
               wrap(
    @@ -1000,6 +1009,30 @@ public Step replaceConfigMapAsync(
             replaceConfigmap);
       }
     
    +  private Call patchConfigMapAsync(
    +      ApiClient client, String name, String namespace, V1Patch patch, ApiCallback callback)
    +      throws ApiException {
    +    return new CoreV1Api(client)
    +        .patchNamespacedConfigMapAsync(name, namespace, patch, pretty, null, null, null, callback);
    +  }
    +
    +  /**
    +   * Asynchronous step for patching a config map.
    +   *
    +   * @param name Name
    +   * @param namespace Namespace
    +   * @param patchBody instructions on what to patch
    +   * @param responseStep Response step for when call completes
    +   * @return Asynchronous step
    +   */
    +  public Step patchConfigMapAsync(
    +      String name, String namespace, V1Patch patchBody, ResponseStep responseStep) {
    +    return createRequestAsync(
    +        responseStep,
    +        new RequestParams("patchConfigMap", namespace, name, patchBody),
    +        patchConfigMap);
    +  }
    +
       private Call listPodAsync(
           ApiClient client, String namespace, String cont, ApiCallback callback)
           throws ApiException {
    @@ -1116,7 +1149,7 @@ private Call patchPodAsync(
           ApiClient client, String name, String namespace, V1Patch patch, ApiCallback callback)
           throws ApiException {
         return new CoreV1Api(client)
    -        .patchNamespacedPodAsync(name, namespace, patch, pretty, null, null, false, callback);
    +        .patchNamespacedPodAsync(name, namespace, patch, pretty, null, null, null, callback);
       }
     
       /**
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/ConfigMapHelper.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/ConfigMapHelper.java
    index 72642b25e9a..fbdcda33b1d 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/ConfigMapHelper.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/ConfigMapHelper.java
    @@ -6,17 +6,23 @@
     import java.io.BufferedReader;
     import java.io.IOException;
     import java.io.StringReader;
    -import java.util.ArrayList;
     import java.util.Collections;
     import java.util.HashMap;
     import java.util.List;
     import java.util.Map;
    -
    -import com.fasterxml.jackson.databind.ObjectMapper;
    -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
    +import java.util.Objects;
    +import java.util.Optional;
    +import javax.json.Json;
    +import javax.json.JsonPatchBuilder;
    +import javax.json.JsonValue;
    +import javax.validation.constraints.NotNull;
    +
    +import io.kubernetes.client.custom.V1Patch;
     import io.kubernetes.client.openapi.models.V1ConfigMap;
     import io.kubernetes.client.openapi.models.V1DeleteOptions;
     import io.kubernetes.client.openapi.models.V1ObjectMeta;
    +import oracle.kubernetes.operator.DomainStatusUpdater;
    +import oracle.kubernetes.operator.IntrospectorConfigMapKeys;
     import oracle.kubernetes.operator.KubernetesConstants;
     import oracle.kubernetes.operator.LabelConstants;
     import oracle.kubernetes.operator.ProcessingConstants;
    @@ -31,17 +37,26 @@
     import oracle.kubernetes.operator.work.NextAction;
     import oracle.kubernetes.operator.work.Packet;
     import oracle.kubernetes.operator.work.Step;
    -import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    +import oracle.kubernetes.weblogic.domain.model.Domain;
    +import org.apache.commons.lang3.builder.HashCodeBuilder;
     import org.joda.time.DateTime;
     
    -import static oracle.kubernetes.operator.VersionConstants.DEFAULT_DOMAIN_VERSION;
    +import static java.lang.System.lineSeparator;
    +import static oracle.kubernetes.operator.IntrospectorConfigMapKeys.DOMAINZIP_HASH;
    +import static oracle.kubernetes.operator.IntrospectorConfigMapKeys.DOMAIN_INPUTS_HASH;
    +import static oracle.kubernetes.operator.IntrospectorConfigMapKeys.DOMAIN_RESTART_VERSION;
    +import static oracle.kubernetes.operator.IntrospectorConfigMapKeys.SECRETS_MD_5;
    +import static oracle.kubernetes.operator.IntrospectorConfigMapKeys.SIT_CONFIG_FILE_PREFIX;
    +import static oracle.kubernetes.operator.KubernetesConstants.SCRIPT_CONFIG_MAP_NAME;
    +import static oracle.kubernetes.operator.LabelConstants.INTROSPECTION_STATE_LABEL;
    +import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_VALIDATION_ERRORS;
     
     public class ConfigMapHelper {
    +
       private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
     
       private static final String SCRIPT_LOCATION = "/scripts";
    -  private static ConfigMapComparator COMPARATOR = new ConfigMapComparatorImpl();
    +  private static final ConfigMapComparator COMPARATOR = new ConfigMapComparatorImpl();
     
       private static final FileGroupReader scriptReader = new FileGroupReader(SCRIPT_LOCATION);
     
    @@ -63,40 +78,18 @@ static FileGroupReader getScriptReader() {
         return scriptReader;
       }
     
    -  /**
    -   * Factory for {@link Step} that creates config map containing sit config.
    -   *
    -   * @param next Next step
    -   * @return Step for creating config map containing sit config
    -   */
    -  public static Step createSitConfigMapStep(Step next) {
    -    return new SitConfigMapStep(next);
    -  }
    -
    -  /**
    -   * Factory for {@link Step} that deletes introspector config map.
    -   *
    -   * @param domainUid The unique identifier assigned to the WebLogic domain when it was registered
    -   * @param namespace Namespace
    -   * @param next Next processing step
    -   * @return Step for deleting introspector config map
    -   */
    -  public static Step deleteDomainIntrospectorConfigMapStep(
    -      String domainUid, String namespace, Step next) {
    -    return new DeleteIntrospectorConfigMapStep(domainUid, namespace, next);
    -  }
    -
    -  public static Step readExistingSituConfigMap(String ns, String domainUid) {
    -    String situConfigMapName = ConfigMapHelper.SitConfigMapContext.getConfigMapName(domainUid);
    -    return new CallBuilder().readConfigMapAsync(situConfigMapName, ns, new ReadSituConfigMapStep());
    -  }
    -
       static Map parseIntrospectorResult(String text, String domainUid) {
         Map map = new HashMap<>();
    +    String token = ">>>  updatedomainResult=";
     
         try (BufferedReader reader = new BufferedReader(new StringReader(text))) {
           String line = reader.readLine();
           while (line != null) {
    +        if (line.contains(token)) {
    +          int index = line.indexOf(token);
    +          int beg = index + 1 + token.length();
    +          map.put("UPDATEDOMAINRESULT", line.substring(beg - 1));
    +        }
             if (line.startsWith(">>>") && !line.endsWith("EOF")) {
               String filename = extractFilename(line);
               readFile(reader, filename, map, domainUid);
    @@ -117,7 +110,7 @@ static void readFile(
           String line = reader.readLine();
           while (line != null) {
             if (line.startsWith(">>>") && line.endsWith("EOF")) {
    -          map.put(fileName, stringBuilder.toString());
    +          map.put(fileName, stringBuilder.toString().trim());
               return;
             } else {
               // add line to StringBuilder
    @@ -133,36 +126,40 @@ static void readFile(
     
       static String extractFilename(String line) {
         int lastSlash = line.lastIndexOf('/');
    -    String fname = line.substring(lastSlash + 1, line.length());
    -    return fname;
    +    return line.substring(lastSlash + 1);
       }
     
       /**
    -   * parse domain topology yaml.
    -   * @param topologyYaml topology yaml.
    -   * @return parsed object hierarchy
    +   * getModelInImageSpecHash returns the hash for the fields that should be compared for changes.
    +   *
    +   * @param imageName image name
    +   * @return int hash value of the fields
        */
    -  public static DomainTopology parseDomainTopologyYaml(String topologyYaml) {
    -    ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
    -
    -    try {
    -      DomainTopology domainTopology = mapper.readValue(topologyYaml, DomainTopology.class);
    -
    -      LOGGER.fine(
    -          ReflectionToStringBuilder.toString(domainTopology, ToStringStyle.MULTI_LINE_STYLE));
    +  public static int getModelInImageSpecHash(String imageName) {
    +    return new HashCodeBuilder(17, 37)
    +        .append(imageName)
    +        .toHashCode();
    +  }
     
    -      return domainTopology;
    +  /**
    +   * Returns the standard name for the generated domain config map.
    +   * @param domainUid the unique ID of the domain
    +   * @return map name
    +   */
    +  public static String getIntrospectorConfigMapName(String domainUid) {
    +    return domainUid + KubernetesConstants.INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX;
    +  }
     
    -    } catch (Exception e) {
    -      LOGGER.warning(MessageKeys.CANNOT_PARSE_TOPOLOGY, e);
    +  abstract static class ConfigMapComparator {
    +    boolean containsAll(V1ConfigMap actual, V1ConfigMap expected) {
    +      return containsAllData(getData(actual), getData(expected));
         }
     
    -    return null;
    -  }
    +    private Map getData(V1ConfigMap map) {
    +      return Optional.ofNullable(map).map(V1ConfigMap::getData).orElse(Collections.emptyMap());
    +    }
     
    -  interface ConfigMapComparator {
    -    /** Returns true if the actual map contains all of the entries from the expected map. */
    -    boolean containsAll(V1ConfigMap actual, V1ConfigMap expected);
    +    abstract boolean containsAllData(Map actual, Map expected);
       }
     
       static class ScriptConfigMapStep extends Step {
    @@ -179,54 +176,120 @@ public NextAction apply(Packet packet) {
       }
     
       static class ScriptConfigMapContext extends ConfigMapContext {
    -    private final Map classpathScripts = loadScriptsFromClasspath();
     
         ScriptConfigMapContext(Step conflictStep, String operatorNamespace, String domainNamespace) {
    -      super(conflictStep, operatorNamespace, domainNamespace);
    +      super(conflictStep, SCRIPT_CONFIG_MAP_NAME, domainNamespace, loadScriptsFromClasspath(domainNamespace), null);
     
    -      this.model = createModel(classpathScripts);
    +      addLabel(LabelConstants.OPERATORNAME_LABEL, operatorNamespace);
         }
     
    -    private V1ConfigMap createModel(Map data) {
    -      return new V1ConfigMap().metadata(createMetadata()).data(data);
    +    private static synchronized Map loadScriptsFromClasspath(String domainNamespace) {
    +      Map scripts = scriptReader.loadFilesFromClasspath();
    +      LOGGER.fine(MessageKeys.SCRIPT_LOADED, domainNamespace);
    +      return scripts;
         }
     
    -    private V1ObjectMeta createMetadata() {
    -      return super.createMetadata(KubernetesConstants.DOMAIN_CONFIG_MAP_NAME)
    -          .putLabelsItem(LabelConstants.OPERATORNAME_LABEL, operatorNamespace);
    +    @Override
    +    void recordCurrentMap(Packet packet, V1ConfigMap configMap) {
    +      packet.put(ProcessingConstants.SCRIPT_CONFIG_MAP, configMap);
         }
     
    -    private synchronized Map loadScriptsFromClasspath() {
    -      Map scripts = scriptReader.loadFilesFromClasspath();
    -      LOGGER.fine(MessageKeys.SCRIPT_LOADED, this.domainNamespace);
    -      return scripts;
    +
    +  }
    +
    +  abstract static class ConfigMapContext extends StepContextBase {
    +    private final Map contents;
    +    private final Step conflictStep;
    +    private final String name;
    +    private final String namespace;
    +    private V1ConfigMap model;
    +    private final Map labels = new HashMap<>();
    +
    +    ConfigMapContext(Step conflictStep, String name, String namespace, Map contents,
    +                     DomainPresenceInfo info) {
    +      super(info);
    +      this.conflictStep = conflictStep;
    +      this.name = name;
    +      this.namespace = namespace;
    +      this.contents = contents;
    +
    +      addLabel(LabelConstants.CREATEDBYOPERATOR_LABEL, "true");
         }
     
    -    ResponseStep createReadResponseStep(Step next) {
    -      return new ReadResponseStep(next);
    +    /**
    +     * This method is invoked after all config map processing is done. Subclasses may override
    +     * it to record the config map in a packet.
    +     * @param packet the packet
    +     * @param configMap the final config map
    +     */
    +    void recordCurrentMap(Packet packet, V1ConfigMap configMap) {
         }
     
    -    ResponseStep createCreateResponseStep(Step next) {
    -      return new CreateResponseStep(next);
    +    protected String getName() {
    +      return name;
         }
     
    -    ResponseStep createReplaceResponseStep(Step next) {
    -      return new ReplaceResponseStep(next);
    +    protected V1ConfigMap getModel() {
    +      if (model == null) {
    +        model = createModel(contents);
    +      }
    +      return model;
         }
     
    -    Step updateConfigMap(Step next, V1ConfigMap existingConfigMap) {
    +    protected final V1ConfigMap createModel(Map data) {
    +      return new V1ConfigMap().kind("ConfigMap").apiVersion("v1").metadata(createMetadata()).data(data);
    +    }
    +
    +    private V1ObjectMeta createMetadata() {
    +      return updateForOwnerReference(
    +          new V1ObjectMeta()
    +          .name(name)
    +          .namespace(namespace)
    +          .labels(labels));
    +    }
    +
    +    @SuppressWarnings("SameParameterValue")
    +    void addLabel(String name, String value) {
    +      labels.put(name, value);
    +      model = null;
    +    }
    +
    +    private Map getLabels() {
    +      return Collections.unmodifiableMap(labels);
    +    }
    +
    +    /**
    +     * Creates the step which begins verifying or updating the config map.
    +     * @param next the step to run after the config map processing is done
    +     * @return the new step to run
    +     */
    +    Step verifyConfigMap(Step next) {
    +      return new CallBuilder().readConfigMapAsync(getName(), namespace, new ReadResponseStep(next));
    +    }
    +
    +    Step createConfigMap(Step next) {
           return new CallBuilder()
    -          .replaceConfigMapAsync(
    -              model.getMetadata().getName(),
    -              domainNamespace,
    -              createModel(getCombinedData(existingConfigMap)),
    -              createReplaceResponseStep(next));
    +          .createConfigMapAsync(namespace, getModel(), createCreateResponseStep(next));
         }
     
    -    Map getCombinedData(V1ConfigMap existingConfigMap) {
    -      Map updated = existingConfigMap.getData();
    -      updated.putAll(this.classpathScripts);
    -      return updated;
    +    boolean isIncompatibleMap(V1ConfigMap existingMap) {
    +      return !COMPARATOR.containsAll(existingMap, getModel());
    +    }
    +
    +    V1ConfigMap withoutTransientData(V1ConfigMap originalMap) {
    +      if (originalMap != null && originalMap.getData() != null) {
    +        originalMap.setData(withoutTransientEntries(originalMap.getData()));
    +      }
    +      return originalMap;
    +    }
    +
    +    private Map withoutTransientEntries(Map data) {
    +      data.entrySet().removeIf(this::shouldRemove);
    +      return data;
    +    }
    +
    +    boolean shouldRemove(Map.Entry entry) {
    +      return false;
         }
     
         class ReadResponseStep extends DefaultResponseStep {
    @@ -236,17 +299,73 @@ class ReadResponseStep extends DefaultResponseStep {
     
           @Override
           public NextAction onSuccess(Packet packet, CallResponse callResponse) {
    -        V1ConfigMap existingMap = callResponse.getResult();
    +        DomainPresenceInfo.fromPacket(packet).map(DomainPresenceInfo::getDomain).map(Domain::getIntrospectVersion)
    +              .ifPresent(value -> addLabel(INTROSPECTION_STATE_LABEL, value));
    +        V1ConfigMap existingMap = withoutTransientData(callResponse.getResult());
             if (existingMap == null) {
               return doNext(createConfigMap(getNext()), packet);
    -        } else if (isCompatibleMap(existingMap)) {
    +        } else if (isIncompatibleMap(existingMap)) {
    +          return doNext(updateConfigMap(getNext(), existingMap), packet);
    +        } else if (mustPatchCurrentMap(existingMap)) {
    +          return doNext(patchCurrentMap(existingMap, getNext()), packet);
    +        } else {
               logConfigMapExists();
    -          packet.put(ProcessingConstants.SCRIPT_CONFIG_MAP, existingMap);
    +          recordCurrentMap(packet, existingMap);
               return doNext(packet);
    -        } else {
    -          return doNext(updateConfigMap(getNext(), existingMap), packet);
             }
           }
    +
    +      private Step createConfigMap(Step next) {
    +        return new CallBuilder()
    +            .createConfigMapAsync(namespace, getModel(), createCreateResponseStep(next));
    +      }
    +
    +      private void logConfigMapExists() {
    +        LOGGER.fine(MessageKeys.CM_EXISTS, getName(), namespace);
    +      }
    +
    +      private Step updateConfigMap(Step next, V1ConfigMap existingConfigMap) {
    +        return new CallBuilder().replaceConfigMapAsync(name, namespace,
    +                                        createModel(getCombinedData(existingConfigMap)),
    +                                        createReplaceResponseStep(next));
    +      }
    +
    +      private boolean mustPatchCurrentMap(V1ConfigMap currentMap) {
    +        return KubernetesUtils.isMissingValues(getMapLabels(currentMap), getLabels());
    +      }
    +
    +      private Map getMapLabels(@NotNull V1ConfigMap map) {
    +        return Optional.ofNullable(map.getMetadata()).map(V1ObjectMeta::getLabels).orElseGet(Collections::emptyMap);
    +      }
    +
    +      private Step patchCurrentMap(V1ConfigMap currentMap, Step next) {
    +        JsonPatchBuilder patchBuilder = Json.createPatchBuilder();
    +
    +        if (labelsNotDefined(currentMap)) {
    +          patchBuilder.add("/metadata/labels", JsonValue.EMPTY_JSON_OBJECT);
    +        }
    +        
    +        KubernetesUtils.addPatches(
    +            patchBuilder, "/metadata/labels/", getMapLabels(currentMap), getLabels());
    +
    +        return new CallBuilder()
    +            .patchConfigMapAsync(name, namespace,
    +                new V1Patch(patchBuilder.build().toString()), createPatchResponseStep(next));
    +      }
    +
    +      private boolean labelsNotDefined(V1ConfigMap currentMap) {
    +        return Objects.requireNonNull(currentMap.getMetadata()).getLabels() == null;
    +      }
    +    }
    +
    +    private Map getCombinedData(V1ConfigMap existingConfigMap) {
    +      Map updated = Objects.requireNonNull(existingConfigMap.getData());
    +      updated.putAll(contents);
    +      return updated;
    +    }
    +
    +    private ResponseStep createCreateResponseStep(Step next) {
    +      return new CreateResponseStep(next);
         }
     
         private class CreateResponseStep extends ResponseStep {
    @@ -261,13 +380,16 @@ public NextAction onFailure(Packet packet, CallResponse callRespons
     
           @Override
           public NextAction onSuccess(Packet packet, CallResponse callResponse) {
    -        LOGGER.info(MessageKeys.CM_CREATED, KubernetesConstants.DOMAIN_CONFIG_MAP_NAME,
    -            domainNamespace);
    -        packet.put(ProcessingConstants.SCRIPT_CONFIG_MAP, callResponse.getResult());
    +        LOGGER.info(MessageKeys.CM_CREATED, getName(), namespace);
    +        recordCurrentMap(packet, callResponse.getResult());
             return doNext(packet);
           }
         }
     
    +    private ResponseStep createReplaceResponseStep(Step next) {
    +      return new ReplaceResponseStep(next);
    +    }
    +
         private class ReplaceResponseStep extends ResponseStep {
           ReplaceResponseStep(Step next) {
             super(next);
    @@ -280,257 +402,256 @@ public NextAction onFailure(Packet packet, CallResponse callRespons
     
           @Override
           public NextAction onSuccess(Packet packet, CallResponse callResponse) {
    -        LOGGER.info(MessageKeys.CM_REPLACED, KubernetesConstants.DOMAIN_CONFIG_MAP_NAME,
    -            domainNamespace);
    -        packet.put(ProcessingConstants.SCRIPT_CONFIG_MAP, callResponse.getResult());
    +        LOGGER.info(MessageKeys.CM_REPLACED, getName(), namespace);
    +        recordCurrentMap(packet, callResponse.getResult());
             return doNext(packet);
           }
         }
    -  }
     
    -  abstract static class ConfigMapContext {
    -    protected final Step conflictStep;
    -    protected final String operatorNamespace;
    -    protected final String domainNamespace;
    -    protected V1ConfigMap model;
     
    -    ConfigMapContext(Step conflictStep, String operatorNamespace, String domainNamespace) {
    -      this.conflictStep = conflictStep;
    -      this.operatorNamespace = operatorNamespace;
    -      this.domainNamespace = domainNamespace;
    +    private ResponseStep createPatchResponseStep(Step next) {
    +      return new PatchResponseStep(next);
         }
     
    -    protected V1ObjectMeta createMetadata(String configMapName) {
    -      return new V1ObjectMeta()
    -          .name(configMapName)
    -          .namespace(this.domainNamespace)
    -          .putLabelsItem(LabelConstants.RESOURCE_VERSION_LABEL, DEFAULT_DOMAIN_VERSION)
    -          .putLabelsItem(LabelConstants.CREATEDBYOPERATOR_LABEL, "true");
    -    }
    +    private class PatchResponseStep extends ResponseStep {
     
    -    Step verifyConfigMap(Step next) {
    -      return new CallBuilder()
    -          .readConfigMapAsync(
    -              model.getMetadata().getName(), domainNamespace, createReadResponseStep(next));
    -    }
    -
    -    abstract ResponseStep createReadResponseStep(Step next);
    +      PatchResponseStep(Step next) {
    +        super(next);
    +      }
     
    -    Step createConfigMap(Step next) {
    -      return new CallBuilder()
    -          .createConfigMapAsync(domainNamespace, model, createCreateResponseStep(next));
    +      @Override
    +      public NextAction onSuccess(Packet packet, CallResponse callResponse) {
    +        LOGGER.info(MessageKeys.CM_PATCHED, getName(), namespace);
    +        return doNext(packet);
    +      }
         }
     
    -    abstract ResponseStep createCreateResponseStep(Step next);
    +  }
     
    -    protected boolean isCompatibleMap(V1ConfigMap existingMap) {
    -      return VersionHelper.matchesResourceVersion(existingMap.getMetadata(), DEFAULT_DOMAIN_VERSION)
    -          && COMPARATOR.containsAll(existingMap, this.model);
    -    }
    +  /** Returns true if the actual map contains all of the entries from the expected map. */
    +  static class ConfigMapComparatorImpl extends ConfigMapComparator {
     
    -    void logConfigMapExists() {
    -      LOGGER.fine(MessageKeys.CM_EXISTS, KubernetesConstants.DOMAIN_CONFIG_MAP_NAME, 
    -          domainNamespace);
    +    @Override
    +    boolean containsAllData(Map actual, Map expected) {
    +      return actual.entrySet().containsAll(expected.entrySet());
         }
       }
     
    -  static class ConfigMapComparatorImpl implements ConfigMapComparator {
    -    @Override
    -    public boolean containsAll(V1ConfigMap actual, V1ConfigMap expected) {
    -      return actual.getData().entrySet().containsAll(expected.getData().entrySet());
    -    }
    +  /**
    +   * Factory for a step that creates or updates the generated domain config map from introspection results.
    +   * Reads the following packet fields:
    +   *   DOMAIN_INTROSPECTOR_LOG_RESULT     the introspection result
    +   * and updates:
    +   *   DOMAIN_TOPOLOGY                    the parsed topology
    +   *   DOMAIN_HASH                        a hash of the topology
    +   *   SECRETS_HASH                       a hash of the override secrets
    +   *   DOMAIN_RESTART_VERSION             a field from the domain to force rolling when changed
    +   *   DOMAIN_INPUTS_HASH                 a hash of the image used in the domain
    +   *
    +   * @param next Next step
    +   * @return Step for creating config map containing introspection results
    +   */
    +  public static Step createIntrospectorConfigMapStep(Step next) {
    +    return new IntrospectionConfigMapStep(next);
       }
     
    -  static class SitConfigMapStep extends Step {
    +  /**
    +   * The first in a chain of steps to create the introspector config map from introspection results.
    +   */
    +  static class IntrospectionConfigMapStep extends Step {
     
    -    SitConfigMapStep(Step next) {
    +    IntrospectionConfigMapStep(Step next) {
           super(next);
         }
     
    -    private static String getOperatorNamespace() {
    -      String namespace = System.getenv("OPERATOR_NAMESPACE");
    -      if (namespace == null) {
    -        namespace = "default";
    +    @Override
    +    public NextAction apply(Packet packet) {
    +      IntrospectionLoader loader = new IntrospectionLoader(packet, this);
    +      if (loader.isTopologyNotValid()) {
    +        return doNext(reportTopologyErrorsAndStop(), packet);
    +      } else if (loader.getDomainConfig() == null)  {
    +        return doNext(loader.createIntrospectionVersionUpdateStep(), packet);
    +      } else {
    +        LOGGER.fine(MessageKeys.WLS_CONFIGURATION_READ, timeSinceJobStart(packet), loader.getDomainConfig());
    +        loader.updatePacket();
    +        return doNext(loader.createValidationStep(), packet);
           }
    -      return namespace;
         }
     
    -    @Override
    -    public NextAction apply(Packet packet) {
    -      DomainPresenceInfo info = packet.getSpi(DomainPresenceInfo.class);
    +    private long timeSinceJobStart(Packet packet) {
    +      return System.currentTimeMillis() - ((Long) packet.get(JobHelper.START_TIME));
    +    }
    +
    +  }
    +
    +  static class IntrospectionLoader {
    +    private final Packet packet;
    +    private final Step conflictStep;
    +    private final DomainPresenceInfo info;
    +    private Map data;
    +    private WlsDomainConfig wlsDomainConfig;
     
    +    IntrospectionLoader(Packet packet, Step conflictStep) {
    +      this.packet = packet;
    +      this.info = packet.getSpi(DomainPresenceInfo.class);
    +      this.conflictStep = conflictStep;
    +      parseIntrospectorResult();
    +    }
    +
    +    private void parseIntrospectorResult() {
           String result = (String) packet.remove(ProcessingConstants.DOMAIN_INTROSPECTOR_LOG_RESULT);
    -      // Parse results into separate data files
    -      Map data = parseIntrospectorResult(result, info.getDomainUid());
    +      data = ConfigMapHelper.parseIntrospectorResult(result, info.getDomainUid());
    +
           LOGGER.fine("================");
           LOGGER.fine(data.toString());
           LOGGER.fine("================");
    -      String topologyYaml = data.get("topology.yaml");
    -      if (topologyYaml != null) {
    -        LOGGER.fine("topology.yaml: " + topologyYaml);
    -        DomainTopology domainTopology = parseDomainTopologyYaml(topologyYaml);
    -        if (domainTopology == null || !domainTopology.getDomainValid()) {
    -          // If introspector determines Domain is invalid then log errors and terminate the fiber
    -          if (domainTopology != null) {
    -            logValidationErrors(domainTopology.getValidationErrors());
    -          }
    -          return doNext(null, packet);
    -        }
    -        WlsDomainConfig wlsDomainConfig = domainTopology.getDomain();
    -        ScanCache.INSTANCE.registerScan(
    -            info.getNamespace(), info.getDomainUid(), new Scan(wlsDomainConfig, new DateTime()));
    -        packet.put(ProcessingConstants.DOMAIN_TOPOLOGY, wlsDomainConfig);
    -        String domainRestartVersion = info.getDomain().getRestartVersion();
    -        if (domainRestartVersion != null) {
    -          packet.put(ProcessingConstants.DOMAIN_RESTART_VERSION, domainRestartVersion);
    -          data.put(ProcessingConstants.DOMAIN_RESTART_VERSION, domainRestartVersion);
    -        }
    -        LOGGER.fine(
    -            MessageKeys.WLS_CONFIGURATION_READ,
    -            (System.currentTimeMillis() - ((Long) packet.get(JobHelper.START_TIME))),
    -            wlsDomainConfig);
    -        SitConfigMapContext context =
    -            new SitConfigMapContext(
    -                this, info.getDomainUid(), getOperatorNamespace(), info.getNamespace(), data);
    -
    -        return doNext(
    -            DomainValidationSteps.createValidateDomainTopologyStep(context.verifyConfigMap(getNext())),
    -            packet
    -        );
    -      }
     
    -      // TODO: How do we handle no topology?
    -      return doNext(getNext(), packet);
    +      wlsDomainConfig = Optional.ofNullable(data.get(IntrospectorConfigMapKeys.TOPOLOGY_YAML))
    +            .map(this::getDomainTopology)
    +            .map(DomainTopology::getDomain)
    +            .orElse(null);
         }
     
    -    private void logValidationErrors(List validationErrors) {
    -      if (!validationErrors.isEmpty()) {
    -        for (String err : validationErrors) {
    -          LOGGER.severe(err);
    -        }
    -      }
    +    boolean isTopologyNotValid() {
    +      return packet.containsKey(DOMAIN_VALIDATION_ERRORS);
         }
    -  }
    -
    -  public static class SitConfigMapContext extends ConfigMapContext {
    -    final Map data;
    -    final String domainUid;
    -    final String cmName;
     
    -    SitConfigMapContext(
    -        Step conflictStep,
    -        String domainUid,
    -        String operatorNamespace,
    -        String domainNamespace,
    -        Map data) {
    -      super(conflictStep, operatorNamespace, domainNamespace);
    +    private void updatePacket() {
    +      ScanCache.INSTANCE.registerScan(
    +            info.getNamespace(), info.getDomainUid(), new Scan(wlsDomainConfig, new DateTime()));
    +      packet.put(ProcessingConstants.DOMAIN_TOPOLOGY, wlsDomainConfig);
     
    -      this.domainUid = domainUid;
    -      this.cmName = getConfigMapName(domainUid);
    -      this.data = data;
    -      this.model = createModel(data);
    +      copyFileToPacketIfPresent(DOMAINZIP_HASH, DOMAINZIP_HASH);
    +      copyFileToPacketIfPresent(SECRETS_MD_5, SECRETS_MD_5);
    +      copyToPacketAndFileIfPresent(DOMAIN_RESTART_VERSION, info.getDomain().getRestartVersion());
    +      copyToPacketAndFileIfPresent(DOMAIN_INPUTS_HASH, getModelInImageSpecHash());
         }
     
    -    public static String getConfigMapName(String domainUid) {
    -      return domainUid + KubernetesConstants.INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX;
    +    private Step createIntrospectionVersionUpdateStep() {
    +      return DomainValidationSteps.createValidateDomainTopologyStep(
    +            createIntrospectorConfigMapContext(conflictStep).patchOnly().verifyConfigMap(conflictStep.getNext()));
         }
     
    -    private V1ConfigMap createModel(Map data) {
    -      return new V1ConfigMap()
    -          .apiVersion("v1")
    -          .kind("ConfigMap")
    -          .metadata(createMetadata())
    -          .data(data);
    +    private Step createValidationStep() {
    +      return DomainValidationSteps.createValidateDomainTopologyStep(
    +            createIntrospectorConfigMapContext(conflictStep).verifyConfigMap(conflictStep.getNext()));
         }
     
    -    ResponseStep createReadResponseStep(Step next) {
    -      return new ReadResponseStep(next);
    +    private IntrospectorConfigMapContext createIntrospectorConfigMapContext(Step conflictStep) {
    +      return new IntrospectorConfigMapContext(conflictStep, info.getDomain(), data, info);
         }
     
    -    private V1ObjectMeta createMetadata() {
    -      return super.createMetadata(cmName).putLabelsItem(LabelConstants.DOMAINUID_LABEL, domainUid);
    +    private String getModelInImageSpecHash() {
    +      return String.valueOf(ConfigMapHelper.getModelInImageSpecHash(info.getDomain().getSpec().getImage()));
         }
     
    -    ResponseStep createCreateResponseStep(Step next) {
    -      return new CreateResponseStep(next);
    +    private void copyFileToPacketIfPresent(String fileName, String packetKey) {
    +      Optional.ofNullable(data.get(fileName)).ifPresent(value -> packet.put(packetKey, value));
         }
     
    -    ResponseStep createReplaceResponseStep(Step next) {
    -      return new ReplaceResponseStep(next);
    +    private void copyToPacketAndFileIfPresent(String packetKey, String stringValue) {
    +      Optional.ofNullable(stringValue).ifPresent(value -> populatePacketAndFile(packetKey, value));
         }
     
    -    Step updateConfigMap(Step next, V1ConfigMap existingConfigMap) {
    -      return new CallBuilder()
    -          .replaceConfigMapAsync(
    -              model.getMetadata().getName(),
    -              domainNamespace,
    -              createModel(getCombinedData(existingConfigMap)),
    -              createReplaceResponseStep(next));
    +    private void populatePacketAndFile(String packetKey, String value) {
    +      packet.put(packetKey, value);
    +      data.put(packetKey, value);
         }
     
    -    Map getCombinedData(V1ConfigMap existingConfigMap) {
    -      Map updated = existingConfigMap.getData();
    -      updated.putAll(this.data);
    -      return updated;
    +    private WlsDomainConfig getDomainConfig() {
    +      return wlsDomainConfig;
         }
     
    -    class ReadResponseStep extends DefaultResponseStep {
    -      ReadResponseStep(Step next) {
    -        super(next);
    -      }
    +    private DomainTopology getDomainTopology(String topologyYaml) {
    +      LOGGER.fine("topology.yaml: " + topologyYaml);
    +      return DomainTopology.parseDomainTopologyYaml(topologyYaml, this::reportValidationErrors);
    +    }
     
    -      @Override
    -      public NextAction onSuccess(Packet packet, CallResponse callResponse) {
    -        V1ConfigMap existingMap = callResponse.getResult();
    -        if (existingMap == null) {
    -          return doNext(createConfigMap(getNext()), packet);
    -        } else if (isCompatibleMap(existingMap)) {
    -          logConfigMapExists();
    -          packet.put(ProcessingConstants.SIT_CONFIG_MAP, existingMap);
    -          return doNext(packet);
    -        } else {
    -          return doNext(updateConfigMap(getNext(), existingMap), packet);
    +    private void reportValidationErrors(List validationErrors) {
    +      packet.put(ProcessingConstants.DOMAIN_VALIDATION_ERRORS, validationErrors);
    +      if (!validationErrors.isEmpty()) {
    +        for (String err : validationErrors) {
    +          LOGGER.severe(err);
             }
           }
         }
    +  }
     
    -    private class CreateResponseStep extends ResponseStep {
    -      CreateResponseStep(Step next) {
    -        super(next);
    -      }
    +  public static Step reportTopologyErrorsAndStop() {
    +    return new TopologyErrorsReportStep();
    +  }
     
    -      @Override
    -      public NextAction onFailure(Packet packet, CallResponse callResponse) {
    -        return super.onFailure(conflictStep, packet, callResponse);
    -      }
    +  private static class TopologyErrorsReportStep extends Step {
     
    -      @Override
    -      public NextAction onSuccess(Packet packet, CallResponse callResponse) {
    -        LOGGER.info(MessageKeys.CM_CREATED, KubernetesConstants.DOMAIN_CONFIG_MAP_NAME, 
    -            domainNamespace);
    -        packet.put(ProcessingConstants.SIT_CONFIG_MAP, callResponse.getResult());
    -        return doNext(packet);
    -      }
    +    @Override
    +    public NextAction apply(Packet packet) {
    +      List errors = getErrors(packet);
    +      Step step = DomainStatusUpdater.createFailedStep(DomainStatusUpdater.BAD_TOPOLOGY, perLine(errors), null);
    +      return doNext(step, packet);
         }
     
    -    private class ReplaceResponseStep extends ResponseStep {
    -      ReplaceResponseStep(Step next) {
    -        super(next);
    -      }
    +    @SuppressWarnings("unchecked")
    +    private List getErrors(Packet packet) {
    +      return (List) packet.get(DOMAIN_VALIDATION_ERRORS);
    +    }
     
    -      @Override
    -      public NextAction onFailure(Packet packet, CallResponse callResponse) {
    -        return super.onFailure(conflictStep, packet, callResponse);
    -      }
    +    @NotNull
    +    private String perLine(List errors) {
    +      return String.join(lineSeparator(), errors);
    +    }
    +  }
     
    -      @Override
    -      public NextAction onSuccess(Packet packet, CallResponse callResponse) {
    -        LOGGER.info(MessageKeys.CM_REPLACED, KubernetesConstants.DOMAIN_CONFIG_MAP_NAME,
    -            domainNamespace);
    -        packet.put(ProcessingConstants.SIT_CONFIG_MAP, callResponse.getResult());
    -        return doNext(packet);
    -      }
    +  public static class IntrospectorConfigMapContext extends ConfigMapContext {
    +    final String domainUid;
    +    private boolean patchOnly;
    +
    +    IntrospectorConfigMapContext(
    +          Step conflictStep,
    +          Domain domain,
    +          Map data,
    +          DomainPresenceInfo info) {
    +      super(conflictStep, getIntrospectorConfigMapName(domain.getDomainUid()), domain.getNamespace(), data, info);
    +
    +      this.domainUid = domain.getDomainUid();
    +      addLabel(LabelConstants.DOMAINUID_LABEL, domainUid);
    +    }
    +
    +    IntrospectorConfigMapContext patchOnly() {
    +      patchOnly = true;
    +      return this;
         }
    +
    +    @Override
    +    Step createConfigMap(Step next) {
    +      return patchOnly ? null : super.createConfigMap(next);
    +    }
    +
    +    @Override
    +    boolean isIncompatibleMap(V1ConfigMap existingMap) {
    +      return !patchOnly && super.isIncompatibleMap(existingMap);
    +    }
    +
    +    @Override
    +    boolean shouldRemove(Map.Entry entry) {
    +      return !patchOnly && isRemovableKey(entry.getKey());
    +    }
    +
    +    private boolean isRemovableKey(String key) {
    +      return key.startsWith(SIT_CONFIG_FILE_PREFIX);
    +    }
    +
    +  }
    +
    +  /**
    +   * Factory for a step that deletes the generated introspector config map.
    +   *
    +   * @param domainUid The unique identifier assigned to the WebLogic domain when it was registered
    +   * @param namespace the domain namespace
    +   * @param next the next step to run after the map is deleted
    +   * @return the created step
    +   */
    +  public static Step deleteIntrospectorConfigMapStep(String domainUid, String namespace, Step next) {
    +    return new DeleteIntrospectorConfigMapStep(domainUid, namespace, next);
       }
     
       private static class DeleteIntrospectorConfigMapStep extends Step {
    @@ -545,147 +666,123 @@ private static class DeleteIntrospectorConfigMapStep extends Step {
     
         @Override
         public NextAction apply(Packet packet) {
    -      return doNext(deleteSitConfigMap(getNext()), packet);
    +      return doNext(deleteIntrospectorConfigMap(getNext()), packet);
         }
     
         String getConfigMapDeletedMessageKey() {
    -      return "Domain Introspector config map "
    -          + SitConfigMapContext.getConfigMapName(this.domainUid)
    -          + " deleted";
    +      return String.format("Introspector config map %s deleted", getIntrospectorConfigMapName(this.domainUid));
         }
     
         protected void logConfigMapDeleted() {
           LOGGER.fine(getConfigMapDeletedMessageKey());
         }
     
    -    private Step deleteSitConfigMap(Step next) {
    +    private Step deleteIntrospectorConfigMap(Step next) {
           logConfigMapDeleted();
    -      String configMapName = SitConfigMapContext.getConfigMapName(this.domainUid);
    -      Step step =
    -          new CallBuilder()
    -              .deleteConfigMapAsync(
    -                  configMapName,
    -                  this.namespace,
    -                  new V1DeleteOptions(),
    -                  new DefaultResponseStep<>(next));
    -      return step;
    +      String configMapName = getIntrospectorConfigMapName(this.domainUid);
    +      return new CallBuilder()
    +          .deleteConfigMapAsync(configMapName, namespace, new V1DeleteOptions(), new DefaultResponseStep<>(next));
         }
       }
     
    -  private static class ReadSituConfigMapStep extends ResponseStep {
    +  /**
    +   * Reads the introspector config map for the specified domain, populating the following packet entries:
    +   *   DOMAIN_TOPOLOGY                    the parsed topology
    +   *   DOMAIN_HASH                        a hash of the topology
    +   *   SECRETS_HASH                       a hash of the override secrets
    +   *   DOMAIN_RESTART_VERSION             a field from the domain to force rolling when changed
    +   *   DOMAIN_INPUTS_HASH                 a hash of the image used in the domain.
    +   *
    +   * @param ns the namespace of the domain
    +   * @param domainUid the unique domain ID
    +   * @return a step to do the processing.
    +   */
    +  public static Step readExistingIntrospectorConfigMap(String ns, String domainUid) {
    +    String configMapName = getIntrospectorConfigMapName(domainUid);
    +    return new CallBuilder().readConfigMapAsync(configMapName, ns, new ReadIntrospectorConfigMapStep());
    +  }
     
    -    ReadSituConfigMapStep() {
    -    }
    +  private static class ReadIntrospectorConfigMapStep extends DefaultResponseStep {
     
    -    @Override
    -    public NextAction onFailure(Packet packet, CallResponse callResponse) {
    -      return callResponse.getStatusCode() == CallBuilder.NOT_FOUND
    -          ? onSuccess(packet, callResponse)
    -          : super.onFailure(packet, callResponse);
    +    ReadIntrospectorConfigMapStep() {
         }
     
         @Override
         public NextAction onSuccess(Packet packet, CallResponse callResponse) {
    -      DomainPresenceInfo info = packet.getSpi(DomainPresenceInfo.class);
    -
           V1ConfigMap result = callResponse.getResult();
    -      if (result != null) {
    -        Map data = result.getData();
    -        final String topologyYaml = data.get("topology.yaml");
    -        final String domainRestartVersion = data.get(ProcessingConstants.DOMAIN_RESTART_VERSION);
    -
    -        LOGGER.finest("ReadSituConfigMapStep.onSuccess restart version (from ino spec) "
    -            + info.getDomain().getRestartVersion());
    -        LOGGER.finest("ReadSituConfigMapStep.onSuccess restart version from cm result "
    -            + domainRestartVersion);
    -
    -        if (topologyYaml != null) {
    -
    -          if (domainRestartVersion != null) {
    -            packet.put(ProcessingConstants.DOMAIN_RESTART_VERSION, domainRestartVersion);
    -          }
    -
    -          ConfigMapHelper.DomainTopology domainTopology =
    -              ConfigMapHelper.parseDomainTopologyYaml(topologyYaml);
    -          if (domainTopology != null) {
    -            WlsDomainConfig wlsDomainConfig = domainTopology.getDomain();
    -            ScanCache.INSTANCE.registerScan(
    -                info.getNamespace(),
    -                info.getDomainUid(),
    -                new Scan(wlsDomainConfig, new DateTime()));
    -            packet.put(ProcessingConstants.DOMAIN_TOPOLOGY, wlsDomainConfig);
    -            return doNext(DomainValidationSteps.createValidateDomainTopologyStep(getNext()), packet);
    -          }
    -        }
    -
    +      copyMapEntryToPacket(result, packet, SECRETS_MD_5);
    +      copyMapEntryToPacket(result, packet, DOMAINZIP_HASH);
    +      copyMapEntryToPacket(result, packet, DOMAIN_RESTART_VERSION);
    +      copyMapEntryToPacket(result, packet, DOMAIN_INPUTS_HASH);
    +
    +      DomainTopology domainTopology =
    +            Optional.ofNullable(result)
    +                  .map(V1ConfigMap::getData)
    +                  .map(this::getTopologyYaml)
    +                  .map(DomainTopology::parseDomainTopologyYaml)
    +                  .orElse(null);
    +
    +      if (domainTopology != null) {
    +        recordTopology(packet, packet.getSpi(DomainPresenceInfo.class), domainTopology);
    +        return doNext(DomainValidationSteps.createValidateDomainTopologyStep(getNext()), packet);
    +      } else {
    +        return doNext(packet);
           }
    -      return doNext(packet);
         }
    -  }
     
    -  /**
    -   * Domain topology.
    -   */
    -  public static class DomainTopology {
    -    private boolean domainValid;
    -    private WlsDomainConfig domain;
    -    private List validationErrors;
    -
    -    /**
    -     * check if domain is valid.
    -     * @return true, if valid
    -     */
    -    public boolean getDomainValid() {
    -      // domainValid = true AND no validation errors exist
    -      return domainValid && getValidationErrors().isEmpty();
    +    private String getTopologyYaml(Map data) {
    +      return data.get(IntrospectorConfigMapKeys.TOPOLOGY_YAML);
         }
     
    -    public void setDomainValid(boolean domainValid) {
    -      this.domainValid = domainValid;
    -    }
    +    private void recordTopology(Packet packet, DomainPresenceInfo info, DomainTopology domainTopology) {
    +      ScanCache.INSTANCE.registerScan(
    +          info.getNamespace(),
    +          info.getDomainUid(),
    +          new Scan(domainTopology.getDomain(), new DateTime()));
     
    -    public WlsDomainConfig getDomain() {
    -      this.domain.processDynamicClusters();
    -      return this.domain;
    +      packet.put(ProcessingConstants.DOMAIN_TOPOLOGY, domainTopology.getDomain());
         }
     
    -    public void setDomain(WlsDomainConfig domain) {
    -      this.domain = domain;
    +    private void copyMapEntryToPacket(V1ConfigMap result, Packet packet, String mapKey) {
    +      Optional.ofNullable(result)
    +            .map(V1ConfigMap::getData)
    +            .map(m -> m.get(mapKey))
    +            .ifPresent(v -> addToPacket(packet, mapKey, v));
         }
     
    -    /**
    -     * Retrieve validation errors.
    -     * @return validation errors
    -     */
    -    public List getValidationErrors() {
    -      if (validationErrors == null) {
    -        validationErrors = Collections.emptyList();
    -      }
    +    private void addToPacket(Packet packet, String key, String value) {
    +      LOGGER.finest("Read " + key + " value " + value + " from domain config map");
    +      packet.put(key, value);
    +    }
    +  }
     
    -      if (!domainValid && validationErrors.isEmpty()) {
    -        // add a log message that domain was marked invalid since we have no validation
    -        // errors from introspector.
    -        validationErrors = new ArrayList<>();
    -        validationErrors.add(
    -            "Error, domain is invalid although there are no validation errors from introspector job.");
    -      }
    +  /**
    +   * Reads the introspector config map for the specified domain, populating the following packet entries.
    +   *   INTROSPECTION_STATE_LABEL          the value of the domain's 'introspectVersion' when this map was created
    +   *
    +   * @param ns the namespace of the domain
    +   * @param domainUid the unique domain ID
    +   * @return a step to do the processing.
    +   */
    +  public static Step readIntrospectionVersionStep(String ns, String domainUid) {
    +    String configMapName = getIntrospectorConfigMapName(domainUid);
    +    return new CallBuilder().readConfigMapAsync(configMapName, ns, new ReadIntrospectionVersionStep());
    +  }
     
    -      return validationErrors;
    -    }
    +  private static class ReadIntrospectionVersionStep extends DefaultResponseStep {
     
    -    public void setValidationErrors(List validationErrors) {
    -      this.validationErrors = validationErrors;
    -    }
    +    @Override
    +    public NextAction onSuccess(Packet packet, CallResponse callResponse) {
    +      Optional.ofNullable(callResponse.getResult())
    +            .map(V1ConfigMap::getMetadata)
    +            .map(V1ObjectMeta::getLabels)
    +            .map(l -> l.get(INTROSPECTION_STATE_LABEL))
    +            .ifPresentOrElse(
    +                version -> packet.put(INTROSPECTION_STATE_LABEL, version),
    +                () -> packet.remove(INTROSPECTION_STATE_LABEL));
     
    -    /**
    -     * to string.
    -     * @return string
    -     */
    -    public String toString() {
    -      if (domainValid) {
    -        return "domain: " + domain;
    -      }
    -      return "domainValid: " + domainValid + ", validationErrors: " + validationErrors;
    +      return doNext(packet);
         }
       }
    +
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/CrdHelper.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/CrdHelper.java
    index 7a453407e14..c1838b22d08 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/CrdHelper.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/CrdHelper.java
    @@ -15,6 +15,7 @@
     import java.util.HashMap;
     import java.util.List;
     import java.util.Map;
    +import java.util.Optional;
     import java.util.stream.Collectors;
     
     import com.google.gson.Gson;
    @@ -37,9 +38,10 @@
     import io.kubernetes.client.openapi.models.V1beta1CustomResourceValidation;
     import io.kubernetes.client.openapi.models.V1beta1JSONSchemaProps;
     import io.kubernetes.client.util.Yaml;
    +import okhttp3.internal.http2.StreamResetException;
     import oracle.kubernetes.json.SchemaGenerator;
     import oracle.kubernetes.operator.KubernetesConstants;
    -import oracle.kubernetes.operator.Main;
    +import oracle.kubernetes.operator.LabelConstants;
     import oracle.kubernetes.operator.calls.CallResponse;
     import oracle.kubernetes.operator.logging.LoggingFacade;
     import oracle.kubernetes.operator.logging.LoggingFactory;
    @@ -55,6 +57,7 @@
     public class CrdHelper {
       private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
       private static final String SCHEMA_LOCATION = "/schema";
    +  private static final String NO_ERROR = "NO_ERROR";
       private static final CrdComparator COMPARATOR = new CrdComparatorImpl();
     
       private static final FileGroupReader schemaReader = new FileGroupReader(SCHEMA_LOCATION);
    @@ -71,7 +74,7 @@ public static void main(String[] args) {
           throw new IllegalArgumentException();
         }
     
    -    CrdContext context = new CrdContext(null, null);
    +    CrdContext context = new CrdContext(null, null, null);
     
         String outputFileName = args[0];
         Path outputFilePath = Paths.get(outputFileName);
    @@ -104,11 +107,12 @@ public static void main(String[] args) {
        * Factory for {@link Step} that creates Domain CRD.
        *
        * @param version Version of the Kubernetes API Server
    +   * @param productVersion Version of the operator
        * @param next Next step
        * @return Step for creating Domain custom resource definition
        */
    -  public static Step createDomainCrdStep(KubernetesVersion version, Step next) {
    -    return new CrdStep(version, next);
    +  public static Step createDomainCrdStep(KubernetesVersion version, SemanticVersion productVersion, Step next) {
    +    return new CrdStep(version, productVersion, next);
       }
     
       private static List getVersions(V1CustomResourceDefinition crd) {
    @@ -137,26 +141,24 @@ private static List getBetaVersions(V1beta1CustomResourceDefini
     
       interface CrdComparator {
         boolean isOutdatedCrd(
    -        V1CustomResourceDefinition actual, V1CustomResourceDefinition expected);
    +        SemanticVersion productVersion, V1CustomResourceDefinition actual, V1CustomResourceDefinition expected);
     
         boolean isOutdatedBetaCrd(
    +        SemanticVersion productVersion,
             V1beta1CustomResourceDefinition actual, V1beta1CustomResourceDefinition expected);
       }
     
       static class CrdStep extends Step {
         final CrdContext context;
     
    -    CrdStep(KubernetesVersion version, Step next) {
    +    CrdStep(KubernetesVersion version, SemanticVersion productVersion, Step next) {
           super(next);
    -      context = new CrdContext(version, this);
    +      context = new CrdContext(version, productVersion, this);
         }
     
         @Override
         public NextAction apply(Packet packet) {
           if (context.version.isCrdV1Supported()) {
    -        /* MARKER-2.6.0-ONLY */
    -        Main.useDomainStatusEndpoint.set(true);
    -        /* END-2.6.0-ONLY */
             return doNext(context.verifyCrd(getNext()), packet);
           } else {
             return doNext(context.verifyBetaCrd(getNext()), packet);
    @@ -169,33 +171,40 @@ static class CrdContext {
         private final V1CustomResourceDefinition model;
         private final V1beta1CustomResourceDefinition betaModel;
         private final KubernetesVersion version;
    +    private final SemanticVersion productVersion;
     
    -    CrdContext(KubernetesVersion version, Step conflictStep) {
    +    CrdContext(KubernetesVersion version, SemanticVersion productVersion, Step conflictStep) {
           this.version = version;
    +      this.productVersion = productVersion;
           this.conflictStep = conflictStep;
    -      this.model = createModel(version);
    -      this.betaModel = createBetaModel(version);
    +      this.model = createModel(version, productVersion);
    +      this.betaModel = createBetaModel(version, productVersion);
         }
     
    -    static V1CustomResourceDefinition createModel(KubernetesVersion version) {
    +    static V1CustomResourceDefinition createModel(KubernetesVersion version, SemanticVersion productVersion) {
           return new V1CustomResourceDefinition()
               .apiVersion("apiextensions.k8s.io/v1")
               .kind("CustomResourceDefinition")
    -          .metadata(createMetadata())
    +          .metadata(createMetadata(productVersion))
               .spec(createSpec(version));
         }
     
    -    static V1beta1CustomResourceDefinition createBetaModel(KubernetesVersion version) {
    +    static V1beta1CustomResourceDefinition createBetaModel(KubernetesVersion version, SemanticVersion productVersion) {
           return new V1beta1CustomResourceDefinition()
               .apiVersion("apiextensions.k8s.io/v1beta1")
               .kind("CustomResourceDefinition")
    -          .metadata(createMetadata())
    +          .metadata(createMetadata(productVersion))
               .spec(createBetaSpec(version));
         }
     
    -    static V1ObjectMeta createMetadata() {
    -      return new V1ObjectMeta()
    +    static V1ObjectMeta createMetadata(SemanticVersion productVersion) {
    +      V1ObjectMeta metadata = new V1ObjectMeta()
               .name(KubernetesConstants.CRD_NAME);
    +
    +      if (productVersion != null) {
    +        metadata.putLabelsItem(LabelConstants.OPERATOR_VERISON, productVersion.toString());
    +      }
    +      return metadata;
         }
     
         static V1CustomResourceDefinitionSpec createSpec(KubernetesVersion version) {
    @@ -244,11 +253,7 @@ static V1CustomResourceSubresources createSubresources() {
     
         static V1beta1CustomResourceSubresources createBetaSubresources() {
           return new V1beta1CustomResourceSubresources()
    -          /* MARKER-2.6.0-ONLY */
    -          // for 2.6.0 we will not enable the status subresource for the beta version of CRD
    -          // the 3.0.0 operator will enable this subresource so 2.6.0 will still check the actual CRD
    -          // .status(new HashMap()) // this just needs an empty object to enable status subresource
    -          /* END-2.6.0-ONLY */
    +          .status(new HashMap()) // this just needs an empty object to enable status subresource
               .scale(
                   new V1beta1CustomResourceSubresourceScale()
                       .specReplicasPath(".spec.replicas")
    @@ -259,9 +264,6 @@ static List getCrdVersions() {
           Map schemas = schemaReader.loadFilesFromClasspath();
           List versions = schemas.entrySet().stream()
               .sorted(Comparator.comparing(Map.Entry::getKey))
    -          /* MARKER-2.6.0-ONLY */
    -          .filter(entry -> !KubernetesConstants.DOMAIN_VERSION.equals(getVersionFromCrdSchemaFileName(entry.getKey())))
    -          /* END-2.6.0-ONLY */
               .map(entry -> new V1CustomResourceDefinitionVersion()
                   .name(getVersionFromCrdSchemaFileName(entry.getKey()))
                   .schema(getValidationFromCrdSchemaFile(entry.getValue()))
    @@ -285,9 +287,6 @@ static List getBetaCrdVersions() {
           Map schemas = schemaReader.loadFilesFromClasspath();
           List versions = schemas.entrySet().stream()
               .sorted(Comparator.comparing(Map.Entry::getKey))
    -          /* MARKER-2.6.0-ONLY */
    -          .filter(entry -> !KubernetesConstants.DOMAIN_VERSION.equals(getVersionFromCrdSchemaFileName(entry.getKey())))
    -          /* END-2.6.0-ONLY */
               .map(entry -> new V1beta1CustomResourceDefinitionVersion()
                   .name(getVersionFromCrdSchemaFileName(entry.getKey()))
                   .served(true)
    @@ -362,12 +361,13 @@ static SchemaGenerator createSchemaGenerator() {
           generator.setIncludeAdditionalProperties(false);
           generator.setSupportObjectReferences(false);
           generator.setIncludeSchemaReference(false);
    +      generator.addPackageToSuppressDescriptions("io.kubernetes.client.openapi.models");
           return generator;
         }
     
         Step verifyCrd(Step next) {
           return new CallBuilder().readCustomResourceDefinitionAsync(
    -          model.getMetadata().getName(), createReadResponseStep(next));
    +              model.getMetadata().getName(), createReadResponseStep(next));
         }
     
         ResponseStep createReadResponseStep(Step next) {
    @@ -385,7 +385,7 @@ ResponseStep createBetaReadResponseStep(Step ne
     
         Step createCrd(Step next) {
           return new CallBuilder().createCustomResourceDefinitionAsync(
    -          model, createCreateResponseStep(next));
    +              model, createCreateResponseStep(next));
         }
     
         ResponseStep createCreateResponseStep(Step next) {
    @@ -402,7 +402,7 @@ ResponseStep createBetaCreateResponseStep(Step
         }
     
         private boolean isOutdatedCrd(V1CustomResourceDefinition existingCrd) {
    -      return COMPARATOR.isOutdatedCrd(existingCrd, this.model);
    +      return COMPARATOR.isOutdatedCrd(productVersion, existingCrd, this.model);
         }
     
         private boolean existingCrdContainsVersion(V1CustomResourceDefinition existingCrd) {
    @@ -421,7 +421,7 @@ private boolean existingCrdContainsVersion(V1CustomResourceDefinition existingCr
         }
     
         private boolean isOutdatedBetaCrd(V1beta1CustomResourceDefinition existingCrd) {
    -      return COMPARATOR.isOutdatedBetaCrd(existingCrd, this.betaModel);
    +      return COMPARATOR.isOutdatedBetaCrd(productVersion, existingCrd, this.betaModel);
         }
     
         private boolean existingBetaCrdContainsVersion(V1beta1CustomResourceDefinition existingCrd) {
    @@ -440,26 +440,33 @@ private boolean existingBetaCrdContainsVersion(V1beta1CustomResourceDefinition e
         }
     
         Step updateExistingCrd(Step next, V1CustomResourceDefinition existingCrd) {
    -      existingCrd
    -          .getSpec()
    -          .addVersionsItem(
    -              new V1CustomResourceDefinitionVersion()
    -                  .name(KubernetesConstants.DOMAIN_VERSION)
    -                  .schema(createSchemaValidation())
    -                  .subresources(createSubresources())
    -                  .served(true));
    +      List versions = existingCrd.getSpec().getVersions();
    +      for (V1CustomResourceDefinitionVersion version : versions) {
    +        version.setStorage(false);
    +      }
    +      versions.add(0,
    +          new V1CustomResourceDefinitionVersion()
    +              .name(KubernetesConstants.DOMAIN_VERSION)
    +              .schema(createSchemaValidation())
    +              .subresources(createSubresources())
    +              .served(true)
    +              .storage(true));
     
           return new CallBuilder().replaceCustomResourceDefinitionAsync(
    -          existingCrd.getMetadata().getName(), existingCrd, createReplaceResponseStep(next));
    +              existingCrd.getMetadata().getName(), existingCrd, createReplaceResponseStep(next));
         }
     
         Step updateExistingBetaCrd(Step next, V1beta1CustomResourceDefinition existingCrd) {
    -      existingCrd
    -          .getSpec()
    -          .addVersionsItem(
    -              new V1beta1CustomResourceDefinitionVersion()
    -                  .name(KubernetesConstants.DOMAIN_VERSION)
    -                  .served(true));
    +      List versions = existingCrd.getSpec().getVersions();
    +      for (V1beta1CustomResourceDefinitionVersion version : versions) {
    +        version.setStorage(false);
    +      }
    +      versions.add(0,
    +          new V1beta1CustomResourceDefinitionVersion()
    +              .name(KubernetesConstants.DOMAIN_VERSION)
    +              .served(true)
    +              .storage(true));
    +      existingCrd.getSpec().setVersion(KubernetesConstants.DOMAIN_VERSION);
     
           return new CallBuilder().replaceBetaCustomResourceDefinitionAsync(
               existingCrd.getMetadata().getName(), existingCrd, createBetaReplaceResponseStep(next));
    @@ -543,24 +550,12 @@ public NextAction onSuccess(
               } else if (isOutdatedBetaCrd(existingCrd)) {
                 return doNext(updateBetaCrd(getNext(), existingCrd), packet);
               } else if (!existingBetaCrdContainsVersion(existingCrd)) {
    -            /* MARKER-2.6.0-ONLY */
    -            checkForStatusSubresource(existingCrd);
    -            /* END-2.6.0-ONLY */
                 return doNext(updateExistingBetaCrd(getNext(), existingCrd), packet);
               }
    -          /* MARKER-2.6.0-ONLY */
    -          checkForStatusSubresource(existingCrd);
    -          /* END-2.6.0-ONLY */
             }
             return doNext(packet);
           }
     
    -      /* MARKER-2.6.0-ONLY */
    -      private void checkForStatusSubresource(V1beta1CustomResourceDefinition existingCrd) {
    -        Main.useDomainStatusEndpoint.set(existingCrd.getSpec().getSubresources().getStatus() != null);
    -      }
    -      /* END-2.6.0-ONLY */
    -
           @Override
           protected NextAction onFailureNoRetry(Packet packet, CallResponse callResponse) {
             return isNotAuthorizedOrForbidden(callResponse)
    @@ -582,9 +577,16 @@ public NextAction onFailure(
           @Override
           public NextAction onSuccess(
               Packet packet, CallResponse callResponse) {
    -        LOGGER.info(MessageKeys.CREATING_CRD, callResponse);
    +        LOGGER.info(MessageKeys.CREATING_CRD, callResponse.getResult().getMetadata().getName());
             return doNext(packet);
           }
    +
    +      @Override
    +      protected NextAction onFailureNoRetry(Packet packet, CallResponse callResponse) {
    +        LOGGER.info(MessageKeys.CREATE_CRD_FAILED, callResponse.getE().getResponseBody());
    +        return isNotAuthorizedOrForbidden(callResponse)
    +            ? doNext(packet) : super.onFailureNoRetry(packet, callResponse);
    +      }
         }
     
         private class CreateBetaResponseStep extends ResponseStep {
    @@ -601,9 +603,16 @@ public NextAction onFailure(
           @Override
           public NextAction onSuccess(
               Packet packet, CallResponse callResponse) {
    -        LOGGER.info(MessageKeys.CREATING_CRD, callResponse);
    +        LOGGER.info(MessageKeys.CREATING_CRD, callResponse.getResult().getMetadata().getName());
             return doNext(packet);
           }
    +
    +      @Override
    +      protected NextAction onFailureNoRetry(Packet packet, CallResponse callResponse) {
    +        LOGGER.info(MessageKeys.CREATE_CRD_FAILED, callResponse.getE().getResponseBody());
    +        return isNotAuthorizedOrForbidden(callResponse)
    +            ? doNext(packet) : super.onFailureNoRetry(packet, callResponse);
    +      }
         }
     
         private class ReplaceResponseStep extends ResponseStep {
    @@ -620,9 +629,18 @@ public NextAction onFailure(
           @Override
           public NextAction onSuccess(
               Packet packet, CallResponse callResponse) {
    -        LOGGER.info(MessageKeys.CREATING_CRD, callResponse);
    +        LOGGER.info(MessageKeys.CREATING_CRD, callResponse.getResult().getMetadata().getName());
             return doNext(packet);
           }
    +
    +      @Override
    +      protected NextAction onFailureNoRetry(Packet packet, CallResponse callResponse) {
    +        LOGGER.info(MessageKeys.REPLACE_CRD_FAILED, callResponse.getE().getResponseBody());
    +        return isNotAuthorizedOrForbidden(callResponse)
    +           || ((callResponse.getE().getCause() instanceof StreamResetException) 
    +           && (callResponse.getExceptionString().contains(NO_ERROR)))
    +           ? doNext(packet) : super.onFailureNoRetry(packet, callResponse);
    +      }      
         }
     
         private class ReplaceBetaResponseStep extends ResponseStep {
    @@ -639,15 +657,24 @@ public NextAction onFailure(
           @Override
           public NextAction onSuccess(
               Packet packet, CallResponse callResponse) {
    -        LOGGER.info(MessageKeys.CREATING_CRD, callResponse);
    +        LOGGER.info(MessageKeys.CREATING_CRD, callResponse.getResult().getMetadata().getName());
             return doNext(packet);
           }
    +
    +      @Override
    +      protected NextAction onFailureNoRetry(Packet packet, CallResponse callResponse) {
    +        LOGGER.info(MessageKeys.REPLACE_CRD_FAILED, callResponse.getE().getResponseBody());
    +        return isNotAuthorizedOrForbidden(callResponse)
    +           || ((callResponse.getE().getCause() instanceof StreamResetException) 
    +           && (callResponse.getExceptionString().contains(NO_ERROR)))
    +           ? doNext(packet) : super.onFailureNoRetry(packet, callResponse);
    +      }
         }
       }
     
       static class CrdComparatorImpl implements CrdComparator {
         @Override
    -    public boolean isOutdatedCrd(
    +    public boolean isOutdatedCrd(SemanticVersion productVersion,
             V1CustomResourceDefinition actual, V1CustomResourceDefinition expected) {
           ResourceVersion current = new ResourceVersion(KubernetesConstants.DOMAIN_VERSION);
           List actualVersions = getVersions(actual);
    @@ -658,12 +685,20 @@ public boolean isOutdatedCrd(
             }
           }
     
    +      // Check product version label
    +      if (productVersion != null) {
    +        SemanticVersion currentCrdVersion = getProductVersionFromMetadata(actual.getMetadata());
    +        if (currentCrdVersion == null || productVersion.compareTo(currentCrdVersion) < 0) {
    +          return false;
    +        }
    +      }
    +
           return getSchemaValidation(actual) == null
               || !getSchemaValidation(expected).equals(getSchemaValidation(actual));
         }
     
         @Override
    -    public boolean isOutdatedBetaCrd(
    +    public boolean isOutdatedBetaCrd(SemanticVersion productVersion,
             V1beta1CustomResourceDefinition actual, V1beta1CustomResourceDefinition expected) {
           ResourceVersion current = new ResourceVersion(KubernetesConstants.DOMAIN_VERSION);
           List actualVersions = getBetaVersions(actual);
    @@ -674,10 +709,26 @@ public boolean isOutdatedBetaCrd(
             }
           }
     
    +      // Check product version label
    +      if (productVersion != null) {
    +        SemanticVersion currentCrdVersion = getProductVersionFromMetadata(actual.getMetadata());
    +        if (currentCrdVersion == null || productVersion.compareTo(currentCrdVersion) < 0) {
    +          return false;
    +        }
    +      }
    +
           return getBetaSchemaValidation(actual) == null
               || !getBetaSchemaValidation(expected).equals(getBetaSchemaValidation(actual));
         }
     
    +    private SemanticVersion getProductVersionFromMetadata(V1ObjectMeta metadata) {
    +      return Optional.ofNullable(metadata)
    +              .map(V1ObjectMeta::getLabels)
    +              .map(labels -> labels.get(LabelConstants.OPERATOR_VERISON))
    +              .map(SemanticVersion::new)
    +              .orElse(null);
    +    }
    +
         // true, if version is later than base
         private boolean isLaterOrEqual(ResourceVersion base, ResourceVersion version) {
           if (!version.getVersion().equals(base.getVersion())) {
    @@ -727,4 +778,4 @@ private V1beta1JSONSchemaProps getBetaSchemaValidation(V1beta1CustomResourceDefi
           return null;
         }
       }
    -}
    \ No newline at end of file
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainPresenceInfo.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainPresenceInfo.java
    index 4b382cbac33..ee4c2ca5b20 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainPresenceInfo.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainPresenceInfo.java
    @@ -16,6 +16,8 @@
     import java.util.concurrent.atomic.AtomicReference;
     import java.util.function.Predicate;
     import java.util.stream.Stream;
    +import javax.annotation.Nonnull;
    +import javax.annotation.Nullable;
     
     import io.kubernetes.client.openapi.models.V1EnvVar;
     import io.kubernetes.client.openapi.models.V1ObjectMeta;
    @@ -23,6 +25,7 @@
     import io.kubernetes.client.openapi.models.V1Service;
     import oracle.kubernetes.operator.WebLogicConstants;
     import oracle.kubernetes.operator.wlsconfig.WlsServerConfig;
    +import oracle.kubernetes.operator.work.Packet;
     import oracle.kubernetes.weblogic.domain.model.Domain;
     import oracle.kubernetes.weblogic.domain.model.ServerSpec;
     import org.apache.commons.lang3.builder.EqualsBuilder;
    @@ -103,6 +106,10 @@ public V1Service removeServerService(String serverName) {
         return getSko(serverName).getService().getAndSet(null);
       }
     
    +  public static Optional fromPacket(Packet packet) {
    +    return Optional.ofNullable(packet.getSpi(DomainPresenceInfo.class));
    +  }
    +
       V1Service[] getServiceServices() {
         return servers.values().stream()
             .map(ServerKubernetesObjects::getService)
    @@ -526,9 +533,9 @@ public ServerStartupInfo(
          * @param isServiceOnly true, if only the server service should be created
          */
         public ServerStartupInfo(
    -        WlsServerConfig serverConfig,
    -        String clusterName,
    -        ServerSpec serverSpec,
    +        @Nonnull WlsServerConfig serverConfig,
    +        @Nullable String clusterName,
    +        @Nonnull ServerSpec serverSpec,
             boolean isServiceOnly) {
           this.serverConfig = serverConfig;
           this.clusterName = clusterName;
    @@ -536,8 +543,12 @@ public ServerStartupInfo(
           this.isServiceOnly = isServiceOnly;
         }
     
    +    public String getName() {
    +      return this.serverConfig.getName();
    +    }
    +
         public String getServerName() {
    -      return Optional.ofNullable(serverConfig).map(WlsServerConfig::getName).orElse(null);
    +      return serverConfig.getName();
         }
     
         public String getClusterName() {
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainStatusPatch.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainStatusPatch.java
    index 713699493e3..bdb261f02f3 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainStatusPatch.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainStatusPatch.java
    @@ -12,8 +12,6 @@
     import oracle.kubernetes.weblogic.domain.model.Domain;
     
     public class DomainStatusPatch {
    -  static final String BAD_DOMAIN = "ErrBadDomain";
    -  static final String ERR_INTROSPECTOR = "ErrIntrospector";
     
       private final String name;
       private final String namespace;
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainTopology.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainTopology.java
    new file mode 100644
    index 00000000000..d8eeff01297
    --- /dev/null
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainTopology.java
    @@ -0,0 +1,137 @@
    +// Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates.
    +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +package oracle.kubernetes.operator.helpers;
    +
    +import java.util.ArrayList;
    +import java.util.Collections;
    +import java.util.List;
    +import java.util.function.Consumer;
    +
    +import com.fasterxml.jackson.databind.ObjectMapper;
    +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
    +import oracle.kubernetes.operator.logging.LoggingFacade;
    +import oracle.kubernetes.operator.logging.LoggingFactory;
    +import oracle.kubernetes.operator.logging.MessageKeys;
    +import oracle.kubernetes.operator.wlsconfig.WlsDomainConfig;
    +import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
    +import org.apache.commons.lang3.builder.ToStringStyle;
    +
    +/**
    + * Domain topology.
    + */
    +public class DomainTopology {
    +  private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
    +
    +  private boolean domainValid;
    +  private WlsDomainConfig domain;
    +  private List validationErrors;
    +
    +  @SuppressWarnings("unused") // Used by parser
    +  public DomainTopology() {
    +  }
    +
    +  public DomainTopology(WlsDomainConfig domain) {
    +    this.domain = domain;
    +    this.domainValid = true;
    +  }
    +
    +  /**
    +   * Parses a topology yaml. If validation errors occur, logs them and returns null.
    +   * @param topologyYaml the YAML to parse
    +   * @param errorReporter processing for the validation errors
    +   * @return a valid topology or null
    +   */
    +  public static DomainTopology parseDomainTopologyYaml(String topologyYaml, Consumer> errorReporter) {
    +    final DomainTopology domainTopology = parseDomainTopologyYaml(topologyYaml);
    +    if (domainTopology == null || domainTopology.getDomainValid()) {
    +      return domainTopology;
    +    } else {
    +      errorReporter.accept(domainTopology.validationErrors);
    +      return null;
    +    }
    +  }
    +
    +  /**
    +   * parse domain topology yaml.
    +   * @param topologyYaml topology yaml.
    +   * @return parsed object hierarchy
    +   */
    +  public static DomainTopology parseDomainTopologyYaml(String topologyYaml) {
    +    ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
    +
    +    try {
    +      DomainTopology domainTopology = mapper.readValue(topologyYaml, DomainTopology.class);
    +
    +      LOGGER.fine(
    +          ReflectionToStringBuilder.toString(domainTopology, ToStringStyle.MULTI_LINE_STYLE));
    +
    +      return domainTopology;
    +
    +    } catch (Exception e) {
    +      LOGGER.warning(MessageKeys.CANNOT_PARSE_TOPOLOGY, e);
    +    }
    +
    +    return null;
    +  }
    +
    +  /**
    +   * check if domain is valid.
    +   * @return true, if valid
    +   */
    +  public boolean getDomainValid() {
    +    return domainValid && getValidationErrors().isEmpty();
    +  }
    +
    +  @SuppressWarnings("unused") // used by parser
    +  public void setDomainValid(boolean domainValid) {
    +    this.domainValid = domainValid;
    +  }
    +
    +  @SuppressWarnings("unused") // used by parser
    +  public void setValidationErrors(List validationErrors) {
    +    this.validationErrors = validationErrors;
    +  }
    +
    +
    +  public WlsDomainConfig getDomain() {
    +    this.domain.processDynamicClusters();
    +    return this.domain;
    +  }
    +
    +  public void setDomain(WlsDomainConfig domain) {
    +    this.domain = domain;
    +  }
    +
    +  /**
    +   * Retrieve validation errors.
    +   * @return validation errors
    +   */
    +  public List getValidationErrors() {
    +    if (validationErrors == null) {
    +      validationErrors = Collections.emptyList();
    +    }
    +
    +    if (!domainValid && validationErrors.isEmpty()) {
    +      // add a log message that domain was marked invalid since we have no validation
    +      // errors from introspector.
    +      validationErrors = new ArrayList<>();
    +      validationErrors.add(
    +          "Error, domain is invalid although there are no validation errors from introspector job.");
    +    }
    +
    +    return validationErrors;
    +  }
    +
    +  /**
    +   * to string.
    +   * @return string
    +   */
    +  public String toString() {
    +    if (domainValid) {
    +      return "domain: " + domain;
    +    } else {
    +      return "domainValidationErrors: " + validationErrors;
    +    }
    +  }
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainValidationSteps.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainValidationSteps.java
    index e864d121fe3..493adc6df81 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainValidationSteps.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/DomainValidationSteps.java
    @@ -29,7 +29,7 @@
     import oracle.kubernetes.weblogic.domain.model.ManagedServer;
     
     import static java.lang.System.lineSeparator;
    -import static oracle.kubernetes.operator.helpers.DomainStatusPatch.BAD_DOMAIN;
    +import static oracle.kubernetes.operator.DomainStatusUpdater.BAD_DOMAIN;
     import static oracle.kubernetes.operator.logging.MessageKeys.DOMAIN_VALIDATION_FAILED;
     
     public class DomainValidationSteps {
    @@ -184,7 +184,9 @@ private List getConfigMaps(Packet packet) {
         }
     
         private boolean hasMatchingMetadata(V1ObjectMeta metadata, String name, String namespace) {
    -      return Objects.equals(name, metadata.getName()) && Objects.equals(namespace, metadata.getNamespace());
    +      return metadata != null
    +            && Objects.equals(name, metadata.getName())
    +            && Objects.equals(namespace, metadata.getNamespace());
         }
       }
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/FileGroupReader.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/FileGroupReader.java
    index f0cd07f379f..3c22bbdbe3a 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/FileGroupReader.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/FileGroupReader.java
    @@ -6,7 +6,6 @@
     import java.io.IOException;
     import java.net.URI;
     import java.net.URISyntaxException;
    -import java.nio.charset.StandardCharsets;
     import java.nio.file.FileSystem;
     import java.nio.file.FileSystems;
     import java.nio.file.Files;
    @@ -14,6 +13,7 @@
     import java.nio.file.Paths;
     import java.util.Collections;
     import java.util.Map;
    +import java.util.function.Function;
     import java.util.stream.Collectors;
     import java.util.stream.Stream;
     
    @@ -30,6 +30,9 @@ class FileGroupReader {
     
       private final String pathToGroup;
     
    +  @SuppressWarnings("FieldMayBeFinal") // keep non-final for unit test
    +  private static Function uriToPath = Paths::get;
    +  
       /**
        * Creates a reader for a specific file location.
        *
    @@ -59,7 +62,7 @@ private static String asString(Path path) {
     
       private static String readContents(Path path) {
         try {
    -      return new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
    +      return Files.readString(path);
         } catch (IOException io) {
           LOGGER.warning(MessageKeys.EXCEPTION, io);
           return "";
    @@ -97,7 +100,7 @@ interface ScriptPath extends AutoCloseable {
         Path getScriptsDir();
       }
     
    -  class FileScriptPath implements ScriptPath {
    +  static class FileScriptPath implements ScriptPath {
         private final URI uri;
     
         FileScriptPath(URI uri) {
    @@ -106,7 +109,7 @@ class FileScriptPath implements ScriptPath {
     
         @Override
         public Path getScriptsDir() {
    -      return Paths.get(uri);
    +      return uriToPath.apply(uri);
         }
     
         @Override
    @@ -115,7 +118,7 @@ public void close() {
       }
     
       class JarScriptPath implements ScriptPath {
    -    private FileSystem fileSystem;
    +    private final FileSystem fileSystem;
     
         JarScriptPath(URI uri) throws IOException {
           fileSystem = FileSystems.newFileSystem(uri, Collections.emptyMap());
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/JobHelper.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/JobHelper.java
    index 9b10c9a1b98..3beed57d3bc 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/JobHelper.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/JobHelper.java
    @@ -4,20 +4,25 @@
     package oracle.kubernetes.operator.helpers;
     
     import java.util.ArrayList;
    +import java.util.Collections;
     import java.util.List;
    +import java.util.Optional;
     
     import io.kubernetes.client.openapi.models.V1DeleteOptions;
     import io.kubernetes.client.openapi.models.V1EnvVar;
     import io.kubernetes.client.openapi.models.V1Job;
     import io.kubernetes.client.openapi.models.V1JobCondition;
     import io.kubernetes.client.openapi.models.V1JobStatus;
    +import io.kubernetes.client.openapi.models.V1ObjectMeta;
     import io.kubernetes.client.openapi.models.V1Pod;
     import io.kubernetes.client.openapi.models.V1PodList;
     import io.kubernetes.client.openapi.models.V1Volume;
     import io.kubernetes.client.openapi.models.V1VolumeMount;
     import oracle.kubernetes.operator.DomainStatusUpdater;
    +import oracle.kubernetes.operator.IntrospectorConfigMapKeys;
     import oracle.kubernetes.operator.JobWatcher;
     import oracle.kubernetes.operator.LabelConstants;
    +import oracle.kubernetes.operator.MakeRightDomainOperation;
     import oracle.kubernetes.operator.ProcessingConstants;
     import oracle.kubernetes.operator.TuningParameters;
     import oracle.kubernetes.operator.calls.CallResponse;
    @@ -39,6 +44,10 @@
     import oracle.kubernetes.weblogic.domain.model.ManagedServer;
     import oracle.kubernetes.weblogic.domain.model.ServerEnvVars;
     
    +import static oracle.kubernetes.operator.DomainSourceType.FromModel;
    +import static oracle.kubernetes.operator.logging.MessageKeys.INTROSPECTOR_JOB_FAILED;
    +import static oracle.kubernetes.operator.logging.MessageKeys.INTROSPECTOR_JOB_FAILED_DETAIL;
    +
     public class JobHelper {
     
       static final String START_TIME = "WlsRetriever-startTime";
    @@ -55,6 +64,11 @@ static String createJobName(String domainUid) {
     
       /**
        * Factory for {@link Step} that creates WebLogic domain introspector job.
    +   * Uses the following packet values:
    +   *  ProcessingConstants.DOMAIN_TOPOLOGY - the domain topology
    +   *  ProcessingConstants.DOMAIN_RESTART_VERSION - the restart version from the domain
    +   *  ProcessingConstants.DOMAIN_INPUTS_HASH
    +   *  ProcessingConstants.DOMAIN_INTROSPECT_VERSION - the introspect version from the old domain spec
        *
        * @param next Next processing step
        * @return Step for creating job
    @@ -69,13 +83,36 @@ private static boolean runIntrospector(Packet packet, DomainPresenceInfo info) {
         LOGGER.fine("runIntrospector topology: " + topology);
         LOGGER.fine("runningServersCount: " + runningServersCount(info));
         LOGGER.fine("creatingServers: " + creatingServers(info));
    -    return topology == null || isBringingUpNewDomain(info);
    +    return topology == null
    +          || isBringingUpNewDomain(info)
    +          || introspectionRequested(packet)
    +          || isModelInImageUpdate(packet, info);
       }
     
       private static boolean isBringingUpNewDomain(DomainPresenceInfo info) {
         return runningServersCount(info) == 0 && creatingServers(info);
       }
     
    +  private static boolean introspectionRequested(Packet packet) {
    +    return packet.containsKey(ProcessingConstants.DOMAIN_INTROSPECT_REQUESTED);
    +  }
    +
    +  private static boolean isModelInImageUpdate(Packet packet, DomainPresenceInfo info) {
    +    return isModelInImage(info) && !getCurrentImageSpecHash(info).equals(getIntrospectionImageSpecHash(packet));
    +  }
    +
    +  private static boolean isModelInImage(DomainPresenceInfo info) {
    +    return info.getDomain().getDomainHomeSourceType() == FromModel;
    +  }
    +
    +  private static String getCurrentImageSpecHash(DomainPresenceInfo info) {
    +    return String.valueOf(ConfigMapHelper.getModelInImageSpecHash(info.getDomain().getSpec().getImage()));
    +  }
    +
    +  private static String getIntrospectionImageSpecHash(Packet packet) {
    +    return (String) packet.get(IntrospectorConfigMapKeys.DOMAIN_INPUTS_HASH);
    +  }
    +
       private static int runningServersCount(DomainPresenceInfo info) {
         return ManagedServersUpStep.getRunningServers(info).size();
       }
    @@ -169,14 +206,12 @@ private static Step readDomainIntrospectorPodStep(Step next) {
       }
     
       static class DomainIntrospectorJobStepContext extends JobStepContext {
    -    private final DomainPresenceInfo info;
     
         // domainTopology is null if this is 1st time we're running job for this domain
         private final WlsDomainConfig domainTopology;
     
    -    DomainIntrospectorJobStepContext(DomainPresenceInfo info, Packet packet) {
    +    DomainIntrospectorJobStepContext(Packet packet) {
           super(packet);
    -      this.info = info;
           this.domainTopology = (WlsDomainConfig) packet.get(ProcessingConstants.DOMAIN_TOPOLOGY);
           init();
         }
    @@ -247,15 +282,30 @@ List getConfiguredEnvVars(TuningParameters tuningParameters) {
           addEnvVar(vars, IntrospectorJobEnvVars.NAMESPACE, getNamespace());
           addEnvVar(vars, IntrospectorJobEnvVars.INTROSPECT_HOME, getIntrospectHome());
           addEnvVar(vars, IntrospectorJobEnvVars.CREDENTIALS_SECRET_NAME, getWebLogicCredentialsSecretName());
    -      addEnvVar(vars, IntrospectorJobEnvVars.DOMAIN_SOURCE_TYPE, getDomainHomeSourceType());
    +      addEnvVar(vars, IntrospectorJobEnvVars.OPSS_KEY_SECRET_NAME, getOpssWalletPasswordSecretName());
    +      addEnvVar(vars, IntrospectorJobEnvVars.OPSS_WALLETFILE_SECRET_NAME, getOpssWalletFileSecretName());
    +      addEnvVar(vars, IntrospectorJobEnvVars.RUNTIME_ENCRYPTION_SECRET_NAME, getRuntimeEncryptionSecretName());
    +      addEnvVar(vars, IntrospectorJobEnvVars.WDT_DOMAIN_TYPE, getWdtDomainType());
    +      addEnvVar(vars, IntrospectorJobEnvVars.DOMAIN_SOURCE_TYPE, getDomainHomeSourceType().toString());
           addEnvVar(vars, IntrospectorJobEnvVars.ISTIO_ENABLED, Boolean.toString(isIstioEnabled()));
           addEnvVar(vars, IntrospectorJobEnvVars.ISTIO_READINESS_PORT, Integer.toString(getIstioReadinessPort()));
    +      addEnvVar(vars, IntrospectorJobEnvVars.ISTIO_POD_NAMESPACE, getNamespace());
     
           String dataHome = getDataHome();
           if (dataHome != null && !dataHome.isEmpty()) {
             addEnvVar(vars, ServerEnvVars.DATA_HOME, dataHome);
           }
     
    +      // Populate env var list used by the MII introspector job's 'short circuit' MD5
    +      // check. To prevent a false trip of the circuit breaker, the list must be the
    +      // same regardless of whether domainTopology == null.
    +      StringBuffer sb = new StringBuffer(vars.size() * 32);
    +      for (V1EnvVar var : vars) {
    +        sb.append(var.getName()).append(',');
    +      }
    +      sb.deleteCharAt(sb.length() - 1);
    +      addEnvVar(vars, "OPERATOR_ENVVAR_NAMES", sb.toString());
    +
           if (domainTopology != null) {
             // The domainTopology != null when the job is rerun for the same domain. In which
             // case we should now know how to contact the admin server, the admin server may
    @@ -267,10 +317,6 @@ List getConfiguredEnvVars(TuningParameters tuningParameters) {
               addEnvVar(vars, "ADMIN_PORT_SECURE", "true");
             }
             addEnvVar(vars, "AS_SERVICE_NAME", getAsServiceName());
    -
    -        // TBD Tom Barnes, Johnny Shum
    -        //     Do we need to pass to the jobwhether the admin server (or any pods)
    -        //     are already running?
           }
     
           return vars;
    @@ -287,7 +333,7 @@ static class DomainIntrospectorJobStep extends Step {
         public NextAction apply(Packet packet) {
           DomainPresenceInfo info = packet.getSpi(DomainPresenceInfo.class);
           if (runIntrospector(packet, info)) {
    -        JobStepContext context = new DomainIntrospectorJobStepContext(info, packet);
    +        JobStepContext context = new DomainIntrospectorJobStepContext(packet);
     
             packet.putIfAbsent(START_TIME, System.currentTimeMillis());
     
    @@ -295,7 +341,7 @@ public NextAction apply(Packet packet) {
                   context.createNewJob(
                         readDomainIntrospectorPodLogStep(
                               deleteDomainIntrospectorJobStep(
    -                                ConfigMapHelper.createSitConfigMapStep(getNext())))),
    +                                ConfigMapHelper.createIntrospectorConfigMapStep(getNext())))),
                   packet);
           }
     
    @@ -318,7 +364,17 @@ String getJobDeletedMessageKey() {
           return MessageKeys.JOB_DELETED;
         }
     
    -    void logJobDeleted(String domainUid, String namespace, String jobName) {
    +    void logJobDeleted(String domainUid, String namespace, String jobName, Packet packet) {
    +      V1Job domainIntrospectorJob =
    +          (V1Job) packet.remove(ProcessingConstants.DOMAIN_INTROSPECTOR_JOB);
    +
    +      packet.remove(ProcessingConstants.INTROSPECTOR_JOB_FAILURE_LOGGED);
    +      if (domainIntrospectorJob != null
    +          && !JobWatcher.isComplete(domainIntrospectorJob)) {
    +        logIntrospectorFailure(packet, domainIntrospectorJob);
    +      }
    +      packet.remove(ProcessingConstants.JOB_POD_NAME);
    +
           LOGGER.fine(getJobDeletedMessageKey(), domainUid, namespace, jobName);
         }
     
    @@ -327,7 +383,7 @@ private Step deleteJob(Packet packet, Step next) {
           java.lang.String domainUid = info.getDomain().getDomainUid();
           java.lang.String namespace = info.getNamespace();
           String jobName = JobHelper.createJobName(domainUid);
    -      logJobDeleted(domainUid, namespace, jobName);
    +      logJobDeleted(domainUid, namespace, jobName, packet);
           return new CallBuilder()
                 .deleteJobAsync(
                       jobName,
    @@ -352,7 +408,7 @@ public NextAction apply(Packet packet) {
           DomainPresenceInfo info = packet.getSpi(DomainPresenceInfo.class);
           String namespace = info.getNamespace();
     
    -      String jobPodName = (String) packet.remove(ProcessingConstants.JOB_POD_NAME);
    +      String jobPodName = (String) packet.get(ProcessingConstants.JOB_POD_NAME);
     
           return doNext(readDomainIntrospectorPodLog(jobPodName, namespace, getNext()), packet);
         }
    @@ -383,13 +439,16 @@ public NextAction onSuccess(Packet packet, CallResponse callResponse) {
               updateStatus(packet.getSpi(DomainPresenceInfo.class));
             }
             packet.put(ProcessingConstants.DOMAIN_INTROSPECTOR_LOG_RESULT, result);
    +        MakeRightDomainOperation.recordInspection(packet);
           }
     
           V1Job domainIntrospectorJob =
    -            (V1Job) packet.remove(ProcessingConstants.DOMAIN_INTROSPECTOR_JOB);
    +            (V1Job) packet.get(ProcessingConstants.DOMAIN_INTROSPECTOR_JOB);
    +
           if (isNotComplete(domainIntrospectorJob)) {
             List jobConditionsReason = new ArrayList<>();
             if (domainIntrospectorJob != null) {
    +          logIntrospectorFailure(packet, domainIntrospectorJob);
               V1JobStatus status = domainIntrospectorJob.getStatus();
               if (status != null && status.getConditions() != null) {
                 for (V1JobCondition cond : status.getConditions()) {
    @@ -398,13 +457,13 @@ public NextAction onSuccess(Packet packet, CallResponse callResponse) {
               }
             }
             if (jobConditionsReason.size() == 0) {
    -          jobConditionsReason.add(DomainStatusPatch.ERR_INTROSPECTOR);
    +          jobConditionsReason.add(DomainStatusUpdater.ERR_INTROSPECTOR);
             }
             //Introspector job is incomplete, update domain status and terminate processing
             return doNext(
                 DomainStatusUpdater.createFailedStep(
    -                onSeparateLines(jobConditionsReason),
    -                onSeparateLines(severeStatuses),
    +              onSeparateLines(jobConditionsReason),
    +              onSeparateLines(severeStatuses),
                     null),
                 packet);
           }
    @@ -413,7 +472,7 @@ public NextAction onSuccess(Packet packet, CallResponse callResponse) {
         }
     
         private boolean isNotComplete(V1Job domainIntrospectorJob) {
    -      return domainIntrospectorJob == null || !JobWatcher.isComplete(domainIntrospectorJob);
    +      return !JobWatcher.isComplete(domainIntrospectorJob);
         }
     
         // Parse log messages out of a Job Log
    @@ -480,7 +539,7 @@ private String getFirstLine(String logMsg) {
     
         private void updateStatus(DomainPresenceInfo domainPresenceInfo) {
           DomainStatusPatch.updateSynchronously(
    -            domainPresenceInfo.getDomain(), DomainStatusPatch.ERR_INTROSPECTOR, onSeparateLines(severeStatuses));
    +            domainPresenceInfo.getDomain(), DomainStatusUpdater.ERR_INTROSPECTOR, onSeparateLines(severeStatuses));
         }
     
         private String onSeparateLines(List lines) {
    @@ -488,6 +547,23 @@ private String onSeparateLines(List lines) {
         }
       }
     
    +  private static void logIntrospectorFailure(Packet packet, V1Job domainIntrospectorJob) {
    +    Boolean logged = (Boolean) packet.get(ProcessingConstants.INTROSPECTOR_JOB_FAILURE_LOGGED);
    +    String jobPodName = (String) packet.get(ProcessingConstants.JOB_POD_NAME);
    +    if (logged == null || !logged.booleanValue()) {
    +      packet.put(ProcessingConstants.INTROSPECTOR_JOB_FAILURE_LOGGED, Boolean.valueOf(true));
    +      LOGGER.info(INTROSPECTOR_JOB_FAILED,
    +          domainIntrospectorJob.getMetadata().getName(),
    +          domainIntrospectorJob.getMetadata().getNamespace(),
    +          domainIntrospectorJob.getStatus().toString(),
    +          jobPodName);
    +      LOGGER.fine(INTROSPECTOR_JOB_FAILED_DETAIL,
    +          domainIntrospectorJob.getMetadata().getNamespace(),
    +          domainIntrospectorJob.getMetadata().getName(),
    +          domainIntrospectorJob.toString());
    +    }
    +  }
    +
       private static class ReadDomainIntrospectorPodStep extends Step {
     
         ReadDomainIntrospectorPodStep(Step next) {
    @@ -525,18 +601,28 @@ public NextAction onFailure(Packet packet, CallResponse callResponse)
     
         @Override
         public NextAction onSuccess(Packet packet, CallResponse callResponse) {
    -      String jobNamePrefix = createJobName(domainUid);
    -      V1PodList result = callResponse.getResult();
    -      if (result != null) {
    -        for (V1Pod pod : result.getItems()) {
    -          if (pod.getMetadata().getName().startsWith(jobNamePrefix)) {
    -            LOGGER.fine("+++++ JobHelper.PodListStep pod: " + pod.toString());
    -            packet.put(ProcessingConstants.JOB_POD_NAME, pod.getMetadata().getName());
    -          }
    -        }
    -      }
    +      Optional.ofNullable(callResponse.getResult())
    +            .map(V1PodList::getItems)
    +            .orElseGet(Collections::emptyList)
    +            .stream()
    +            .map(this::getName)
    +            .filter(this::isJobPodName)
    +            .findFirst()
    +            .ifPresent(name -> recordJobPodName(packet, name));
     
           return doNext(packet);
         }
    +
    +    private String getName(V1Pod pod) {
    +      return Optional.of(pod).map(V1Pod::getMetadata).map(V1ObjectMeta::getName).orElse("");
    +    }
    +
    +    private boolean isJobPodName(String podName) {
    +      return podName.startsWith(createJobName(domainUid));
    +    }
    +
    +    private void recordJobPodName(Packet packet, String podName) {
    +      packet.put(ProcessingConstants.JOB_POD_NAME, podName);
    +    }
       }
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/JobStepContext.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/JobStepContext.java
    index 13f973d5490..8e34a279923 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/JobStepContext.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/JobStepContext.java
    @@ -8,7 +8,9 @@
     import java.util.Collections;
     import java.util.List;
     import java.util.Map;
    +import java.util.Optional;
     
    +import com.google.common.base.Strings;
     import io.kubernetes.client.openapi.models.V1ConfigMapVolumeSource;
     import io.kubernetes.client.openapi.models.V1Container;
     import io.kubernetes.client.openapi.models.V1Job;
    @@ -19,12 +21,12 @@
     import io.kubernetes.client.openapi.models.V1SecretVolumeSource;
     import io.kubernetes.client.openapi.models.V1Volume;
     import io.kubernetes.client.openapi.models.V1VolumeMount;
    +import oracle.kubernetes.operator.DomainSourceType;
     import oracle.kubernetes.operator.DomainStatusUpdater;
     import oracle.kubernetes.operator.KubernetesConstants;
     import oracle.kubernetes.operator.LabelConstants;
     import oracle.kubernetes.operator.ProcessingConstants;
     import oracle.kubernetes.operator.TuningParameters;
    -import oracle.kubernetes.operator.VersionConstants;
     import oracle.kubernetes.operator.calls.CallResponse;
     import oracle.kubernetes.operator.calls.UnrecoverableErrorBuilder;
     import oracle.kubernetes.operator.logging.LoggingFacade;
    @@ -40,11 +42,10 @@ public abstract class JobStepContext extends BasePodStepContext {
       private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
       private static final String WEBLOGIC_OPERATOR_SCRIPTS_INTROSPECT_DOMAIN_SH =
             "/weblogic-operator/scripts/introspectDomain.sh";
    -  private final DomainPresenceInfo info;
       private V1Job jobModel;
     
       JobStepContext(Packet packet) {
    -    info = packet.getSpi(DomainPresenceInfo.class);
    +    super(packet.getSpi(DomainPresenceInfo.class));
       }
     
       private static V1VolumeMount readOnlyVolumeMount(String volumeName, String mountPath) {
    @@ -101,6 +102,19 @@ String getWebLogicCredentialsSecretName() {
         return getDomain().getWebLogicCredentialsSecretName();
       }
     
    +  String getOpssWalletPasswordSecretName() {
    +    return getDomain().getOpssWalletPasswordSecret();
    +  }
    +
    +  String getOpssWalletFileSecretName() {
    +    return getDomain().getOpssWalletFileSecret();
    +  }
    +
    +  String getRuntimeEncryptionSecretName() {
    +    return getDomain().getRuntimeEncryptionSecret();
    +  }
    +
    +
       // ----------------------- step methods ------------------------------
     
       abstract List getAdditionalVolumes();
    @@ -140,7 +154,11 @@ protected String getDataHome() {
         return dataHome != null && !dataHome.isEmpty() ? dataHome + File.separator + getDomainUid() : null;
       }
     
    -  protected String getDomainHomeSourceType() {
    +  protected String getWdtDomainType() {
    +    return getDomain().getWdtDomainType();
    +  }
    +
    +  protected DomainSourceType getDomainHomeSourceType() {
         return getDomain().getDomainHomeSourceType();
       }
     
    @@ -173,15 +191,20 @@ private List getConfigOverrideSecrets() {
       }
     
       private String getConfigOverrides() {
    -    return getDomain().getConfigOverrides();
    +    return Strings.emptyToNull(getDomain().getConfigOverrides());
       }
     
       private long getIntrospectorJobActiveDeadlineSeconds(TuningParameters.PodTuning podTuning) {
    -    return podTuning.introspectorJobActiveDeadlineSeconds;
    +    return Optional.ofNullable(getDomain().getIntrospectorJobActiveDeadlineSeconds())
    +        .orElse(podTuning.introspectorJobActiveDeadlineSeconds);
       }
     
       // ---------------------- model methods ------------------------------
     
    +  String getWdtConfigMap() {
    +    return Strings.emptyToNull(getDomain().getWdtConfigMap());
    +  }
    +
       private ResponseStep createResponse(Step next) {
         return new CreateResponseStep(next);
       }
    @@ -193,12 +216,12 @@ private V1Job createJobModel() {
       }
     
       V1ObjectMeta createMetadata() {
    -    return new V1ObjectMeta()
    +    return updateForOwnerReference(
    +        new V1ObjectMeta()
               .name(getJobName())
               .namespace(getNamespace())
    -          .putLabelsItem(LabelConstants.RESOURCE_VERSION_LABEL, VersionConstants.DOMAIN_V1)
               .putLabelsItem(LabelConstants.DOMAINUID_LABEL, getDomainUid())
    -          .putLabelsItem(LabelConstants.CREATEDBYOPERATOR_LABEL, "true");
    +          .putLabelsItem(LabelConstants.CREATEDBYOPERATOR_LABEL, "true"));
       }
     
       private long getActiveDeadlineSeconds(TuningParameters.PodTuning podTuning) {
    @@ -247,7 +270,19 @@ protected V1PodSpec createPodSpec(TuningParameters tuningParameters) {
                 .serviceAccountName(info.getDomain().getSpec().getServiceAccountName())
                 .addVolumesItem(new V1Volume().name(SECRETS_VOLUME).secret(getSecretsVolume()))
                 .addVolumesItem(
    -                new V1Volume().name(SCRIPTS_VOLUME).configMap(getConfigMapVolumeSource()));
    +                new V1Volume().name(SCRIPTS_VOLUME).configMap(getConfigMapVolumeSource()))
    +            .addVolumesItem(
    +                new V1Volume()
    +                    .name("mii" + KubernetesConstants.INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX)
    +                    .configMap(getIntrospectMD5VolumeSource()));
    +    if (getOpssWalletPasswordSecretVolume() != null) {
    +      podSpec.addVolumesItem(new V1Volume().name(OPSS_KEYPASSPHRASE_VOLUME).secret(
    +          getOpssWalletPasswordSecretVolume()));
    +    }
    +    if (getOpssWalletFileSecretName() != null) {
    +      podSpec.addVolumesItem(new V1Volume().name(OPSS_WALLETFILE_VOLUME).secret(
    +              getOpssWalletFileSecretVolume()));
    +    }
     
         podSpec.setImagePullSecrets(info.getDomain().getSpec().getImagePullSecrets());
     
    @@ -255,27 +290,65 @@ protected V1PodSpec createPodSpec(TuningParameters tuningParameters) {
           podSpec.addVolumesItem(additionalVolume);
         }
     
    -    List configOverrideSecrets = getConfigOverrideSecrets();
    -    for (String secretName : configOverrideSecrets) {
    -      podSpec.addVolumesItem(
    -            new V1Volume()
    -                  .name(secretName + "-volume")
    -                  .secret(getOverrideSecretVolumeSource(secretName)));
    -    }
    -    if (getConfigOverrides() != null && getConfigOverrides().length() > 0) {
    -      podSpec.addVolumesItem(
    -            new V1Volume()
    -                  .name(getConfigOverrides() + "-volume")
    -                  .configMap(getOverridesVolumeSource(getConfigOverrides())));
    +    getConfigOverrideSecrets().forEach(secretName -> addConfigOverrideSecretVolume(podSpec, secretName));
    +    Optional.ofNullable(getConfigOverrides()).ifPresent(overrides -> addConfigOverrideVolume(podSpec, overrides));
    +
    +    if (isSourceWdt()) {
    +      Optional.ofNullable(getWdtConfigMap()).ifPresent(mapName -> addWdtConfigMapVolume(podSpec, mapName));
    +      addWdtSecretVolume(podSpec);
         }
         return podSpec;
       }
     
    +  private void addConfigOverrideSecretVolume(V1PodSpec podSpec, String secretName) {
    +    podSpec.addVolumesItem(
    +          new V1Volume()
    +                .name(secretName + "-volume")
    +                .secret(getOverrideSecretVolumeSource(secretName)));
    +  }
    +
    +  private void addConfigOverrideVolume(V1PodSpec podSpec, String configOverrides) {
    +    podSpec.addVolumesItem(
    +          new V1Volume()
    +                .name(configOverrides + "-volume")
    +                .configMap(getOverridesVolumeSource(configOverrides)));
    +  }
    +
    +  private boolean isSourceWdt() {
    +    return getDomainHomeSourceType() == DomainSourceType.FromModel;
    +  }
    +
    +  private void addWdtConfigMapVolume(V1PodSpec podSpec, String configMapName) {
    +    podSpec.addVolumesItem(
    +        new V1Volume()
    +            .name(configMapName + "-volume")
    +            .configMap(getWdtConfigMapVolumeSource(configMapName)));
    +  }
    +
    +  private void addWdtSecretVolume(V1PodSpec podSpec) {
    +    podSpec.addVolumesItem(
    +        new V1Volume()
    +            .name(RUNTIME_ENCRYPTION_SECRET_VOLUME)
    +            .secret(getRuntimeEncryptionSecretVolume()));
    +  }
    +
       protected V1Container createContainer(TuningParameters tuningParameters) {
         V1Container container = super.createContainer(tuningParameters)
             .addVolumeMountsItem(readOnlyVolumeMount(SECRETS_VOLUME, SECRETS_MOUNT_PATH))
    -        .addVolumeMountsItem(readOnlyVolumeMount(SCRIPTS_VOLUME, SCRIPTS_MOUNTS_PATH));
    -
    +        .addVolumeMountsItem(readOnlyVolumeMount(SCRIPTS_VOLUME, SCRIPTS_MOUNTS_PATH))
    +        .addVolumeMountsItem(
    +          volumeMount(
    +              "mii" + KubernetesConstants.INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX,
    +              "/weblogic-operator/introspectormii")
    +              .readOnly(false));
    +
    +    if (getOpssWalletPasswordSecretVolume() != null) {
    +      container.addVolumeMountsItem(readOnlyVolumeMount(OPSS_KEYPASSPHRASE_VOLUME, OPSS_KEY_MOUNT_PATH));
    +    }
    +    if (getOpssWalletFileSecretVolume() != null) {
    +      container.addVolumeMountsItem(readOnlyVolumeMount(OPSS_WALLETFILE_VOLUME, OPSS_WALLETFILE_MOUNT_PATH));
    +    }
    +    
         for (V1VolumeMount additionalVolumeMount : getAdditionalVolumeMounts()) {
           container.addVolumeMountsItem(additionalVolumeMount);
         }
    @@ -292,6 +365,17 @@ protected V1Container createContainer(TuningParameters tuningParameters) {
                       secretName + "-volume", OVERRIDE_SECRETS_MOUNT_PATH + '/' + secretName));
         }
     
    +    if (isSourceWdt()) {
    +      if (getWdtConfigMap() != null) {
    +        container.addVolumeMountsItem(
    +            readOnlyVolumeMount(getWdtConfigMap() + "-volume", WDTCONFIGMAP_MOUNT_PATH));
    +      }
    +      container.addVolumeMountsItem(
    +          readOnlyVolumeMount(RUNTIME_ENCRYPTION_SECRET_VOLUME,
    +              RUNTIME_ENCRYPTION_SECRET_MOUNT_PATH));
    +
    +    }
    +
         return container;
       }
     
    @@ -319,12 +403,51 @@ private V1SecretVolumeSource getSecretsVolume() {
               .defaultMode(420);
       }
     
    +  private V1SecretVolumeSource getRuntimeEncryptionSecretVolume() {
    +    V1SecretVolumeSource result = new V1SecretVolumeSource()
    +          .secretName(getRuntimeEncryptionSecretName())
    +          .defaultMode(420);
    +    result.setOptional(true);
    +    return result;
    +  }
    +
    +  private V1SecretVolumeSource getOpssWalletPasswordSecretVolume() {
    +    if (getOpssWalletPasswordSecretName() != null) {
    +      V1SecretVolumeSource result =  new V1SecretVolumeSource()
    +          .secretName(getOpssWalletPasswordSecretName())
    +          .defaultMode(420);
    +      result.setOptional(true);
    +      return result;
    +    }
    +    return null;
    +  }
    +
    +  private V1SecretVolumeSource getOpssWalletFileSecretVolume() {
    +    if (getOpssWalletFileSecretName() != null) {
    +      V1SecretVolumeSource result =  new V1SecretVolumeSource()
    +              .secretName(getOpssWalletFileSecretName())
    +              .defaultMode(420);
    +      result.setOptional(true);
    +      return result;
    +    }
    +    return null;
    +  }
    +
       private V1ConfigMapVolumeSource getConfigMapVolumeSource() {
         return new V1ConfigMapVolumeSource()
    -          .name(KubernetesConstants.DOMAIN_CONFIG_MAP_NAME)
    +          .name(KubernetesConstants.SCRIPT_CONFIG_MAP_NAME)
               .defaultMode(ALL_READ_AND_EXECUTE);
       }
     
    +  protected V1ConfigMapVolumeSource getIntrospectMD5VolumeSource() {
    +    V1ConfigMapVolumeSource result =
    +        new V1ConfigMapVolumeSource()
    +            .name(getDomainUid() + KubernetesConstants.INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX)
    +            .defaultMode(ALL_READ_AND_EXECUTE);
    +    result.setOptional(true);
    +    return result;
    +  }
    +
       private V1SecretVolumeSource getOverrideSecretVolumeSource(String name) {
         return new V1SecretVolumeSource().secretName(name).defaultMode(420);
       }
    @@ -361,4 +484,12 @@ public NextAction onSuccess(Packet packet, CallResponse callResponse) {
           return doNext(packet);
         }
       }
    +
    +  protected V1ConfigMapVolumeSource getWdtConfigMapVolumeSource(String name) {
    +    return new V1ConfigMapVolumeSource().name(name).defaultMode(ALL_READ_AND_EXECUTE);
    +  }
    +
    +  protected V1ConfigMapVolumeSource getOpssKeyWalletVolumeSource(String name) {
    +    return new V1ConfigMapVolumeSource().name(name).defaultMode(ALL_READ_AND_EXECUTE);
    +  }
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/KubernetesUtils.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/KubernetesUtils.java
    index 54b853127e5..248ce48a63a 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/KubernetesUtils.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/KubernetesUtils.java
    @@ -4,6 +4,7 @@
     package oracle.kubernetes.operator.helpers;
     
     import java.lang.reflect.Field;
    +import java.math.BigInteger;
     import java.util.Map;
     import java.util.Objects;
     import java.util.Optional;
    @@ -14,6 +15,7 @@
     import org.apache.commons.collections.MapUtils;
     import org.joda.time.DateTime;
     
    +import static com.google.common.base.Strings.isNullOrEmpty;
     import static oracle.kubernetes.operator.LabelConstants.CREATEDBYOPERATOR_LABEL;
     
     public class KubernetesUtils {
    @@ -128,14 +130,47 @@ public static boolean isFirstNewer(V1ObjectMeta first, V1ObjectMeta second) {
         DateTime time2 = second.getCreationTimestamp();
     
         if (time1.equals(time2)) {
    -      return getResourceVersion(first) > getResourceVersion(second);
    +      return getResourceVersion(first).compareTo(getResourceVersion(second)) > 0;
         } else {
           return time1.isAfter(time2);
         }
       }
     
    -  private static int getResourceVersion(V1ObjectMeta metadata) {
    -    return Integer.parseInt(metadata.getResourceVersion());
    +  /**
    +   * Parse the resource version from the metadata. According to the Kubernetes design documentation,
    +   * https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/
    +   *  api-conventions.md#concurrency-control-and-consistency, the resource version is technically opaque; however,
    +   * the Kubernetes design also requires that clients be able to list changes to resources "after" the last
    +   * change to the same or different resource. Therefore, all Kubernetes implementations use a increasing positive
    +   * integer value for the resource version. This can be useful to detect out-of-order watch events. This method
    +   * parses the metadata's resource version into a big integer or to 0, if the value is not parsable.
    +   * @param metadata Meta data containing resource version
    +   * @return The integer value of the resource version or 0, if the value is not parsable
    +   */
    +  public static BigInteger getResourceVersion(V1ObjectMeta metadata) {
    +    return getResourceVersion(Optional.ofNullable(metadata).map(V1ObjectMeta::getResourceVersion).orElse(null));
    +  }
    +
    +  /**
    +   * Parse the resource version. According to the Kubernetes design documentation,
    +   * https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/
    +   *  api-conventions.md#concurrency-control-and-consistency, the resource version is technically opaque; however,
    +   * the Kubernetes design also requires that clients be able to list changes to resources "after" the last
    +   * change to the same or different resource. Therefore, all Kubernetes implementations use a increasing positive
    +   * integer value for the resource version. This can be useful to detect out-of-order watch events. This method
    +   * parses the metadata's resource version into a big integer or to 0, if the value is not parsable.
    +   * @param resVersion resource version
    +   * @return The integer value of the resource version or 0, if the value is not parsable
    +   */
    +  public static BigInteger getResourceVersion(String resVersion) {
    +    if (!isNullOrEmpty(resVersion)) {
    +      try {
    +        return new BigInteger(resVersion);
    +      } catch (NumberFormatException nfe) {
    +        // no-op, fall through and return 0
    +      }
    +    }
    +    return BigInteger.ZERO;
       }
     
       public static V1ObjectMeta withOperatorLabels(String uid, V1ObjectMeta meta) {
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/KubernetesVersion.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/KubernetesVersion.java
    index fbc8c5cb25b..aafbc32b533 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/KubernetesVersion.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/KubernetesVersion.java
    @@ -3,18 +3,13 @@
     
     package oracle.kubernetes.operator.helpers;
     
    -import java.util.Objects;
    -
     import io.kubernetes.client.openapi.models.VersionInfo;
     
     /** Major and minor version of Kubernetes API Server. */
    -public class KubernetesVersion {
    +public class KubernetesVersion extends SemanticVersion {
       public static final KubernetesVersion TEST_VERSION = new KubernetesVersion(1, 10);
    -  private static final String[] MINIMUM_K8S_VERSIONS = {"1.13.5", "1.14.8", "1.15.7"};
    +  private static final String[] MINIMUM_K8S_VERSIONS = {"1.14.8", "1.15.7", "1.16.0", "1.17.0", "1.18.0"};
       static final KubernetesVersion UNREADABLE = new KubernetesVersion(0, 0);
    -  private final int major;
    -  private final int minor;
    -  private final int revision;
       private final String version;
     
       /**
    @@ -23,17 +18,13 @@ public class KubernetesVersion {
        * @param minor minor
        */
       public KubernetesVersion(int major, int minor) {
    -    this.major = major;
    -    this.minor = minor;
    -    revision = 0;
    +    super(major, minor);
         version = String.format("%d.%d.0", major, minor);
       }
     
       KubernetesVersion(VersionInfo info) {
    -    major = Integer.parseInt(info.getMajor());
    -    minor = getNumericPortion(info.getMinor());
    +    super(Integer.parseInt(info.getMajor()), getNumericPortion(info.getMinor()), getRevision(info.getGitVersion()));
         version = info.getGitVersion();
    -    revision = getRevision(asDisplayString());
       }
     
       static String getSupportedVersions() {
    @@ -46,21 +37,6 @@ private static int getRevision(String version) {
         return splitVersion.length > 2 ? getNumericPortion(splitVersion[2]) : 0;
       }
     
    -  private static int getNumericPortion(String numericString) {
    -    while (!numericString.chars().allMatch(Character::isDigit)) {
    -      numericString = numericString.substring(0, numericString.length() - 1);
    -    }
    -    return numericString.length() == 0 ? 0 : Integer.parseInt(numericString);
    -  }
    -
    -  int getMajor() {
    -    return major;
    -  }
    -
    -  int getMinor() {
    -    return minor;
    -  }
    -
       String asDisplayString() {
         return version;
       }
    @@ -83,40 +59,12 @@ boolean isCompatible() {
         return numHigher == MINIMUM_K8S_VERSIONS.length;
       }
     
    -  private Compatibility getCompatibilityWith(String minimumVersion) {
    -    String[] parts = minimumVersion.split("\\.");
    -    int allowedMajor = asInteger(parts[0]);
    -    if (major < allowedMajor) {
    -      return Compatibility.VERSION_LOWER;
    -    }
    -    if (major > allowedMajor) {
    -      return Compatibility.VERSION_HIGHER;
    -    }
    -
    -    int allowedMinor = asInteger(parts[1]);
    -    if (minor < allowedMinor) {
    -      return Compatibility.VERSION_LOWER;
    -    }
    -    if (minor > allowedMinor) {
    -      return Compatibility.VERSION_HIGHER;
    -    }
    -
    -    int allowedRevision = asInteger(parts[2]);
    -    return (revision >= allowedRevision)
    -        ? Compatibility.REVISION_OK
    -        : Compatibility.REVISION_TOO_LOW;
    -  }
    -
    -  private int asInteger(String intString) {
    -    return Integer.parseInt(intString);
    -  }
    -
       boolean isPublishNotReadyAddressesSupported() {
    -    return this.major > 1 || (this.major == 1 && this.minor >= 8);
    +    return getMajor() > 1 || (getMajor() == 1 && getMinor() >= 8);
       }
     
       boolean isCrdV1Supported() {
    -    return this.major > 1 || (this.major == 1 && this.minor >= 16);
    +    return getMajor() > 1 || (getMajor() == 1 && getMinor() >= 16);
       }
     
       @Override
    @@ -124,24 +72,8 @@ public boolean equals(Object o) {
         return this == o || o instanceof KubernetesVersion && equals((KubernetesVersion) o);
       }
     
    -  private boolean equals(KubernetesVersion o) {
    -    return major == o.major && minor == o.minor;
    -  }
    -
    -  @Override
    -  public int hashCode() {
    -    return Objects.hash(major, minor);
    -  }
    -
       @Override
       public String toString() {
    -    return "KubernetesVersion{" + "major=" + major + ", minor=" + minor + '}';
    -  }
    -
    -  enum Compatibility {
    -    REVISION_OK,
    -    REVISION_TOO_LOW,
    -    VERSION_HIGHER,
    -    VERSION_LOWER
    +    return "KubernetesVersion{" + "major=" + getMajor() + ", minor=" + getMinor() + ", revision=" + getRevision() + '}';
       }
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/LegalNames.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/LegalNames.java
    index b26b857a936..272af00520c 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/LegalNames.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/LegalNames.java
    @@ -16,7 +16,8 @@ public class LegalNames {
     
       private static final String SERVER_PATTERN = "%s-%s";
       private static final String CLUSTER_SERVICE_PATTERN = "%s-cluster-%s";
    -  private static final String DOMAIN_INTROSPECTOR_JOB_PATTERN = "%s-introspect-domain-job";
    +  public static final String DOMAIN_INTROSPECTOR_JOB_SUFFIX = "-introspect-domain-job";
    +  private static final String DOMAIN_INTROSPECTOR_JOB_PATTERN = "%s" + DOMAIN_INTROSPECTOR_JOB_SUFFIX;
       private static final String EXTERNAL_SERVICE_PATTERN = "%s-%s-external";
     
       public static final String DNS_1123_FIELDS_PARAM = "dns1123Fields";
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodCompatibility.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodCompatibility.java
    index dfcb21e9ada..81110c41f8c 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodCompatibility.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodCompatibility.java
    @@ -11,7 +11,6 @@
     import java.util.List;
     import java.util.Map;
     import java.util.Objects;
    -import java.util.Optional;
     import java.util.Set;
     
     import io.kubernetes.client.custom.Quantity;
    @@ -21,20 +20,18 @@
     import io.kubernetes.client.openapi.models.V1PodSpec;
     import io.kubernetes.client.openapi.models.V1Probe;
     import io.kubernetes.client.openapi.models.V1ResourceRequirements;
    -import oracle.kubernetes.operator.LabelConstants;
     
     import static oracle.kubernetes.operator.LabelConstants.CLUSTERRESTARTVERSION_LABEL;
     import static oracle.kubernetes.operator.LabelConstants.DOMAINRESTARTVERSION_LABEL;
     import static oracle.kubernetes.operator.LabelConstants.SERVERRESTARTVERSION_LABEL;
    -import static oracle.kubernetes.operator.VersionConstants.DEFAULT_DOMAIN_VERSION;
     import static oracle.kubernetes.operator.helpers.PodHelper.AdminPodStepContext.INTERNAL_OPERATOR_CERT_ENV;
     
    -/** A class which defines the compatability rules for existing vs. specified pods. */
    +/** A class which defines the compatibility rules for existing vs. specified pods. */
     class PodCompatibility extends CollectiveCompatibility {
       PodCompatibility(V1Pod expected, V1Pod actual) {
         add("sha256Hash", AnnotationHelper.getHash(expected), AnnotationHelper.getHash(actual));
         add(new PodMetadataCompatibility(expected.getMetadata(), actual.getMetadata()));
    -    add(new PodSpecCompatibility(expected.getSpec(), actual.getSpec()));
    +    add(new PodSpecCompatibility(Objects.requireNonNull(expected.getSpec()), Objects.requireNonNull(actual.getSpec())));
       }
     
       static  Set asSet(Collection collection) {
    @@ -52,37 +49,6 @@ static  Set getMissingElements(Collection expected, Collection actua
       static class PodMetadataCompatibility extends CollectiveCompatibility {
         PodMetadataCompatibility(V1ObjectMeta expected, V1ObjectMeta actual) {
           add(new RestartVersion(expected, actual));
    -      add(new DomainVersion(actual));
    -    }
    -  }
    -
    -  static class DomainVersion implements CompatibilityCheck {
    -    private final V1ObjectMeta actual;
    -
    -    DomainVersion(V1ObjectMeta actual) {
    -      this.actual = actual;
    -    }
    -
    -    @Override
    -    public boolean isCompatible() {
    -      return VersionHelper.matchesResourceVersion(actual, DEFAULT_DOMAIN_VERSION);
    -    }
    -
    -    @Override
    -    public String getIncompatibility() {
    -      return String.format(
    -          "Domain version should be %s but was %s", DEFAULT_DOMAIN_VERSION, getDomainVersion());
    -    }
    -
    -    private String getDomainVersion() {
    -      if (actual == null) {
    -        return "unspecified";
    -      }
    -      if (actual.getLabels() == null) {
    -        return "unspecified";
    -      }
    -      return Optional.ofNullable(actual.getLabels().get(LabelConstants.RESOURCE_VERSION_LABEL))
    -          .orElse("unspecified");
         }
       }
     
    @@ -103,21 +69,23 @@ && isLabelSame(CLUSTERRESTARTVERSION_LABEL)
         }
     
         private boolean isLabelSame(String labelName) {
    -      return Objects.equals(expected.getLabels().get(labelName), actual.getLabels().get(labelName));
    +      return Objects.equals(
    +            Objects.requireNonNull(expected.getLabels()).get(labelName),
    +            Objects.requireNonNull(actual.getLabels()).get(labelName)
    +      );
         }
     
         @Override
         public String getIncompatibility() {
           if (!isLabelSame(DOMAINRESTARTVERSION_LABEL)) {
             return "domain restart label changed.";
    -      }
    -      if (!isLabelSame(CLUSTERRESTARTVERSION_LABEL)) {
    +      } else if (!isLabelSame(CLUSTERRESTARTVERSION_LABEL)) {
             return "cluster restart label changed.";
    -      }
    -      if (!isLabelSame(SERVERRESTARTVERSION_LABEL)) {
    +      } else if (!isLabelSame(SERVERRESTARTVERSION_LABEL)) {
             return "server restart label changed.";
    +      } else {
    +        return null;
           }
    -      return null;
         }
       }
     
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodDefaults.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodDefaults.java
    index 50392d68ce8..4b79b768598 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodDefaults.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodDefaults.java
    @@ -10,15 +10,15 @@
     import io.kubernetes.client.openapi.models.V1Volume;
     import io.kubernetes.client.openapi.models.V1VolumeMount;
     
    -import static oracle.kubernetes.operator.KubernetesConstants.DOMAIN_CONFIG_MAP_NAME;
     import static oracle.kubernetes.operator.KubernetesConstants.DOMAIN_DEBUG_CONFIG_MAP_SUFFIX;
    -import static oracle.kubernetes.operator.KubernetesConstants.INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX;
    +import static oracle.kubernetes.operator.KubernetesConstants.SCRIPT_CONFIG_MAP_NAME;
     import static oracle.kubernetes.operator.helpers.StepContextConstants.ALL_READ_AND_EXECUTE;
     import static oracle.kubernetes.operator.helpers.StepContextConstants.DEBUG_CM_MOUNTS_PATH;
     import static oracle.kubernetes.operator.helpers.StepContextConstants.DEBUG_CM_VOLUME;
     import static oracle.kubernetes.operator.helpers.StepContextConstants.SCRIPTS_MOUNTS_PATH;
     import static oracle.kubernetes.operator.helpers.StepContextConstants.SCRIPTS_VOLUME;
     import static oracle.kubernetes.operator.helpers.StepContextConstants.SIT_CONFIG_MAP_VOLUME;
    +import static oracle.kubernetes.operator.helpers.StepContextConstants.WDT_CONFIG_MAP_VOLUME;
     
     class PodDefaults {
       static final String K8S_SERVICE_ACCOUNT_MOUNT_PATH =
    @@ -33,7 +33,7 @@ static List getStandardVolumes(String domainUid) {
       }
     
       private static V1Volume createScriptsVolume() {
    -    return createVolume(SCRIPTS_VOLUME, DOMAIN_CONFIG_MAP_NAME);
    +    return createVolume(SCRIPTS_VOLUME, SCRIPT_CONFIG_MAP_NAME);
       }
     
       private static V1Volume createVolume(String volumeName, String configMapName) {
    @@ -50,15 +50,19 @@ private static V1Volume createDebugCmVolume(String domainUid) {
       }
     
       private static V1Volume createSitConfigVolume(String domainUid) {
    -    return createVolume(getSitConfigMapVolumeName(domainUid), getConfigMapName(domainUid));
    +    return createVolume(getSitConfigMapVolumeName(domainUid), ConfigMapHelper.getIntrospectorConfigMapName(domainUid));
       }
     
       private static String getSitConfigMapVolumeName(String domainUid) {
         return SIT_CONFIG_MAP_VOLUME;
       }
     
    -  private static String getConfigMapName(String domainUid) {
    -    return domainUid + INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX;
    +  private static V1Volume createWdtConfigMapVolume(String domainUid) {
    +    return createVolume(getWdtConfigMapVolumeName(domainUid), ConfigMapHelper.getIntrospectorConfigMapName(domainUid));
    +  }
    +
    +  private static String getWdtConfigMapVolumeName(String domainUid) {
    +    return WDT_CONFIG_MAP_VOLUME;
       }
     
       static List getStandardVolumeMounts(String domainUid) {
    @@ -81,6 +85,10 @@ private static V1VolumeMount createSitConfigVolumeMount(String domainUid) {
         return volumeMount(getSitConfigMapVolumeName(domainUid), "/weblogic-operator/introspector");
       }
     
    +  private static V1VolumeMount createWdtConfigVolumeMount(String domainUid) {
    +    return volumeMount(getWdtConfigMapVolumeName(domainUid), "/weblogic-operator/introspector");
    +  }
    +
       private static V1VolumeMount readOnlyVolumeMount(String volumeName, String mountPath) {
         return volumeMount(volumeName, mountPath).readOnly(true);
       }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodHelper.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodHelper.java
    index 4a24661bedd..7442b5bccb9 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodHelper.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodHelper.java
    @@ -6,6 +6,7 @@
     import java.util.ArrayList;
     import java.util.List;
     import java.util.Map;
    +import java.util.Optional;
     
     import io.kubernetes.client.openapi.models.V1DeleteOptions;
     import io.kubernetes.client.openapi.models.V1EnvVar;
    @@ -16,6 +17,7 @@
     import io.kubernetes.client.openapi.models.V1PodStatus;
     import oracle.kubernetes.operator.DomainStatusUpdater;
     import oracle.kubernetes.operator.LabelConstants;
    +import oracle.kubernetes.operator.MakeRightDomainOperation;
     import oracle.kubernetes.operator.PodAwaiterStepFactory;
     import oracle.kubernetes.operator.ProcessingConstants;
     import oracle.kubernetes.operator.TuningParameters;
    @@ -32,6 +34,8 @@
     import oracle.kubernetes.weblogic.domain.model.ServerSpec;
     import oracle.kubernetes.weblogic.domain.model.Shutdown;
     
    +import static oracle.kubernetes.operator.ProcessingConstants.SERVERS_TO_ROLL;
    +
     public class PodHelper {
       static final long DEFAULT_ADDITIONAL_DELETE_TIME = 10;
       private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
    @@ -39,13 +43,32 @@ public class PodHelper {
       private PodHelper() {
       }
     
    +  /**
    +   * Creates an admin server pod resource, based on the specified packet.
    +   * Expects the packet to contain a domain presence info as well as:
    +   *   SCAN                 the topology for the server (WlsServerConfig)
    +   *   DOMAIN_TOPOLOGY      the topology for the domain (WlsDomainConfig)
    +   *
    +   *
    +   * @param packet a packet describing the domain model and topology.
    +   * @return an appropriate Kubernetes resource
    +   */
    +  public static V1Pod createAdminServerPodModel(Packet packet) {
    +    return new AdminPodStepContext(null, packet).createPodModel();
    +  }
    +
       /**
        * Creates a managed server pod resource, based on the specified packet.
    +   * Expects the packet to contain a domain presence info as well as:
    +   *   CLUSTER_NAME         (optional) the name of the cluster to which the server is assigned
    +   *   SCAN                 the topology for the server (WlsServerConfig)
    +   *   DOMAIN_TOPOLOGY      the topology for the domain (WlsDomainConfig)
    +   *
        *
        * @param packet a packet describing the domain model and topology.
        * @return an appropriate Kubernetes resource
        */
    -  static V1Pod createManagedServerPodModel(Packet packet) {
    +  public static V1Pod createManagedServerPodModel(Packet packet) {
         return new ManagedPodStepContext(null, packet).createPodModel();
       }
     
    @@ -143,6 +166,7 @@ public static String getPodServerName(V1Pod pod) {
         return null;
       }
     
    +
       /**
        * Factory for {@link Step} that creates admin server pod.
        *
    @@ -204,9 +228,11 @@ static List createCopy(List envVars) {
     
       static class AdminPodStepContext extends PodStepContext {
         static final String INTERNAL_OPERATOR_CERT_ENV = "INTERNAL_OPERATOR_CERT";
    +    private final Packet packet;
     
         AdminPodStepContext(Step conflictStep, Packet packet) {
           super(conflictStep, packet);
    +      this.packet = packet;
     
           init();
         }
    @@ -233,7 +259,11 @@ Step createNewPod(Step next) {
     
         @Override
         Step replaceCurrentPod(Step next) {
    -      return createCyclePodStep(next);
    +      if (MakeRightDomainOperation.isInspectionRequired(packet)) {
    +        return MakeRightDomainOperation.createStepsToRerunWithIntrospection(packet);
    +      } else {
    +        return createCyclePodStep(next);
    +      }
         }
     
         @Override
    @@ -361,28 +391,33 @@ String getServerName() {
         @Override
         // let the pod rolling step update the pod
         Step replaceCurrentPod(Step next) {
    +      return deferProcessing(createCyclePodStep(next));
    +    }
    +
    +    private Step deferProcessing(Step deferredStep) {
           synchronized (packet) {
    -        @SuppressWarnings("unchecked")
    -        Map rolling =
    -            (Map) packet.get(ProcessingConstants.SERVERS_TO_ROLL);
    -        if (rolling != null) {
    -          rolling.put(
    -              getServerName(),
    -              new Step.StepAndPacket(
    -                  DomainStatusUpdater.createProgressingStep(
    -                      DomainStatusUpdater.MANAGED_SERVERS_STARTING_PROGRESS_REASON,
    -                      false,
    -                      createCyclePodStep(next)),
    -                  packet.clone()));
    -        }
    +        Optional.ofNullable(getServersToRoll()).ifPresent(r -> r.put(getServerName(), createRollRequest(deferredStep)));
           }
           return null;
         }
     
    +    private Step.StepAndPacket createRollRequest(Step deferredStep) {
    +      return new Step.StepAndPacket(createProgressingStep(deferredStep), packet.clone());
    +    }
    +
    +    @SuppressWarnings("unchecked")
    +    private Map getServersToRoll() {
    +      return (Map) packet.get(SERVERS_TO_ROLL);
    +    }
    +
    +    private Step createProgressingStep(Step actionStep) {
    +      return DomainStatusUpdater.createProgressingStep(
    +          DomainStatusUpdater.MANAGED_SERVERS_STARTING_PROGRESS_REASON, false, actionStep);
    +    }
    +
         @Override
         Step createNewPod(Step next) {
    -      return DomainStatusUpdater.createProgressingStep(
    -          DomainStatusUpdater.MANAGED_SERVERS_STARTING_PROGRESS_REASON, false, createPod(next));
    +      return createProgressingStep(createPod(next));
         }
     
         @Override
    @@ -429,10 +464,7 @@ protected List getContainerCommand() {
         List getConfiguredEnvVars(TuningParameters tuningParameters) {
           List envVars = createCopy((List) packet.get(ProcessingConstants.ENVVARS));
     
    -      List vars = new ArrayList<>();
    -      if (envVars != null) {
    -        vars.addAll(envVars);
    -      }
    +      List vars = new ArrayList<>(envVars);
           addStartupEnvVars(vars);
           return vars;
         }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java
    index 13e18a6fcbe..373777cc86a 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java
    @@ -9,6 +9,7 @@
     import java.util.Collections;
     import java.util.List;
     import java.util.Map;
    +import java.util.Objects;
     import java.util.Optional;
     import javax.json.Json;
     import javax.json.JsonPatchBuilder;
    @@ -28,10 +29,13 @@
     import io.kubernetes.client.openapi.models.V1PodReadinessGate;
     import io.kubernetes.client.openapi.models.V1PodSpec;
     import io.kubernetes.client.openapi.models.V1Probe;
    +import io.kubernetes.client.openapi.models.V1SecretVolumeSource;
     import io.kubernetes.client.openapi.models.V1Status;
     import io.kubernetes.client.openapi.models.V1Volume;
     import io.kubernetes.client.openapi.models.V1VolumeMount;
    +import oracle.kubernetes.operator.DomainSourceType;
     import oracle.kubernetes.operator.DomainStatusUpdater;
    +import oracle.kubernetes.operator.IntrospectorConfigMapKeys;
     import oracle.kubernetes.operator.KubernetesConstants;
     import oracle.kubernetes.operator.LabelConstants;
     import oracle.kubernetes.operator.PodAwaiterStepFactory;
    @@ -55,9 +59,6 @@
     import oracle.kubernetes.weblogic.domain.model.Shutdown;
     import org.apache.commons.lang3.builder.EqualsBuilder;
     
    -import static oracle.kubernetes.operator.KubernetesConstants.GRACEFUL_SHUTDOWNTYPE;
    -import static oracle.kubernetes.operator.VersionConstants.DEFAULT_DOMAIN_VERSION;
    -
     public abstract class PodStepContext extends BasePodStepContext {
     
       private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
    @@ -69,17 +70,20 @@ public abstract class PodStepContext extends BasePodStepContext {
       private static final String READINESS_PATH = "/weblogic/ready";
     
       final WlsServerConfig scan;
    -  private final DomainPresenceInfo info;
       private final WlsDomainConfig domainTopology;
       private final Step conflictStep;
       private V1Pod podModel;
    -  private String domainRestartVersion;
    +  private final String miiModelSecretsHash;
    +  private final String miiDomainZipHash;
    +  private final String domainRestartVersion;
     
       PodStepContext(Step conflictStep, Packet packet) {
    +    super(packet.getSpi(DomainPresenceInfo.class));
         this.conflictStep = conflictStep;
    -    info = packet.getSpi(DomainPresenceInfo.class);
         domainTopology = (WlsDomainConfig) packet.get(ProcessingConstants.DOMAIN_TOPOLOGY);
    -    domainRestartVersion = (String)packet.get(ProcessingConstants.DOMAIN_RESTART_VERSION);
    +    miiModelSecretsHash = (String)packet.get(IntrospectorConfigMapKeys.SECRETS_MD_5);
    +    miiDomainZipHash = (String)packet.get(IntrospectorConfigMapKeys.DOMAINZIP_HASH);
    +    domainRestartVersion = (String)packet.get(IntrospectorConfigMapKeys.DOMAIN_RESTART_VERSION);
         scan = (WlsServerConfig) packet.get(ProcessingConstants.SERVER_SCAN);
       }
     
    @@ -121,11 +125,7 @@ String getDomainName() {
         return domainTopology.getName();
       }
     
    -  private String getDomainResourceName() {
    -    return info.getDomain().getMetadata().getName();
    -  }
    -
    -  private String getDomainHomeSourceType() {
    +  private DomainSourceType getDomainHomeSourceType() {
         return getDomain().getDomainHomeSourceType();
       }
     
    @@ -187,6 +187,10 @@ private String isIncludeServerOutInPodLog() {
         return Boolean.toString(getDomain().isIncludeServerOutInPodLog());
       }
     
    +  private String getRuntimeEncryptionSecret() {
    +    return getDomain().getRuntimeEncryptionSecret();
    +  }
    +
       private List getContainerPorts() {
         if (scan != null) {
           List ports = new ArrayList<>();
    @@ -322,18 +326,23 @@ private Step patchCurrentPod(V1Pod currentPod, Step next) {
         JsonPatchBuilder patchBuilder = Json.createPatchBuilder();
     
         KubernetesUtils.addPatches(
    -        patchBuilder, "/metadata/labels/", currentPod.getMetadata().getLabels(), getPodLabels());
    +        patchBuilder, "/metadata/labels/", getLabels(currentPod), getPodLabels());
         KubernetesUtils.addPatches(
    -        patchBuilder,
    -        "/metadata/annotations/",
    -        currentPod.getMetadata().getAnnotations(),
    -        getPodAnnotations());
    +        patchBuilder, "/metadata/annotations/", getAnnotations(currentPod), getPodAnnotations());
     
         return new CallBuilder()
             .patchPodAsync(getPodName(), getNamespace(),
                 new V1Patch(patchBuilder.build().toString()), patchResponse(next));
       }
     
    +  private Map getLabels(V1Pod pod) {
    +    return Optional.ofNullable(pod.getMetadata()).map(V1ObjectMeta::getLabels).orElseGet(Collections::emptyMap);
    +  }
    +
    +  private Map getAnnotations(V1Pod pod) {
    +    return Optional.ofNullable(pod.getMetadata()).map(V1ObjectMeta::getAnnotations).orElseGet(Collections::emptyMap);
    +  }
    +
       private void logPodCreated() {
         LOGGER.info(getPodCreatedMessageKey(), getDomainUid(), getServerName());
       }
    @@ -363,9 +372,8 @@ Step createCyclePodStep(Step next) {
       }
     
       private boolean mustPatchPod(V1Pod currentPod) {
    -    return KubernetesUtils.isMissingValues(currentPod.getMetadata().getLabels(), getPodLabels())
    -        || KubernetesUtils.isMissingValues(
    -            currentPod.getMetadata().getAnnotations(), getPodAnnotations());
    +    return KubernetesUtils.isMissingValues(getLabels(currentPod), getPodLabels())
    +        || KubernetesUtils.isMissingValues(getAnnotations(currentPod), getPodAnnotations());
       }
     
       private boolean canUseCurrentPod(V1Pod currentPod) {
    @@ -406,8 +414,17 @@ V1Pod createPodModel() {
         return withNonHashedElements(AnnotationHelper.withSha256Hash(createPodRecipe()));
       }
     
    +  @Override
    +  protected Map augmentSubVars(Map vars) {
    +    String clusterName = getClusterName();
    +    if (clusterName != null) {
    +      vars.put("CLUSTER_NAME", clusterName);
    +    }
    +    return vars;
    +  }
    +
       V1Pod withNonHashedElements(V1Pod pod) {
    -    V1ObjectMeta metadata = pod.getMetadata();
    +    V1ObjectMeta metadata = Objects.requireNonNull(pod.getMetadata());
         // Adds labels and annotations to a pod, skipping any whose names begin with "weblogic."
         getPodLabels().entrySet().stream()
             .filter(PodStepContext::isCustomerItem)
    @@ -416,77 +433,59 @@ V1Pod withNonHashedElements(V1Pod pod) {
             .filter(PodStepContext::isCustomerItem)
             .forEach(e -> metadata.putAnnotationsItem(e.getKey(), e.getValue()));
     
    -    updateForStartupMode(pod);
    -    updateForShutdown(pod);
    +    setTerminationGracePeriod(pod);
    +    getContainer(pod).map(V1Container::getEnv).ifPresent(this::updateEnv);
    +
    +    updateForOwnerReference(metadata);
         return updateForDeepSubstitution(pod.getSpec(), pod);
       }
     
    -  @Override
    -  protected Map augmentSubVars(Map vars) {
    -    String clusterName = getClusterName();
    -    if (clusterName != null) {
    -      vars.put("CLUSTER_NAME", clusterName);
    -    }
    -    return vars;
    +  private void setTerminationGracePeriod(V1Pod pod) {
    +    Objects.requireNonNull(pod.getSpec()).terminationGracePeriodSeconds(getTerminationGracePeriodSeconds());
       }
     
    -  private void updateForStartupMode(V1Pod pod) {
    -    ServerSpec serverSpec = getServerSpec();
    -    if (serverSpec != null) {
    -      String desiredState = serverSpec.getDesiredState();
    -      if (!WebLogicConstants.RUNNING_STATE.equals(desiredState)) {
    -        getContainer(pod)
    -            .ifPresent(
    -                c -> {
    -                  List env = c.getEnv();
    -                  addDefaultEnvVarIfMissing(env, "STARTUP_MODE", desiredState);
    -                });
    -      }
    +  private long getTerminationGracePeriodSeconds() {
    +    return getShutdownSpec().getTimeoutSeconds() + PodHelper.DEFAULT_ADDITIONAL_DELETE_TIME;
    +  }
    +
    +  private void updateEnv(List env) {
    +    updateEnvForShutdown(env);
    +    updateEnvForStartupMode(env);
    +    defineConfigOverride(env);
    +  }
    +
    +  private void updateEnvForShutdown(List env) {
    +    if (scan != null) {
    +      Integer localAdminPort = scan.getLocalAdminProtocolChannelPort();
    +      addOrReplaceEnvVar(env, "LOCAL_ADMIN_PORT", String.valueOf(localAdminPort));
    +      addOrReplaceEnvVar(env, "LOCAL_ADMIN_PROTOCOL", localAdminPort.equals(scan.getListenPort()) ? "t3" : "t3s");
         }
    +
    +    Shutdown shutdown = getShutdownSpec();
    +    addDefaultEnvVarIfMissing(env, "SHUTDOWN_TYPE", shutdown.getShutdownType());
    +    addDefaultEnvVarIfMissing(env, "SHUTDOWN_TIMEOUT", String.valueOf(shutdown.getTimeoutSeconds()));
    +    addDefaultEnvVarIfMissing(env, "SHUTDOWN_IGNORE_SESSIONS", String.valueOf(shutdown.getIgnoreSessions()));
       }
     
    -  /**
    -   * Inserts into the pod the environment variables and other configuration related to shutdown
    -   * behavior.
    -   *
    -   * @param pod The pod
    -   */
    -  private void updateForShutdown(V1Pod pod) {
    -    String shutdownType;
    -    Long timeout;
    -    boolean ignoreSessions;
    -
    -    ServerSpec serverSpec = getServerSpec();
    -    if (serverSpec != null) {
    -      Shutdown shutdown = serverSpec.getShutdown();
    -      shutdownType = shutdown.getShutdownType();
    -      timeout = shutdown.getTimeoutSeconds();
    -      ignoreSessions = shutdown.getIgnoreSessions();
    -    } else {
    -      shutdownType = GRACEFUL_SHUTDOWNTYPE;
    -      timeout = Shutdown.DEFAULT_TIMEOUT;
    -      ignoreSessions = Shutdown.DEFAULT_IGNORESESSIONS;
    -    }
    -
    -    getContainer(pod)
    -        .ifPresent(
    -            c -> {
    -              List env = c.getEnv();
    -              if (scan != null) {
    -                Integer localAdminPort = scan.getLocalAdminProtocolChannelPort();
    -                addOrReplaceEnvVar(env, "LOCAL_ADMIN_PORT", String.valueOf(localAdminPort));
    -                addOrReplaceEnvVar(
    -                    env,
    -                    "LOCAL_ADMIN_PROTOCOL",
    -                    localAdminPort.equals(scan.getListenPort()) ? "t3" : "t3s");
    -              }
    -              addDefaultEnvVarIfMissing(env, "SHUTDOWN_TYPE", shutdownType);
    -              addDefaultEnvVarIfMissing(env, "SHUTDOWN_TIMEOUT", String.valueOf(timeout));
    -              addDefaultEnvVarIfMissing(
    -                  env, "SHUTDOWN_IGNORE_SESSIONS", String.valueOf(ignoreSessions));
    -            });
    -
    -    pod.getSpec().terminationGracePeriodSeconds(timeout + PodHelper.DEFAULT_ADDITIONAL_DELETE_TIME);
    +  private Shutdown getShutdownSpec() {
    +    return Optional.ofNullable(getServerSpec()).map(ServerSpec::getShutdown).orElse(new Shutdown());
    +  }
    +
    +  private void updateEnvForStartupMode(List env) {
    +    Optional.ofNullable(getServerSpec())
    +          .map(ServerSpec::getDesiredState)
    +          .filter(this::isNotRunning)
    +          .ifPresent(s -> addDefaultEnvVarIfMissing(env, "STARTUP_MODE", s));
    +  }
    +
    +  private boolean isNotRunning(String desiredState) {
    +    return !WebLogicConstants.RUNNING_STATE.equals(desiredState);
    +  }
    +
    +  private void defineConfigOverride(List env) {
    +    if (distributeOverridesDynamically()) {
    +      addDefaultEnvVarIfMissing(env, ServerEnvVars.DYNAMIC_CONFIG_OVERRIDE, "true");
    +    }
       }
     
       // Creates a pod model containing elements which are not patchable.
    @@ -501,8 +500,10 @@ protected V1ObjectMeta createMetadata() {
             + domainRestartVersion);
         LOGGER.finest("PodStepContext.createMetaData domainRestartVersion from serverspec "
             + getServerSpec().getDomainRestartVersion());
    +    LOGGER.finest("PodStepContext.createMetaData domainIntrospectVersion from spec "
    +        + getDomain().getIntrospectVersion());
    +    
         metadata
    -        .putLabelsItem(LabelConstants.RESOURCE_VERSION_LABEL, DEFAULT_DOMAIN_VERSION)
             .putLabelsItem(LabelConstants.DOMAINUID_LABEL, getDomainUid())
             .putLabelsItem(LabelConstants.DOMAINNAME_LABEL, getDomainName())
             .putLabelsItem(LabelConstants.SERVERNAME_LABEL, getServerName())
    @@ -514,11 +515,25 @@ LabelConstants.CLUSTERRESTARTVERSION_LABEL, getServerSpec().getClusterRestartVer
             .putLabelsItem(
                 LabelConstants.SERVERRESTARTVERSION_LABEL, getServerSpec().getServerRestartVersion());
     
    +    Optional.ofNullable(miiDomainZipHash)
    +          .ifPresent(hash -> addHashLabel(metadata, LabelConstants.MODEL_IN_IMAGE_DOMAINZIP_HASH, hash));
    +    Optional.ofNullable(miiModelSecretsHash)
    +          .ifPresent(hash -> addHashLabel(metadata, LabelConstants.MODEL_IN_IMAGE_MODEL_SECRETS_HASH, hash));
    +
         // Add prometheus annotations. This will overwrite any custom annotations with same name.
         AnnotationHelper.annotateForPrometheus(metadata, getDefaultPort());
         return metadata;
       }
     
    +  private void addHashLabel(V1ObjectMeta metadata, String label, String hash) {
    +    metadata.putLabelsItem(label, formatHashLabel(hash));
    +  }
    +
    +  private static String formatHashLabel(String hash) {
    +    return String.format("md5.%s.md5", hash.replace("\n", ""));
    +  }
    +
    +
       protected V1PodSpec createSpec(TuningParameters tuningParameters) {
         V1PodSpec podSpec = createPodSpec(tuningParameters)
             .readinessGates(getReadinessGates())
    @@ -540,6 +555,9 @@ private List getReadinessGates() {
       private List getVolumes(String domainUid) {
         List volumes = PodDefaults.getStandardVolumes(domainUid);
         volumes.addAll(getServerSpec().getAdditionalVolumes());
    +    if (getDomainHomeSourceType() == DomainSourceType.FromModel) {
    +      volumes.add(createRuntimeEncryptionSecretVolume());
    +    }
     
         return volumes;
       }
    @@ -560,6 +578,11 @@ protected V1Container createContainer(TuningParameters tuningParameters) {
         return v1Container;
       }
     
    +  private V1VolumeMount createRuntimeEncryptionSecretVolumeMount() {
    +    return new V1VolumeMount().name(RUNTIME_ENCRYPTION_SECRET_VOLUME)
    +        .mountPath(RUNTIME_ENCRYPTION_SECRET_MOUNT_PATH).readOnly(true);
    +  }
    +
       protected String getContainerName() {
         return KubernetesConstants.CONTAINER_NAME;
       }
    @@ -575,9 +598,22 @@ protected List getContainers() {
       private List getVolumeMounts() {
         List mounts = PodDefaults.getStandardVolumeMounts(getDomainUid());
         mounts.addAll(getServerSpec().getAdditionalVolumeMounts());
    +    if (getDomainHomeSourceType() == DomainSourceType.FromModel) {
    +      mounts.add(createRuntimeEncryptionSecretVolumeMount());
    +    }
         return mounts;
       }
     
    +  private V1Volume createRuntimeEncryptionSecretVolume() {
    +    return new V1Volume()
    +        .name(RUNTIME_ENCRYPTION_SECRET_VOLUME)
    +        .secret(getRuntimeEncryptionSecretVolumeSource(getRuntimeEncryptionSecret()));
    +  }
    +
    +  private V1SecretVolumeSource getRuntimeEncryptionSecretVolumeSource(String name) {
    +    return new V1SecretVolumeSource().secretName(name).defaultMode(420);
    +  }
    +
       /**
        * Sets the environment variables used by operator/src/main/resources/scripts/startServer.sh
        * @param vars a list to which new variables are to be added
    @@ -587,16 +623,8 @@ void addStartupEnvVars(List vars) {
         addEnvVar(vars, ServerEnvVars.DOMAIN_HOME, getDomainHome());
         addEnvVar(vars, ServerEnvVars.ADMIN_NAME, getAsName());
         addEnvVar(vars, ServerEnvVars.ADMIN_PORT, getAsPort().toString());
    -    if (isLocalAdminProtocolChannelSecure()) {
    -      addEnvVar(vars, "ADMIN_PORT_SECURE", "true");
    -    }
    -    if (isAdminServerProtocolChannelSecure()) {
    -      // The following env variable determines whether to set a secure protocol(https/t3s) in the "AdminURL" property
    -      // in NM startup.properties.
    -      // WebLogic Node Manager then sets the ADMIN_URL env variable(based on the "AdminURL") before starting
    -      // the managed server
    -      addEnvVar(vars, "ADMIN_SERVER_PORT_SECURE", "true");
    -    }
    +    addEnvVarIfTrue(isLocalAdminProtocolChannelSecure(), vars, "ADMIN_PORT_SECURE");
    +    addEnvVarIfTrue(isAdminServerProtocolChannelSecure(), vars, ServerEnvVars.ADMIN_SERVER_PORT_SECURE);
         addEnvVar(vars, ServerEnvVars.SERVER_NAME, getServerName());
         addEnvVar(vars, ServerEnvVars.DOMAIN_UID, getDomainUid());
         addEnvVar(vars, ServerEnvVars.NODEMGR_HOME, NODEMGR_HOME);
    @@ -604,19 +632,18 @@ void addStartupEnvVars(List vars) {
         addEnvVar(vars, ServerEnvVars.SERVER_OUT_IN_POD_LOG, isIncludeServerOutInPodLog());
         addEnvVar(vars, ServerEnvVars.SERVICE_NAME, LegalNames.toServerServiceName(getDomainUid(), getServerName()));
         addEnvVar(vars, ServerEnvVars.AS_SERVICE_NAME, LegalNames.toServerServiceName(getDomainUid(), getAsName()));
    -    String dataHome = getDataHome();
    -    if (dataHome != null && !dataHome.isEmpty()) {
    -      addEnvVar(vars, ServerEnvVars.DATA_HOME, dataHome);
    -    }
    -    if (mockWls()) {
    -      addEnvVar(vars, "MOCK_WLS", "true");
    -    }
    +    Optional.ofNullable(getDataHome()).ifPresent(v -> addEnvVar(vars, ServerEnvVars.DATA_HOME, v));
    +    addEnvVarIfTrue(mockWls(), vars, "MOCK_WLS");
       }
     
       private String getDomainHome() {
         return getDomain().getDomainHome();
       }
     
    +  private boolean distributeOverridesDynamically() {
    +    return getDomain().distributeOverridesDynamically();
    +  }
    +
       private V1Lifecycle createLifecycle() {
         return new V1Lifecycle().preStop(handler(STOP_SERVER));
       }
    @@ -774,7 +801,7 @@ public NextAction apply(Packet packet) {
           } else if (!canUseCurrentPod(currentPod)) {
             LOGGER.info(
                 MessageKeys.CYCLING_POD,
    -            currentPod.getMetadata().getName(),
    +            Objects.requireNonNull(currentPod.getMetadata()).getName(),
                 getReasonToRecycle(currentPod));
             return doNext(replaceCurrentPod(getNext()), packet);
           } else if (mustPatchPod(currentPod)) {
    @@ -810,6 +837,7 @@ private NextAction updateDomainStatus(Packet packet, CallResponse callRes
       }
     
       private class CreateResponseStep extends BaseResponseStep {
    +
         CreateResponseStep(Step next) {
           super(next);
         }
    @@ -821,6 +849,14 @@ public NextAction onSuccess(Packet packet, CallResponse callResponse) {
             info.updateLastKnownServerStatus(getServerName(), WebLogicConstants.STARTING_STATE);
             setRecordedPod(callResponse.getResult());
           }
    +
    +      boolean waitForPodReady =
    +          (boolean) Optional.ofNullable(packet.get(ProcessingConstants.WAIT_FOR_POD_READY)).orElse(false);
    +
    +      if (waitForPodReady) {
    +        PodAwaiterStepFactory pw = packet.getSpi(PodAwaiterStepFactory.class);
    +        return doNext(pw.waitForReady(callResponse.getResult(), getNext()), packet);
    +      }
           return doNext(packet);
         }
       }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/ResponseStep.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/ResponseStep.java
    index 24332d2ba08..84abebf4d31 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/ResponseStep.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/ResponseStep.java
    @@ -151,8 +151,11 @@ public NextAction onFailure(Packet packet, CallResponse callResponse) {
        * @return Next action for fiber processing, which may be a retry
        */
       public NextAction onFailure(Step conflictStep, Packet packet, CallResponse callResponse) {
    -    return Optional.ofNullable(doPotentialRetry(conflictStep, packet, callResponse))
    -        .orElse(onFailureNoRetry(packet, callResponse));
    +    Optional optionalNextAction =
    +        Optional.ofNullable(doPotentialRetry(conflictStep, packet, callResponse));
    +    return optionalNextAction
    +        .filter(na -> optionalNextAction.isPresent())
    +        .orElseGet(() -> onFailureNoRetry(packet, callResponse));
       }
     
       protected NextAction onFailureNoRetry(Packet packet, CallResponse callResponse) {
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/RollingHelper.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/RollingHelper.java
    index 110815abcb6..c52dd2fdf40 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/RollingHelper.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/RollingHelper.java
    @@ -36,7 +36,7 @@
      */
     public class RollingHelper {
       private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
    -  private static long DELAY_IN_SECONDS = 10;
    +  private static long DELAY_IN_SECONDS = 1;
     
       private RollingHelper() {
       }
    @@ -226,4 +226,4 @@ public NextAction apply(Packet packet) {
           }
         }
       }
    -}
    \ No newline at end of file
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/SecretType.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/SecretType.java
    index b35d11ed4ce..7d3b255ba1b 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/SecretType.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/SecretType.java
    @@ -9,5 +9,8 @@
     public enum SecretType {
       WebLogicCredentials, 
       ImagePull, 
    -  ConfigOverride
    +  ConfigOverride, 
    +  RuntimeEncryption,
    +  OpssWalletPassword, 
    +  OpssWalletFile
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/SemanticVersion.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/SemanticVersion.java
    new file mode 100644
    index 00000000000..7884379ab62
    --- /dev/null
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/SemanticVersion.java
    @@ -0,0 +1,133 @@
    +// Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +package oracle.kubernetes.operator.helpers;
    +
    +import java.util.Objects;
    +import javax.validation.constraints.NotNull;
    +
    +/** Major, minor and revision version specification for a product. */
    +public class SemanticVersion implements Comparable {
    +  private final int major;
    +  private final int minor;
    +  private final int revision;
    +
    +  /**
    +   * Construct semantic version.
    +   * @param major major
    +   * @param minor minor
    +   */
    +  public SemanticVersion(int major, int minor) {
    +    this(major, minor, 0);
    +  }
    +
    +  /**
    +   * Construct semantic version.
    +   * @param major major
    +   * @param minor minor
    +   * @param revision revision
    +   */
    +  public SemanticVersion(int major, int minor, int revision) {
    +    this.major = major;
    +    this.minor = minor;
    +    this.revision = revision;
    +  }
    +
    +  /**
    +   * Construct semantic version.
    +   * @param fullVersion Version formatted like "1.2[.3[+abcd]]
    +   */
    +  public SemanticVersion(String fullVersion) {
    +    String[] splitVersion = fullVersion.split("\\.");
    +    this.major = getNumericPortion(splitVersion[0]);
    +    this.minor = getNumericPortion(splitVersion[1]);
    +    this.revision = splitVersion.length > 2 ? getNumericPortion(splitVersion[2]) : 0;
    +  }
    +
    +  protected static int getNumericPortion(String numericString) {
    +    while (!numericString.chars().allMatch(Character::isDigit)) {
    +      numericString = numericString.substring(0, numericString.length() - 1);
    +    }
    +    return numericString.length() == 0 ? 0 : Integer.parseInt(numericString);
    +  }
    +
    +  public int getMajor() {
    +    return major;
    +  }
    +
    +  public int getMinor() {
    +    return minor;
    +  }
    +
    +  public int getRevision() {
    +    return revision;
    +  }
    +
    +  /**
    +   * Compatibility check, similar to compare, but that reports more details on revision comparision.
    +   * @param minimumVersion Minimum version
    +   * @return Compatibility statement
    +   */
    +  public Compatibility getCompatibilityWith(String minimumVersion) {
    +    SemanticVersion minimum = new SemanticVersion(minimumVersion);
    +    if (major < minimum.major) {
    +      return Compatibility.VERSION_LOWER;
    +    }
    +    if (major > minimum.major) {
    +      return Compatibility.VERSION_HIGHER;
    +    }
    +
    +    if (minor < minimum.minor) {
    +      return Compatibility.VERSION_LOWER;
    +    }
    +    if (minor > minimum.minor) {
    +      return Compatibility.VERSION_HIGHER;
    +    }
    +
    +    return (revision >= minimum.revision)
    +            ? Compatibility.REVISION_OK
    +            : Compatibility.REVISION_TOO_LOW;
    +  }
    +
    +  @Override
    +  public boolean equals(Object o) {
    +    return this == o || o instanceof SemanticVersion && equals((SemanticVersion) o);
    +  }
    +
    +  private boolean equals(SemanticVersion o) {
    +    return major == o.major && minor == o.minor && revision == o.revision;
    +  }
    +
    +  @Override
    +  public int hashCode() {
    +    return Objects.hash(major, minor, revision);
    +  }
    +
    +  @Override
    +  public String toString() {
    +    return major + "." + minor + "." + revision;
    +  }
    +
    +  @Override
    +  public int compareTo(@NotNull SemanticVersion o) {
    +    if (o == null) {
    +      return 1;
    +    }
    +    int majorDiff = this.major - o.major;
    +    if (majorDiff != 0) {
    +      return majorDiff;
    +    }
    +    int minorDiff = this.minor - o.minor;
    +    if (minorDiff != 0) {
    +      return minorDiff;
    +    }
    +    return this.revision - o.revision;
    +  }
    +
    +  enum Compatibility {
    +    REVISION_OK,
    +    REVISION_TOO_LOW,
    +    VERSION_HIGHER,
    +    VERSION_LOWER
    +  }
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/ServiceHelper.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/ServiceHelper.java
    index d560168d5a7..7f8f6610522 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/ServiceHelper.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/ServiceHelper.java
    @@ -20,7 +20,6 @@
     import oracle.kubernetes.operator.DomainStatusUpdater;
     import oracle.kubernetes.operator.LabelConstants;
     import oracle.kubernetes.operator.ProcessingConstants;
    -import oracle.kubernetes.operator.VersionConstants;
     import oracle.kubernetes.operator.calls.CallResponse;
     import oracle.kubernetes.operator.calls.UnrecoverableErrorBuilder;
     import oracle.kubernetes.operator.logging.LoggingFacade;
    @@ -376,16 +375,15 @@ private static boolean testNodePort(Map ports, Integer po
         return true;
       }
     
    -  private abstract static class ServiceStepContext {
    +  private abstract static class ServiceStepContext extends StepContextBase {
         private final Step conflictStep;
         protected List ports;
    -    final DomainPresenceInfo info;
         final WlsDomainConfig domainTopology;
         private final OperatorServiceType serviceType;
     
         ServiceStepContext(Step conflictStep, Packet packet, OperatorServiceType serviceType) {
    +      super(packet.getSpi(DomainPresenceInfo.class));
           this.conflictStep = conflictStep;
    -      info = packet.getSpi(DomainPresenceInfo.class);
           domainTopology = (WlsDomainConfig) packet.get(ProcessingConstants.DOMAIN_TOPOLOGY);
           this.serviceType = serviceType;
         }
    @@ -395,7 +393,13 @@ Step getConflictStep() {
         }
     
         V1Service createModel() {
    -      return AnnotationHelper.withSha256Hash(createRecipe());
    +      return withNonHashedElements(AnnotationHelper.withSha256Hash(createRecipe()));
    +    }
    +
    +    V1Service withNonHashedElements(V1Service service) {
    +      V1ObjectMeta metadata = service.getMetadata();
    +      updateForOwnerReference(metadata);
    +      return service;
         }
     
         V1Service createRecipe() {
    @@ -419,6 +423,7 @@ void addServicePorts(WlsServerConfig serverConfig) {
             addServicePortIfNeeded("default-secure", serverConfig.getSslListenPort());
             addServicePortIfNeeded("default-admin", serverConfig.getAdminPort());
           }
    +
         }
     
         List getNetworkAccessPoints(@Nonnull WlsServerConfig config) {
    @@ -456,15 +461,12 @@ protected V1ObjectMeta createMetadata() {
           getServiceLabels().forEach(metadata::putLabelsItem);
     
           metadata
    -          .putLabelsItem(
    -              LabelConstants.RESOURCE_VERSION_LABEL, VersionConstants.DEFAULT_DOMAIN_VERSION)
               .putLabelsItem(LabelConstants.DOMAINUID_LABEL, getDomainUid())
               .putLabelsItem(LabelConstants.DOMAINNAME_LABEL, getDomainName())
               .putLabelsItem(LabelConstants.CREATEDBYOPERATOR_LABEL, "true");
     
           // Add custom annotations
           getServiceAnnotations().forEach(metadata::putAnnotationsItem);
    -
           return metadata;
         }
     
    @@ -881,7 +883,7 @@ void addServicePortIfNeeded(String channelName, Integer internalPort) {
               String[] tokens = channelName.split("-");
               if (tokens.length > 0) {
                 if ("http".equals(tokens[0]) || "https".equals(tokens[0]) || "tcp".equals(tokens[0])
    -                || "tls".equals(tokens[0])) {
    +                  || "tls".equals(tokens[0])) {
                   int index = channelName.indexOf('-');
                   channel = getChannel(channelName.substring(index + 1));
                 }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/StepContextBase.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/StepContextBase.java
    index e83e53c44df..437b110a6ca 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/StepContextBase.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/StepContextBase.java
    @@ -11,97 +11,17 @@
     import java.util.List;
     import java.util.Map;
     
    -import io.kubernetes.client.openapi.models.V1Container;
    -import io.kubernetes.client.openapi.models.V1EnvVar;
    +import io.kubernetes.client.openapi.models.V1ObjectMeta;
    +import io.kubernetes.client.openapi.models.V1OwnerReference;
     import io.kubernetes.client.openapi.models.V1Pod;
    -import io.kubernetes.client.openapi.models.V1PodSpec;
    -import io.kubernetes.client.openapi.models.V1Toleration;
     import oracle.kubernetes.operator.Pair;
    -import oracle.kubernetes.operator.TuningParameters;
     import oracle.kubernetes.weblogic.domain.model.Domain;
    -import oracle.kubernetes.weblogic.domain.model.ServerSpec;
     
     public abstract class StepContextBase implements StepContextConstants {
    -  abstract ServerSpec getServerSpec();
    +  protected final DomainPresenceInfo info;
     
    -  abstract String getContainerName();
    -
    -  abstract List getContainerCommand();
    -
    -  abstract List getContainers();
    -
    -  protected V1Container createContainer(TuningParameters tuningParameters) {
    -    return new V1Container()
    -        .name(getContainerName())
    -        .image(getServerSpec().getImage())
    -        .imagePullPolicy(getServerSpec().getImagePullPolicy())
    -        .command(getContainerCommand())
    -        .env(getEnvironmentVariables(tuningParameters))
    -        .resources(getServerSpec().getResources())
    -        .securityContext(getServerSpec().getContainerSecurityContext());
    -  }
    -
    -  protected V1PodSpec createPodSpec(TuningParameters tuningParameters) {
    -    return new V1PodSpec()
    -        .containers(getContainers())
    -        .addContainersItem(createContainer(tuningParameters))
    -        .affinity(getServerSpec().getAffinity())
    -        .nodeSelector(getServerSpec().getNodeSelectors())
    -        .serviceAccountName(getServerSpec().getServiceAccountName())
    -        .nodeName(getServerSpec().getNodeName())
    -        .schedulerName(getServerSpec().getSchedulerName())
    -        .priorityClassName(getServerSpec().getPriorityClassName())
    -        .runtimeClassName(getServerSpec().getRuntimeClassName())
    -        .tolerations(getTolerations())
    -        .restartPolicy(getServerSpec().getRestartPolicy())
    -        .securityContext(getServerSpec().getPodSecurityContext())
    -        .imagePullSecrets(getServerSpec().getImagePullSecrets());
    -  }
    -
    -  private List getTolerations() {
    -    List tolerations = getServerSpec().getTolerations();
    -    return tolerations.isEmpty() ? null : tolerations;
    -  }
    -
    -
    -  /**
    -     * Abstract method to be implemented by subclasses to return a list of configured and additional
    -     * environment variables to be set up in the pod.
    -     *
    -     * @param tuningParameters TuningParameters that can be used when obtaining
    -     * @return A list of configured and additional environment variables
    -     */
    -  abstract List getConfiguredEnvVars(TuningParameters tuningParameters);
    -
    -  /**
    -   * Return a list of environment variables to be set up in the pod. This method does some
    -   * processing of the list of environment variables such as token substitution before returning the
    -   * list.
    -   *
    -   * @param tuningParameters TuningParameters containing parameters that may be used in environment
    -   *     variables
    -   * @return A List of environment variables to be set up in the pod
    -   */
    -  final List getEnvironmentVariables(TuningParameters tuningParameters) {
    -
    -    List vars = getConfiguredEnvVars(tuningParameters);
    -
    -    addDefaultEnvVarIfMissing(
    -        vars, "USER_MEM_ARGS", "-Djava.security.egd=file:/dev/./urandom");
    -
    -    hideAdminUserCredentials(vars);
    -    return doDeepSubstitution(varsToSubVariables(vars), vars);
    -  }
    -
    -  protected Map varsToSubVariables(List vars) {
    -    Map substitutionVariables = new HashMap<>();
    -    if (vars != null) {
    -      for (V1EnvVar envVar : vars) {
    -        substitutionVariables.put(envVar.getName(), envVar.getValue());
    -      }
    -    }
    -
    -    return substitutionVariables;
    +  StepContextBase(DomainPresenceInfo info) {
    +    this.info = info;
       }
     
       protected  T doDeepSubstitution(final Map substitutionVariables, T obj) {
    @@ -209,52 +129,20 @@ private String translate(final Map substitutionVariables, String
         return result;
       }
     
    -  protected void addEnvVar(List vars, String name, String value) {
    -    vars.add(new V1EnvVar().name(name).value(value));
    -  }
    -
    -  protected boolean hasEnvVar(List vars, String name) {
    -    for (V1EnvVar var : vars) {
    -      if (name.equals(var.getName())) {
    -        return true;
    -      }
    -    }
    -    return false;
    -  }
    -
    -  protected void addDefaultEnvVarIfMissing(List vars, String name, String value) {
    -    if (!hasEnvVar(vars, name)) {
    -      addEnvVar(vars, name, value);
    -    }
    -  }
    -
    -  protected V1EnvVar findEnvVar(List vars, String name) {
    -    for (V1EnvVar var : vars) {
    -      if (name.equals(var.getName())) {
    -        return var;
    +  protected V1ObjectMeta updateForOwnerReference(V1ObjectMeta metadata) {
    +    if (info != null) {
    +      Domain domain = info.getDomain();
    +      if (domain != null) {
    +        V1ObjectMeta domainMetadata = domain.getMetadata();
    +        metadata.addOwnerReferencesItem(
    +            new V1OwnerReference()
    +                .apiVersion(domain.getApiVersion())
    +                .kind(domain.getKind())
    +                .name(domainMetadata.getName())
    +                .uid(domainMetadata.getUid())
    +                .controller(true));
           }
         }
    -    return null;
    -  }
    -
    -  protected void addOrReplaceEnvVar(List vars, String name, String value) {
    -    V1EnvVar var = findEnvVar(vars, name);
    -    if (var != null) {
    -      var.value(value);
    -    } else {
    -      addEnvVar(vars, name, value);
    -    }
    -  }
    -
    -  // Hide the admin account's user name and password.
    -  // Note: need to use null v.s. "" since if you upload a "" to kubectl then download it,
    -  // it comes back as a null and V1EnvVar.equals returns false even though it's supposed to
    -  // be the same value.
    -  // Regardless, the pod ends up with an empty string as the value (v.s. thinking that
    -  // the environment variable hasn't been set), so it honors the value (instead of using
    -  // the default, e.g. 'weblogic' for the user name).
    -  protected void hideAdminUserCredentials(List vars) {
    -    addEnvVar(vars, "ADMIN_USERNAME", null);
    -    addEnvVar(vars, "ADMIN_PASSWORD", null);
    +    return metadata;
       }
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/StepContextConstants.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/StepContextConstants.java
    index 15f3104e8e0..aadbfbff892 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/StepContextConstants.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/StepContextConstants.java
    @@ -5,14 +5,25 @@
     
     public interface StepContextConstants {
     
    +  static final String OPSS_KEYPASSPHRASE_VOLUME = "opss-keypass-volume";
    +  static final String OPSS_WALLETFILE_VOLUME = "opss-walletfile-volume";
    +  static final String WDT_ENCRYPT_PASSPHRASE_VOLUME = "wdt-encrypt-keypass-volume";
       static final String SECRETS_VOLUME = "weblogic-credentials-volume";
    -  static final String SCRIPTS_VOLUME = "weblogic-domain-cm-volume";
    +  static final String SCRIPTS_VOLUME = "weblogic-scripts-cm-volume";
       static final String DEBUG_CM_VOLUME = "weblogic-domain-debug-cm-volume";
       static final String SIT_CONFIG_MAP_VOLUME = "weblogic-domain-introspect-cm-volume";
    +  static final String WDT_CONFIG_MAP_VOLUME = "weblogic-domain-introspect-wdt-cm-volume";
    +  static final String RUNTIME_ENCRYPTION_SECRET_VOLUME = "weblogic-domain-runtime-encryption-volume";
    +  static final String STORAGE_VOLUME = "weblogic-domain-storage-volume";
       static final String SECRETS_MOUNT_PATH = "/weblogic-operator/secrets";
    +  static final String OPSS_KEY_MOUNT_PATH = "/weblogic-operator/opss-walletkey-secret";
    +  static final String WDT_ENCRYPT_KEY_MOUNT_PATH = "/weblogic-operator/wdt-encrypt-key-passphrase";
    +  static final String RUNTIME_ENCRYPTION_SECRET_MOUNT_PATH = "/weblogic-operator/model-runtime-secret";
       static final String SCRIPTS_MOUNTS_PATH = "/weblogic-operator/scripts";
       static final String OVERRIDE_SECRETS_MOUNT_PATH = "/weblogic-operator/config-overrides-secrets";
       static final String OVERRIDES_CM_MOUNT_PATH = "/weblogic-operator/config-overrides";
    +  static final String WDTCONFIGMAP_MOUNT_PATH = "/weblogic-operator/wdt-config-map";
    +  static final String OPSS_WALLETFILE_MOUNT_PATH = "/weblogic-operator/opss-walletfile-secret";
       static final String DEBUG_CM_MOUNTS_PATH = "/weblogic-operator/debug";
       static final String NODEMGR_HOME = "/u01/nodemanager";
       static final int FAILURE_THRESHOLD = 1;
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/VersionHelper.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/VersionHelper.java
    deleted file mode 100644
    index 68e19c262a3..00000000000
    --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/VersionHelper.java
    +++ /dev/null
    @@ -1,34 +0,0 @@
    -// Copyright (c) 2017, 2020, Oracle Corporation and/or its affiliates.
    -// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    -
    -package oracle.kubernetes.operator.helpers;
    -
    -import java.util.Map;
    -
    -import io.kubernetes.client.openapi.models.V1ObjectMeta;
    -import oracle.kubernetes.operator.LabelConstants;
    -
    -/** Helper methods for managing versions. */
    -public class VersionHelper {
    -  /**
    -   * Determines whether a resource matches a version.
    -   *
    -   * @param meta Metadata
    -   * @param resourceVersion resource version
    -   * @return true, if the labeled and expected versions match
    -   */
    -  public static boolean matchesResourceVersion(V1ObjectMeta meta, String resourceVersion) {
    -    if (meta == null) {
    -      return false;
    -    }
    -    Map labels = meta.getLabels();
    -    if (labels == null) {
    -      return false;
    -    }
    -    String val = labels.get(LabelConstants.RESOURCE_VERSION_LABEL);
    -    if (val == null) {
    -      return false;
    -    }
    -    return val.equals(resourceVersion);
    -  }
    -}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/http/HttpAsyncRequestStep.java b/operator/src/main/java/oracle/kubernetes/operator/http/HttpAsyncRequestStep.java
    index d47a527d6a5..8c0d76dcbf6 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/http/HttpAsyncRequestStep.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/http/HttpAsyncRequestStep.java
    @@ -108,7 +108,7 @@ private void resume(AsyncFiber fiber, HttpResponse response, Throwable t
           if (throwable != null) {
             LOGGER.fine(MessageKeys.HTTP_REQUEST_TIMED_OUT, request.method(), request.uri(), throwable);
           }
    -
    +      
           Optional.ofNullable(response).ifPresent(this::recordResponse);
           fiber.resume(packet);
         }
    @@ -140,4 +140,4 @@ public String getMessage() {
           return method + " request to " + uri + " timed out";
         }
       }
    -}
    \ No newline at end of file
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/http/HttpResponseStep.java b/operator/src/main/java/oracle/kubernetes/operator/http/HttpResponseStep.java
    index 5e1a68ce885..0a523e5b467 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/http/HttpResponseStep.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/http/HttpResponseStep.java
    @@ -70,4 +70,4 @@ static void removeResponse(Packet packet) {
        * @return the next action for the fiber to take
        */
       public abstract NextAction onFailure(Packet packet, HttpResponse response);
    -}
    \ No newline at end of file
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/logging/LoggingContext.java b/operator/src/main/java/oracle/kubernetes/operator/logging/LoggingContext.java
    new file mode 100644
    index 00000000000..f3c181274e1
    --- /dev/null
    +++ b/operator/src/main/java/oracle/kubernetes/operator/logging/LoggingContext.java
    @@ -0,0 +1,58 @@
    +// Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +package oracle.kubernetes.operator.logging;
    +
    +import java.util.Optional;
    +
    +/** Necessary additional context information for Operator log messages. */
    +public class LoggingContext implements AutoCloseable {
    +  public static final String LOGGING_CONTEXT_KEY = "LoggingContextComponent";
    +
    +  private static final ThreadLocal currentContext = new ThreadLocal<>();
    +
    +  private String namespace;
    +  private String domainUid;
    +
    +  /**
    +   * Creates a new LoggingContext and sets it as the current thread context. Returns the created context
    +   * in order to append parameters.
    +   * @return a new logging context
    +   */
    +  public static LoggingContext setThreadContext() {
    +    LoggingContext loggingContext = new LoggingContext();
    +    currentContext.set(loggingContext);
    +    return loggingContext;
    +  }
    +  
    +  /**
    +   * Gets the current logging context on the thread.
    +   *
    +   * @return current logging context
    +   */
    +  public static Optional optionalContext() {
    +    return Optional.ofNullable(currentContext.get());
    +  }
    +
    +  public LoggingContext namespace(String namespace) {
    +    this.namespace = namespace;
    +    return this;
    +  }
    +  
    +  public String namespace() {
    +    return namespace;
    +  }
    +  
    +  public LoggingContext domainUid(String domainUid) {
    +    this.domainUid = domainUid;
    +    return this;
    +  }
    +  
    +  public String domainUid() {
    +    return domainUid;
    +  }
    +
    +  public void close() {
    +    currentContext.remove();
    +  }
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/logging/LoggingFormatter.java b/operator/src/main/java/oracle/kubernetes/operator/logging/LoggingFormatter.java
    index a497b1aaa16..834276c89b7 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/logging/LoggingFormatter.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/logging/LoggingFormatter.java
    @@ -11,6 +11,7 @@
     import java.util.LinkedHashMap;
     import java.util.List;
     import java.util.Map;
    +import java.util.Optional;
     import java.util.logging.Formatter;
     import java.util.logging.LogRecord;
     
    @@ -32,6 +33,7 @@ public class LoggingFormatter extends Formatter {
       private static final String THREAD = "thread";
       private static final String FIBER = "fiber";
       private static final String DOMAIN_UID = "domainUID";
    +  private static final String DOMAIN_NAMESPACE = "namespace";
       private static final String SOURCE_CLASS = "class";
       private static final String SOURCE_METHOD = "method";
       private static final String TIME_IN_MILLIS = "timeInMillis";
    @@ -112,6 +114,7 @@ public String format(LogRecord record) {
         map.put(TIMESTAMP, dateString);
         map.put(THREAD, thread);
         map.put(FIBER, fiber != null ? fiber.toString() : "");
    +    map.put(DOMAIN_NAMESPACE, getNamespace(fiber));
         map.put(DOMAIN_UID, getDomainUid(fiber));
         map.put(LOG_LEVEL, level);
         map.put(SOURCE_CLASS, sourceClassName);
    @@ -145,19 +148,52 @@ public String format(LogRecord record) {
       }
     
       /**
    -   * Get the domain UID currently being used by the step executing for the Fiber.
    +   * Get the domain UID associated with the current log message.
    +   * Check the fiber that is currently being used to execute the step that initiates the log.
    +   * If there is no fiber associated with this log, check the ThreadLocal.
        *
        * @param fiber The current Fiber
        * @return the domain UID or empty string
        */
       private String getDomainUid(Fiber fiber) {
    +    return Optional.ofNullable(fiber)
    +          .map(Fiber::getPacket)
    +          .map(this::getDomainPresenceInfo)
    +          .map(DomainPresenceInfo::getDomainUid)
    +          .orElse(getDomainUidFromThreadContext());
    +  }
     
    -    Packet packet = fiber == null ? null : fiber.getPacket();
    -    if (packet != null) {
    -      DomainPresenceInfo info = packet.getSpi(DomainPresenceInfo.class);
    -      return info == null ? "" : info.getDomainUid();
    -    } else {
    -      return "";
    -    }
    +  private DomainPresenceInfo getDomainPresenceInfo(Packet packet) {
    +    return packet.getSpi(DomainPresenceInfo.class);
    +  }
    +
    +  private String getDomainUidFromThreadContext() {
    +    return LoggingContext.optionalContext().map(LoggingContext::domainUid).orElse("");
    +  }
    +
    +  /**
    +   * Get the namespace associated with the current log message.
    +   * Check the fiber that is currently being used to execute the step that initiate the log.
    +   * If there is no fiber associated with this log, check the ThreadLocal.
    +   *
    +   * @param fiber The current Fiber
    +   * @return the namespace or empty string
    +   */
    +  private String getNamespace(Fiber fiber) {
    +    return Optional.ofNullable(fiber)
    +          .map(Fiber::getPacket)
    +          .map(this::getDomainPresenceInfo)
    +          .map(DomainPresenceInfo::getNamespace)
    +          .orElse(getNamespaceFromLoggingContext(fiber));
       }
    +
    +  private String getNamespaceFromLoggingContext(Fiber fiber) {
    +    return Optional.ofNullable(fiber)
    +          .map(Fiber::getPacket)
    +          .map(p -> p.getSpi(LoggingContext.class))
    +          .or(LoggingContext::optionalContext)
    +          .map(LoggingContext::namespace)
    +          .orElse("");
    +  }
    +
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/logging/MessageKeys.java b/operator/src/main/java/oracle/kubernetes/operator/logging/MessageKeys.java
    index bc5bb661eac..2a3342900fc 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/logging/MessageKeys.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/logging/MessageKeys.java
    @@ -14,7 +14,6 @@ public class MessageKeys {
       public static final String OPERATOR_SHUTTING_DOWN = "WLSKO-0005";
       public static final String EXCEPTION = "WLSKO-0006";
       public static final String CREATING_CRD = "WLSKO-0012";
    -  public static final String DOMAIN_STATUS_IGNORED = "WLSKO-0013";
       public static final String LISTING_DOMAINS = "WLSKO-0014";
       public static final String SECRET_NOT_FOUND = "WLSKO-0018";
       public static final String RETRIEVING_SECRET = "WLSKO-0019";
    @@ -128,6 +127,12 @@ public class MessageKeys {
       public static final String JOB_CREATION_TIMESTAMP_MESSAGE = "WLSKO-0169";
       public static final String HTTP_REQUEST_TIMED_OUT = "WLSKO-0170";
       public static final String NAMESPACE_IS_MISSING = "WLSKO-0171";
    +  public static final String CM_PATCHED = "WLSKO-0172";
    +  public static final String REPLACE_CRD_FAILED = "WLSKO-0173";
    +  public static final String CREATE_CRD_FAILED = "WLSKO-0174";
    +  public static final String INTROSPECTOR_JOB_FAILED = "WLSKO-0175";
    +  public static final String INTROSPECTOR_JOB_FAILED_DETAIL = "WLSKO-0176";
    +  public static final String INTROSPECTOR_POD_FAILED = "WLSKO-0177";
     
       // domain status messages
       public static final String DUPLICATE_SERVER_NAME_FOUND = "WLSDO-0001";
    @@ -136,6 +141,10 @@ public class MessageKeys {
       public static final String BAD_VOLUME_MOUNT_PATH = "WLSDO-0004";
       public static final String RESERVED_ENVIRONMENT_VARIABLES = "WLSDO-0005";
       public static final String ILLEGAL_SECRET_NAMESPACE = "WLSDO-0006";
    +  public static final String ILLEGAL_SIT_CONFIG_MII = "WLSDO-0007";
    +  public static final String MODEL_CONFIGMAP_NOT_FOUND = "WLSDO-0008";
    +  public static final String SECRET_NOT_SPECIFIED = "WLSDO-0009";
    +  public static final String OPSS_SECRET_NOT_SPECIFIED = "WLSDO-0010";
       public static final String NO_CLUSTER_IN_DOMAIN = "WLSDO-0011";
       public static final String NO_MANAGED_SERVER_IN_DOMAIN = "WLSDO-0012";
       public static final String CANNOT_EXPOSE_DEFAULT_CHANNEL_ISTIO = "WLSDO-0013";
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/rest/RestBackendImpl.java b/operator/src/main/java/oracle/kubernetes/operator/rest/RestBackendImpl.java
    index dec5f334cda..d2cd17bac5b 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/rest/RestBackendImpl.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/rest/RestBackendImpl.java
    @@ -7,9 +7,12 @@
     import java.util.Collection;
     import java.util.List;
     import java.util.Map;
    +import java.util.Optional;
     import java.util.Set;
     import java.util.TreeSet;
    +import java.util.function.Consumer;
     import java.util.stream.Collectors;
    +import javax.annotation.Nonnull;
     import javax.json.Json;
     import javax.json.JsonPatchBuilder;
     import javax.ws.rs.WebApplicationException;
    @@ -19,6 +22,7 @@
     
     import io.kubernetes.client.custom.V1Patch;
     import io.kubernetes.client.openapi.ApiException;
    +import io.kubernetes.client.openapi.models.V1ObjectMeta;
     import io.kubernetes.client.openapi.models.V1TokenReviewStatus;
     import io.kubernetes.client.openapi.models.V1UserInfo;
     import oracle.kubernetes.operator.helpers.AuthenticationProxy;
    @@ -31,11 +35,15 @@
     import oracle.kubernetes.operator.logging.LoggingFactory;
     import oracle.kubernetes.operator.logging.MessageKeys;
     import oracle.kubernetes.operator.rest.backend.RestBackend;
    +import oracle.kubernetes.operator.rest.model.DomainAction;
    +import oracle.kubernetes.operator.rest.model.DomainActionType;
     import oracle.kubernetes.operator.wlsconfig.WlsClusterConfig;
     import oracle.kubernetes.operator.wlsconfig.WlsDomainConfig;
     import oracle.kubernetes.weblogic.domain.model.Domain;
     import oracle.kubernetes.weblogic.domain.model.DomainList;
     
    +import static oracle.kubernetes.operator.logging.MessageKeys.INVALID_DOMAIN_UID;
    +
     /**
      * RestBackendImpl implements the backend of the WebLogic operator REST api by making calls to
      * Kubernetes and WebLogic. A separate instance is created for each REST request since we need to
    @@ -44,8 +52,13 @@
     public class RestBackendImpl implements RestBackend {
     
       private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
    -  private static final String NEW_CLUSTER =
    +  private static final String NEW_CLUSTER_REPLICAS =
           "{'clusterName':'%s','replicas':%d}".replaceAll("'", "\"");
    +  private static final String NEW_CLUSTER_RESTART =
    +      "{'clusterName':'%s','restartVersion':'1'}".replaceAll("'", "\"");
    +  public static final String INITIAL_VERSION = "1";
    +
    +  @SuppressWarnings("FieldMayBeFinal") // used by unit test
       private static TopologyRetriever INSTANCE =
           (String ns, String domainUid) -> {
             Scan s = ScanCache.INSTANCE.lookupScan(ns, domainUid);
    @@ -54,6 +67,7 @@ public class RestBackendImpl implements RestBackend {
             }
             return null;
           };
    +
       private final AuthenticationProxy atn = new AuthenticationProxy();
       private final AuthorizationProxy atz = new AuthorizationProxy();
       private final String principal;
    @@ -113,20 +127,9 @@ private void authorize(String domainUid, Operation operation) {
       }
     
       private String getNamespace(String domainUid) {
    -    if (domainUid == null) {
    -      throw new AssertionError(LOGGER.formatMessage(MessageKeys.NULL_DOMAIN_UID));
    -    }
    -
    -    return getNamespace(domainUid, getDomainsList());
    +    return getDomain(domainUid).map(Domain::getMetadata).map(V1ObjectMeta::getNamespace).orElse(null);
       }
     
    -  private String getNamespace(String domainUid, List domains) {
    -    if (domainUid == null) {
    -      throw new AssertionError(LOGGER.formatMessage(MessageKeys.NULL_DOMAIN_UID));
    -    }
    -    Domain domain = findDomain(domainUid, domains);
    -    return domain.getMetadata().getNamespace();
    -  }
     
       private V1UserInfo authenticate(String accessToken) {
         LOGGER.entering();
    @@ -140,7 +143,7 @@ private V1UserInfo authenticate(String accessToken) {
           LOGGER.throwing(e);
           throw e;
         }
    -    if (!status.getAuthenticated()) {
    +    if (isNotAuthenticated(status)) {
           // don't know why the user didn't get authenticated
           WebApplicationException e = createWebApplicationException(Status.UNAUTHORIZED, null);
           LOGGER.throwing(e);
    @@ -154,6 +157,10 @@ private V1UserInfo authenticate(String accessToken) {
         return userInfo;
       }
     
    +  private boolean isNotAuthenticated(@Nonnull V1TokenReviewStatus status) {
    +    return !Boolean.TRUE.equals(status.getAuthenticated());
    +  }
    +
       @Override
       public Set getDomainUids() {
         LOGGER.entering();
    @@ -185,19 +192,86 @@ private List getDomainsList() {
     
       @Override
       public boolean isDomainUid(String domainUid) {
    -    LOGGER.entering(domainUid);
    +    return getDomain(domainUid).isPresent();
    +  }
    +
    +  @Override
    +  public void performDomainAction(String domainUid, DomainAction params) {
    +    verifyDomain(domainUid);
    +    authorize(domainUid, Operation.update);
    +
    +    switch (Optional.ofNullable(params.getAction()).orElse(DomainActionType.UNKNOWN)) {
    +      case INTROSPECT:
    +        introspect(domainUid);
    +        break;
    +      case RESTART:
    +        restartDomain(domainUid);
    +        break;
    +      default:
    +        throw new WebApplicationException(Status.BAD_REQUEST);
    +    }
    +  }
    +
    +  private void verifyDomain(String domainUid) {
    +    if (!isDomainUid(domainUid)) {
    +      throw new WebApplicationException(LOGGER.formatMessage(INVALID_DOMAIN_UID, domainUid), Status.BAD_REQUEST);
    +    }
    +  }
    +
    +  private void introspect(String domainUid) {
    +    forDomainDo(domainUid, this::markForIntrospection);
    +  }
    +
    +  private void markForIntrospection(Domain domain) {
    +    updateVersionField(domain, domain.getIntrospectVersion(), "/spec/introspectVersion");
    +  }
    +
    +  private String nextVersion(String version) {
    +    try {
    +      return Integer.toString(Integer.parseInt(version) + 1);
    +    } catch (NumberFormatException e) {
    +      return INITIAL_VERSION;
    +    }
    +  }
    +
    +  private void restartDomain(String domainUid) {
    +    forDomainDo(domainUid, this::markDomainForRestart);
    +  }
    +
    +  private void markDomainForRestart(Domain domain) {
    +    updateVersionField(domain, domain.getRestartVersion(), "/spec/restartVersion");
    +  }
    +
    +  private void updateVersionField(Domain domain, String version, String fieldPath) {
    +    JsonPatchBuilder patchBuilder = Json.createPatchBuilder();
    +    Optional.ofNullable(version).ifPresentOrElse(
    +        v -> patchBuilder.replace(fieldPath, nextVersion(v)),
    +        () -> patchBuilder.add(fieldPath, INITIAL_VERSION));
    +
    +    patchDomain(domain, patchBuilder);
    +  }
    +
    +  private void forDomainDo(String domainUid, Consumer consumer) {
    +    if (domainUid == null) {
    +      throw new AssertionError(LOGGER.formatMessage(MessageKeys.NULL_DOMAIN_UID));
    +    }
    +
    +    getDomain(domainUid).ifPresentOrElse(consumer, () -> reportNotFound(domainUid));
    +  }
    +
    +  private void reportNotFound(String domainUid) {
    +    throw createWebApplicationException(Status.NOT_FOUND, MessageKeys.MATCHING_DOMAIN_NOT_FOUND, domainUid);
    +  }
    +
    +  private Optional getDomain(String domainUid) {
         authorize(null, Operation.list);
    -    boolean result = getDomainUids().contains(domainUid);
    -    LOGGER.exiting(result);
    -    return result;
    +    return getDomainsList().stream().filter(domain -> domainUid.equals(domain.getDomainUid())).findFirst();
       }
     
       @Override
       public Set getClusters(String domainUid) {
         LOGGER.entering(domainUid);
    -    if (!isDomainUid(domainUid)) {
    -      throw new AssertionError(LOGGER.formatMessage(MessageKeys.INVALID_DOMAIN_UID, domainUid));
    -    }
    +    verifyDomain(domainUid);
         authorize(domainUid, Operation.get);
     
         // Get list of WLS Configured Clusters defined for the corresponding WLS Domain identified by
    @@ -227,30 +301,33 @@ public void scaleCluster(String domainUid, String cluster, int managedServerCoun
         }
     
         authorize(domainUid, Operation.update);
    +    forDomainDo(domainUid, d -> performScaling(d, cluster, managedServerCount));
    +    LOGGER.exiting();
    +  }
     
    -    List domains = getDomainsList();
    -    Domain domain = findDomain(domainUid, domains);
    -
    +  private void performScaling(Domain domain, String cluster, int managedServerCount) {
         verifyWlsConfiguredClusterCapacity(domain, cluster, managedServerCount);
    -
    -    patchDomain(domain, cluster, managedServerCount);
    -    LOGGER.exiting();
    +    patchClusterReplicas(domain, cluster, managedServerCount);
       }
     
    -  private void patchDomain(Domain domain, String cluster, int replicas) {
    +  private void patchClusterReplicas(Domain domain, String cluster, int replicas) {
         if (replicas == domain.getReplicaCount(cluster)) {
           return;
         }
     
    -    try {
    -      JsonPatchBuilder patchBuilder = Json.createPatchBuilder();
    -      int index = getClusterIndex(domain, cluster);
    -      if (index < 0) {
    -        patchBuilder.add("/spec/clusters/0", String.format(NEW_CLUSTER, cluster, replicas));
    -      } else {
    -        patchBuilder.replace("/spec/clusters/" + index + "/replicas", replicas);
    -      }
    +    JsonPatchBuilder patchBuilder = Json.createPatchBuilder();
    +    int index = getClusterIndex(domain, cluster);
    +    if (index < 0) {
    +      patchBuilder.add("/spec/clusters/0", String.format(NEW_CLUSTER_REPLICAS, cluster, replicas));
    +    } else {
    +      patchBuilder.replace("/spec/clusters/" + index + "/replicas", replicas);
    +    }
     
    +    patchDomain(domain, patchBuilder);
    +  }
    +
    +  private void patchDomain(Domain domain, JsonPatchBuilder patchBuilder) {
    +    try {
           new CallBuilder()
               .patchDomain(
                   domain.getDomainUid(), domain.getMetadata().getNamespace(),
    @@ -314,17 +391,6 @@ WlsDomainConfig getWlsDomainConfig(String domainUid) {
         return new WlsDomainConfig(null);
       }
     
    -  private Domain findDomain(String domainUid, List domains) {
    -    for (Domain domain : domains) {
    -      if (domainUid.equals(domain.getDomainUid())) {
    -        return domain;
    -      }
    -    }
    -
    -    throw createWebApplicationException(
    -        Status.NOT_FOUND, MessageKeys.MATCHING_DOMAIN_NOT_FOUND, domainUid);
    -  }
    -
       private WebApplicationException handleApiException(ApiException e) {
         // TBD - what about e.getResponseHeaders?
         return createWebApplicationException(e.getCode(), e.getResponseBody());
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/rest/backend/RestBackend.java b/operator/src/main/java/oracle/kubernetes/operator/rest/backend/RestBackend.java
    index 8efb8f8816f..5b0d8a282a9 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/rest/backend/RestBackend.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/rest/backend/RestBackend.java
    @@ -5,6 +5,8 @@
     
     import java.util.Set;
     
    +import oracle.kubernetes.operator.rest.model.DomainAction;
    +
     /**
      * The RestBackend interface is to implement all of the WebLogic Operator REST resources that need
      * to talk to Kubernetes and WebLogic to get their work done. It separates the jaxrs part of the
    @@ -28,6 +30,13 @@ public interface RestBackend {
        */
       public boolean isDomainUid(String domainUid);
     
    +  /**
    +   * Applies the specified command to the specified domain.
    +   * @param domainUid the unique ID of a domain
    +   * @param params an update command with optional parameters
    +   */
    +  void performDomainAction(String domainUid, DomainAction params);
    +
       /**
        * Get the names of the clusters in a WebLogic domain.
        *
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/rest/model/DomainAction.java b/operator/src/main/java/oracle/kubernetes/operator/rest/model/DomainAction.java
    new file mode 100644
    index 00000000000..99255bd29d3
    --- /dev/null
    +++ b/operator/src/main/java/oracle/kubernetes/operator/rest/model/DomainAction.java
    @@ -0,0 +1,23 @@
    +// Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +package oracle.kubernetes.operator.rest.model;
    +
    +import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
    +
    +/**
    + * Describes an action to the domain that the operation should take.
    + */
    +@JsonIgnoreProperties(ignoreUnknown = true)
    +public class DomainAction {
    +
    +  private final DomainActionType action;
    +
    +  public DomainAction(DomainActionType action) {
    +    this.action = action;
    +  }
    +
    +  public DomainActionType getAction() {
    +    return action;
    +  }
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/rest/model/DomainActionType.java b/operator/src/main/java/oracle/kubernetes/operator/rest/model/DomainActionType.java
    new file mode 100644
    index 00000000000..8f966053b9e
    --- /dev/null
    +++ b/operator/src/main/java/oracle/kubernetes/operator/rest/model/DomainActionType.java
    @@ -0,0 +1,8 @@
    +// Copyright (c) 2020, Oracle Corporation and/or its affiliates.
    +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    +
    +package oracle.kubernetes.operator.rest.model;
    +
    +public enum DomainActionType {
    +  UNKNOWN, INTROSPECT, RESTART
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/rest/resource/DomainResource.java b/operator/src/main/java/oracle/kubernetes/operator/rest/resource/DomainResource.java
    index 5dc3faccc2e..fa4ae2e7629 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/rest/resource/DomainResource.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/rest/resource/DomainResource.java
    @@ -3,13 +3,16 @@
     
     package oracle.kubernetes.operator.rest.resource;
     
    +import javax.ws.rs.Consumes;
     import javax.ws.rs.GET;
    +import javax.ws.rs.POST;
     import javax.ws.rs.Path;
     import javax.ws.rs.Produces;
     import javax.ws.rs.core.MediaType;
     
     import oracle.kubernetes.operator.logging.LoggingFacade;
     import oracle.kubernetes.operator.logging.LoggingFactory;
    +import oracle.kubernetes.operator.rest.model.DomainAction;
     import oracle.kubernetes.operator.rest.model.DomainModel;
     
     /**
    @@ -47,6 +50,17 @@ public DomainModel get() {
         return item;
       }
     
    +  /**
    +   * Apply changes to this domain. The changes depend on the details of the specified instructions
    +   *
    +   * @param params - an update command, including a command type and optional parameters
    +   */
    +  @POST
    +  @Consumes(MediaType.APPLICATION_JSON)
    +  public void post(final DomainAction params) {
    +    getBackend().performDomainAction(getDomainUid(), params);
    +  }
    +
       /**
        * Construct and return the 'clusters' jaxrs child resource.
        *
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/steps/DeleteDomainStep.java b/operator/src/main/java/oracle/kubernetes/operator/steps/DeleteDomainStep.java
    index 6c5aa892fda..990a674aab1 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/steps/DeleteDomainStep.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/steps/DeleteDomainStep.java
    @@ -42,7 +42,7 @@ public NextAction apply(Packet packet) {
             Step.chain(
                 deletePods(),
                 deleteServices(),
    -            ConfigMapHelper.deleteDomainIntrospectorConfigMapStep(domainUid, namespace, getNext()));
    +            ConfigMapHelper.deleteIntrospectorConfigMapStep(domainUid, namespace, getNext()));
         if (info != null) {
           serverDownStep =
               new ServerDownIteratorStep(
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/steps/DomainPresenceStep.java b/operator/src/main/java/oracle/kubernetes/operator/steps/DomainPresenceStep.java
    index 31715aa237e..57d613db23c 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/steps/DomainPresenceStep.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/steps/DomainPresenceStep.java
    @@ -10,13 +10,13 @@
     
     public class DomainPresenceStep extends Step {
     
    -  private DomainPresenceStep(Step adminStep) {
    -    super(adminStep);
    +  private DomainPresenceStep(Step domainUpSteps) {
    +    super(domainUpSteps);
       }
     
       public static DomainPresenceStep createDomainPresenceStep(
    -      Domain dom, Step adminStep, Step managedServerStep) {
    -    return new DomainPresenceStep(dom.isShuttingDown() ? managedServerStep : adminStep);
    +      Domain dom, Step domainUpSteps, Step managedServerStep) {
    +    return new DomainPresenceStep(dom.isShuttingDown() ? managedServerStep : domainUpSteps);
       }
     
       @Override
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/steps/ManagedServerUpAfterStep.java b/operator/src/main/java/oracle/kubernetes/operator/steps/ManagedServerUpAfterStep.java
    index 04927cc592d..11e95cacc23 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/steps/ManagedServerUpAfterStep.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/steps/ManagedServerUpAfterStep.java
    @@ -3,10 +3,13 @@
     
     package oracle.kubernetes.operator.steps;
     
    -import java.util.Collection;
     import java.util.Collections;
     import java.util.Map;
    +import java.util.Optional;
    +import java.util.Set;
    +import javax.validation.constraints.NotNull;
     
    +import oracle.kubernetes.operator.MakeRightDomainOperation;
     import oracle.kubernetes.operator.ProcessingConstants;
     import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
     import oracle.kubernetes.operator.helpers.RollingHelper;
    @@ -15,7 +18,6 @@
     import oracle.kubernetes.operator.work.NextAction;
     import oracle.kubernetes.operator.work.Packet;
     import oracle.kubernetes.operator.work.Step;
    -import oracle.kubernetes.weblogic.domain.model.Domain;
     
     public class ManagedServerUpAfterStep extends Step {
       private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
    @@ -26,30 +28,35 @@ public ManagedServerUpAfterStep(Step next) {
     
       @Override
       public NextAction apply(Packet packet) {
    -    @SuppressWarnings("unchecked")
    -    Map rolling =
    -        (Map) packet.get(ProcessingConstants.SERVERS_TO_ROLL);
    +    if (getServersToRoll(packet).isEmpty()) {
    +      return doNext(packet);
    +    } else if (MakeRightDomainOperation.isInspectionRequired(packet)) {
    +      return doNext(MakeRightDomainOperation.createStepsToRerunWithIntrospection(packet), packet);
    +    } else {
    +      logServersToRoll(packet);
    +      return doNext(RollingHelper.rollServers(getServersToRoll(packet), getNext()), packet);
    +    }
    +  }
    +
    +  @SuppressWarnings("unchecked")
    +  @NotNull Map getServersToRoll(Packet packet) {
    +    return Optional.ofNullable((Map) packet.get(ProcessingConstants.SERVERS_TO_ROLL))
    +          .orElseGet(Collections::emptyMap);
    +  }
     
    +  void logServersToRoll(Packet packet) {
         if (LOGGER.isFineEnabled()) {
    -      DomainPresenceInfo info = packet.getSpi(DomainPresenceInfo.class);
    -
    -      Domain dom = info.getDomain();
    -
    -      Collection rollingList = Collections.emptyList();
    -      if (rolling != null) {
    -        rollingList = rolling.keySet();
    -      }
    -      LOGGER.fine(
    -          "Rolling servers for domain with UID: "
    -              + dom.getDomainUid()
    -              + ", rolling list: "
    -              + rollingList);
    +      LOGGER.fine("Rolling servers for domain with UID: {0}: {1}",
    +            getDomainUid(packet),
    +            getRollingServerNames(packet));
         }
    +  }
     
    -    if (rolling == null || rolling.isEmpty()) {
    -      return doNext(packet);
    -    }
    +  private String getDomainUid(Packet packet) {
    +    return packet.getSpi(DomainPresenceInfo.class).getDomainUid();
    +  }
     
    -    return doNext(RollingHelper.rollServers(rolling, getNext()), packet);
    +  private Set getRollingServerNames(Packet packet) {
    +    return getServersToRoll(packet).keySet();
       }
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/steps/ManagedServerUpIteratorStep.java b/operator/src/main/java/oracle/kubernetes/operator/steps/ManagedServerUpIteratorStep.java
    index 7a6b0c39305..cabacd161f7 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/steps/ManagedServerUpIteratorStep.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/steps/ManagedServerUpIteratorStep.java
    @@ -4,10 +4,16 @@
     package oracle.kubernetes.operator.steps;
     
     import java.util.ArrayList;
    +import java.util.Arrays;
     import java.util.Collection;
    +import java.util.HashMap;
     import java.util.List;
     import java.util.Map;
    +import java.util.Queue;
     import java.util.concurrent.ConcurrentHashMap;
    +import java.util.concurrent.ConcurrentLinkedQueue;
    +import java.util.stream.Collectors;
    +import java.util.stream.IntStream;
     
     import oracle.kubernetes.operator.DomainStatusUpdater;
     import oracle.kubernetes.operator.ProcessingConstants;
    @@ -22,14 +28,27 @@
     import oracle.kubernetes.operator.work.Step;
     import oracle.kubernetes.weblogic.domain.model.Domain;
     
    +/**
    + * A step which will bring up the specified managed servers in parallel.
    + * Adds to packet:
    + *    SERVERS_TO_ROLL    a collection of servers to be rolled, updated in parallel by the server-up steps.
    + * and for each server:
    + *    SERVER_NAME        the name of the server to bring up
    + *    CLUSTER_NAME       the name of the cluster of which it is a member, if any
    + *    ENVVARS            the associated environment variables
    + *    SERVER_SCAN        the configuration for the server
    + */
     public class ManagedServerUpIteratorStep extends Step {
       private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
     
    -  private final Collection cols;
    +  private final Collection startupInfos;
     
    -  public ManagedServerUpIteratorStep(Collection cols, Step next) {
    +  private static NextStepFactory NEXT_STEP_FACTORY =
    +      (next) -> DomainStatusUpdater.createStatusUpdateStep(next);
    +
    +  public ManagedServerUpIteratorStep(Collection startupInfos, Step next) {
         super(next);
    -    this.cols = cols;
    +    this.startupInfos = startupInfos;
       }
     
       // pre-conditions: DomainPresenceInfo SPI
    @@ -37,64 +56,90 @@ public ManagedServerUpIteratorStep(Collection cols, Step next
       // "serverScan"
       // "clusterScan"
       // "envVars"
    -  private static Step bringManagedServerUp(ServerStartupInfo ssi, Step next) {
    +  private static Step bringManagedServerUp(ServerStartupInfo ssi) {
         return ssi.isServiceOnly()
             ? ServiceHelper.createForServerStep(
    -            true, new ServerDownStep(ssi.getServerName(), true, next))
    -        : ServiceHelper.createForServerStep(PodHelper.createManagedPodStep(next));
    +            true, new ServerDownStep(ssi.getServerName(), true, null))
    +        : ServiceHelper.createForServerStep(PodHelper.createManagedPodStep(null));
       }
     
       @Override
       protected String getDetail() {
         List serversToStart = new ArrayList<>();
    -    for (ServerStartupInfo ssi : cols) {
    -      serversToStart.add(ssi.serverConfig.getName());
    +    for (ServerStartupInfo ssi : startupInfos) {
    +      serversToStart.add(ssi.getName());
         }
         return String.join(",", serversToStart);
       }
     
       @Override
       public NextAction apply(Packet packet) {
    -    Collection startDetails = new ArrayList<>();
    -    Map rolling = new ConcurrentHashMap<>();
    -    packet.put(ProcessingConstants.SERVERS_TO_ROLL, rolling);
    -
    -    for (ServerStartupInfo ssi : cols) {
    -      Packet p = packet.clone();
    -      p.put(ProcessingConstants.SERVER_SCAN, ssi.serverConfig);
    -      p.put(ProcessingConstants.CLUSTER_NAME, ssi.getClusterName());
    -      p.put(ProcessingConstants.ENVVARS, ssi.getEnvironment());
    -
    -      p.put(ProcessingConstants.SERVER_NAME, ssi.serverConfig.getName());
    -
    -      startDetails.add(new StepAndPacket(bringManagedServerUp(ssi, null), p));
    +    if (startupInfos.isEmpty()) {
    +      return doNext(packet);
         }
     
         if (LOGGER.isFineEnabled()) {
    -      DomainPresenceInfo info = packet.getSpi(DomainPresenceInfo.class);
    +      LOGGER.fine(String.format("Starting or validating servers for domain with UID: %s, server list: %s",
    +          getDomainUid(packet), getServerNames(startupInfos)));
    +    }
     
    -      Domain dom = info.getDomain();
    +    packet.put(ProcessingConstants.SERVERS_TO_ROLL, new ConcurrentHashMap());
    +    Collection startDetails =
    +        startupInfos.stream()
    +            .filter(ssi -> !isServerInCluster(ssi))
    +            .map(ssi -> createManagedServerUpDetails(packet, ssi)).collect(Collectors.toList());
     
    -      Collection serverList = new ArrayList<>();
    -      for (ServerStartupInfo ssi : cols) {
    -        serverList.add(ssi.serverConfig.getName());
    -      }
    -      LOGGER.fine(
    -          "Starting or validating servers for domain with UID: "
    -              + dom.getDomainUid()
    -              + ", server list: "
    -              + serverList);
    -    }
    +    getStartClusteredServersStepFactories(startupInfos, packet).values()
    +        .forEach(factory -> startDetails.addAll(factory.getServerStartsStepAndPackets()));
     
    -    if (startDetails.isEmpty()) {
    -      return doNext(packet);
    -    }
         return doNext(
    -        DomainStatusUpdater.createStatusUpdateStep(
    -            new StartManagedServersStep(startDetails, getNext())),
    +        NEXT_STEP_FACTORY.createStatusUpdateStep(new StartManagedServersStep(startDetails, getNext())),
             packet);
       }
     
    +
    +  private String getDomainUid(Packet packet) {
    +    return packet.getSpi(DomainPresenceInfo.class).getDomain().getDomainUid();
    +  }
    +
    +  private List getServerNames(Collection startupInfos) {
    +    return startupInfos.stream().map(ServerStartupInfo::getName).collect(Collectors.toList());
    +  }
    +
    +  private StepAndPacket createManagedServerUpDetails(Packet packet, ServerStartupInfo ssi) {
    +    return new StepAndPacket(bringManagedServerUp(ssi), createPacketForServer(packet, ssi));
    +  }
    +
    +  private Packet createPacketForServer(Packet packet, ServerStartupInfo ssi) {
    +    Packet p = packet.clone();
    +    p.put(ProcessingConstants.CLUSTER_NAME, ssi.getClusterName());
    +    p.put(ProcessingConstants.SERVER_NAME, ssi.getName());
    +    p.put(ProcessingConstants.SERVER_SCAN, ssi.serverConfig);
    +    p.put(ProcessingConstants.ENVVARS, ssi.getEnvironment());
    +    return p;
    +  }
    +
    +  private Map getStartClusteredServersStepFactories(
    +      Collection startupInfos,
    +      Packet packet) {
    +    DomainPresenceInfo info = packet.getSpi(DomainPresenceInfo.class);
    +    Domain domain = info.getDomain();
    +
    +    Map factories = new HashMap<>();
    +    startupInfos.stream()
    +        .filter(this::isServerInCluster)
    +        .forEach(ssi ->
    +            factories.computeIfAbsent(ssi.getClusterName(),
    +                k -> new StartClusteredServersStepFactory(getMaxConcurrentStartup(domain, ssi)))
    +                .add(createManagedServerUpDetails(packet, ssi)));
    +
    +    return factories;
    +  }
    +
    +  private boolean isServerInCluster(ServerStartupInfo ssi) {
    +    return ssi.getClusterName() != null;
    +  }
    +
       static class StartManagedServersStep extends Step {
         final Collection startDetails;
     
    @@ -103,10 +148,81 @@ static class StartManagedServersStep extends Step {
           this.startDetails = startDetails;
         }
     
    +    Collection getStartDetails() {
    +      return startDetails;
    +    }
    +
         @Override
         public NextAction apply(Packet packet) {
           return doForkJoin(new ManagedServerUpAfterStep(getNext()), packet, startDetails);
         }
       }
     
    +  private int getMaxConcurrentStartup(Domain domain, ServerStartupInfo ssi) {
    +    return domain.getMaxConcurrentStartup(ssi.getClusterName());
    +  }
    +
    +  private static class StartClusteredServersStepFactory {
    +
    +    private final Queue serversToStart = new ConcurrentLinkedQueue<>();
    +    private final int maxConcurrency;
    +
    +    StartClusteredServersStepFactory(int maxConcurrency) {
    +      this.maxConcurrency = maxConcurrency;
    +    }
    +
    +    void add(StepAndPacket serverToStart) {
    +      serversToStart.add(serverToStart);
    +    }
    +
    +    Collection getServerStartsStepAndPackets() {
    +      if (maxConcurrency == 0 || serversToStart.size() <= maxConcurrency) {
    +        return serversToStart;
    +      }
    +      ArrayList steps = new ArrayList<>(maxConcurrency);
    +      IntStream.range(0, maxConcurrency)
    +          .forEach(i -> steps.add(StartClusteredServersStep.createStepAndPacket(serversToStart)));
    +      return steps;
    +    }
    +
    +  }
    +
    +  static class StartClusteredServersStep extends Step {
    +
    +    private final Queue serversToStart;
    +
    +    static StepAndPacket createStepAndPacket(Queue serversToStart) {
    +      return new StepAndPacket(new StartClusteredServersStep(serversToStart), null);
    +    }
    +
    +    StartClusteredServersStep(Queue serversToStart) {
    +      super(null);
    +      this.serversToStart = serversToStart;
    +      serversToStart.forEach(stepAndPacket -> setupSequentialStartPacket(stepAndPacket.packet));
    +    }
    +
    +    Collection getServersToStart() {
    +      return serversToStart;
    +    }
    +
    +    private void setupSequentialStartPacket(Packet packet) {
    +      packet.put(ProcessingConstants.WAIT_FOR_POD_READY, true);
    +    }
    +
    +    @Override
    +    public NextAction apply(Packet packet) {
    +      Collection servers = Arrays.asList(serversToStart.poll());
    +      if (servers.isEmpty()) {
    +        return doNext(packet);
    +      } else {
    +        return doForkJoin(this, packet, servers);
    +      }
    +    }
    +  }
    +
    +  // an interface to provide a hook for unit testing.
    +  interface NextStepFactory {
    +    Step createStatusUpdateStep(Step next);
    +  }
    +
     }
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/steps/ManagedServersUpStep.java b/operator/src/main/java/oracle/kubernetes/operator/steps/ManagedServersUpStep.java
    index 371b1257bb2..ad0923548b0 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/steps/ManagedServersUpStep.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/steps/ManagedServersUpStep.java
    @@ -123,7 +123,7 @@ private void addServersToFactory(@Nonnull ServersUpStepFactory factory, @Nonnull
       }
     
       private void addClusteredServersToFactory(@Nonnull ServersUpStepFactory factory, Set clusteredServers,
    -                                            @Nonnull WlsClusterConfig wlsClusterConfig) {
    +      @Nonnull WlsClusterConfig wlsClusterConfig) {
         factory.logIfInvalidReplicaCount(wlsClusterConfig);
         // We depend on 'getServerConfigs()' returning an ascending 'numero-lexi'
         // sorted list so that a cluster's "lowest named" servers have precedence
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/steps/ReadHealthStep.java b/operator/src/main/java/oracle/kubernetes/operator/steps/ReadHealthStep.java
    index 35e8069599b..3ac54d04037 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/steps/ReadHealthStep.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/steps/ReadHealthStep.java
    @@ -218,10 +218,10 @@ private V1ServicePort getServicePort(V1ServiceSpec spec) {
     
         private Optional getAdminProtocolPort(V1ServiceSpec spec) {
           return Optional.ofNullable(spec.getPorts())
    -          .stream()
    -          .flatMap(Collection::stream)
    -          .filter(this::isAdminProtocolPort)
    -          .findFirst();
    +            .stream()
    +            .flatMap(Collection::stream)
    +            .filter(this::isAdminProtocolPort)
    +            .findFirst();
         }
     
         private boolean isAdminProtocolPort(V1ServicePort port) {
    @@ -245,8 +245,7 @@ private String getPortalIP(V1ServiceSpec spec) {
               portalIP =
                   getService().getMetadata().getName()
                       + "."
    -                  + getService().getMetadata().getNamespace()
    -                  + ".pod.cluster.local";
    +                  + getService().getMetadata().getNamespace();
             }
           }
           return portalIP;
    @@ -331,7 +330,7 @@ public NextAction apply(Packet packet) {
     
         private HttpAsyncRequestStep createRequestStep(HttpRequest request, RecordHealthStep responseStep) {
           return HttpAsyncRequestStep.create(request, responseStep)
    -          .withTimeoutSeconds(HTTP_TIMEOUT_SECONDS);
    +            .withTimeoutSeconds(HTTP_TIMEOUT_SECONDS);
         }
     
       }
    @@ -400,8 +399,8 @@ void recordFailedStateAndHealth() {
     
           private String getFailedHealth() {
             return isServerOverloaded()
    -            ? OVERALL_HEALTH_FOR_SERVER_OVERLOADED
    -            : OVERALL_HEALTH_NOT_AVAILABLE;
    +              ? OVERALL_HEALTH_FOR_SERVER_OVERLOADED
    +              : OVERALL_HEALTH_NOT_AVAILABLE;
           }
     
           void recordStateAndHealth() throws IOException {
    @@ -518,8 +517,8 @@ private static void decrementIntegerInPacketAtomically(Packet packet, String key
     
       private static void logReadFailure(Packet packet) {
         LOGGER.info(
    -        (LoggingFilter) packet.get(LoggingFilter.LOGGING_FILTER_PACKET_KEY),
    -        MessageKeys.WLS_HEALTH_READ_FAILED,
    -        packet.get(ProcessingConstants.SERVER_NAME));
    +          (LoggingFilter) packet.get(LoggingFilter.LOGGING_FILTER_PACKET_KEY),
    +          MessageKeys.WLS_HEALTH_READ_FAILED,
    +          packet.get(ProcessingConstants.SERVER_NAME));
       }
    -}
    \ No newline at end of file
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/WlsClusterConfig.java b/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/WlsClusterConfig.java
    index 40e53ecc9aa..add382641df 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/WlsClusterConfig.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/WlsClusterConfig.java
    @@ -411,4 +411,4 @@ public boolean equals(Object other) {
         return builder.isEquals();
       }
     
    -}
    \ No newline at end of file
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/WlsServerConfig.java b/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/WlsServerConfig.java
    index 873515d4885..0a51155bccf 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/WlsServerConfig.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/WlsServerConfig.java
    @@ -7,6 +7,7 @@
     import java.util.List;
     import java.util.Map;
     
    +import com.fasterxml.jackson.annotation.JsonIgnore;
     import oracle.kubernetes.operator.helpers.LegalNames;
     import org.apache.commons.lang3.builder.EqualsBuilder;
     import org.apache.commons.lang3.builder.HashCodeBuilder;
    @@ -334,6 +335,7 @@ public boolean isAdminPortEnabled() {
        * Get the name of the Admin protocol channel as a safe/legal kubernetes service name.
        * @return the name of the admin channel
        */
    +  @JsonIgnore
       public String getAdminProtocolChannelName() {
         String adminProtocolChannel = null;
         if (networkAccessPoints != null) {
    @@ -361,6 +363,7 @@ public String getAdminProtocolChannelName() {
        * Get the port number of the local admin protocol channel.
        * @return the port number
        */
    +  @JsonIgnore
       public Integer getLocalAdminProtocolChannelPort() {
         Integer adminProtocolPort = null;
         if (networkAccessPoints != null) {
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/work/AsyncFiber.java b/operator/src/main/java/oracle/kubernetes/operator/work/AsyncFiber.java
    index b702e7fd4c6..e7f6bd7311e 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/work/AsyncFiber.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/work/AsyncFiber.java
    @@ -40,4 +40,4 @@ public interface AsyncFiber {
        * @return a new child fiber
        */
       Fiber createChildFiber();
    -}
    \ No newline at end of file
    +}
    diff --git a/operator/src/main/java/oracle/kubernetes/operator/work/Fiber.java b/operator/src/main/java/oracle/kubernetes/operator/work/Fiber.java
    index 19c97f7410b..6ac326e7eb0 100644
    --- a/operator/src/main/java/oracle/kubernetes/operator/work/Fiber.java
    +++ b/operator/src/main/java/oracle/kubernetes/operator/work/Fiber.java
    @@ -268,6 +268,7 @@ public Fiber createChildFiber() {
             // Race condition where child is created after parent is cancelled or done
             child.status.set(CANCELLED);
           }
    +
           return child;
         }
       }
    diff --git a/operator/src/main/java/oracle/kubernetes/utils/OperatorUtils.java b/operator/src/main/java/oracle/kubernetes/utils/OperatorUtils.java
    index 25eee09c009..fd7270006d0 100644
    --- a/operator/src/main/java/oracle/kubernetes/utils/OperatorUtils.java
    +++ b/operator/src/main/java/oracle/kubernetes/utils/OperatorUtils.java
    @@ -75,8 +75,8 @@ public static int compareSortingStrings(String str1, String str2) {
        * as these would munge to "member000002foo" and "member000012foo".
        *
        * 

    Handles up to 20 digits... - otherwise it doesn't zero fill... - * @param orig non-normalized value - * @return Normalized value ready for sorting + * @param orig original value + * @return munged value */ public static String getSortingString(String orig) { String ret = ""; diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/ClusterConfigurator.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/ClusterConfigurator.java index 94302dc9418..c8edd1d911c 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/ClusterConfigurator.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/ClusterConfigurator.java @@ -128,4 +128,8 @@ ClusterConfigurator withLivenessProbeSettings( ClusterConfigurator withToleration(V1Toleration toleration); ClusterConfigurator withPrecreateServerService(boolean precreateServerService); + + ClusterConfigurator withAllowReplicasBelowDynClusterSize(boolean allowReplicasBelowDynClusterSize); + + ClusterConfigurator withMaxConcurrentStartup(Integer maxConcurrentStartup); } diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/DomainConfigurator.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/DomainConfigurator.java index b40b1fc0fe5..19742c719b7 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/DomainConfigurator.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/DomainConfigurator.java @@ -14,6 +14,8 @@ import io.kubernetes.client.openapi.models.V1PodSecurityContext; import io.kubernetes.client.openapi.models.V1SecurityContext; import io.kubernetes.client.openapi.models.V1Toleration; +import oracle.kubernetes.operator.DomainSourceType; +import oracle.kubernetes.operator.OverrideDistributionStrategy; import oracle.kubernetes.weblogic.domain.model.Domain; import oracle.kubernetes.weblogic.domain.model.DomainSpec; @@ -58,12 +60,10 @@ public DomainConfigurator withDomainHomeInImage(boolean domainHomeInImage) { return this; } - /** - * Add Istio for the domain resource. - * - * @return this object - */ - public abstract DomainConfigurator withIstio(); + public DomainConfigurator withDomainHomeSourceType(DomainSourceType domainHomeSourceType) { + getDomainSpec().setDomainHomeSourceType(domainHomeSourceType); + return this; + } /** * Configure admin server. @@ -154,6 +154,29 @@ public DomainConfigurator withDataHome(String dataHome) { return this; } + /** + * Sets whether to write server HTTP access log files to the directory specified in + * logHome. + * + * @param httpAccessLogInLogHome boolean specifying whether to write server HTTP + * access log files to the logHome directory + * @return this object + */ + public DomainConfigurator withHttpAccessLogInLogHome(boolean httpAccessLogInLogHome) { + getDomainSpec().setHttpAccessLogInLogHome(httpAccessLogInLogHome); + return this; + } + + public DomainConfigurator withAllowReplicasBelowMinDynClusterSize(Boolean allowReplicasBelowMinDynClusterSize) { + getDomainSpec().setAllowReplicasBelowMinDynClusterSize(allowReplicasBelowMinDynClusterSize); + return this; + } + + public DomainConfigurator withMaxConcurrentStartup(Integer maxConcurrentStartup) { + getDomainSpec().setMaxClusterConcurrentStartup(maxConcurrentStartup); + return this; + } + /** * Sets the WebLogic configuration overrides configmap name for the domain. * @@ -170,6 +193,9 @@ public DomainConfigurator withDataHome(String dataHome) { */ public abstract DomainConfigurator withConfigOverrideSecrets(String... secretNames); + public abstract DomainConfigurator withConfigOverrideDistributionStrategy( + OverrideDistributionStrategy strategy); + /** * Sets the default settings for the readiness probe. Any settings left null will default to the * tuning parameters. @@ -329,6 +355,18 @@ public abstract DomainConfigurator withPodSecurityContext( */ public abstract DomainConfigurator withRestartVersion(String restartVersion); + + /** + * Tells the operator to start the introspect domain job. + * + * @since 2.0 + * @param introspectVersion If present, every time this value is updated the operator will start + * the introspect domain job. + * @return this object + */ + public abstract DomainConfigurator withIntrospectVersion(String introspectVersion); + + /** * Defines a secret reference for the domain. * @param secretName the name of the secret @@ -400,4 +438,59 @@ public abstract DomainConfigurator withPodSecurityContext( * @return this object */ public abstract DomainConfigurator withToleration(V1Toleration toleration); + + /** + * Add the introspector job active deadline. + * + * @param deadline the deadline value to be set to this DomainConfigurator + * @return this object + */ + public abstract DomainConfigurator withIntrospectorJobActiveDeadlineSeconds(long deadline); + + /** + * Add WDT model config map for the domain resource. + * + * @param configmap the configmap for WDT model + * @return this object + */ + public abstract DomainConfigurator withModelConfigMap(String configmap); + + /** + * Add model runtime encryption secret for the domain resource. + * + * @param secret the runtime encryption secret for WDT model + * @return this object + */ + public abstract DomainConfigurator withRuntimeEncryptionSecret(String secret); + + /** + * Add OPSS wallet password secret for the domain resource. + * + * @param secret the OPSS wallet password secret + * @return this object + */ + public abstract DomainConfigurator withOpssWalletPasswordSecret(String secret); + + /** + * Add OPSS wallet file secret for the domain resource. + * + * @param secret the OPSS wallet file secret + * @return this object + */ + public abstract DomainConfigurator withOpssWalletFileSecret(String secret); + + /** + * Add Istio for the domain resource. + * + * @return this object + */ + public abstract DomainConfigurator withIstio(); + + /** + * Add domain type for the domain resource. + * + * @param type the domain type + * @return this object + */ + public abstract DomainConfigurator withDomainType(String type); } diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/EffectiveConfigurationFactory.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/EffectiveConfigurationFactory.java index b84abf00f7d..fe73e3d1aaf 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/EffectiveConfigurationFactory.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/EffectiveConfigurationFactory.java @@ -32,4 +32,6 @@ public interface EffectiveConfigurationFactory { List getAdminServerChannelNames(); boolean isAllowReplicasBelowMinDynClusterSize(String clusterName); + + int getMaxConcurrentStartup(String clusterName); } diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/AdminServer.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/AdminServer.java index 97bed39b7b0..d9a31b8b012 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/AdminServer.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/AdminServer.java @@ -12,12 +12,12 @@ import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; -@Description("AdminServer represents the operator configuration for the Administration Server.") public class AdminServer extends Server { @Description( - "Configures which of the Administration Server's WebLogic admin channels should be exposed outside" - + " the Kubernetes cluster via a node port service.") + "Customization affecting the generation of the Kubernetes Service for the Administration Server. These settings " + + "can also specify the creation of a second NodePort Service to expose specific channels or network access " + + "points outside the Kubernetes cluster.") private AdminService adminService; /** diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/AdminService.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/AdminService.java index 8be0259f471..e1fc5926236 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/AdminService.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/AdminService.java @@ -20,15 +20,15 @@ public class AdminService implements ServiceConfigurator { @SerializedName("channels") @Description( "Specifies which of the Administration Server's WebLogic channels should be exposed outside " - + "the Kubernetes cluster via a node port service, along with the node port for " - + "each channel. If not specified, the Administration Server's node port service will " + + "the Kubernetes cluster via a NodePort Service, along with the port for " + + "each channel. If not specified, the Administration Server's NodePort Service will " + "not be created.") private final List channels = new ArrayList<>(); - @Description("Labels to associate with the external channel service.") + @Description("Labels to associate with the Administration Server's Service(s).") private final Map labels = new HashMap<>(); - @Description("Annotations to associate with the external channel service.") + @Description("Annotations to associate with the Administration Server's Service(s).") private final Map annotations = new HashMap<>(); /** diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/BaseConfiguration.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/BaseConfiguration.java index 63563f38824..94b8f2ca9ce 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/BaseConfiguration.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/BaseConfiguration.java @@ -35,11 +35,11 @@ */ public abstract class BaseConfiguration { - @Description("Configuration affecting server pods.") + @Description("Customization affecting the generation of Pods for WebLogic Server instances.") private final ServerPod serverPod = new ServerPod(); @Description( - "Customization affecting ClusterIP Kubernetes services for WebLogic Server instances.") + "Customization affecting the generation of Kubernetes Services for WebLogic Server instances.") @SerializedName("serverService") @Expose private final ServerService serverService = new ServerService(); @@ -47,7 +47,7 @@ public abstract class BaseConfiguration { /** Desired startup state. Legal values are RUNNING or ADMIN. */ @EnumClass(ServerStartState.class) @Description( - "The state in which the server is to be started. Use ADMIN if server should start " + "The WebLogic runtime state in which the server is to be started. Use ADMIN if the server should start " + "in the admin state. Defaults to RUNNING.") private String serverStartState; @@ -61,8 +61,9 @@ public abstract class BaseConfiguration { * @since 2.0 */ @Description( - "If present, every time this value is updated the operator will restart" - + " the required servers.") + "Changes to this field cause the operator to restart WebLogic Server instances. More info: " + + "https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/" + + "domain-lifecycle/startup/#restarting-servers.") private String restartVersion; /** diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Channel.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Channel.java index 56b1ba2ee11..9ed8280e196 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Channel.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Channel.java @@ -11,25 +11,24 @@ import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; -@Description("Describes a single channel used by the Administration Server.") public class Channel implements Comparable { @SerializedName("channelName") @Description( - "Name of channel.\n'default' refers to the Administration Server's default channel (configured " - + "via the ServerMBean's ListenPort) " - + "\n'default-secure' refers to the Administration Server's default secure channel " - + "(configured via the ServerMBean's SSLMBean's ListenPort) " - + "\n'default-admin' refers to the Administration Server's default administrative channel " - + "(configured via the DomainMBean's AdministrationPort) " - + "\nOtherwise, the name is the name of one of the Administration Server's network access points " - + "(configured via the ServerMBean's NetworkAccessMBeans).") + "Name of the channel. The \"default\" value refers to the Administration Server's default channel, " + + "which is configured using the ServerMBean's ListenPort. " + + "The \"default-secure\" value refers to the Administration Server's default secure channel, " + + "which is configured using the ServerMBean's SSLMBean's ListenPort. " + + "The \"default-admin\" value refers to the Administration Server's default administrative channel, " + + "which is configured using the DomainMBean's AdministrationPort. " + + "Otherwise, provide the name of one of the Administration Server's network access points, " + + "which is configured using the ServerMBean's NetworkAccessMBeans. The \"default\", \"default-secure\", " + + "and \"default-admin\" channels may not be specified here when using Istio.") @Nonnull private String channelName; @SerializedName("nodePort") @Description( - "Specifies the port number used to access the WebLogic channel " - + "outside of the Kubernetes cluster. " + "Specifies the port number used to access the WebLogic channel outside of the Kubernetes cluster. " + "If not specified, defaults to the port defined by the WebLogic channel.") private Integer nodePort; diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Cluster.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Cluster.java index 228fd634f24..fc55dc78eea 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Cluster.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Cluster.java @@ -12,7 +12,6 @@ import oracle.kubernetes.json.Description; import oracle.kubernetes.json.EnumClass; import oracle.kubernetes.json.Range; -import oracle.kubernetes.operator.KubernetesConstants; import oracle.kubernetes.operator.ServerStartPolicy; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; @@ -23,15 +22,27 @@ * * @since 2.0 */ -@Description("An element representing a cluster in the domain configuration.") public class Cluster extends BaseConfiguration implements Comparable { /** The name of the cluster. Required. */ - @Description("The name of this cluster. Required") + @Description("The name of the cluster. This value must match the name of a WebLogic cluster already defined " + + "in the WebLogic domain configuration. Required.") @Nonnull private String clusterName; /** The number of replicas to run in the cluster, if specified. */ - @Description("The number of cluster members to run.") + @Description( + "The number of cluster member Managed Server instances to start for this WebLogic cluster. " + + "The operator will sort cluster member Managed Server names from the WebLogic domain " + + "configuration by normalizing any numbers in the Managed Server name and then sorting alphabetically. " + + "This is done so that server names such as \"managed-server10\" come after \"managed-server9\". " + + "The operator will then start Managed Server instances from the sorted list, " + + "up to the `replicas` count, unless specific Managed Servers are specified as " + + "starting in their entry under the `managedServers` field. In that case, the specified Managed Server " + + "instances will be started and then additional cluster members " + + "will be started, up to the `replicas` count, by finding further cluster members in the sorted list that are " + + "not already started. If cluster members are started " + + "because of their related entries under `managedServers`, then this cluster may have more cluster members " + + "running than its `replicas` count. Defaults to 0.") @Range(minimum = 0) private Integer replicas; @@ -43,9 +54,10 @@ public class Cluster extends BaseConfiguration implements Comparable { * @since 2.0 */ @EnumClass(value = ServerStartPolicy.class, qualifier = "forCluster") - @Description( - "The strategy for deciding whether to start a server. " - + "Legal values are NEVER, or IF_NEEDED.") + @Description("The strategy for deciding whether to start a WebLogic Server instance. " + + "Legal values are NEVER, or IF_NEEDED. Defaults to IF_NEEDED. " + + "More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/" + + "domain-lifecycle/startup/#starting-and-stopping-servers.") private String serverStartPolicy; @Description( @@ -53,11 +65,29 @@ public class Cluster extends BaseConfiguration implements Comparable { @Range(minimum = 1) private Integer maxUnavailable; - @Description("Customization affecting ClusterIP Kubernetes services for the WebLogic cluster.") + @Description("Customization affecting Kubernetes Service generated for this WebLogic cluster.") @SerializedName("clusterService") @Expose private KubernetesResource clusterService = new KubernetesResource(); + @Description("Specifies whether the number of running cluster members is allowed to drop below the " + + "minimum dynamic cluster size configured in the WebLogic domain configuration. " + + "Otherwise, the operator will ensure that the number of running cluster members is not less than " + + "the minimum dynamic cluster setting. This setting applies to dynamic clusters only. " + + "Defaults to true." + ) + private Boolean allowReplicasBelowMinDynClusterSize; + + @Description( + "The maximum number of Managed Servers instances that the operator will start in parallel " + + "for this cluster in response to a change in the `replicas` count. " + + "If more Managed Server instances must be started, the operator will wait until a Managed " + + "Server Pod is in the `Ready` state before starting the next Managed Server instance. " + + "A value of 0 means all Managed Server instances will start in parallel. Defaults to 0." + ) + @Range(minimum = 0) + private Integer maxConcurrentStartup; + protected Cluster getConfiguration() { Cluster configuration = new Cluster(); configuration.fillInFrom(this); @@ -93,8 +123,20 @@ public void setReplicas(Integer replicas) { * @return whether to allow number of replicas to drop below the minimum dynamic cluster size * configured in the WebLogic domain home configuration. */ - public boolean isAllowReplicasBelowMinDynClusterSize() { - return KubernetesConstants.DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE; + public Boolean isAllowReplicasBelowMinDynClusterSize() { + return allowReplicasBelowMinDynClusterSize; + } + + public void setAllowReplicasBelowMinDynClusterSize(Boolean value) { + allowReplicasBelowMinDynClusterSize = value; + } + + public Integer getMaxConcurrentStartup() { + return maxConcurrentStartup; + } + + public void setMaxConcurrentStartup(Integer value) { + maxConcurrentStartup = value; } @Nullable @@ -157,6 +199,7 @@ public String toString() { .append("serverStartPolicy", serverStartPolicy) .append("clusterService", clusterService) .append("maxUnavailable", maxUnavailable) + .append("allowReplicasBelowMinDynClusterSize", allowReplicasBelowMinDynClusterSize) .toString(); } @@ -179,6 +222,8 @@ public boolean equals(Object o) { .append(serverStartPolicy, cluster.serverStartPolicy) .append(clusterService, cluster.clusterService) .append(maxUnavailable, cluster.maxUnavailable) + .append(allowReplicasBelowMinDynClusterSize, cluster.allowReplicasBelowMinDynClusterSize) + .append(maxConcurrentStartup, cluster.maxConcurrentStartup) .isEquals(); } @@ -191,6 +236,8 @@ public int hashCode() { .append(serverStartPolicy) .append(clusterService) .append(maxUnavailable) + .append(allowReplicasBelowMinDynClusterSize) + .append(maxConcurrentStartup) .toHashCode(); } diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ClusterStatus.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ClusterStatus.java index 245a470d9f6..43773b90225 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ClusterStatus.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ClusterStatus.java @@ -19,23 +19,23 @@ /** ServerStatus describes the current status of a specific WebLogic Server. */ public class ClusterStatus implements Comparable, PatchableComponent { - @Description("WebLogic cluster name. Required.") + @Description("WebLogic cluster name.") @SerializedName("clusterName") @Expose private String clusterName; - /** The number of intended cluster members. Required. */ - @Description("The number of intended cluster members. Required.") + /** The number of currently cluster members. Required. */ + @Description("The number of currently running cluster members.") @Range(minimum = 0) private Integer replicas; /** The number of ready cluster members. Required. */ - @Description("The number of ready cluster members. Required.") + @Description("The number of ready cluster members.") @Range(minimum = 0) private Integer readyReplicas; /** The maximum number of cluster members. Required. */ - @Description("The maximum number of cluster members. Required.") + @Description("The maximum number of cluster members.") @Range(minimum = 0) private Integer maximumReplicas; @@ -45,7 +45,7 @@ public class ClusterStatus implements Comparable, PatchableCompon private Integer minimumReplicas; /** The requested number of cluster members from the domain spec. */ - @Description("The requested number of cluster members from the domain spec. " + @Description("The requested number of cluster members. " + "Cluster members will be started by the operator if this value is larger than zero.") @Range(minimum = 0) private Integer replicasGoal; diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Configuration.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Configuration.java index 4eb260179aa..aa2a316925b 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Configuration.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Configuration.java @@ -3,15 +3,98 @@ package oracle.kubernetes.weblogic.domain.model; +import java.util.List; + import oracle.kubernetes.json.Description; +import oracle.kubernetes.operator.OverrideDistributionStrategy; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; public class Configuration { + + @Description("Model in image model files and properties.") + private Model model; + + @Description("Settings for OPSS security.") + private Opss opss; + + @Description( + "A list of names of the Secrets for WebLogic configuration overrides or model. If this field is specified," + + " then the value of `spec.configOverrideSecrets` is ignored.") + private List secrets; + + @Description("The name of the ConfigMap for WebLogic configuration overrides. If this field is specified," + + " then the value of `spec.configOverrides` is ignored.") + private String overridesConfigMap; + + @Description("The introspector job timeout value in seconds. If this field is specified, " + + "then the operator's ConfigMap `data.introspectorJobActiveDeadlineSeconds` value is ignored. " + + "Defaults to 120 seconds.") + private Long introspectorJobActiveDeadlineSeconds; + + @Description( + "Determines how updated configuration overrides are distributed to already running WebLogic Server instances " + + "following introspection when the `domainHomeSourceType` is PersistentVolume or Image. Configuration overrides " + + "are generated during introspection from Secrets, the `overrideConfigMap` field, and WebLogic domain topology. " + + "Legal values are DYNAMIC, which means that the operator will distribute updated configuration overrides " + + "dynamically to running servers, and ON_RESTART, which means that servers will use updated configuration " + + "overrides only after the server's next restart. The selection of ON_RESTART will not cause servers to " + + "restart when there are updated configuration overrides available. See also `domains.spec.introspectVersion`. " + + "Defaults to DYNAMIC.") + private OverrideDistributionStrategy overrideDistributionStrategy; + @Description("The Istio service mesh integration settings.") private Istio istio; + public Model getModel() { + return model; + } + + public void setModel(Model model) { + this.model = model; + } + + public Opss getOpss() { + return this.opss; + } + + public void setOpss(Opss opss) { + this.opss = opss; + } + + public List getSecrets() { + return secrets; + } + + public void setSecrets(List secrets) { + this.secrets = secrets; + } + + public String getOverridesConfigMap() { + return this.overridesConfigMap; + } + + public void setOverridesConfigMap(String overridesConfigMap) { + this.overridesConfigMap = overridesConfigMap; + } + + public Long getIntrospectorJobActiveDeadlineSeconds() { + return this.introspectorJobActiveDeadlineSeconds; + } + + public void setIntrospectorJobActiveDeadlineSeconds(Long introspectorJobActiveDeadlineSeconds) { + this.introspectorJobActiveDeadlineSeconds = introspectorJobActiveDeadlineSeconds; + } + + public void setOverrideDistributionStrategy(OverrideDistributionStrategy overrideDistributionStrategy) { + this.overrideDistributionStrategy = overrideDistributionStrategy; + } + + public OverrideDistributionStrategy getOverrideDistributionStrategy() { + return overrideDistributionStrategy; + } + public Istio getIstio() { return istio; } @@ -29,6 +112,12 @@ public Configuration withIstio(Istio istio) { public String toString() { ToStringBuilder builder = new ToStringBuilder(this) + .append("model", model) + .append("opss", opss) + .append("secrets", secrets) + .append("distributionStrategy", overrideDistributionStrategy) + .append("overridesConfigMap", overridesConfigMap) + .append("introspectorJobActiveDeadlineSeconds", introspectorJobActiveDeadlineSeconds) .append("istio", istio); return builder.toString(); @@ -37,7 +126,13 @@ public String toString() { @Override public int hashCode() { HashCodeBuilder builder = new HashCodeBuilder() - .append(istio); + .append(model) + .append(opss) + .append(secrets) + .append(overrideDistributionStrategy) + .append(overridesConfigMap) + .append(introspectorJobActiveDeadlineSeconds) + .append(istio); return builder.toHashCode(); } @@ -53,6 +148,12 @@ public boolean equals(Object other) { Configuration rhs = ((Configuration) other); EqualsBuilder builder = new EqualsBuilder() + .append(model, rhs.model) + .append(opss, rhs.opss) + .append(secrets, rhs.secrets) + .append(overrideDistributionStrategy, rhs.overrideDistributionStrategy) + .append(overridesConfigMap, rhs.overridesConfigMap) + .append(introspectorJobActiveDeadlineSeconds, rhs.introspectorJobActiveDeadlineSeconds) .append(istio, rhs.istio); return builder.isEquals(); diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Domain.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Domain.java index 8b92495ef7a..6c83b9acbc1 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Domain.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Domain.java @@ -9,7 +9,6 @@ import java.util.Comparator; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.function.Predicate; @@ -17,6 +16,7 @@ import javax.annotation.Nonnull; import javax.validation.Valid; +import com.google.common.base.Strings; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; import io.kubernetes.client.openapi.models.V1EnvVar; @@ -26,8 +26,8 @@ import io.kubernetes.client.openapi.models.V1VolumeMount; import oracle.kubernetes.json.Description; import oracle.kubernetes.operator.DomainSourceType; -import oracle.kubernetes.operator.LabelConstants; -import oracle.kubernetes.operator.VersionConstants; +import oracle.kubernetes.operator.ModelInImageDomainType; +import oracle.kubernetes.operator.OverrideDistributionStrategy; import oracle.kubernetes.operator.helpers.SecretType; import oracle.kubernetes.weblogic.domain.EffectiveConfigurationFactory; import org.apache.commons.lang3.builder.EqualsBuilder; @@ -37,8 +37,6 @@ /** * Domain represents a WebLogic domain and how it will be realized in the Kubernetes cluster. */ -@Description( - "Domain represents a WebLogic domain and how it will be realized in the Kubernetes cluster.") public class Domain { /** * The pattern for computing the default shared logs directory. @@ -52,7 +50,7 @@ public class Domain { */ @SerializedName("apiVersion") @Expose - @Description("The API version for the Domain.") + @Description("The API version defines the versioned schema of this Domain. Required.") private String apiVersion; /** @@ -62,7 +60,7 @@ public class Domain { */ @SerializedName("kind") @Expose - @Description("The type of resource. Must be 'Domain'.") + @Description("The type of the REST resource. Must be \"Domain\". Required.") private String kind; /** @@ -72,7 +70,7 @@ public class Domain { @SerializedName("metadata") @Expose @Valid - @Description("The domain meta-data. Must include the name and namespace.") + @Description("The resource metadata. Must include the `name` and `namespace`. Required.") @Nonnull private V1ObjectMeta metadata = new V1ObjectMeta(); @@ -82,7 +80,7 @@ public class Domain { @SerializedName("spec") @Expose @Valid - @Description("The specification of the domain. Required.") + @Description("The specification of the operation of the WebLogic domain. Required.") @Nonnull private DomainSpec spec = new DomainSpec(); @@ -93,7 +91,7 @@ public class Domain { @SerializedName("status") @Expose @Valid - @Description("The current status of the domain. Updated by the operator.") + @Description("The current status of the operation of the WebLogic domain. Updated automatically by the operator.") private DomainStatus status; @SuppressWarnings({"rawtypes"}) @@ -225,16 +223,12 @@ public String getRestartVersion() { return spec.getRestartVersion(); } - private EffectiveConfigurationFactory getEffectiveConfigurationFactory() { - return spec.getEffectiveConfigurationFactory(apiVersion, getResourceVersion()); + public String getIntrospectVersion() { + return spec.getIntrospectVersion(); } - private String getResourceVersion() { - Map labels = metadata.getLabels(); - if (labels == null) { - return VersionConstants.DEFAULT_DOMAIN_VERSION; - } - return labels.get(LabelConstants.RESOURCE_VERSION_LABEL); + private EffectiveConfigurationFactory getEffectiveConfigurationFactory() { + return spec.getEffectiveConfigurationFactory(apiVersion); } /** @@ -304,6 +298,10 @@ public boolean isAllowReplicasBelowMinDynClusterSize(String clusterName) { return getEffectiveConfigurationFactory().isAllowReplicasBelowMinDynClusterSize(clusterName); } + public int getMaxConcurrentStartup(String clusterName) { + return getEffectiveConfigurationFactory().getMaxConcurrentStartup(clusterName); + } + /** * DomainSpec is a description of a domain. @@ -367,7 +365,7 @@ public Domain withStatus(DomainStatus status) { } /** - * Name of the secret containing WebLogic startup credentials username and password. + * Name of the secret containing WebLogic startup credentials user name and password. * * @return the secret name */ @@ -375,6 +373,33 @@ public String getWebLogicCredentialsSecretName() { return spec.getWebLogicCredentialsSecret().getName(); } + /** + * Reference to secret opss key passphrase. + * + * @return opss key passphrase + */ + public String getOpssWalletPasswordSecret() { + return spec.getOpssWalletPasswordSecret(); + } + + /** + * Returns the opss wallet file secret. + * + * @return opss wallet file secret. + */ + public String getOpssWalletFileSecret() { + return spec.getOpssWalletFileSecret(); + } + + /** + * Reference to runtime encryption secret. + * + * @return runtime encryption secret + */ + public String getRuntimeEncryptionSecret() { + return spec.getRuntimeEncryptionSecret(); + } + /** * Returns the domain unique identifier. * @@ -399,25 +424,35 @@ String getLogHome() { } boolean isLogHomeEnabled() { - return Optional.ofNullable(spec.isLogHomeEnabled()) - .orElse(DomainSourceType.PersistentVolume.toString().equals(getDomainHomeSourceType())); + return Optional.ofNullable(spec.isLogHomeEnabled()).orElse(getDomainHomeSourceType().hasLogHomeByDefault()); } public String getDataHome() { return spec.getDataHome(); } + public String getWdtDomainType() { + return spec.getWdtDomainType(); + } + public boolean isIncludeServerOutInPodLog() { return spec.getIncludeServerOutInPodLog(); } /** - * Get domain home source type. + * Returns a description of how the domain is defined. * @return source type */ - public String getDomainHomeSourceType() { - return Optional.ofNullable(spec.isDomainHomeInImage()) - .orElse(true) ? DomainSourceType.Image.toString() : DomainSourceType.PersistentVolume.toString(); + public DomainSourceType getDomainHomeSourceType() { + return spec.getDomainHomeSourceType(); + } + + public boolean isNewIntrospectionRequiredForNewServers() { + return getDomainHomeSourceType() == DomainSourceType.FromModel; + } + + public Model getModel() { + return spec.getModel(); } public boolean isHttpAccessLogInLogHome() { @@ -433,23 +468,12 @@ public int getIstioReadinessPort() { } /** - * Returns the domain home. - * - *

    Defaults to either /u01/oracle/user_projects/domains or /shared/domains/domainUID + * Returns the domain home. May be null, but will not be an empty string. * * @return domain home */ public String getDomainHome() { - if (spec.getDomainHome() != null) { - return spec.getDomainHome(); - } - if (DomainSourceType.Image.toString().equals(getDomainHomeSourceType())) { - return "/u01/oracle/user_projects/domains"; - } else if (DomainSourceType.PersistentVolume.toString().equals(getDomainHomeSourceType())) { - return "/shared/domains/" + getDomainUid(); - } else { // FromModel - return "/u01/domains/" + getDomainUid(); - } + return Strings.emptyToNull(spec.getDomainHome()); } public boolean isShuttingDown() { @@ -474,13 +498,44 @@ public String getConfigOverrides() { return spec.getConfigOverrides(); } + /** + * Returns the strategy for applying changes to configuration overrides. + * @return the selected strategy + */ + public OverrideDistributionStrategy getOverrideDistributionStrategy() { + return spec.getOverrideDistributionStrategy(); + } + + /** + * Returns the strategy for applying changes to configuration overrides. + * @return the selected strategy + */ + public boolean distributeOverridesDynamically() { + return spec.getOverrideDistributionStrategy() == OverrideDistributionStrategy.DYNAMIC; + } + + /** + * Returns the value of the introspector job active deadline. + * + * @return value of the deadline in seconds. + */ + public Long getIntrospectorJobActiveDeadlineSeconds() { + return Optional.ofNullable(spec.getConfiguration()) + .map(Configuration::getIntrospectorJobActiveDeadlineSeconds).orElse(null); + } + + public String getWdtConfigMap() { + return spec.getWdtConfigMap(); + } + /** * Returns a list of Kubernetes secret names used in optional configuration overrides. * * @return list of Kubernetes secret names */ public List getConfigOverrideSecrets() { - return spec.getConfigOverrideSecrets(); + return Optional.ofNullable(spec.getConfiguration()) + .map(Configuration::getSecrets).orElse(spec.getConfigOverrideSecrets()); } @@ -539,7 +594,9 @@ List getValidationFailures(KubernetesResourceLookup kubernetesResources) addUnmappedLogHome(); addReservedEnvironmentVariables(); addMissingSecrets(kubernetesResources); + addIllegalSitConfigForMii(); verifyNoAlternateSecretNamespaceSpecified(); + addMissingModelConfigMap(kubernetesResources); verifyIstioExposingDefaultChannel(); return failures; @@ -618,19 +675,25 @@ private String separatorTerminated(String path) { } } + private void addIllegalSitConfigForMii() { + if (getDomainHomeSourceType() == DomainSourceType.FromModel + && getConfigOverrides() != null) { + failures.add(DomainValidationMessages.illegalSitConfigForMii(getConfigOverrides())); + } + } + private void verifyIstioExposingDefaultChannel() { if (spec.isIstioEnabled()) { Optional.ofNullable(spec.getAdminServer()) - .map(a -> a.getAdminService()) - .map(service -> service.getChannels()) - .ifPresent(cs -> cs.stream() - .forEach(this::checkForDefaultNameExposed)); + .map(AdminServer::getAdminService) + .map(AdminService::getChannels) + .ifPresent(cs -> cs.forEach(this::checkForDefaultNameExposed)); } } private void checkForDefaultNameExposed(Channel channel) { if ("default".equals(channel.getChannelName()) || "default-admin".equals(channel.getChannelName()) - || "default-secure".equals(channel.getChannelName())) { + || "default-secure".equals(channel.getChannelName())) { failures.add(DomainValidationMessages.cannotExposeDefaultChannelIstio(channel.getChannelName())); } } @@ -687,6 +750,23 @@ private void addMissingSecrets(KubernetesResourceLookup resourceLookup) { for (String secretName : getConfigOverrideSecrets()) { verifySecretExists(resourceLookup, secretName, SecretType.ConfigOverride); } + + verifySecretExists(resourceLookup, getOpssWalletPasswordSecret(), SecretType.OpssWalletPassword); + verifySecretExists(resourceLookup, getOpssWalletFileSecret(), SecretType.OpssWalletFile); + + if (getDomainHomeSourceType() == DomainSourceType.FromModel) { + if (getRuntimeEncryptionSecret() == null) { + failures.add(DomainValidationMessages.missingRequiredSecret( + "spec.configuration.model.runtimeEncryptionSecret")); + } else { + verifySecretExists(resourceLookup, getRuntimeEncryptionSecret(), SecretType.RuntimeEncryption); + } + if (ModelInImageDomainType.JRF.toString().equals(getWdtDomainType()) + && getOpssWalletPasswordSecret() == null) { + failures.add(DomainValidationMessages.missingRequiredOpssSecret( + "spec.configuration.opss.walletPasswordSecret")); + } + } } private List getImagePullSecrets() { @@ -712,6 +792,18 @@ private String getSpecifiedWebLogicCredentialsNamespace() { .orElse(getNamespace()); } + private void addMissingModelConfigMap(KubernetesResourceLookup resourceLookup) { + verifyModelConfigMapExists(resourceLookup, getWdtConfigMap()); + } + + @SuppressWarnings("SameParameterValue") + private void verifyModelConfigMapExists(KubernetesResourceLookup resources, String modelConfigMapName) { + if (getDomainHomeSourceType() == DomainSourceType.FromModel + && modelConfigMapName != null && !resources.isConfigMapExists(modelConfigMapName, getNamespace())) { + failures.add(DomainValidationMessages.noSuchModelConfigMap(modelConfigMapName, getNamespace())); + } + } + } } diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainCommonConfigurator.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainCommonConfigurator.java index c8bedfb6d8f..b650d0dd766 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainCommonConfigurator.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainCommonConfigurator.java @@ -15,13 +15,12 @@ import io.kubernetes.client.openapi.models.V1SecurityContext; import io.kubernetes.client.openapi.models.V1Toleration; import oracle.kubernetes.operator.KubernetesConstants; +import oracle.kubernetes.operator.OverrideDistributionStrategy; import oracle.kubernetes.weblogic.domain.AdminServerConfigurator; import oracle.kubernetes.weblogic.domain.ClusterConfigurator; import oracle.kubernetes.weblogic.domain.DomainConfigurator; import oracle.kubernetes.weblogic.domain.ServerConfigurator; -import static oracle.kubernetes.operator.LabelConstants.RESOURCE_VERSION_LABEL; -import static oracle.kubernetes.operator.VersionConstants.DOMAIN_V2; import static oracle.kubernetes.weblogic.domain.model.ConfigurationConstants.START_ALWAYS; import static oracle.kubernetes.weblogic.domain.model.ConfigurationConstants.START_NEVER; @@ -41,7 +40,6 @@ public DomainConfigurator createFor(Domain domain) { } private void setApiVersion(Domain domain) { - domain.getMetadata().putLabelsItem(RESOURCE_VERSION_LABEL, DOMAIN_V2); domain.setApiVersion( KubernetesConstants.DOMAIN_GROUP + "/" + KubernetesConstants.DOMAIN_VERSION); } @@ -117,28 +115,6 @@ public DomainConfigurator withContainer(V1Container container) { return this; } - @Override - public DomainConfigurator withIstio() { - getOrCreateIstio(); - return this; - } - - private Configuration getOrCreateConfiguration() { - DomainSpec spec = getDomainSpec(); - if (spec.getConfiguration() == null) { - spec.setConfiguration(new Configuration()); - } - return spec.getConfiguration(); - } - - private Istio getOrCreateIstio() { - Configuration configuration = getOrCreateConfiguration(); - if (configuration.getIstio() == null) { - configuration.withIstio(new Istio()); - } - return configuration.getIstio(); - } - /** * Sets the WebLogic configuration overrides config map name for the domain. * @@ -148,13 +124,19 @@ private Istio getOrCreateIstio() { */ @Override public DomainConfigurator withConfigOverrides(String configMapName) { - getDomainSpec().setConfigOverrides(configMapName); + getOrCreateConfiguration().setOverridesConfigMap(configMapName); return this; } @Override public DomainConfigurator withConfigOverrideSecrets(String... secretNames) { - getDomainSpec().setConfigOverrideSecrets(Arrays.asList(secretNames)); + getOrCreateConfiguration().setSecrets(Arrays.asList(secretNames)); + return this; + } + + @Override + public DomainConfigurator withConfigOverrideDistributionStrategy(OverrideDistributionStrategy strategy) { + getOrCreateConfiguration().setOverrideDistributionStrategy(strategy); return this; } @@ -231,6 +213,12 @@ public DomainConfigurator withRestartVersion(String restartVersion) { return this; } + @Override + public DomainConfigurator withIntrospectVersion(String introspectVersion) { + getDomainSpec().setIntrospectVersion(introspectVersion); + return this; + } + @Override public DomainConfigurator withWebLogicCredentialsSecret(String secretName, String namespace) { getDomainSpec().setWebLogicCredentialsSecret(new V1SecretReference().name(secretName).namespace(namespace)); @@ -306,6 +294,80 @@ public DomainConfigurator withToleration(V1Toleration toleration) { return this; } + @Override + public DomainConfigurator withIntrospectorJobActiveDeadlineSeconds(long deadline) { + getOrCreateConfiguration().setIntrospectorJobActiveDeadlineSeconds(deadline); + return this; + } + + @Override + public DomainConfigurator withModelConfigMap(String configmap) { + getOrCreateModel().withConfigMap(configmap); + return this; + } + + @Override + public DomainConfigurator withRuntimeEncryptionSecret(String secret) { + getOrCreateModel().withRuntimeEncryptionSecret(secret); + return this; + } + + @Override + public DomainConfigurator withOpssWalletPasswordSecret(String secret) { + getOrCreateOpss().withWalletPasswordSecret(secret); + return this; + } + + @Override + public DomainConfigurator withOpssWalletFileSecret(String secret) { + getOrCreateOpss().withWalletFileSecret(secret); + return this; + } + + @Override + public DomainConfigurator withIstio() { + getOrCreateIstio(); + return this; + } + + @Override + public DomainConfigurator withDomainType(String type) { + getOrCreateModel().withDomainType(type); + return this; + } + + private Configuration getOrCreateConfiguration() { + DomainSpec spec = getDomainSpec(); + if (spec.getConfiguration() == null) { + spec.setConfiguration(new Configuration()); + } + return spec.getConfiguration(); + } + + private Model getOrCreateModel() { + Configuration configuration = getOrCreateConfiguration(); + if (configuration.getModel() == null) { + configuration.setModel(new Model()); + } + return configuration.getModel(); + } + + private Opss getOrCreateOpss() { + Configuration configuration = getOrCreateConfiguration(); + if (configuration.getOpss() == null) { + configuration.setOpss(new Opss()); + } + return configuration.getOpss(); + } + + private Istio getOrCreateIstio() { + Configuration configuration = getOrCreateConfiguration(); + if (configuration.getIstio() == null) { + configuration.withIstio(new Istio()); + } + return configuration.getIstio(); + } + @Override public void setShuttingDown(boolean shuttingDown) { configureAdminServer().withServerStartPolicy(shuttingDown ? START_NEVER : START_ALWAYS); @@ -663,6 +725,18 @@ public ClusterConfigurator withNodeName(String nodeName) { return this; } + @Override + public ClusterConfigurator withAllowReplicasBelowDynClusterSize(boolean allowReplicasBelowDynClusterSize) { + cluster.setAllowReplicasBelowMinDynClusterSize(allowReplicasBelowDynClusterSize); + return this; + } + + @Override + public ClusterConfigurator withMaxConcurrentStartup(Integer maxConcurrentStartup) { + cluster.setMaxConcurrentStartup(maxConcurrentStartup); + return this; + } + @Override public ClusterConfigurator withSchedulerName(String schedulerName) { getDomainSpec().setSchedulerName(schedulerName); diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainCondition.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainCondition.java index a4c34835cbb..f2611efd91d 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainCondition.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainCondition.java @@ -21,7 +21,7 @@ public class DomainCondition implements Comparable, PatchableCo @Description( "The type of the condition. Valid types are Progressing, " - + "Available, and Failed. Required.") + + "Available, and Failed.") @NotNull private final DomainConditionType type; @@ -45,7 +45,7 @@ public class DomainCondition implements Comparable, PatchableCo @Expose private String reason; - @Description("Status is the status of the condition. Can be True, False, Unknown. Required.") + @Description("The status of the condition. Can be True, False, Unknown.") @SerializedName("status") @Expose @NotNull @@ -162,7 +162,7 @@ public DomainCondition withReason(String reason) { } /** - * Status is the status of the condition. Can be True, False, Unknown. Required. + * The status of the condition. Can be True, False, Unknown. Required. * * @return status */ @@ -171,7 +171,7 @@ public String getStatus() { } /** - * Status is the status of the condition. Can be True, False, Unknown. Required. + * The status of the condition. Can be True, False, Unknown. Required. * * @param status status * @return this diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainSpec.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainSpec.java index 690ef9ad53e..64b4c86d91a 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainSpec.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainSpec.java @@ -8,6 +8,7 @@ import java.util.Collections; import java.util.List; import java.util.Optional; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.validation.Valid; import javax.validation.constraints.NotNull; @@ -19,8 +20,11 @@ import oracle.kubernetes.json.EnumClass; import oracle.kubernetes.json.Pattern; import oracle.kubernetes.json.Range; +import oracle.kubernetes.operator.DomainSourceType; import oracle.kubernetes.operator.ImagePullPolicy; import oracle.kubernetes.operator.KubernetesConstants; +import oracle.kubernetes.operator.ModelInImageDomainType; +import oracle.kubernetes.operator.OverrideDistributionStrategy; import oracle.kubernetes.operator.ServerStartPolicy; import oracle.kubernetes.weblogic.domain.EffectiveConfigurationFactory; import org.apache.commons.lang3.builder.EqualsBuilder; @@ -30,16 +34,20 @@ import static oracle.kubernetes.operator.KubernetesConstants.ALWAYS_IMAGEPULLPOLICY; import static oracle.kubernetes.operator.KubernetesConstants.DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE; import static oracle.kubernetes.operator.KubernetesConstants.DEFAULT_IMAGE; +import static oracle.kubernetes.operator.KubernetesConstants.DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP; import static oracle.kubernetes.operator.KubernetesConstants.IFNOTPRESENT_IMAGEPULLPOLICY; /** DomainSpec is a description of a domain. */ -@Description("DomainSpec is a description of a domain.") +@Description("The specification of the operation of the WebLogic domain. Required.") public class DomainSpec extends BaseConfiguration { /** Domain unique identifier. Must be unique across the Kubernetes cluster. */ @Description( - "Domain unique identifier. Must be unique across the Kubernetes cluster. Not required." - + " Defaults to the value of metadata.name.") + "Domain unique identifier. It is recommended that this value be unique to assist in future work to " + + "identify related domains in active-passive scenarios across data centers; however, it is only required " + + "that this value be unique within the namespace, similarly to the names of Kubernetes resources. " + + "This value is distinct and need not match the domain name from the WebLogic domain configuration. " + + "Defaults to the value of `metadata.name`.") @Pattern("^[a-z0-9-.]{1,253}$") @SerializedName("domainUID") private String domainUid; @@ -50,9 +58,10 @@ public class DomainSpec extends BaseConfiguration { * @since 2.0 */ @Description( - "The folder for the WebLogic Domain. Not required." - + " Defaults to /shared/domains/domains/domainUID if domainHomeInImage is false." - + " Defaults to /u01/oracle/user_projects/domains/ if domainHomeInImage is true.") + "The directory containing the WebLogic domain configuration inside the container." + + " Defaults to /shared/domains/domains/ if `domainHomeSourceType` is PersistentVolume." + + " Defaults to /u01/oracle/user_projects/domains/ if `domainHomeSourceType` is Image." + + " Defaults to /u01/domains/ if `domainHomeSourceType` is FromModel.") private String domainHome; /** @@ -64,30 +73,32 @@ public class DomainSpec extends BaseConfiguration { * @since 2.0 */ @EnumClass(value = ServerStartPolicy.class, qualifier = "forDomain") - @Description( - "The strategy for deciding whether to start a server. " - + "Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED.") + @Description("The strategy for deciding whether to start a WebLogic Server instance. " + + "Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED. Defaults to IF_NEEDED. " + + "More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/" + + "domain-lifecycle/startup/#starting-and-stopping-servers.") private String serverStartPolicy; /** - * Reference to secret containing WebLogic startup credentials username and password. Secret must + * Reference to secret containing WebLogic startup credentials user name and password. Secret must * contain keys names 'username' and 'password'. Required. */ @Description( - "The name of a pre-created Kubernetes secret, in the domain's namespace, that holds" - + " the username and password needed to boot WebLogic Server under the 'username' and " - + "'password' fields.") + "Reference to a Kubernetes Secret that contains" + + " the user name and password needed to boot a WebLogic Server under the `username` and " + + "`password` fields.") @Valid @NotNull private V1SecretReference webLogicCredentialsSecret; /** - * The in-pod name of the directory to store the domain, Node Manager, server logs, and server - * .out files in. + * The in-pod name of the directory to store the domain, Node Manager, server logs, server + * .out, and HTTP access log files in. */ @Description( - "The in-pod name of the directory in which to store the domain, Node Manager, server logs, " - + "and server *.out files.") + "The directory in a server's container in which to store the domain, Node Manager, server logs, " + + "server *.out, and optionally HTTP access log files if `httpAccessLogInLogHome` is true. " + + "Ignored if `logHomeEnabled` is false.") private String logHome; /** @@ -96,9 +107,8 @@ public class DomainSpec extends BaseConfiguration { * @since 2.0 */ @Description( - "Specified whether the log home folder is enabled. Not required. " - + "Defaults to true if domainHomeInImage is false. " - + "Defaults to false if domainHomeInImage is true. ") + "Specifies whether the log home folder is enabled. " + + "Defaults to true if `domainHomeSourceType` is PersistentVolume; false, otherwise.") private Boolean logHomeEnabled; // Boolean object, null if unspecified /** @@ -107,37 +117,45 @@ public class DomainSpec extends BaseConfiguration { * directories are determined from the WebLogic domain home configuration. */ @Description( - "An optional, in-pod location for data storage of default and custom file stores. " - + "If dataHome is not specified or its value is either not set or empty (e.g. dataHome: \"\") " - + "then the data storage directories are determined from the WebLogic domain home configuration.") + "An optional directory in a server's container for data storage of default and custom file stores. " + + "If `dataHome` is not specified or its value is either not set or empty, " + + "then the data storage directories are determined from the WebLogic domain configuration.") private String dataHome; /** Whether to include the server .out file to the pod's stdout. Default is true. */ - @Description("If true (the default), then the server .out file will be included in the pod's stdout.") + @Description("Specifies whether the server .out file will be included in the Pod's log. " + + "Defaults to true.") private Boolean includeServerOutInPodLog; + /** Whether to include the server HTTP access log file to the directory specified in {@link #logHome} + * if {@link #logHomeEnabled} is true. Default is true. */ + @Description("Specifies whether the server HTTP access log files will be written to the same " + + "directory specified in `logHome`. Otherwise, server HTTP access log files will be written to " + + "the directory configured in the WebLogic domain configuration. Defaults to true.") + private Boolean httpAccessLogInLogHome; + /** * The WebLogic Docker image. * *

    Defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4 */ @Description( - "The WebLogic Docker image; required when domainHomeInImage is true; " + "The WebLogic container image; required when `domainHomeSourceType` is Image or FromModel; " + "otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4.") private String image; /** - * The image pull policy for the WebLogic Docker image. Legal values are Always, Never and + * The image pull policy for the WebLogic Docker image. Legal values are Always, Never and, * IfNotPresent. * - *

    Defaults to Always if image ends in :latest, IfNotPresent otherwise. + *

    Defaults to Always if image ends in :latest; IfNotPresent, otherwise. * *

    More info: https://kubernetes.io/docs/concepts/containers/images#updating-images */ @Description( - "The image pull policy for the WebLogic Docker image. " - + "Legal values are Always, Never and IfNotPresent. " - + "Defaults to Always if image ends in :latest, IfNotPresent otherwise.") + "The image pull policy for the WebLogic container image. " + + "Legal values are Always, Never, and IfNotPresent. " + + "Defaults to Always if image ends in :latest; IfNotPresent, otherwise.") @EnumClass(ImagePullPolicy.class) private String imagePullPolicy; @@ -149,30 +167,87 @@ public class DomainSpec extends BaseConfiguration { * * @since 2.0 */ - @Description("A list of image pull secrets for the WebLogic Docker image.") + @Description("A list of image pull Secrets for the WebLogic container image.") private List imagePullSecrets; /** * The desired number of running managed servers in each WebLogic cluster that is not explicitly * configured in a cluster specification. */ + @Description( - "The number of managed servers to run in any cluster that does not specify a replica count.") + "The default number of cluster member Managed Server instances to start for each WebLogic cluster in the " + + "domain configuration, unless `replicas` is specified for that cluster under the `clusters` field. " + + "For each cluster, the operator will sort cluster member Managed Server names from the WebLogic domain " + + "configuration by normalizing any numbers in the Managed Server name and then sorting alphabetically. " + + "This is done so that server names such as \"managed-server10\" come after \"managed-server9\". " + + "The operator will then start Managed Servers from the sorted list, " + + "up to the `replicas` count, unless specific Managed Servers are specified as " + + "starting in their entry under the `managedServers` field. In that case, the specified Managed Servers " + + "will be started and then additional cluster members " + + "will be started, up to the `replicas` count, by finding further cluster members in the sorted list that are " + + "not already started. If cluster members are started " + + "because of their entries under `managedServers`, then a cluster may have more cluster members " + + "running than its `replicas` count. Defaults to 0.") @Range(minimum = 0) private Integer replicas; + @Description("Whether to allow the number of running cluster member Managed Server instances to drop " + + "below the minimum dynamic cluster size configured in the WebLogic domain configuration, " + + "if this is not specified for a specific cluster under the `clusters` field. Defaults to true." + ) + private Boolean allowReplicasBelowMinDynClusterSize; + + @Description( + "The maximum number of cluster member Managed Server instances that the operator will start in parallel " + + "for a given cluster, if `maxConcurrentStartup` is not specified for a specific cluster under the " + + "`clusters` field. A value of 0 means there is no configured limit. Defaults to 0." + ) + @Range(minimum = 0) + private Integer maxClusterConcurrentStartup; + /** * Whether the domain home is part of the image. * * @since 2.0 */ + @Deprecated @Description( - "True indicates that the domain home file system is contained in the Docker image" + "Deprecated. Use `domainHomeSourceType` instead. Ignored if `domainHomeSourceType` is specified." + + " True indicates that the domain home file system is present in the container image" + " specified by the image field. False indicates that the domain home file system is located" - + " on a persistent volume.") + + " on a persistent volume. Defaults to unset.") private Boolean domainHomeInImage; - @Description("Properties affecting the WebLogic domain configuration.") + @Description( + "Domain home file system source type: Legal values: Image, PersistentVolume, FromModel." + + " Image indicates that the domain home file system is present in the container image" + + " specified by the `image` field. PersistentVolume indicates that the domain home file system is located" + + " on a persistent volume. FromModel indicates that the domain home file system will be created" + + " and managed by the operator based on a WDT domain model." + + " If this field is specified, it overrides the value of `domainHomeInImage`. If both fields are" + + " unspecified, then `domainHomeSourceType` defaults to Image.") + private DomainSourceType domainHomeSourceType; + + /** + * Tells the operator to start the introspect domain job. + * + * @since 3.0.0 + */ + @Description( + "Changes to this field cause the operator to repeat its introspection of the WebLogic domain configuration. " + + "Repeating introspection is required for the operator to recognize changes to the domain configuration, " + + "such as adding a new WebLogic cluster or Managed Server instance, to regenerate configuration overrides, " + + "or to regenerate the WebLogic domain home when the `domainHomeSourceType` is FromModel. Introspection occurs " + + "automatically, without requiring change to this field, when servers are first started or restarted after a " + + "full domain shut down. For the FromModel `domainHomeSourceType`, introspection also occurs when a running " + + "server must be restarted because of changes to any of the fields listed here: " + + "https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/" + + "domain-lifecycle/startup/#properties-that-cause-servers-to-be-restarted. " + + "See also `domains.spec.configuration.overridesConfigurationStrategy`.") + private String introspectVersion; + + @Description("Models and overrides affecting the WebLogic domain configuration.") private Configuration configuration; /** @@ -180,7 +255,10 @@ public class DomainSpec extends BaseConfiguration { * * @since 2.0 */ - @Description("The name of the config map for optional WebLogic configuration overrides.") + @Deprecated + @Description("Deprecated. Use `configuration.overridesConfigMap` instead." + + " Ignored if `configuration.overridesConfigMap` is specified." + + " The name of the ConfigMap for optional WebLogic configuration overrides.") private String configOverrides; /** @@ -188,7 +266,9 @@ public class DomainSpec extends BaseConfiguration { * * @since 2.0 */ - @Description("A list of names of the secrets for optional WebLogic configuration overrides.") + @Deprecated + @Description("Deprecated. Use `configuration.secrets` instead. Ignored if `configuration.secrets` is specified." + + " A list of names of the Secrets for optional WebLogic configuration overrides.") private List configOverrideSecrets; /** @@ -196,7 +276,9 @@ public class DomainSpec extends BaseConfiguration { * * @since 2.0 */ - @Description("Configuration for the Administration Server.") + @Description("Lifecycle options for the Administration Server, including Java options, environment variables, " + + "additional Pod content, and which channels or network access points should be exposed using " + + "a NodePort Service.") private AdminServer adminServer; /** @@ -204,7 +286,10 @@ public class DomainSpec extends BaseConfiguration { * * @since 2.0 */ - @Description("Configuration for individual Managed Servers.") + @Description("Lifecycle options for individual Managed Servers, including Java options, environment variables, " + + "additional Pod content, and the ability to explicitly start, stop, or restart a named server instance. " + + "The `serverName` field of each entry must match a Managed Server that already exists in the WebLogic " + + "domain configuration or that matches a dynamic cluster member based on the server template.") private final List managedServers = new ArrayList<>(); /** @@ -212,9 +297,13 @@ public class DomainSpec extends BaseConfiguration { * * @since 2.0 */ - @Description("Configuration for the clusters.") + @Description("Lifecycle options for all of the Managed Server members of a WebLogic cluster, including Java options, " + + "environment variables, additional Pod content, and the ability to explicitly start, stop, or restart " + + "cluster members. The `clusterName` field of each entry must match a cluster that already exists in the " + + "WebLogic domain configuration.") protected final List clusters = new ArrayList<>(); + /** /** * Adds a Cluster to the DomainSpec. * @@ -242,7 +331,7 @@ private AdminServer createAdminServer() { @SuppressWarnings("unused") EffectiveConfigurationFactory getEffectiveConfigurationFactory( - String apiVersion, String resourceVersionLabel) { + String apiVersion) { return new CommonEffectiveConfigurationFactory(); } @@ -284,7 +373,7 @@ public DomainSpec withDomainUid(String domainUid) { * @return domain home */ String getDomainHome() { - return domainHome; + return Optional.ofNullable(domainHome).orElse(getDomainHomeSourceType().getDefaultDomainHome(getDomainUid())); } /** @@ -330,7 +419,7 @@ void setWebLogicCredentialsSecret(V1SecretReference webLogicCredentialsSecret) { } /** - * Reference to secret containing WebLogic startup credentials username and password. Secret must + * Reference to secret containing WebLogic startup credentials user name and password. Secret must * contain keys names 'username' and 'password'. Required. * * @param webLogicCredentialsSecret WebLogic startup credentials secret @@ -341,6 +430,18 @@ public DomainSpec withWebLogicCredentialsSecret(V1SecretReference webLogicCreden return this; } + /** + * Reference to secret containing WebLogic startup credentials user name and password. Secret must + * contain keys names 'username' and 'password'. Required. + * + * @param opssKeyPassPhrase WebLogic startup credentials secret + * @return this + */ + public DomainSpec withOpssKeyPassPhrase(V1SecretReference opssKeyPassPhrase) { + this.webLogicCredentialsSecret = opssKeyPassPhrase; + return this; + } + public String getImage() { return Optional.ofNullable(image).orElse(DEFAULT_IMAGE); } @@ -349,7 +450,6 @@ public void setImage(@Nullable String image) { this.image = image; } - @Nullable public String getImagePullPolicy() { return Optional.ofNullable(imagePullPolicy).orElse(getInferredPullPolicy()); } @@ -415,7 +515,7 @@ private String validatePath(String s) { * @return log home enabled */ Boolean isLogHomeEnabled() { - return Optional.ofNullable(logHomeEnabled).orElse(!isDomainHomeInImage()); + return logHomeEnabled; } /** @@ -471,16 +571,22 @@ public DomainSpec withIncludeServerOutInPodLog(boolean includeServerOutInPodLog) * to the directory as configured in the WebLogic domain home configuration */ boolean getHttpAccessLogInLogHome() { - return KubernetesConstants.DEFAULT_HTTP_ACCESS_LOG_IN_LOG_HOME; + return Optional.ofNullable(httpAccessLogInLogHome) + .orElse(KubernetesConstants.DEFAULT_HTTP_ACCESS_LOG_IN_LOG_HOME); + } + + public void setHttpAccessLogInLogHome(boolean httpAccessLogInLogHome) { + this.httpAccessLogInLogHome = httpAccessLogInLogHome; } /** * Returns true if this domain's home is defined in the default docker image for the domain. + * Defaults to true. * * @return true or false * @since 2.0 */ - Boolean isDomainHomeInImage() { + boolean isDomainHomeInImage() { return Optional.ofNullable(domainHomeInImage).orElse(true); } @@ -498,6 +604,40 @@ public DomainSpec withDomainHomeInImage(boolean domainHomeInImage) { return this; } + @Nonnull DomainSourceType getDomainHomeSourceType() { + return Optional.ofNullable(domainHomeSourceType).orElse(inferDomainSourceType()); + } + + private DomainSourceType inferDomainSourceType() { + if (getModel() != null) { + return DomainSourceType.FromModel; + } else if (isDomainHomeInImage()) { + return DomainSourceType.Image; + } else { + return DomainSourceType.PersistentVolume; + } + } + + public void setDomainHomeSourceType(DomainSourceType domainHomeSourceType) { + this.domainHomeSourceType = domainHomeSourceType; + } + + public String getIntrospectVersion() { + return introspectVersion; + } + + public void setIntrospectVersion(String introspectVersion) { + this.introspectVersion = introspectVersion; + } + + public Configuration getConfiguration() { + return configuration; + } + + public void setConfiguration(Configuration configuration) { + this.configuration = configuration; + } + /** * The desired number of running managed servers in each WebLogic cluster that is not explicitly * configured in clusters. @@ -530,27 +670,19 @@ public DomainSpec withReplicas(Integer replicas) { return this; } - @Nullable - Configuration getConfiguration() { - return configuration; - } - - void setConfiguration(@Nullable Configuration configuration) { - this.configuration = configuration; + public boolean isAllowReplicasBelowMinDynClusterSize() { + return Optional.ofNullable(allowReplicasBelowMinDynClusterSize) + .orElse(DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE); } - public DomainSpec withConfiguration(@Nullable Configuration configuration) { - this.configuration = configuration; - return this; + public Integer getMaxClusterConcurrentStartup() { + return Optional.ofNullable(maxClusterConcurrentStartup) + .orElse(DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP); } @Nullable String getConfigOverrides() { - return configOverrides; - } - - void setConfigOverrides(@Nullable String overrides) { - this.configOverrides = overrides; + return Optional.ofNullable(configuration).map(Configuration::getOverridesConfigMap).orElse(configOverrides); } public DomainSpec withConfigOverrides(@Nullable String overrides) { @@ -567,6 +699,20 @@ public void setConfigOverrideSecrets(@Nullable List overridesSecretNames this.configOverrideSecrets = overridesSecretNames; } + /** + * Returns the strategy used for distributing changed config overrides. + * @return the set or computed strategy + */ + public OverrideDistributionStrategy getOverrideDistributionStrategy() { + return Optional.ofNullable(configuration) + .map(Configuration::getOverrideDistributionStrategy) + .orElse(OverrideDistributionStrategy.DEFAULT); + } + + Model getModel() { + return Optional.ofNullable(configuration).map(Configuration::getModel).orElse(null); + } + /** * Test if the domain is deployed under Istio environment. * @@ -591,6 +737,49 @@ int getIstioReadinessPort() { .orElse(8888); } + String getWdtDomainType() { + return Optional.ofNullable(configuration) + .map(Configuration::getModel) + .map(Model::getDomainType) + .orElse(ModelInImageDomainType.WLS.toString()); + } + + String getOpssWalletPasswordSecret() { + return Optional.ofNullable(configuration) + .map(Configuration::getOpss) + .map(Opss::getWalletPasswordSecret) + .orElse(null); + } + + /** + * Get OPSS wallet file secret. + * @return wallet file secret + */ + public String getOpssWalletFileSecret() { + return Optional.ofNullable(configuration) + .map(Configuration::getOpss) + .map(Opss::getWalletFileSecret) + .orElse(null); + } + + String getRuntimeEncryptionSecret() { + return Optional.ofNullable(configuration) + .map(Configuration::getModel) + .map(Model::getRuntimeEncryptionSecret) + .orElse(null); + } + + /** + * Get WDT config map. + * @return config map name + */ + public String getWdtConfigMap() { + return Optional.ofNullable(configuration) + .map(Configuration::getModel) + .map(Model::getConfigMap) + .orElse(null); + } + @Override public String toString() { ToStringBuilder builder = @@ -599,6 +788,9 @@ public String toString() { .append("domainUID", domainUid) .append("domainHome", domainHome) .append("domainHomeInImage", domainHomeInImage) + .append("domainHomeSourceType", domainHomeSourceType) + .append("introspectVersion", introspectVersion) + .append("configuration", configuration) .append("serverStartPolicy", serverStartPolicy) .append("webLogicCredentialsSecret", webLogicCredentialsSecret) .append("image", image) @@ -611,7 +803,6 @@ public String toString() { .append("logHome", logHome) .append("logHomeEnabled", logHomeEnabled) .append("includeServerOutInPodLog", includeServerOutInPodLog) - .append("configuration", configuration) .append("configOverrides", configOverrides) .append("configOverrideSecrets", configOverrideSecrets); @@ -626,6 +817,9 @@ public int hashCode() { .append(domainUid) .append(domainHome) .append(domainHomeInImage) + .append(domainHomeSourceType) + .append(introspectVersion) + .append(configuration) .append(serverStartPolicy) .append(webLogicCredentialsSecret) .append(image) @@ -638,9 +832,10 @@ public int hashCode() { .append(logHome) .append(logHomeEnabled) .append(includeServerOutInPodLog) - .append(configuration) .append(configOverrides) - .append(configOverrideSecrets); + .append(configOverrideSecrets) + .append(allowReplicasBelowMinDynClusterSize) + .append(maxClusterConcurrentStartup); return builder.toHashCode(); } @@ -661,6 +856,9 @@ public boolean equals(Object other) { .append(domainUid, rhs.domainUid) .append(domainHome, rhs.domainHome) .append(domainHomeInImage, rhs.domainHomeInImage) + .append(domainHomeSourceType, rhs.domainHomeSourceType) + .append(introspectVersion, rhs.introspectVersion) + .append(configuration, rhs.configuration) .append(serverStartPolicy, rhs.serverStartPolicy) .append(webLogicCredentialsSecret, rhs.webLogicCredentialsSecret) .append(getImage(), rhs.getImage()) @@ -673,9 +871,10 @@ public boolean equals(Object other) { .append(logHome, rhs.logHome) .append(logHomeEnabled, rhs.logHomeEnabled) .append(includeServerOutInPodLog, rhs.includeServerOutInPodLog) - .append(configuration, rhs.configuration) .append(configOverrides, rhs.configOverrides) - .append(configOverrideSecrets, rhs.configOverrideSecrets); + .append(configOverrideSecrets, rhs.configOverrideSecrets) + .append(isAllowReplicasBelowMinDynClusterSize(), rhs.isAllowReplicasBelowMinDynClusterSize()) + .append(getMaxClusterConcurrentStartup(), rhs.getMaxClusterConcurrentStartup()); return builder.isEquals(); } @@ -720,8 +919,31 @@ private boolean hasMaxUnavailable(Cluster cluster) { } private boolean isAllowReplicasBelowDynClusterSizeFor(Cluster cluster) { - return cluster == null ? DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE : - cluster.isAllowReplicasBelowMinDynClusterSize(); + return hasAllowReplicasBelowMinDynClusterSize(cluster) + ? cluster.isAllowReplicasBelowMinDynClusterSize() + : isAllowReplicasBelowMinDynClusterSize(); + } + + private boolean hasAllowReplicasBelowMinDynClusterSize(Cluster cluster) { + return cluster != null && cluster.isAllowReplicasBelowMinDynClusterSize() != null; + } + + public void setAllowReplicasBelowMinDynClusterSize(Boolean allowReplicasBelowMinDynClusterSize) { + this.allowReplicasBelowMinDynClusterSize = allowReplicasBelowMinDynClusterSize; + } + + private int getMaxConcurrentStartupFor(Cluster cluster) { + return hasMaxConcurrentStartup(cluster) + ? cluster.getMaxConcurrentStartup() + : getMaxClusterConcurrentStartup(); + } + + private boolean hasMaxConcurrentStartup(Cluster cluster) { + return cluster != null && cluster.getMaxConcurrentStartup() != null; + } + + public void setMaxClusterConcurrentStartup(Integer maxClusterConcurrentStartup) { + this.maxClusterConcurrentStartup = maxClusterConcurrentStartup; } public AdminServer getAdminServer() { @@ -794,6 +1016,11 @@ public boolean isAllowReplicasBelowMinDynClusterSize(String clusterName) { return isAllowReplicasBelowDynClusterSizeFor(getCluster(clusterName)); } + @Override + public int getMaxConcurrentStartup(String clusterName) { + return getMaxConcurrentStartupFor(getCluster(clusterName)); + } + private Cluster getOrCreateCluster(String clusterName) { Cluster cluster = getCluster(clusterName); if (cluster != null) { diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainStatus.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainStatus.java index 5fca3bf5371..6e1f6534d5b 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainStatus.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainStatus.java @@ -32,12 +32,10 @@ * DomainStatus represents information about the status of a domain. Status may trail the actual * state of a system. */ -@Description( - "DomainStatus represents information about the status of a domain. " - + "Status may trail the actual state of a system.") +@Description("The current status of the operation of the WebLogic domain. Updated automatically by the operator.") public class DomainStatus { - @Description("Current service state of domain.") + @Description("Current service state of the domain.") @Valid private List conditions = new ArrayList<>(); @@ -66,9 +64,10 @@ public class DomainStatus { private DateTime startTime = SystemClock.now(); @Description( - "The number of running Managed Servers in the WebLogic cluster if there is " - + "only one cluster in the domain and where the cluster does not explicitly " - + "configure its replicas in a cluster specification.") + "The number of running cluster member Managed Servers in the WebLogic cluster if there is " + + "exactly one cluster defined in the domain configuration and where the `replicas` field is set at the `spec` " + + "level rather than for the specific cluster under `clusters`. This field is provided to support use of " + + "Kubernetes scaling for this limited use case.") @Range(minimum = 0) private Integer replicas; @@ -278,9 +277,9 @@ public DomainStatus withReplicas(Integer replicas) { } /** - * Status of WebLogic servers in this domain. + * Status of WebLogic Servers in this domain. * - * @return a sorted list of ServerStatus containing status of WebLogic servers in this domain + * @return a sorted list of ServerStatus containing status of WebLogic Servers in this domain */ public List getServers() { synchronized (servers) { @@ -289,7 +288,7 @@ public List getServers() { } /** - * Status of WebLogic servers in this domain. + * Status of WebLogic Servers in this domain. * * @param servers servers */ @@ -333,7 +332,7 @@ private ServerStatus getMatchingServer(ServerStatus server) { /** - * Status of WebLogic servers in this domain. + * Status of WebLogic Servers in this domain. * * @param servers servers * @return this diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainValidationMessages.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainValidationMessages.java index 5587b4dd1a2..c026dcc3856 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainValidationMessages.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainValidationMessages.java @@ -91,11 +91,28 @@ static String noSuchSecret(String secretName, String namespace, SecretType type) return getMessage(MessageKeys.SECRET_NOT_FOUND, secretName, namespace, type); } + static String missingRequiredSecret(String secret) { + return getMessage(MessageKeys.SECRET_NOT_SPECIFIED, secret); + } + + static String missingRequiredOpssSecret(String secret) { + return getMessage(MessageKeys.OPSS_SECRET_NOT_SPECIFIED, secret); + } + static String illegalSecretNamespace(String namespace) { return getMessage(MessageKeys.ILLEGAL_SECRET_NAMESPACE, namespace); } + static String illegalSitConfigForMii(String configOverrides) { + return getMessage(MessageKeys.ILLEGAL_SIT_CONFIG_MII, configOverrides); + } + + static String noSuchModelConfigMap(String configMapName, String namespace) { + return getMessage(MessageKeys.MODEL_CONFIGMAP_NOT_FOUND, configMapName, namespace); + } + static String cannotExposeDefaultChannelIstio(String channelName) { return getMessage(MessageKeys.CANNOT_EXPOSE_DEFAULT_CHANNEL_ISTIO, channelName); } + } diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/IntrospectorJobEnvVars.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/IntrospectorJobEnvVars.java index c9d66f6a8cc..382754f87ac 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/IntrospectorJobEnvVars.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/IntrospectorJobEnvVars.java @@ -25,11 +25,38 @@ public class IntrospectorJobEnvVars { */ public static final String CREDENTIALS_SECRET_NAME = "CREDENTIALS_SECRET_NAME"; + /** + * The credentials used by the introspection job - opss key passphrase. + */ + public static final String OPSS_KEY_SECRET_NAME = "OPSS_KEY_SECRET_NAME"; + + /** + * The credentials used by the introspection job - opss wallet file. + */ + public static final String OPSS_WALLETFILE_SECRET_NAME = "OPSS_WALLETFILE_SECRET_NAME"; + + + /** + * The credentials used by the introspection job - wdt encryption passphrase. + */ + public static final String WDT_ENCRYPTION_PASSPHRASE_NAME = "WDT_ENCRYPTION_PASSPHRASE_NAME"; + + /** + * The credentials used by the introspection job - runtime encryption secret name. + */ + public static final String RUNTIME_ENCRYPTION_SECRET_NAME = "RUNTIME_ENCRYPTION_SECRET_NAME"; + + /** * The domain source type. */ public static final String DOMAIN_SOURCE_TYPE = "DOMAIN_SOURCE_TYPE"; + /** + * The wdt domain type. + */ + public static final String WDT_DOMAIN_TYPE = "WDT_DOMAIN_TYPE"; + /** * Istio enabled. */ @@ -40,6 +67,11 @@ public class IntrospectorJobEnvVars { */ public static final String ISTIO_READINESS_PORT = "ISTIO_READINESS_PORT"; + /** + * Istio pod namespace. + */ + public static final String ISTIO_POD_NAMESPACE = "ISTIO_POD_NAMESPACE"; + /** * Returns true if the specified environment variable name is reserved by the operator for communication with * the introspection job. diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Istio.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Istio.java index cad6aca3831..0236ab4112f 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Istio.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Istio.java @@ -12,10 +12,12 @@ public class Istio { @Description( "True, if this domain is deployed under an Istio service mesh. " - + "Defaults to true when the 'istio' element is included. Not required.") + + "Defaults to true when the `istio` field is specified.") private Boolean enabled = true; - @Description("The WebLogic readiness port for Istio. Defaults to 8888. Not required.") + @Description("The operator will create a WebLogic network access point with this port that will then be exposed " + + "from the container running the WebLogic Server instance. The readiness probe will use this network " + + "access point to verify that the server instance is ready for application traffic. Defaults to 8888.") private Integer readinessPort = 8888; /** diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/KubernetesResource.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/KubernetesResource.java index f530dfbfb87..4866d12e5f3 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/KubernetesResource.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/KubernetesResource.java @@ -20,8 +20,8 @@ class KubernetesResource { * @since 2.0 */ @Description( - "The labels to be attached to generated resources. The label names must " - + "not start with 'weblogic.'.") + "The labels to be added to generated resources. The label names must " + + "not start with \"weblogic.\".") private final Map labels = new HashMap<>(); /** @@ -29,7 +29,7 @@ class KubernetesResource { * * @since 2.0 */ - @Description("The annotations to be attached to generated resources.") + @Description("The annotations to be added to generated resources.") private final Map annotations = new HashMap<>(); void fillInFrom(KubernetesResource kubernetesResource1) { diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ManagedServer.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ManagedServer.java index 048dc1b2dd8..2991f8771ec 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ManagedServer.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ManagedServer.java @@ -12,12 +12,13 @@ import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; -@Description("ManagedServer represents the operator configuration for a single Managed Server.") public class ManagedServer extends Server implements Comparable { /** The name of the Managed Server. Required. */ @SerializedName("serverName") @Expose - @Description("The name of the Managed Server. Required.") + @Description("The name of the Managed Server. This name must match the name of a Managed Server instance or of a " + + "dynamic cluster member name from a server template already defined in the WebLogic domain configuration. " + + "Required.") @Nonnull private String serverName; diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Model.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Model.java new file mode 100644 index 00000000000..36a4aa2b5c3 --- /dev/null +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Model.java @@ -0,0 +1,110 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.kubernetes.weblogic.domain.model; + +import javax.annotation.Nullable; +import javax.validation.Valid; + +import oracle.kubernetes.json.Description; +import oracle.kubernetes.json.EnumClass; +import oracle.kubernetes.operator.ModelInImageDomainType; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; + +public class Model { + + @EnumClass(value = ModelInImageDomainType.class) + @Description("WebLogic Deploy Tooling domain type. Legal values: WLS, RestrictedJRF, JRF. Defaults to WLS.") + private String domainType; + + @Description("Name of a ConfigMap containing the WebLogic Deploy Tooling model.") + private String configMap; + + @Valid + @Nullable + @Description("Runtime encryption secret. Required when `domainHomeSourceType` is set to FromModel.") + private String runtimeEncryptionSecret; + + @Nullable + public String getDomainType() { + return domainType; + } + + public void setDomainType(@Nullable String domainType) { + this.domainType = domainType; + } + + public Model withDomainType(@Nullable String domainType) { + this.domainType = domainType; + return this; + } + + @Nullable + String getConfigMap() { + return configMap; + } + + void setConfigMap(@Nullable String configMap) { + this.configMap = configMap; + } + + public Model withConfigMap(@Nullable String configMap) { + this.configMap = configMap; + return this; + } + + String getRuntimeEncryptionSecret() { + return runtimeEncryptionSecret; + } + + void setRuntimeEncryptionSecret(String runtimeEncryptionSecret) { + this.runtimeEncryptionSecret = runtimeEncryptionSecret; + } + + public Model withRuntimeEncryptionSecret(String runtimeEncryptionSecret) { + this.runtimeEncryptionSecret = runtimeEncryptionSecret; + return this; + } + + @Override + public String toString() { + ToStringBuilder builder = + new ToStringBuilder(this) + .append("domainType", domainType) + .append("configMap", configMap) + .append("runtimeEncryptionSecret", runtimeEncryptionSecret); + + return builder.toString(); + } + + @Override + public int hashCode() { + HashCodeBuilder builder = new HashCodeBuilder() + .append(domainType) + .append(configMap) + .append(runtimeEncryptionSecret); + + return builder.toHashCode(); + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if (!(other instanceof Model)) { + return false; + } + + Model rhs = ((Model) other); + EqualsBuilder builder = + new EqualsBuilder() + .append(domainType, rhs.domainType) + .append(configMap,rhs.configMap) + .append(runtimeEncryptionSecret, rhs.runtimeEncryptionSecret); + + return builder.isEquals(); + } +} diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Opss.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Opss.java new file mode 100644 index 00000000000..42ad29af0e5 --- /dev/null +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Opss.java @@ -0,0 +1,88 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.kubernetes.weblogic.domain.model; + +import javax.validation.Valid; + +import oracle.kubernetes.json.Description; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; + +public class Opss { + + @Description("Name of a Secret containing the OPSS key wallet file, which must be in a field named `walletFile`." + + " Use this to allow a JRF domain to reuse its entries in the RCU database. This allows you to specify" + + " a wallet file that was obtained from the domain home after the domain was booted for the first time.") + private String walletFileSecret; + + @Description( + "Name of a Secret containing the OPSS key passphrase, which must be in a field named `walletPassword`." + + " Used to encrypt and decrypt the wallet that is used for accessing the domain's entries in its RCU database.") + @Valid + private String walletPasswordSecret; + + public String getWalletFileSecret() { + return this.walletFileSecret; + } + + public void setWalletFileSecret(String walletFileSecret) { + this.walletFileSecret = walletFileSecret; + } + + public Opss withWalletFileSecret(String walletFileSecret) { + this.walletFileSecret = walletFileSecret; + return this; + } + + public String getWalletPasswordSecret() { + return this.walletPasswordSecret; + } + + public void setWalletPasswordSecret(String walletPasswordSecret) { + this.walletPasswordSecret = walletPasswordSecret; + } + + public Opss withWalletPasswordSecret(String walletPasswordSecret) { + this.walletPasswordSecret = walletPasswordSecret; + return this; + } + + @Override + public String toString() { + ToStringBuilder builder = + new ToStringBuilder(this) + .append("walletFileSecret", walletFileSecret) + .append("walletPasswordSecret", walletPasswordSecret); + + return builder.toString(); + } + + @Override + public int hashCode() { + HashCodeBuilder builder = new HashCodeBuilder() + .append(walletFileSecret) + .append(walletPasswordSecret); + + return builder.toHashCode(); + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if (!(other instanceof Opss)) { + return false; + } + + Opss rhs = ((Opss) other); + EqualsBuilder builder = + new EqualsBuilder() + .append(walletFileSecret, rhs.walletFileSecret) + .append(walletPasswordSecret, rhs.walletPasswordSecret); + + return builder.isEquals(); + } +} diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Server.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Server.java index dd0005fcff2..e2e89fd85cc 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Server.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Server.java @@ -20,9 +20,10 @@ public class Server extends BaseConfiguration { * @since 2.0 */ @EnumClass(value = ServerStartPolicy.class, qualifier = "forServer") - @Description( - "The strategy for deciding whether to start a server. " - + "Legal values are ALWAYS, NEVER, or IF_NEEDED.") + @Description("The strategy for deciding whether to start a WebLogic Server instance. " + + "Legal values are ALWAYS, NEVER, or IF_NEEDED. Defaults to IF_NEEDED. " + + "More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/" + + "domain-lifecycle/startup/#starting-and-stopping-servers.") private String serverStartPolicy; protected Server getConfiguration() { diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerEnvVars.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerEnvVars.java index b112236e0a1..1b3135e677f 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerEnvVars.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerEnvVars.java @@ -40,6 +40,12 @@ public class ServerEnvVars { /** The secure port on which the admin server is listening. */ public static final String ADMIN_PORT_SECURE = "ADMIN_PORT_SECURE"; + /** + * If defined, WebLogic Server sets a secure protocol(https/t3s) in the "AdminURL" property in NM startup.properties. + * WebLogic Node Manager then sets the ADMIN_URL env variable before starting the managed server. + */ + public static final String ADMIN_SERVER_PORT_SECURE = "ADMIN_SERVER_PORT_SECURE"; + /** The location for the logs. */ public static final String LOG_HOME = "LOG_HOME"; @@ -53,6 +59,9 @@ public class ServerEnvVars { * directory specified by LOG_HOME. */ public static final String ACCESS_LOG_IN_LOG_HOME = "ACCESS_LOG_IN_LOG_HOME"; + /** If present, pod scripts will watch for changes to override configurations and move them into place. */ + public static final String DYNAMIC_CONFIG_OVERRIDE = "DYNAMIC_CONFIG_OVERRIDE"; + private static final List RESERVED_NAMES = Arrays.asList( DOMAIN_UID, DOMAIN_NAME, DOMAIN_HOME, NODEMGR_HOME, SERVER_NAME, SERVICE_NAME, ADMIN_NAME, AS_SERVICE_NAME, ADMIN_PORT, ADMIN_PORT_SECURE, diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerHealth.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerHealth.java index beed1880159..c03bbaf2eb2 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerHealth.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerHealth.java @@ -25,10 +25,10 @@ public class ServerHealth { private DateTime activationTime; @Description( - "Server health of this WebLogic Server. If the value is \"Not available\", the operator has " + "Server health of this WebLogic Server instance. If the value is \"Not available\", the operator has " + "failed to read the health. If the value is \"Not available (possibly overloaded)\", the " + "operator has failed to read the health of the server possibly due to the server is " - + "in overloaded state.") + + "in the overloaded state.") @Expose private String overallHealth; diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerPod.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerPod.java index 439a487dd8f..b8f0222b002 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerPod.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerPod.java @@ -43,7 +43,6 @@ import static java.util.Collections.emptyList; -@Description("ServerPod describes the configuration for a Kubernetes pod for a server.") class ServerPod extends KubernetesResource { private static final Comparator ENV_VAR_COMPARATOR = @@ -59,7 +58,10 @@ class ServerPod extends KubernetesResource { * @since 2.0 */ @Valid - @Description("A list of environment variables to add to a server.") + @Description("A list of environment variables to set in the container running a WebLogic Server instance. " + + "More info: https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/" + + "domain-resource/#jvm-memory-and-java-option-environment-variables. " + + "See `kubectl explain pods.spec.containers.env`.") private List env = new ArrayList<>(); /** @@ -68,7 +70,7 @@ class ServerPod extends KubernetesResource { * * @since 2.0 */ - @Description("Settings for the liveness probe associated with a server.") + @Description("Settings for the liveness probe associated with a WebLogic Server instance.") private final ProbeTuning livenessProbe = new ProbeTuning(); /** @@ -77,7 +79,7 @@ class ServerPod extends KubernetesResource { * * @since 2.0 */ - @Description("Settings for the readiness probe associated with a server.") + @Description("Settings for the readiness probe associated with a WebLogic Server instance.") private final ProbeTuning readinessProbe = new ProbeTuning(); /** @@ -87,48 +89,53 @@ class ServerPod extends KubernetesResource { * @since 2.0 */ @Description( - "Selector which must match a node's labels for the pod to be scheduled on that node.") + "Selector which must match a Node's labels for the Pod to be scheduled on that Node. " + + "See `kubectl explain pods.spec.nodeSelector`.") private final Map nodeSelector = new HashMap<>(); - @Description("If specified, the pod's scheduling constraints") + @Description("If specified, the Pod's scheduling constraints. See `kubectl explain pods.spec.affinity`") private V1Affinity affinity = null; - @Description("If specified, indicates the pod's priority. \"system-node-critical\" and \"system-cluster-critical\" " + @Description("If specified, indicates the Pod's priority. \"system-node-critical\" and \"system-cluster-critical\" " + "are two special keywords which indicate the highest priorities with the former being the highest priority. " + "Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod " - + "priority will be default or zero if there is no default.") + + "priority will be the default or zero, if there is no default. " + + "See `kubectl explain pods.spec.priorityClassName`.") private String priorityClassName = null; - @Description("If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its " - + "containers are ready AND all conditions specified in the readiness gates have status equal to \"True\" More " - + "info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md") + @Description("If specified, all readiness gates will be evaluated for Pod readiness. A Pod is ready when all its " + + "containers are ready AND all conditions specified in the readiness gates have a status equal to \"True\". " + + "More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md.") private List readinessGates = new ArrayList<>(); - @Description("Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. " - + "More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy") + @Description("Restart policy for all containers within the Pod. One of Always, OnFailure, Never. Default to Always. " + + "More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy. " + + "See `kubectl explain pods.spec.restartPolicy`.") private String restartPolicy = null; @Description("RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run " - + "this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, " + + "this Pod. If no RuntimeClass resource matches the named class, the Pod will not be run. If unset or empty, " + "the \"legacy\" RuntimeClass will be used, which is an implicit class with an empty definition that uses the " + "default runtime handler. More " + "info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md This is an " - + "alpha feature and may change in the future.") + + "alpha feature and may change in the future. See `kubectl explain pods.spec.runtimeClassName`.") private String runtimeClassName = null; - @Description("NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler " - + "simply schedules this pod onto that node, assuming that it fits resource requirements.") + @Description("NodeName is a request to schedule this Pod onto a specific Node. If it is non-empty, the scheduler " + + "simply schedules this pod onto that node, assuming that it fits the resource requirements. " + + "See `kubectl explain pods.spec.nodeName`.") private String nodeName = null; - @Description("If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be " - + "dispatched by default scheduler.") + @Description("If specified, the Pod will be dispatched by the specified scheduler. If not specified, the Pod will be " + + "dispatched by the default scheduler. See `kubectl explain pods.spec.schedulerName`.") private String schedulerName = null; - @Description("If specified, the pod's tolerations.") + @Description("If specified, the Pod's tolerations. See `kubectl explain pods.spec.tolerations`.") private List tolerations = new ArrayList<>(); - @Description("Name of the ServiceAccount to be used to run this pod. If it is not set, default " - + "ServiceAccount will be used. The ServiceAccount has to exist at the time the pod is created.") + @Description("Name of the ServiceAccount to be used to run this Pod. If it is not set, default " + + "ServiceAccount will be used. The ServiceAccount has to exist at the time the Pod is created. " + + "See `kubectl explain pods.spec.serviceAccountName`.") private String serviceAccountName = null; /** @@ -136,7 +143,8 @@ class ServerPod extends KubernetesResource { * * @since 2.0 */ - @Description("Memory and CPU minimum requirements and limits for the server.") + @Description("Memory and CPU minimum requirements and limits for the WebLogic Server instance. " + + "See `kubectl explain pods.spec.containers.resources`.") private final V1ResourceRequirements resources = new V1ResourceRequirements().limits(new HashMap<>()).requests(new HashMap<>()); @@ -147,7 +155,7 @@ class ServerPod extends KubernetesResource { * * @since 2.0 */ - @Description("Pod-level security attributes.") + @Description("Pod-level security attributes. See `kubectl explain pods.spec.securityContext`.") private V1PodSecurityContext podSecurityContext = new V1PodSecurityContext(); /** @@ -156,7 +164,8 @@ class ServerPod extends KubernetesResource { * * @since 2.1 */ - @Description("Initialization containers to be included in the server pod.") + @Description("Initialization containers to be included in the server Pod. " + + "See `kubectl explain pods.spec.initContainers`.") private List initContainers = new ArrayList<>(); /** @@ -164,7 +173,7 @@ class ServerPod extends KubernetesResource { * * @since 2.1 */ - @Description("Additional containers to be included in the server pod.") + @Description("Additional containers to be included in the server Pod. See `kubectl explain pods.spec.containers`.") private List containers = new ArrayList<>(); /** @@ -172,7 +181,7 @@ class ServerPod extends KubernetesResource { * * @since 2.2 */ - @Description("Configures how the operator should shutdown the server instance.") + @Description("Configures how the operator should shut down the server instance.") private final Shutdown shutdown = new Shutdown(); /** @@ -183,7 +192,8 @@ class ServerPod extends KubernetesResource { * @since 2.0 */ @Description( - "Container-level security attributes. Will override any matching pod-level attributes.") + "Container-level security attributes. Will override any matching Pod-level attributes. " + + "See `kubectl explain pods.spec.containers.securityContext`.") private V1SecurityContext containerSecurityContext = new V1SecurityContext(); /** @@ -191,7 +201,7 @@ class ServerPod extends KubernetesResource { * * @since 2.0 */ - @Description("Additional volumes to be created in the server pod.") + @Description("Additional volumes to be created in the server Pod. See `kubectl explain pods.spec.volumes`.") private final List volumes = new ArrayList<>(); /** @@ -199,7 +209,8 @@ class ServerPod extends KubernetesResource { * * @since 2.0 */ - @Description("Additional volume mounts for the server pod.") + @Description("Additional volume mounts for the container running a WebLogic Server instance. " + + "See `kubectl explain pods.spec.containers.volumeMounts`.") private final List volumeMounts = new ArrayList<>(); private static void copyValues(V1ResourceRequirements to, V1ResourceRequirements from) { @@ -815,4 +826,4 @@ public int hashCode() { .append(serviceAccountName) .toHashCode(); } -} \ No newline at end of file +} diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerService.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerService.java index b4ba622ae6f..dd82ce7d813 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerService.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerService.java @@ -15,7 +15,7 @@ public class ServerService extends KubernetesResource { @SerializedName("precreateService") @Description( - "If true, operator will create server services even for server instances without running pods.") + "If true, the operator will create Services even for Managed Server instances without running Pods.") private Boolean isPrecreateService; void fillInFrom(ServerService serverService1) { diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerStatus.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerStatus.java index 63451995ae2..ee7d76125d8 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerStatus.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/ServerStatus.java @@ -20,29 +20,29 @@ /** ServerStatus describes the current status of a specific WebLogic Server. */ public class ServerStatus implements Comparable, PatchableComponent { - @Description("WebLogic Server name. Required.") + @Description("WebLogic Server instance name.") @Expose @NotNull private String serverName; - @Description("Current state of this WebLogic Server. Required.") + @Description("Current state of this WebLogic Server instance.") @Expose @NotNull private String state; - @Description("Desired state of this WebLogic Server. Values are RUNNING, ADMIN, or SHUTDOWN.") + @Description("Desired state of this WebLogic Server instance. Values are RUNNING, ADMIN, or SHUTDOWN.") @Expose private String desiredState; - @Description("WebLogic cluster name, if the server is part of a cluster.") + @Description("WebLogic cluster name, if the server is a member of a cluster.") @Expose private String clusterName; - @Description("Name of node that is hosting the Pod containing this WebLogic Server.") + @Description("Name of Node that is hosting the Pod containing this WebLogic Server instance.") @Expose private String nodeName; - @Description("Current status and health of a specific WebLogic Server.") + @Description("Current status and health of a specific WebLogic Server instance.") @Expose @Valid private ServerHealth health; diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Shutdown.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Shutdown.java index c31da2ed79b..731cac52344 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Shutdown.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Shutdown.java @@ -14,26 +14,25 @@ import static oracle.kubernetes.operator.KubernetesConstants.GRACEFUL_SHUTDOWNTYPE; -@Description("Shutdown describes the configuration for shutting down a server instance.") public class Shutdown { // Default timeout must stay 30 seconds to match Kubernetes default public static final Long DEFAULT_TIMEOUT = 30L; public static final Boolean DEFAULT_IGNORESESSIONS = Boolean.FALSE; @Description( - "Tells the operator how to shutdown server instances. Not required." + "Specifies how the operator will shut down server instances." + " Defaults to graceful shutdown.") @EnumClass(ShutdownType.class) private String shutdownType; @Description( "For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting down" - + " the server. Not required. Defaults to 30 seconds.") + + " the server. Defaults to 30 seconds.") private Long timeoutSeconds; @Description( "For graceful shutdown only, indicates to ignore pending HTTP sessions during in-flight work handling." - + " Not required. Defaults to false.") + + " Defaults to false.") private Boolean ignoreSessions; public Shutdown() { diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/SubsystemHealth.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/SubsystemHealth.java index fe4eb0e3afb..7263ac825a8 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/SubsystemHealth.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/SubsystemHealth.java @@ -21,12 +21,12 @@ /** SubsystemHealth describes the current health of a specific subsystem. */ public class SubsystemHealth implements Comparable, PatchableComponent { - @Description("Server health of this WebLogic Server. Required.") + @Description("Server health of this WebLogic Server instance.") @Expose @NotNull private String health; - @Description("Name of subsystem providing symptom information. Required.") + @Description("Name of subsystem providing symptom information.") @Expose @NotNull private String subsystemName; diff --git a/operator/src/main/resources/Operator.properties b/operator/src/main/resources/Operator.properties index 1c0ace9ff95..b363f437353 100644 --- a/operator/src/main/resources/Operator.properties +++ b/operator/src/main/resources/Operator.properties @@ -11,7 +11,7 @@ WLSKO-0009=Created Network Policy: {0} WLSKO-0010=Service Details: {0} WLSKO-0011=Creating Service in namespace {0} with details: {1} WLSKO-0012=Create Custom Resource Definition: {0} -WLSKO-0013=Domain status update ignored; rechecking CRD +WLSKO-0013= WLSKO-0014=Listing WebLogic Domains WLSKO-0015=WebLogic Domain information: {0} WLSKO-0016=There are {0} domains in namespace {1} @@ -54,9 +54,10 @@ WLSKO-0052=Existing managed server Service is correct for WebLogic domain with U WLSKO-0053=Creating cluster Service for WebLogic domain with UID: {0}. Cluster name: {1}. WLSKO-0054=Replacing cluster Service for WebLogic domain with UID: {0}. Cluster name: {1}. WLSKO-0055=Existing cluster Service is correct for WebLogic domain with UID: {0}. Cluster name: {1}. -WLSKO-0056=Creating domain config map, {0}, for namespace: {1}. -WLSKO-0057=Replacing domain config map, {0}, for namespace: {1}. -WLSKO-0058=Existing domain config map, {0}, is correct for namespace: {1}. +WLSKO-0056=Creating config map, {0}, for namespace: {1}. +WLSKO-0057=Replacing config map, {0}, for namespace: {1}. +WLSKO-0172=Patching config map, {0}, for namespace: {1}. +WLSKO-0058=Existing config map, {0}, is correct for namespace: {1}. WLSKO-0059=Cannot create Token Review - not authorized. WLSKO-0060=Cannot create Network Policy - not authorized. WLSKO-0061=Cannot delete Network Policy - not authorized. @@ -160,8 +161,16 @@ WLSKO-0154=Job {0} failed due to reason: DeadlineExceeded. \ The job may be retried by the operator up to {3} \ times with longer ActiveDeadlineSeconds value in each subsequent retry. \ Use tuning parameter 'domainPresenceFailureRetryMaxCount' to configure max retries. +WLSKO-0155=Unexpected exception, {0}, while parsing introspect job log [{1}]. WLSKO-0156=Access denied for operator service account for operation {0} on resource {1} in namespace {2}. WLSKO-0157=Domain {0} is not valid: {1} +WLSKO-0158=Expected CustomResourceDefinition domains.weblogic.oracle not found. But the operator's service \ + account does not have the permission to {0}. Create or update the CRD and re-install the operator. +WLSKO-0159=Skipped the verification of the CustomResourceDefinition domains.weblogic.oracle because \ + the operator's service account does not have the permission to access the existing CustomResourceDefinition. +WLSKO-0160=Verifying that operator service account can perform operation {1} on required resource {0}. +WLSKO-0161=Skipped the creation of the namespace watcher because the operator's service account \ + does not have the permission to access the namespaces in the Kubernetes cluster. WLSKO-162=Unable to read internal certificate at path {0} WLSKO-163=No external certificate configured for REST endpoint. Endpoint will be disabled. WLSKO-0164=Replica request of {0} less than the minimum dynamic server count of {1} configured for cluster {2} @@ -172,6 +181,12 @@ WLSKO-0168={0}: {1} WLSKO-0169=Job {0} is created at {1} WLSKO-0170=HTTP timeout: exception {0}. WLSKO-0171=Namespace {0} is in operator's target namespaces list but doesn't exist +WLSKO-0173=Replace custom resource definition failed: {0} +WLSKO-0174=Create custom resource definition failed: {0} +WLSKO-0175=Job {0} in namespace {1} failed with status {2}. Check log messages \ + copied from the introspector pod {3} log for additional information. +WLSKO-0176=Job {1} in namespace {0} failed, job details are {2} +WLSKO-0177=Pod {0} in namespace {1} failed, the pod status is {2} # Domain status messages @@ -181,12 +196,15 @@ WLSDO-0003=No volume mount contains path for log home ''{0}'' WLSDO-0004=The mount path ''{0}'', in entry ''{1}'' of domain resource ''additionalVolumeMounts'', is not valid WLSDO-0005=Environment {0} {1}, specified under ''{2}'', {3} reserved for use by the operator WLSDO-0006=Bad namespace for weblogicCredentialsSecret: ''{0}''. If specified, must be same as domain namespace. +WLSDO-0007=Configuration overridesConfigMap ''{0}'' is not supported if ''domainHomeSourceType'' is configured as ''FromModel''. +WLSDO-0008=ConfigMap ''{0}'' specified by ''spec.configuration.model.configMap'' not found in namespace ''{1}''. +WLSDO-0009=The secret ''{0}'' must be specified if ''domainHomeSourceType'' is configured as ''FromModel''. +WLSDO-0010=The secret ''{0}'' must be specified if ''domainHomeSourceType'' is configured as ''FromModel'' and spec.configuration.model.domainType is configured as ''JRF''. WLSDO-0011=Cluster ''{0}'' specified in the domain resource does not exist in the WebLogic domain home configuration. WLSDO-0012=Managed Server ''{0}'' specified in the domain resource does not exist in the WebLogic domain home configuration. WLSDO-0013=Istio is enabled and the domain resource specified to expose channel {0} in the adminServices section. The channel name default, \ default-admin, default-secure are internal to the WebLogic Kubernetes Operator. Please create the network channel with a different name in the WebLogic Domain before \ exposing it. - oneEnvVar=variable multipleEnvVars=variables singularToBe=is diff --git a/operator/src/main/resources/schema/domain-crd-schemav6-240.yaml b/operator/src/main/resources/schema/domain-crd-schemav7-260.yaml similarity index 62% rename from operator/src/main/resources/schema/domain-crd-schemav6-240.yaml rename to operator/src/main/resources/schema/domain-crd-schemav7-260.yaml index 45b251d429c..cb7a88fd36c 100644 --- a/operator/src/main/resources/schema/domain-crd-schemav6-240.yaml +++ b/operator/src/main/resources/schema/domain-crd-schemav7-260.yaml @@ -12,21 +12,38 @@ openAPIV3Schema: description: The state in which the server is to be started. Use ADMIN if server should start in the admin state. Defaults to RUNNING. enum: - - RUNNING - - ADMIN + - RUNNING + - ADMIN image: type: string description: The WebLogic Docker image; required when domainHomeInImage is true; otherwise, defaults to container-registry.oracle.com/middleware/weblogic:12.2.1.4. imagePullPolicy: type: string - description: The image pull policy for the WebLogic Docker image. - Legal values are Always, Never and IfNotPresent. Defaults to Always - if image ends in :latest, IfNotPresent otherwise. + description: The image pull policy for the WebLogic Docker image. Legal + values are Always, Never and IfNotPresent. Defaults to Always if image + ends in :latest, IfNotPresent otherwise. enum: - - Always - - Never - - IfNotPresent + - Always + - Never + - IfNotPresent + configuration: + type: object + description: Properties affecting the WebLogic domain configuration. + properties: + istio: + type: object + description: The Istio service mesh integration settings + properties: + readinessPort: + type: number + description: The WebLogic readiness port for Istio. Defaults + to 8888. Not required. + enabled: + type: boolean + description: True, if this domain is deployed under an Istio + service mesh. Defaults to true when the 'istio' element is + included. Not required. replicas: type: number description: The number of managed servers to run in any cluster that @@ -34,17 +51,16 @@ openAPIV3Schema: minimum: 0.0 configOverrideSecrets: type: array - description: A list of names of the secrets for optional WebLogic - configuration overrides. + description: A list of names of the secrets for optional WebLogic configuration + overrides. items: type: string imagePullSecrets: type: array - description: A list of image pull secrets for the WebLogic Docker - image. + description: A list of image pull secrets for the WebLogic Docker image. items: - description: LocalObjectReference contains enough information to - let you locate the referenced object inside the same namespace. + description: LocalObjectReference contains enough information to let + you locate the referenced object inside the same namespace. type: object properties: name: @@ -60,31 +76,14 @@ openAPIV3Schema: description: Domain unique identifier. Must be unique across the Kubernetes cluster. Not required. Defaults to the value of metadata.name. pattern: ^[a-z0-9-.]{1,253}$ - experimental: - type: object - description: Experimental feature configurations. - properties: - istio: - type: object - description: Istio service mesh integration configuration. - properties: - readinessPort: - type: number - description: The WebLogic readiness port for Istio. Defaults - to 8888. Not required. - enabled: - type: boolean - description: True, if this domain is deployed under an Istio - service mesh. Defaults to true when the 'istio' element - is included. Not required. serverStartPolicy: type: string - description: The strategy for deciding whether to start a server. - Legal values are ADMIN_ONLY, NEVER, or IF_NEEDED. + description: The strategy for deciding whether to start a server. Legal + values are ADMIN_ONLY, NEVER, or IF_NEEDED. enum: - - NEVER - - IF_NEEDED - - ADMIN_ONLY + - NEVER + - IF_NEEDED + - ADMIN_ONLY restartVersion: type: string description: If present, every time this value is updated the operator @@ -92,17 +91,17 @@ openAPIV3Schema: dataHome: type: string description: 'An optional, in-pod location for data storage of default - and custom file stores. If dataHome is not specified or its value - is either not set or empty (e.g. dataHome: "") then the data storage - directories are determined from the WebLogic domain home configuration.' + and custom file stores. If dataHome is not specified or its value + is either not set or empty (e.g. dataHome: "") then the data storage + directories are determined from the WebLogic domain home configuration.' configOverrides: type: string description: The name of the config map for optional WebLogic configuration overrides. serverService: type: object - description: Customization affecting ClusterIP Kubernetes services - for WebLogic Server instances. + description: Customization affecting ClusterIP Kubernetes services for + WebLogic Server instances. properties: precreateService: type: boolean @@ -117,8 +116,8 @@ openAPIV3Schema: type: object additionalProperties: type: string - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. + description: The labels to be attached to generated resources. The + label names must not start with 'weblogic.'. domainHome: type: string description: The folder for the WebLogic Domain. Not required. Defaults @@ -128,8 +127,8 @@ openAPIV3Schema: logHomeEnabled: type: boolean description: 'Specified whether the log home folder is enabled. Not - required. Defaults to true if domainHomeInImage is false. Defaults - to false if domainHomeInImage is true. ' + required. Defaults to true if domainHomeInImage is false. Defaults + to false if domainHomeInImage is true. ' webLogicCredentialsSecret: type: object description: The name of a pre-created Kubernetes secret, in the domain's @@ -138,8 +137,8 @@ openAPIV3Schema: properties: name: type: string - description: Name is unique within a namespace to reference a - secret resource. + description: Name is unique within a namespace to reference a secret + resource. namespace: type: string description: Namespace defines the space within which the secret @@ -151,11 +150,10 @@ openAPIV3Schema: serverStartState: type: string description: The state in which the server is to be started. Use - ADMIN if server should start in the admin state. Defaults to - RUNNING. + ADMIN if server should start in the admin state. Defaults to RUNNING. enum: - - RUNNING - - ADMIN + - RUNNING + - ADMIN serverService: type: object description: Customization affecting ClusterIP Kubernetes services @@ -163,8 +161,8 @@ openAPIV3Schema: properties: precreateService: type: boolean - description: If true, operator will create server services - even for server instances without running pods. + description: If true, operator will create server services even + for server instances without running pods. annotations: type: object additionalProperties: @@ -184,8 +182,8 @@ openAPIV3Schema: type: string description: NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply - schedules this pod onto that node, assuming that it fits - resource requirements. + schedules this pod onto that node, assuming that it fits resource + requirements. livenessProbe: type: object description: Settings for the liveness probe associated with @@ -205,26 +203,25 @@ openAPIV3Schema: readinessGates: type: array description: 'If specified, all readiness gates will be evaluated - for pod readiness. A pod is ready when all its containers - are ready AND all conditions specified in the readiness - gates have status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + for pod readiness. A pod is ready when all its containers + are ready AND all conditions specified in the readiness gates + have status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' items: - description: PodReadinessGate contains the reference to - a pod condition + description: PodReadinessGate contains the reference to a + pod condition type: object properties: conditionType: - description: ConditionType refers to a condition in - the pod's condition list with matching type. + description: ConditionType refers to a condition in the + pod's condition list with matching type. type: string required: - - conditionType + - conditionType serviceAccountName: type: string - description: Name of the ServiceAccount to be used to run - this pod. If it is not set, default ServiceAccount will - be used. The ServiceAccount has to exist at the time the - pod is created. + description: Name of the ServiceAccount to be used to run this + pod. If it is not set, default ServiceAccount will be used. + The ServiceAccount has to exist at the time the pod is created. podSecurityContext: type: object description: Pod-level security attributes. @@ -234,9 +231,9 @@ openAPIV3Schema: description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence - for that container. + set in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence for + that container. seLinuxOptions: type: object description: SELinuxOptions are the labels to be applied @@ -261,14 +258,13 @@ openAPIV3Schema: fsGroup: type: number description: 'A special supplemental group that applies - to all containers in a pod. Some volume types allow - the Kubelet to change the ownership of that volume to - be owned by the pod: 1. The owning GID will be the - FSGroup 2. The setgid bit is set (new files created - in the volume will be owned by FSGroup) 3. The permission - bits are OR''d with rw-rw---- If unset, the Kubelet - will not modify the ownership and permissions of any - volume.' + to all containers in a pod. Some volume types allow the + Kubelet to change the ownership of that volume to be owned + by the pod: 1. The owning GID will be the FSGroup 2. + The setgid bit is set (new files created in the volume + will be owned by FSGroup) 3. The permission bits are OR''d + with rw-rw---- If unset, the Kubelet will not modify + the ownership and permissions of any volume.' windowsOptions: type: object description: WindowsSecurityContextOptions contain Windows-specific @@ -276,12 +272,12 @@ openAPIV3Schema: properties: gmsaCredentialSpec: type: string - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named + by the GMSACredentialSpecName field. This field is + alpha-level and is only honored by servers that enable + the WindowsGMSA feature flag. runAsUserName: type: string description: The UserName in Windows to run the entrypoint @@ -289,13 +285,13 @@ openAPIV3Schema: in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and - it is only honored by servers that enable the WindowsRunAsUserName + takes precedence. This field is alpha-level and it + is only honored by servers that enable the WindowsRunAsUserName feature flag. gmsaCredentialSpecName: type: string - description: GMSACredentialSpecName is the name of - the GMSA credential spec to use. This field is alpha-level + description: GMSACredentialSpecName is the name of the + GMSA credential spec to use. This field is alpha-level and is only honored by servers that enable the WindowsGMSA feature flag. supplementalGroups: @@ -309,28 +305,27 @@ openAPIV3Schema: runAsGroup: type: number description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in SecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext + process. Uses runtime default if unset. May also be set + in SecurityContext. If set in both SecurityContext and + PodSecurityContext, the value specified in SecurityContext takes precedence for that container. runAsNonRoot: type: boolean - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if it - does. If unset or false, no such validation will be - performed. May also be set in SecurityContext. If set - in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. + description: Indicates that the container must run as a + non-root user. If true, the Kubelet will validate the + image at runtime to ensure that it does not run as UID + 0 (root) and fail to start the container if it does. If + unset or false, no such validation will be performed. + May also be set in SecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. sysctls: type: array - description: Sysctls hold a list of namespaced sysctls - used for the pod. Pods with unsupported sysctls (by - the container runtime) might fail to launch. + description: Sysctls hold a list of namespaced sysctls used + for the pod. Pods with unsupported sysctls (by the container + runtime) might fail to launch. items: - description: Sysctl defines a kernel parameter to be - set + description: Sysctl defines a kernel parameter to be set type: object properties: name: @@ -340,17 +335,16 @@ openAPIV3Schema: description: Value of a property to set type: string required: - - name - - value + - name + - value priorityClassName: type: string description: If specified, indicates the pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating - a PriorityClass object with that name. If not specified, - the pod priority will be default or zero if there is no - default. + a PriorityClass object with that name. If not specified, the + pod priority will be default or zero if there is no default. volumes: type: array description: Additional volumes to be created in the server @@ -362,13 +356,13 @@ openAPIV3Schema: properties: quobyte: description: Represents a Quobyte mount that lasts the - lifetime of a pod. Quobyte volumes do not support - ownership management or SELinux relabeling. + lifetime of a pod. Quobyte volumes do not support ownership + management or SELinux relabeling. type: object properties: volume: - description: Volume is a string that references - an already created Quobyte volume by name. + description: Volume is a string that references an + already created Quobyte volume by name. type: string registry: description: Registry represents a single or multiple @@ -396,8 +390,8 @@ openAPIV3Schema: is no group type: string required: - - registry - - volume + - registry + - volume azureFile: description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. @@ -415,21 +409,19 @@ openAPIV3Schema: description: Share Name type: string required: - - secretName - - shareName + - secretName + - shareName flexVolume: - description: FlexVolume represents a generic volume - resource that is provisioned/attached using an exec - based plugin. + description: FlexVolume represents a generic volume resource + that is provisioned/attached using an exec based plugin. type: object properties: driver: - description: Driver is the name of the driver to - use for this volume. + description: Driver is the name of the driver to use + for this volume. type: string options: - description: 'Optional: Extra command options if - any.' + description: 'Optional: Extra command options if any.' additionalProperties: type: string type: object @@ -441,21 +433,21 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' + ReadOnly here will force the ReadOnly setting in + VolumeMounts.' type: boolean fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". The default - filesystem depends on FlexVolume script. + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. + "ext4", "xfs", "ntfs". The default filesystem depends + on FlexVolume script. type: string required: - - driver + - driver secret: description: Adapts a Secret into a volume. The contents of the target Secret's Data field will be presented @@ -466,33 +458,32 @@ openAPIV3Schema: properties: secretName: description: 'Name of the secret in the pod''s namespace - to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' type: string defaultMode: description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect - the file mode, like fsGroup, and the result can - be other mode bits set.' + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the path + are not affected by this setting. This might be + in conflict with other options that affect the file + mode, like fsGroup, and the result can be other + mode bits set.' type: number optional: description: Specify whether the Secret or its keys must be defined type: boolean items: - description: If unspecified, each key-value pair - in the Data field of the referenced Secret will - be projected into the volume as a file whose name - is the key and content is the value. If specified, + description: If unspecified, each key-value pair in + the Data field of the referenced Secret will be + projected into the volume as a file whose name is + the key and content is the value. If specified, the listed keys will be projected into the specified - paths, and unlisted keys will not be present. - If a key is specified which is not present in - the Secret, the volume setup will error unless - it is marked optional. Paths must be relative - and may not contain the '..' path or start with - '..'. + paths, and unlisted keys will not be present. If + a key is specified which is not present in the Secret, + the volume setup will error unless it is marked + optional. Paths must be relative and may not contain + the '..' path or start with '..'. type: array items: description: Maps a string key to a path within @@ -501,25 +492,24 @@ openAPIV3Schema: properties: mode: description: 'Optional: mode bits to use on - this file, must be a value between 0 and - 0777. If not specified, the volume defaultMode - will be used. This might be in conflict - with other options that affect the file - mode, like fsGroup, and the result can be - other mode bits set.' + this file, must be a value between 0 and 0777. + If not specified, the volume defaultMode will + be used. This might be in conflict with other + options that affect the file mode, like fsGroup, + and the result can be other mode bits set.' type: number path: - description: The relative path of the file - to map the key to. May not be an absolute - path. May not contain the path element '..'. - May not start with the string '..'. + description: The relative path of the file to + map the key to. May not be an absolute path. + May not contain the path element '..'. May + not start with the string '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path projected: description: Represents a projected volume source type: object @@ -528,15 +518,15 @@ openAPIV3Schema: description: list of volume projections type: array items: - description: Projection that may be projected - along with other supported volume types + description: Projection that may be projected along + with other supported volume types type: object properties: downwardAPI: - description: Represents downward API info - for projecting into a projected volume. - Note that this is identical to a downwardAPI - volume source without the default mode. + description: Represents downward API info for + projecting into a projected volume. Note that + this is identical to a downwardAPI volume + source without the default mode. type: object properties: items: @@ -551,112 +541,100 @@ openAPIV3Schema: properties: mode: description: 'Optional: mode bits - to use on this file, must be a - value between 0 and 0777. If not - specified, the volume defaultMode - will be used. This might be in - conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode - bits set.' + to use on this file, must be a value + between 0 and 0777. If not specified, + the volume defaultMode will be used. + This might be in conflict with other + options that affect the file mode, + like fsGroup, and the result can + be other mode bits set.' type: number path: description: 'Required: Path is the - relative path name of the file - to be created. Must not be absolute - or contain the ''..'' path. Must - be utf-8 encoded. The first item - of the relative path must not - start with ''..''' + relative path name of the file to + be created. Must not be absolute + or contain the ''..'' path. Must + be utf-8 encoded. The first item + of the relative path must not start + with ''..''' type: string resourceFieldRef: description: ResourceFieldSelector - represents container resources - (cpu, memory) and their output - format + represents container resources (cpu, + memory) and their output format type: object properties: divisor: - description: 'Quantity is a - fixed-point representation - of a number. It provides convenient - marshaling/unmarshaling in - JSON and YAML, in addition - to String() and AsInt64() - accessors. The serialization - format is: ::= - (Note - that may be empty, - from the "" case in .) - ::= 0 | - 1 | ... | 9 ::= - | - ::= - | . | . - | . ::= - "+" | "-" ::= - | - ::= - | | - ::= Ki | - Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | - "" | k | M | G | T | P | E (Note - that 1024 = 1Ki but 1000 = - 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No - matter which of the three - exponent forms is used, no - quantity may represent a number - greater than 2^63-1 in magnitude, - nor may it have more than - 3 decimal places. Numbers - larger or more precise will - be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) - This may be extended in the - future if we require larger - or smaller quantities. When - a Quantity is parsed from - a string, it will remember - the type of suffix it had, - and will use the same type - again when it is serialized. Before - serializing, Quantity will - be put in "canonical form". - This means that Exponent/suffix - will be adjusted up or down - (with a corresponding increase - or decrease in Mantissa) such - that: a. No precision is - lost b. No fractional digits - will be emitted c. The exponent - (or suffix) is as large as - possible. The sign will be - omitted unless the number - is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER - be internally represented - by a floating point number. - That is the whole point of - this exercise. Non-canonical - values will still parse as - long as they are well formed, - but will be re-emitted in - their canonical form. (So - always use canonical form, - or don''t diff.) This format - is intended to make it difficult - to use these numbers without - writing some sort of special - handling code in the hopes - that that will cause implementors - to also use a fixed point - implementation.' + description: 'Quantity is a fixed-point + representation of a number. + It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition + to String() and AsInt64() accessors. The + serialization format is: ::= + (Note + that may be empty, + from the "" case in .) + ::= 0 | 1 + | ... | 9 ::= + | ::= + | . + | . | . ::= + "+" | "-" ::= + | ::= + | + | ::= + Ki | Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" + | k | M | G | T | P | E (Note + that 1024 = 1Ki but 1000 = 1k; + I didn''t choose the capitalization.) + ::= "e" + | "E" No matter + which of the three exponent + forms is used, no quantity may + represent a number greater than + 2^63-1 in magnitude, nor may + it have more than 3 decimal + places. Numbers larger or more + precise will be capped or rounded + up. (E.g.: 0.1m will rounded + up to 1m.) This may be extended + in the future if we require + larger or smaller quantities. When + a Quantity is parsed from a + string, it will remember the + type of suffix it had, and will + use the same type again when + it is serialized. Before serializing, + Quantity will be put in "canonical + form". This means that Exponent/suffix + will be adjusted up or down + (with a corresponding increase + or decrease in Mantissa) such + that: a. No precision is lost b. + No fractional digits will be + emitted c. The exponent (or + suffix) is as large as possible. + The sign will be omitted unless + the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER + be internally represented by + a floating point number. That + is the whole point of this exercise. Non-canonical + values will still parse as long + as they are well formed, but + will be re-emitted in their + canonical form. (So always use + canonical form, or don''t diff.) This + format is intended to make it + difficult to use these numbers + without writing some sort of + special handling code in the + hopes that that will cause implementors + to also use a fixed point implementation.' type: object properties: number: @@ -664,40 +642,39 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource - to select' + to select' type: string containerName: description: 'Container name: - required for volumes, optional - for env vars' + required for volumes, optional + for env vars' type: string required: - - resource + - resource fieldRef: - description: ObjectFieldSelector - selects an APIVersioned field - of an object. + description: ObjectFieldSelector selects + an APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the - schema the FieldPath is written - in terms of, defaults to "v1". + description: Version of the schema + the FieldPath is written in + terms of, defaults to "v1". type: string fieldPath: description: Path of the field - to select in the specified - API version. + to select in the specified API + version. type: string required: - - fieldPath + - fieldPath required: - - path + - path configMap: description: Adapts a ConfigMap into a projected volume. The contents of the target ConfigMap's @@ -706,13 +683,13 @@ openAPIV3Schema: field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical - to a configmap volume source without the - default mode. + to a configmap volume source without the default + mode. type: object properties: name: description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap @@ -721,61 +698,58 @@ openAPIV3Schema: items: description: If unspecified, each key-value pair in the Data field of the referenced - ConfigMap will be projected into the - volume as a file whose name is the key - and content is the value. If specified, - the listed keys will be projected into - the specified paths, and unlisted keys - will not be present. If a key is specified - which is not present in the ConfigMap, - the volume setup will error unless it - is marked optional. Paths must be relative - and may not contain the '..' path or - start with '..'. + ConfigMap will be projected into the volume + as a file whose name is the key and content + is the value. If specified, the listed + keys will be projected into the specified + paths, and unlisted keys will not be present. + If a key is specified which is not present + in the ConfigMap, the volume setup will + error unless it is marked optional. Paths + must be relative and may not contain the + '..' path or start with '..'. type: array items: - description: Maps a string key to a - path within a volume. + description: Maps a string key to a path + within a volume. type: object properties: mode: description: 'Optional: mode bits - to use on this file, must be a - value between 0 and 0777. If not - specified, the volume defaultMode - will be used. This might be in - conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode - bits set.' + to use on this file, must be a value + between 0 and 0777. If not specified, + the volume defaultMode will be used. + This might be in conflict with other + options that affect the file mode, + like fsGroup, and the result can + be other mode bits set.' type: number path: description: The relative path of the file to map the key to. May not be an absolute path. May not - contain the path element '..'. - May not start with the string - '..'. + contain the path element '..'. May + not start with the string '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path secret: description: Adapts a secret into a projected volume. The contents of the target Secret's Data field will be presented in a projected volume as files using the keys in the Data - field as the file names. Note that this - is identical to a secret volume source without + field as the file names. Note that this is + identical to a secret volume source without the default mode. type: object properties: name: description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the Secret @@ -785,85 +759,80 @@ openAPIV3Schema: description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume - as a file whose name is the key and - content is the value. If specified, - the listed keys will be projected into - the specified paths, and unlisted keys - will not be present. If a key is specified - which is not present in the Secret, - the volume setup will error unless it - is marked optional. Paths must be relative - and may not contain the '..' path or - start with '..'. + as a file whose name is the key and content + is the value. If specified, the listed + keys will be projected into the specified + paths, and unlisted keys will not be present. + If a key is specified which is not present + in the Secret, the volume setup will error + unless it is marked optional. Paths must + be relative and may not contain the '..' + path or start with '..'. type: array items: - description: Maps a string key to a - path within a volume. + description: Maps a string key to a path + within a volume. type: object properties: mode: description: 'Optional: mode bits - to use on this file, must be a - value between 0 and 0777. If not - specified, the volume defaultMode - will be used. This might be in - conflict with other options that - affect the file mode, like fsGroup, - and the result can be other mode - bits set.' + to use on this file, must be a value + between 0 and 0777. If not specified, + the volume defaultMode will be used. + This might be in conflict with other + options that affect the file mode, + like fsGroup, and the result can + be other mode bits set.' type: number path: description: The relative path of the file to map the key to. May not be an absolute path. May not - contain the path element '..'. - May not start with the string - '..'. + contain the path element '..'. May + not start with the string '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path serviceAccountToken: - description: ServiceAccountTokenProjection - represents a projected service account token - volume. This projection can be used to insert - a service account token into the pods runtime - filesystem for use against APIs (Kubernetes - API Server or otherwise). + description: ServiceAccountTokenProjection represents + a projected service account token volume. + This projection can be used to insert a service + account token into the pods runtime filesystem + for use against APIs (Kubernetes API Server + or otherwise). type: object properties: path: - description: Path is the path relative - to the mount point of the file to project + description: Path is the path relative to + the mount point of the file to project the token into. type: string audience: - description: Audience is the intended - audience of the token. A recipient of - a token must identify itself with an - identifier specified in the audience - of the token, and otherwise should reject - the token. The audience defaults to - the identifier of the apiserver. + description: Audience is the intended audience + of the token. A recipient of a token must + identify itself with an identifier specified + in the audience of the token, and otherwise + should reject the token. The audience + defaults to the identifier of the apiserver. type: string expirationSeconds: - description: ExpirationSeconds is the - requested duration of validity of the - service account token. As the token - approaches expiration, the kubelet volume - plugin will proactively rotate the service - account token. The kubelet will start - trying to rotate the token if the token - is older than 80 percent of its time - to live or if the token is older than - 24 hours.Defaults to 1 hour and must - be at least 10 minutes. + description: ExpirationSeconds is the requested + duration of validity of the service account + token. As the token approaches expiration, + the kubelet volume plugin will proactively + rotate the service account token. The + kubelet will start trying to rotate the + token if the token is older than 80 percent + of its time to live or if the token is + older than 24 hours.Defaults to 1 hour + and must be at least 10 minutes. type: number required: - - path + - path defaultMode: description: Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories @@ -873,16 +842,16 @@ openAPIV3Schema: can be other mode bits set. type: number required: - - sources + - sources cephfs: - description: Represents a Ceph Filesystem mount that - lasts the lifetime of a pod Cephfs volumes do not - support ownership management or SELinux relabeling. + description: Represents a Ceph Filesystem mount that lasts + the lifetime of a pod Cephfs volumes do not support + ownership management or SELinux relabeling. type: object properties: path: description: 'Optional: Used as the mounted root, - rather than the full Ceph tree, default is /' + rather than the full Ceph tree, default is /' type: string secretRef: description: LocalObjectReference contains enough @@ -892,30 +861,30 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string secretFile: description: 'Optional: SecretFile is the path to - key ring for User, default is /etc/ceph/user.secret - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + ReadOnly here will force the ReadOnly setting in + VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: boolean user: description: 'Optional: User is the rados user name, - default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string monitors: - description: 'Required: Monitors is a collection - of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + description: 'Required: Monitors is a collection of + Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: array items: type: string required: - - monitors + - monitors scaleIO: description: ScaleIOVolumeSource represents a persistent ScaleIO volume @@ -926,22 +895,22 @@ openAPIV3Schema: in ScaleIO. type: string protectionDomain: - description: The name of the ScaleIO Protection - Domain for the configured storage. + description: The name of the ScaleIO Protection Domain + for the configured storage. type: string sslEnabled: description: Flag to enable/disable SSL communication with Gateway, default false type: boolean storageMode: - description: Indicates whether the storage for a - volume should be ThickProvisioned or ThinProvisioned. - Default is ThinProvisioned. + description: Indicates whether the storage for a volume + should be ThickProvisioned or ThinProvisioned. Default + is ThinProvisioned. type: string volumeName: description: The name of a volume already created - in the ScaleIO system that is associated with - this volume source. + in the ScaleIO system that is associated with this + volume source. type: string secretRef: description: LocalObjectReference contains enough @@ -951,30 +920,28 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Default is - "xfs". + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. + "ext4", "xfs", "ntfs". Default is "xfs". type: string storagePool: - description: The ScaleIO Storage Pool associated - with the protection domain. + description: The ScaleIO Storage Pool associated with + the protection domain. type: string gateway: - description: The host address of the ScaleIO API - Gateway. + description: The host address of the ScaleIO API Gateway. type: string required: - - gateway - - secretRef - - system + - gateway + - secretRef + - system emptyDir: description: Represents an empty directory for a pod. Empty directory volumes support ownership management @@ -983,53 +950,51 @@ openAPIV3Schema: properties: sizeLimit: description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and - AsInt64() accessors. The serialization format - is: ::= (Note - that may be empty, from the "" case in - .) ::= 0 | 1 | ... - | 9 ::= | - ::= | . - | . | . ::= - "+" | "-" ::= | - ::= | - | ::= Ki | Mi | - Gi | Ti | Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T | - P | E (Note that 1024 = 1Ki but 1000 = 1k; I - didn''t choose the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms is used, - no quantity may represent a number greater than - 2^63-1 in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more precise - will be capped or rounded up. (E.g.: 0.1m will - rounded up to 1m.) This may be extended in the - future if we require larger or smaller quantities. When - a Quantity is parsed from a string, it will remember - the type of suffix it had, and will use the same - type again when it is serialized. Before serializing, - Quantity will be put in "canonical form". This - means that Exponent/suffix will be adjusted up - or down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision is lost b. - No fractional digits will be emitted c. The - exponent (or suffix) is as large as possible. - The sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole - point of this exercise. Non-canonical values - will still parse as long as they are well formed, - but will be re-emitted in their canonical form. - (So always use canonical form, or don''t diff.) This - format is intended to make it difficult to use - these numbers without writing some sort of special - handling code in the hopes that that will cause - implementors to also use a fixed point implementation.' + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and AsInt64() + accessors. The serialization format is: ::= + (Note that may + be empty, from the "" case in .) ::= + 0 | 1 | ... | 9 ::= | + ::= | + . | . | . ::= + "+" | "-" ::= | + ::= | + | ::= Ki | Mi | Gi + | Ti | Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T | P + | E (Note that 1024 = 1Ki but 1000 = 1k; I didn''t + choose the capitalization.) ::= + "e" | "E" No matter + which of the three exponent forms is used, no quantity + may represent a number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal places. Numbers + larger or more precise will be capped or rounded + up. (E.g.: 0.1m will rounded up to 1m.) This may + be extended in the future if we require larger or + smaller quantities. When a Quantity is parsed from + a string, it will remember the type of suffix it + had, and will use the same type again when it is + serialized. Before serializing, Quantity will be + put in "canonical form". This means that Exponent/suffix + will be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such that: a. + No precision is lost b. No fractional digits will + be emitted c. The exponent (or suffix) is as large + as possible. The sign will be omitted unless the + number is negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole point + of this exercise. Non-canonical values will still + parse as long as they are well formed, but will + be re-emitted in their canonical form. (So always + use canonical form, or don''t diff.) This format + is intended to make it difficult to use these numbers + without writing some sort of special handling code + in the hopes that that will cause implementors to + also use a fixed point implementation.' type: object properties: number: @@ -1037,74 +1002,72 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI medium: - description: 'What type of storage medium should - back this directory. The default is "" which means - to use the node''s default medium. Must be an - empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + description: 'What type of storage medium should back + this directory. The default is "" which means to + use the node''s default medium. Must be an empty + string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' type: string glusterfs: - description: Represents a Glusterfs mount that lasts - the lifetime of a pod. Glusterfs volumes do not support + description: Represents a Glusterfs mount that lasts the + lifetime of a pod. Glusterfs volumes do not support ownership management or SELinux relabeling. type: object properties: path: - description: 'Path is the Glusterfs volume path. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + description: 'Path is the Glusterfs volume path. More + info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string endpoints: - description: 'EndpointsName is the endpoint name - that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + description: 'EndpointsName is the endpoint name that + details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string readOnly: description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. - Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + volume to be mounted with read-only permissions. + Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: boolean required: - - endpoints - - path + - endpoints + - path gcePersistentDisk: description: Represents a Persistent Disk resource in - Google Compute Engine. A GCE PD must exist before - mounting to a container. The disk must also be in - the same GCE project and zone as the kubelet. A GCE - PD can only be mounted as read/write once or read-only - many times. GCE PDs support ownership management and - SELinux relabeling. + Google Compute Engine. A GCE PD must exist before mounting + to a container. The disk must also be in the same GCE + project and zone as the kubelet. A GCE PD can only be + mounted as read/write once or read-only many times. + GCE PDs support ownership management and SELinux relabeling. type: object properties: partition: description: 'The partition in the volume that you - want to mount. If omitted, the default is to mount - by volume name. Examples: For volume /dev/sda1, - you specify the partition as "1". Similarly, the - volume partition for /dev/sda is "0" (or you can - leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + want to mount. If omitted, the default is to mount + by volume name. Examples: For volume /dev/sda1, + you specify the partition as "1". Similarly, the + volume partition for /dev/sda is "0" (or you can + leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: number readOnly: description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More - info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + setting in VolumeMounts. Defaults to false. More + info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: boolean pdName: - description: 'Unique name of the PD resource in - GCE. Used to identify the disk in GCE. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + description: 'Unique name of the PD resource in GCE. + Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + description: 'Filesystem type of the volume that you + want to mount. Tip: Ensure that the filesystem type + is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be + "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string required: - - pdName + - pdName photonPersistentDisk: description: Represents a Photon Controller persistent disk resource. @@ -1115,16 +1078,16 @@ openAPIV3Schema: persistent disk type: string fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. + "ext4", "xfs", "ntfs". Implicitly inferred to be + "ext4" if unspecified. type: string required: - - pdID + - pdID azureDisk: - description: AzureDisk represents an Azure Data Disk - mount on the host and bind mount to the pod. + description: AzureDisk represents an Azure Data Disk mount + on the host and bind mount to the pod. type: object properties: diskName: @@ -1133,10 +1096,10 @@ openAPIV3Schema: type: string kind: description: 'Expected values Shared: multiple blob - disks per storage account Dedicated: single blob - disk per storage account Managed: azure managed - data disk (only in managed availability set). - defaults to shared' + disks per storage account Dedicated: single blob + disk per storage account Managed: azure managed + data disk (only in managed availability set). defaults + to shared' type: string readOnly: description: Defaults to false (read/write). ReadOnly @@ -1144,26 +1107,26 @@ openAPIV3Schema: type: boolean cachingMode: description: 'Host Caching mode: None, Read Only, - Read Write.' + Read Write.' type: string diskURI: description: The URI the data disk in the blob storage type: string fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. + "ext4", "xfs", "ntfs". Implicitly inferred to be + "ext4" if unspecified. type: string required: - - diskName - - diskURI + - diskName + - diskURI cinder: - description: Represents a cinder volume resource in - Openstack. A Cinder volume must exist before mounting - to a container. The volume must also be in the same - region as the kubelet. Cinder volumes support ownership - management and SELinux relabeling. + description: Represents a cinder volume resource in Openstack. + A Cinder volume must exist before mounting to a container. + The volume must also be in the same region as the kubelet. + Cinder volumes support ownership management and SELinux + relabeling. type: object properties: secretRef: @@ -1174,66 +1137,64 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string volumeID: description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + ReadOnly here will force the ReadOnly setting in + VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: boolean fsType: - description: 'Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://examples.k8s.io/mysql-cinder-pd/README.md' + description: 'Filesystem type to mount. Must be a + filesystem type supported by the host operating + system. Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://examples.k8s.io/mysql-cinder-pd/README.md' type: string required: - - volumeID + - volumeID downwardAPI: description: DownwardAPIVolumeSource represents a volume - containing downward API info. Downward API volumes - support ownership management and SELinux relabeling. + containing downward API info. Downward API volumes support + ownership management and SELinux relabeling. type: object properties: defaultMode: description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect - the file mode, like fsGroup, and the result can - be other mode bits set.' + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the path + are not affected by this setting. This might be + in conflict with other options that affect the file + mode, like fsGroup, and the result can be other + mode bits set.' type: number items: description: Items is a list of downward API volume file type: array items: - description: DownwardAPIVolumeFile represents - information to create the file containing the - pod field + description: DownwardAPIVolumeFile represents information + to create the file containing the pod field type: object properties: mode: description: 'Optional: mode bits to use on - this file, must be a value between 0 and - 0777. If not specified, the volume defaultMode - will be used. This might be in conflict - with other options that affect the file - mode, like fsGroup, and the result can be - other mode bits set.' + this file, must be a value between 0 and 0777. + If not specified, the volume defaultMode will + be used. This might be in conflict with other + options that affect the file mode, like fsGroup, + and the result can be other mode bits set.' type: number path: description: 'Required: Path is the relative - path name of the file to be created. Must - not be absolute or contain the ''..'' path. - Must be utf-8 encoded. The first item of - the relative path must not start with ''..''' + path name of the file to be created. Must + not be absolute or contain the ''..'' path. + Must be utf-8 encoded. The first item of the + relative path must not start with ''..''' type: string resourceFieldRef: description: ResourceFieldSelector represents @@ -1243,64 +1204,62 @@ openAPIV3Schema: properties: divisor: description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the - "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | - Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M - | G | T | P | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms - is used, no quantity may represent a - number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may - be extended in the future if we require - larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type again - when it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. - No fractional digits will be emitted c. - The exponent (or suffix) is as large - as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always - use canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing - some sort of special handling code in - the hopes that that will cause implementors - to also use a fixed point implementation.' + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= | + ::= + | | ::= + Ki | Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | + G | T | P | E (Note that 1024 = 1Ki + but 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No matter which + of the three exponent forms is used, no + quantity may represent a number greater + than 2^63-1 in magnitude, nor may it have + more than 3 decimal places. Numbers larger + or more precise will be capped or rounded + up. (E.g.: 0.1m will rounded up to 1m.) + This may be extended in the future if + we require larger or smaller quantities. When + a Quantity is parsed from a string, it + will remember the type of suffix it had, + and will use the same type again when + it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will be + adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. No + fractional digits will be emitted c. + The exponent (or suffix) is as large as + possible. The sign will be omitted unless + the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note that + the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always use + canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing some + sort of special handling code in the hopes + that that will cause implementors to also + use a fixed point implementation.' type: object properties: number: @@ -1308,76 +1267,75 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string containerName: - description: 'Container name: required - for volumes, optional for env vars' + description: 'Container name: required for + volumes, optional for env vars' type: string required: - - resource + - resource fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the - FieldPath is written in terms of, defaults - to "v1". + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". type: string fieldPath: description: Path of the field to select in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - path + - path awsElasticBlockStore: description: Represents a Persistent Disk resource in AWS. An AWS EBS disk must exist before mounting to - a container. The disk must also be in the same AWS - zone as the kubelet. An AWS EBS disk can only be mounted + a container. The disk must also be in the same AWS zone + as the kubelet. An AWS EBS disk can only be mounted as read/write once. AWS EBS volumes support ownership management and SELinux relabeling. type: object properties: partition: description: 'The partition in the volume that you - want to mount. If omitted, the default is to mount - by volume name. Examples: For volume /dev/sda1, - you specify the partition as "1". Similarly, the - volume partition for /dev/sda is "0" (or you can - leave the property empty).' + want to mount. If omitted, the default is to mount + by volume name. Examples: For volume /dev/sda1, + you specify the partition as "1". Similarly, the + volume partition for /dev/sda is "0" (or you can + leave the property empty).' type: number volumeID: description: 'Unique ID of the persistent disk resource - in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string readOnly: description: 'Specify "true" to force and set the - ReadOnly property in VolumeMounts to "true". If - omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + ReadOnly property in VolumeMounts to "true". If + omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: boolean fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + description: 'Filesystem type of the volume that you + want to mount. Tip: Ensure that the filesystem type + is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be + "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string required: - - volumeID + - volumeID flocker: - description: Represents a Flocker volume mounted by - the Flocker agent. One and only one of datasetName - and datasetUUID should be set. Flocker volumes do - not support ownership management or SELinux relabeling. + description: Represents a Flocker volume mounted by the + Flocker agent. One and only one of datasetName and datasetUUID + should be set. Flocker volumes do not support ownership + management or SELinux relabeling. type: object properties: datasetName: @@ -1386,18 +1344,17 @@ openAPIV3Schema: as deprecated type: string datasetUUID: - description: UUID of the dataset. This is unique - identifier of a Flocker dataset + description: UUID of the dataset. This is unique identifier + of a Flocker dataset type: string iscsi: - description: Represents an ISCSI disk. ISCSI volumes - can only be mounted as read/write once. ISCSI volumes - support ownership management and SELinux relabeling. + description: Represents an ISCSI disk. ISCSI volumes can + only be mounted as read/write once. ISCSI volumes support + ownership management and SELinux relabeling. type: object properties: chapAuthSession: - description: whether support iSCSI Session CHAP - authentication + description: whether support iSCSI Session CHAP authentication type: boolean iscsiInterface: description: iSCSI Interface Name that uses an iSCSI @@ -1415,9 +1372,8 @@ openAPIV3Schema: type: string portals: description: iSCSI Target Portal List. The portal - is either an IP or ip_addr:port if the port is - other than default (typically TCP ports 860 and - 3260). + is either an IP or ip_addr:port if the port is other + than default (typically TCP ports 860 and 3260). type: array items: type: string @@ -1429,7 +1385,7 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string initiatorName: description: Custom iSCSI Initiator Name. If initiatorName @@ -1442,21 +1398,21 @@ openAPIV3Schema: setting in VolumeMounts. Defaults to false. type: boolean fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' + description: 'Filesystem type of the volume that you + want to mount. Tip: Ensure that the filesystem type + is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be + "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' type: string targetPortal: - description: iSCSI Target Portal. The Portal is - either an IP or ip_addr:port if the port is other - than default (typically TCP ports 860 and 3260). + description: iSCSI Target Portal. The Portal is either + an IP or ip_addr:port if the port is other than + default (typically TCP ports 860 and 3260). type: string required: - - iqn - - lun - - targetPortal + - iqn + - lun + - targetPortal rbd: description: Represents a Rados Block Device mount that lasts the lifetime of a pod. RBD volumes support ownership @@ -1468,7 +1424,7 @@ openAPIV3Schema: type: string pool: description: 'The rados pool name. Default is rbd. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string secretRef: description: LocalObjectReference contains enough @@ -1478,56 +1434,55 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + setting in VolumeMounts. Defaults to false. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: boolean fsType: - description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred - to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' + description: 'Filesystem type of the volume that you + want to mount. Tip: Ensure that the filesystem type + is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be + "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' type: string keyring: description: 'Keyring is the path to key ring for - RBDUser. Default is /etc/ceph/keyring. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + RBDUser. Default is /etc/ceph/keyring. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string user: description: 'The rados user name. Default is admin. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string monitors: description: 'A collection of Ceph monitors. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: array items: type: string required: - - image - - monitors + - image + - monitors configMap: - description: Adapts a ConfigMap into a volume. The - contents of the target ConfigMap's Data field will - be presented in a volume as files using the keys in - the Data field as the file names, unless the items - element is populated with specific mappings of keys - to paths. ConfigMap volumes support ownership management - and SELinux relabeling. + description: Adapts a ConfigMap into a volume. The contents + of the target ConfigMap's Data field will be presented + in a volume as files using the keys in the Data field + as the file names, unless the items element is populated + with specific mappings of keys to paths. ConfigMap volumes + support ownership management and SELinux relabeling. type: object properties: defaultMode: description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and - 0777. Defaults to 0644. Directories within the - path are not affected by this setting. This might - be in conflict with other options that affect - the file mode, like fsGroup, and the result can - be other mode bits set.' + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the path + are not affected by this setting. This might be + in conflict with other options that affect the file + mode, like fsGroup, and the result can be other + mode bits set.' type: number name: description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' @@ -1537,17 +1492,16 @@ openAPIV3Schema: keys must be defined type: boolean items: - description: If unspecified, each key-value pair - in the Data field of the referenced ConfigMap - will be projected into the volume as a file whose - name is the key and content is the value. If specified, + description: If unspecified, each key-value pair in + the Data field of the referenced ConfigMap will + be projected into the volume as a file whose name + is the key and content is the value. If specified, the listed keys will be projected into the specified - paths, and unlisted keys will not be present. - If a key is specified which is not present in - the ConfigMap, the volume setup will error unless - it is marked optional. Paths must be relative - and may not contain the '..' path or start with - '..'. + paths, and unlisted keys will not be present. If + a key is specified which is not present in the ConfigMap, + the volume setup will error unless it is marked + optional. Paths must be relative and may not contain + the '..' path or start with '..'. type: array items: description: Maps a string key to a path within @@ -1556,40 +1510,39 @@ openAPIV3Schema: properties: mode: description: 'Optional: mode bits to use on - this file, must be a value between 0 and - 0777. If not specified, the volume defaultMode - will be used. This might be in conflict - with other options that affect the file - mode, like fsGroup, and the result can be - other mode bits set.' + this file, must be a value between 0 and 0777. + If not specified, the volume defaultMode will + be used. This might be in conflict with other + options that affect the file mode, like fsGroup, + and the result can be other mode bits set.' type: number path: - description: The relative path of the file - to map the key to. May not be an absolute - path. May not contain the path element '..'. - May not start with the string '..'. + description: The relative path of the file to + map the key to. May not be an absolute path. + May not contain the path element '..'. May + not start with the string '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path storageos: description: Represents a StorageOS persistent volume resource. type: object properties: volumeNamespace: - description: VolumeNamespace specifies the scope - of the volume within StorageOS. If no namespace - is specified then the Pod's namespace will be - used. This allows the Kubernetes name scoping - to be mirrored within StorageOS for tighter integration. - Set VolumeName to any name to override the default - behaviour. Set to "default" if you are not using - namespaces within StorageOS. Namespaces that do - not pre-exist within StorageOS will be created. + description: VolumeNamespace specifies the scope of + the volume within StorageOS. If no namespace is + specified then the Pod's namespace will be used. This + allows the Kubernetes name scoping to be mirrored + within StorageOS for tighter integration. Set VolumeName + to any name to override the default behaviour. Set + to "default" if you are not using namespaces within + StorageOS. Namespaces that do not pre-exist within + StorageOS will be created. type: string volumeName: description: VolumeName is the human-readable name @@ -1604,17 +1557,17 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. + "ext4", "xfs", "ntfs". Implicitly inferred to be + "ext4" if unspecified. type: string csi: description: Represents a source location of a volume @@ -1634,11 +1587,11 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: Specifies a read-only configuration - for the volume. Defaults to false (read/write). + description: Specifies a read-only configuration for + the volume. Defaults to false (read/write). type: boolean fsType: description: Filesystem type to mount. Ex. "ext4", @@ -1648,69 +1601,66 @@ openAPIV3Schema: type: string volumeAttributes: description: VolumeAttributes stores driver-specific - properties that are passed to the CSI driver. - Consult your driver's documentation for supported - values. + properties that are passed to the CSI driver. Consult + your driver's documentation for supported values. additionalProperties: type: string type: object required: - - driver + - driver name: description: 'Volume''s name. Must be a DNS_LABEL and - unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string nfs: - description: Represents an NFS mount that lasts the - lifetime of a pod. NFS volumes do not support ownership - management or SELinux relabeling. + description: Represents an NFS mount that lasts the lifetime + of a pod. NFS volumes do not support ownership management + or SELinux relabeling. type: object properties: path: description: 'Path that is exported by the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string server: description: 'Server is the hostname or IP address - of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string readOnly: description: 'ReadOnly here will force the NFS export - to be mounted with read-only permissions. Defaults - to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + to be mounted with read-only permissions. Defaults + to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: boolean required: - - path - - server + - path + - server persistentVolumeClaim: description: PersistentVolumeClaimVolumeSource references - the user's PVC in the same namespace. This volume - finds the bound PV and mounts that volume for the - pod. A PersistentVolumeClaimVolumeSource is, essentially, - a wrapper around another type of volume that is owned - by someone else (the system). + the user's PVC in the same namespace. This volume finds + the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource + is, essentially, a wrapper around another type of volume + that is owned by someone else (the system). type: object properties: claimName: description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + in the same namespace as the pod using this volume. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' type: string readOnly: - description: Will force the ReadOnly setting in - VolumeMounts. Default false. + description: Will force the ReadOnly setting in VolumeMounts. + Default false. type: boolean required: - - claimName + - claimName gitRepo: - description: 'Represents a volume that is populated - with the contents of a git repository. Git repo volumes - do not support ownership management. Git repo volumes - support SELinux relabeling. DEPRECATED: GitRepo is - deprecated. To provision a container with a git repo, - mount an EmptyDir into an InitContainer that clones - the repo using git, then mount the EmptyDir into the - Pod''s container.' + description: 'Represents a volume that is populated with + the contents of a git repository. Git repo volumes do + not support ownership management. Git repo volumes support + SELinux relabeling. DEPRECATED: GitRepo is deprecated. + To provision a container with a git repo, mount an EmptyDir + into an InitContainer that clones the repo using git, + then mount the EmptyDir into the Pod''s container.' type: object properties: repository: @@ -1720,15 +1670,14 @@ openAPIV3Schema: description: Target directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, - if specified, the volume will contain the git - repository in the subdirectory with the given - name. + if specified, the volume will contain the git repository + in the subdirectory with the given name. type: string revision: description: Commit hash for the specified revision. type: string required: - - repository + - repository portworxVolume: description: PortworxVolumeSource represents a Portworx volume resource. @@ -1745,11 +1694,11 @@ openAPIV3Schema: fsType: description: FSType represents the filesystem type to mount Must be a filesystem type supported by - the host operating system. Ex. "ext4", "xfs". - Implicitly inferred to be "ext4" if unspecified. + the host operating system. Ex. "ext4", "xfs". Implicitly + inferred to be "ext4" if unspecified. type: string required: - - volumeID + - volumeID vsphereVolume: description: Represents a vSphere volume resource. type: object @@ -1763,22 +1712,21 @@ openAPIV3Schema: profile ID associated with the StoragePolicyName. type: string volumePath: - description: Path that identifies vSphere volume - vmdk + description: Path that identifies vSphere volume vmdk type: string fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. + "ext4", "xfs", "ntfs". Implicitly inferred to be + "ext4" if unspecified. type: string required: - - volumePath + - volumePath fc: description: Represents a Fibre Channel volume. Fibre - Channel volumes can only be mounted as read/write - once. Fibre Channel volumes support ownership management - and SELinux relabeling. + Channel volumes can only be mounted as read/write once. + Fibre Channel volumes support ownership management and + SELinux relabeling. type: object properties: lun: @@ -1786,27 +1734,27 @@ openAPIV3Schema: type: number targetWWNs: description: 'Optional: FC target worldwide names - (WWNs)' + (WWNs)' type: array items: type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' + ReadOnly here will force the ReadOnly setting in + VolumeMounts.' type: boolean wwids: description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' + (wwids) Either wwids or combination of targetWWNs + and lun must be set, but not both simultaneously.' type: array items: type: string fsType: - description: Filesystem type to mount. Must be a - filesystem type supported by the host operating - system. Ex. "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. + description: Filesystem type to mount. Must be a filesystem + type supported by the host operating system. Ex. + "ext4", "xfs", "ntfs". Implicitly inferred to be + "ext4" if unspecified. type: string hostPath: description: Represents a host path mapped into a pod. @@ -1815,18 +1763,18 @@ openAPIV3Schema: type: object properties: path: - description: 'Path of the directory on the host. - If the path is a symlink, it will follow the link - to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + description: 'Path of the directory on the host. If + the path is a symlink, it will follow the link to + the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string type: - description: 'Type for HostPath Volume Defaults - to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + description: 'Type for HostPath Volume Defaults to + "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string required: - - path + - path required: - - name + - name resources: type: object description: Memory and CPU minimum requirements and limits @@ -1836,17 +1784,17 @@ openAPIV3Schema: type: object additionalProperties: type: string - description: 'Requests describes the minimum amount of - compute resources required. If Requests is omitted for - a container, it defaults to Limits if that is explicitly - specified, otherwise to an implementation-defined value. - More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Requests describes the minimum amount of compute + resources required. If Requests is omitted for a container, + it defaults to Limits if that is explicitly specified, + otherwise to an implementation-defined value. More info: + https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' limits: type: object additionalProperties: type: string description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' annotations: type: object additionalProperties: @@ -1861,19 +1809,18 @@ openAPIV3Schema: type: object properties: name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. + description: Name of the environment variable. Must be + a C_IDENTIFIER. type: string value: description: 'Variable references $(VAR_NAME) are expanded - using the previous defined environment variables in - the container and any service environment variables. - If a variable cannot be resolved, the reference in - the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Defaults to - "".' + using the previous defined environment variables in + the container and any service environment variables. + If a variable cannot be resolved, the reference in the + input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). Escaped + references will never be expanded, regardless of whether + the variable exists or not. Defaults to "".' type: string valueFrom: description: EnvVarSource represents a source for the @@ -1881,24 +1828,24 @@ openAPIV3Schema: type: object properties: secretKeyRef: - description: SecretKeySelector selects a key of - a Secret. + description: SecretKeySelector selects a key of a + Secret. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the Secret or its key must be defined type: boolean key: - description: The key of the secret to select - from. Must be a valid secret key. + description: The key of the secret to select from. Must + be a valid secret key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their output format @@ -1906,58 +1853,54 @@ openAPIV3Schema: properties: divisor: description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" case - in .) ::= 0 | - 1 | ... | 9 ::= - | ::= - | . | . | . - ::= "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | Ti | - Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | - T | P | E (Note that 1024 = 1Ki but 1000 - = 1k; I didn''t choose the capitalization.) - ::= "e" | - "E" No matter which of the - three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than 3 - decimal places. Numbers larger or more precise - will be capped or rounded up. (E.g.: 0.1m - will rounded up to 1m.) This may be extended - in the future if we require larger or smaller - quantities. When a Quantity is parsed from - a string, it will remember the type of suffix - it had, and will use the same type again when - it is serialized. Before serializing, Quantity - will be put in "canonical form". This means - that Exponent/suffix will be adjusted up or - down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision - is lost b. No fractional digits will be - emitted c. The exponent (or suffix) is as - large as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi will - be serialized as "1536Mi" Note that the quantity - will NEVER be internally represented by a - floating point number. That is the whole point - of this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or don''t - diff.) This format is intended to make it - difficult to use these numbers without writing - some sort of special handling code in the - hopes that that will cause implementors to - also use a fixed point implementation.' + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and + AsInt64() accessors. The serialization format + is: ::= (Note + that may be empty, from the "" case + in .) ::= 0 | 1 + | ... | 9 ::= | + ::= | . + | . | . ::= + "+" | "-" ::= | + ::= | + | ::= Ki | Mi + | Gi | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T + | P | E (Note that 1024 = 1Ki but 1000 = 1k; + I didn''t choose the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms is + used, no quantity may represent a number greater + than 2^63-1 in magnitude, nor may it have more + than 3 decimal places. Numbers larger or more + precise will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may be extended + in the future if we require larger or smaller + quantities. When a Quantity is parsed from + a string, it will remember the type of suffix + it had, and will use the same type again when + it is serialized. Before serializing, Quantity + will be put in "canonical form". This means + that Exponent/suffix will be adjusted up or + down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision is + lost b. No fractional digits will be emitted c. + The exponent (or suffix) is as large as possible. + The sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole + point of this exercise. Non-canonical values + will still parse as long as they are well formed, + but will be re-emitted in their canonical form. + (So always use canonical form, or don''t diff.) This + format is intended to make it difficult to use + these numbers without writing some sort of special + handling code in the hopes that that will cause + implementors to also use a fixed point implementation.' type: object properties: number: @@ -1965,25 +1908,25 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string containerName: description: 'Container name: required for volumes, - optional for env vars' + optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap or @@ -1993,7 +1936,7 @@ openAPIV3Schema: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -2004,24 +1947,24 @@ openAPIV3Schema: is written in terms of, defaults to "v1". type: string fieldPath: - description: Path of the field to select in - the specified API version. + description: Path of the field to select in the + specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name restartPolicy: type: string - description: 'Restart policy for all containers within the - pod. One of Always, OnFailure, Never. Default to Always. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + description: 'Restart policy for all containers within the pod. + One of Always, OnFailure, Never. Default to Always. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' nodeSelector: type: object additionalProperties: type: string - description: Selector which must match a node's labels for - the pod to be scheduled on that node. + description: Selector which must match a node's labels for the + pod to be scheduled on that node. volumeMounts: type: array description: Additional volume mounts for the server pod. @@ -2031,14 +1974,14 @@ openAPIV3Schema: type: object properties: mountPath: - description: Path within the container at which the - volume should be mounted. Must not contain ':'. + description: Path within the container at which the volume + should be mounted. Must not contain ':'. type: string mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and the - other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. + description: mountPropagation determines how mounts are + propagated from the host to container and the other + way around. When not set, MountPropagationNone is used. + This field is beta in 1.10. type: string name: description: This must match the Name of a Volume. @@ -2049,20 +1992,19 @@ openAPIV3Schema: type: boolean subPath: description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's - root). + volume should be mounted. Defaults to "" (volume's root). type: string subPathExpr: description: Expanded path within the volume from which - the container's volume should be mounted. Behaves - similarly to SubPath but environment variable references - $(VAR_NAME) are expanded using the container's environment. - Defaults to "" (volume's root). SubPathExpr and SubPath - are mutually exclusive. This field is beta in 1.15. + the container's volume should be mounted. Behaves similarly + to SubPath but environment variable references $(VAR_NAME) + are expanded using the container's environment. Defaults + to "" (volume's root). SubPathExpr and SubPath are mutually + exclusive. This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name labels: type: object additionalProperties: @@ -2072,13 +2014,12 @@ openAPIV3Schema: runtimeClassName: type: string description: 'RuntimeClassName refers to a RuntimeClass object - in the node.k8s.io group, which should be used to run this - pod. If no RuntimeClass resource matches the named class, - the pod will not be run. If unset or empty, the "legacy" - RuntimeClass will be used, which is an implicit class with - an empty definition that uses the default runtime handler. - More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md - This is an alpha feature and may change in the future.' + in the node.k8s.io group, which should be used to run this + pod. If no RuntimeClass resource matches the named class, + the pod will not be run. If unset or empty, the "legacy" RuntimeClass + will be used, which is an implicit class with an empty definition + that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future.' tolerations: type: array description: If specified, the pod's tolerations. @@ -2095,17 +2036,17 @@ openAPIV3Schema: NoExecute. type: string tolerationSeconds: - description: TolerationSeconds represents the period - of time the toleration (which must be of effect NoExecute, + description: TolerationSeconds represents the period of + time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. type: number value: - description: Value is the taint value the toleration - matches to. If the operator is Exists, the value should - be empty, otherwise just a regular string. + description: Value is the taint value the toleration matches + to. If the operator is Exists, the value should be empty, + otherwise just a regular string. type: string key: description: Key is the taint key that the toleration @@ -2150,33 +2091,32 @@ openAPIV3Schema: to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of a - raw block device within a container. + description: volumeDevice describes a mapping of a raw + block device within a container. type: object properties: devicePath: - description: devicePath is the path inside of - the container that the device will be mapped - to. + description: devicePath is the path inside of the + container that the device will be mapped to. type: string name: description: name must match the name of a persistentVolumeClaim in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' + This field is optional to allow higher level config + management to default or override container images in + workload controllers like Deployments and StatefulSets.' type: string imagePullPolicy: description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag is - specified, or IfNotPresent otherwise. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + IfNotPresent. Defaults to Always if :latest tag is specified, + or IfNotPresent otherwise. Cannot be updated. More info: + https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: description: Probe describes a health check to be performed @@ -2191,21 +2131,20 @@ openAPIV3Schema: type: number periodSeconds: description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. + probe. Default to 10 seconds. Minimum value is 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + description: TCPSocketAction describes an action based + on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -2215,28 +2154,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + description: 'Optional: Host name to connect to, + defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. + probe to be considered successful after having failed. + Defaults to 1. Must be 1 for liveness and startup. + Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -2244,15 +2183,15 @@ openAPIV3Schema: type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. + description: Command is the command line to execute + inside the container, the working directory + for the command is root ('/') in the container's + filesystem. The command is simply exec'd, it + is not run inside a shell, so traditional shell + instructions ('|', etc) won't work. To use a + shell, you need to explicitly call out to that + shell. Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. type: array items: type: string @@ -2265,16 +2204,16 @@ openAPIV3Schema: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + description: Scheme to use for connecting to the + host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -2284,7 +2223,7 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -2295,8 +2234,8 @@ openAPIV3Schema: HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes + description: HTTPHeader describes a custom header + to be used in HTTP probes type: object properties: name: @@ -2306,15 +2245,15 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: - description: Whether this container should allocate - a buffer for stdin in the container runtime. If this - is not set, reads from stdin in the container will - always result in EOF. Default is false. + description: Whether this container should allocate a + buffer for stdin in the container runtime. If this is + not set, reads from stdin in the container will always + result in EOF. Default is false. type: boolean terminationMessagePolicy: description: Indicate how the termination message should @@ -2324,25 +2263,23 @@ openAPIV3Schema: chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to File. Cannot be - updated. + whichever is smaller. Defaults to File. Cannot be updated. type: string terminationMessagePath: description: 'Optional: Path at which the file to which - the container''s termination message will be written - is mounted into the container''s filesystem. Message - written is intended to be brief final status, such - as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' + the container''s termination message will be written + is mounted into the container''s filesystem. Message + written is intended to be brief final status, such as + an assertion failure message. Will be truncated by the + node if greater than 4096 bytes. The total message length + across all containers will be limited to 12kb. Defaults + to /dev/termination-log. Cannot be updated.' type: string workingDir: description: Container's working directory. If not specified, the container runtime's default will be used, which - might be configured in the container image. Cannot - be updated. + might be configured in the container image. Cannot be + updated. type: string resources: description: ResourceRequirements describes the compute @@ -2351,16 +2288,16 @@ openAPIV3Schema: properties: requests: description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + of compute resources required. If Requests is omitted + for a container, it defaults to Limits if that is + explicitly specified, otherwise to an implementation-defined + value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object @@ -2378,15 +2315,15 @@ openAPIV3Schema: type: boolean runAsUser: description: The UID to run the entrypoint of the - container process. Defaults to user specified - in image metadata if unspecified. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. + container process. Defaults to user specified in + image metadata if unspecified. May also be set in + PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. type: number capabilities: - description: Adds and removes POSIX capabilities - from running containers. + description: Adds and removes POSIX capabilities from + running containers. type: object properties: add: @@ -2400,8 +2337,8 @@ openAPIV3Schema: items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to be - applied to the container + description: SELinuxOptions are the labels to be applied + to the container type: object properties: role: @@ -2426,8 +2363,8 @@ openAPIV3Schema: type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the - GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. This field is alpha-level and is only honored @@ -2435,15 +2372,15 @@ openAPIV3Schema: flag. type: string runAsUserName: - description: The UserName in Windows to run - the entrypoint of the container process. Defaults - to the user specified in image metadata if - unspecified. May also be set in PodSecurityContext. - If set in both SecurityContext and PodSecurityContext, + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes - precedence. This field is alpha-level and - it is only honored by servers that enable - the WindowsRunAsUserName feature flag. + precedence. This field is alpha-level and it + is only honored by servers that enable the WindowsRunAsUserName + feature flag. type: string gmsaCredentialSpecName: description: GMSACredentialSpecName is the name @@ -2452,39 +2389,36 @@ openAPIV3Schema: that enable the WindowsGMSA feature flag. type: string procMount: - description: procMount denotes the type of proc - mount to use for the containers. The default is - DefaultProcMount which uses the container runtime - defaults for readonly paths and masked paths. - This requires the ProcMountType feature flag to - be enabled. + description: procMount denotes the type of proc mount + to use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. This requires the ProcMountType + feature flag to be enabled. type: string allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the container - process. AllowPrivilegeEscalation is true always - when the container is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' + description: 'AllowPrivilegeEscalation controls whether + a process can gain more privileges than its parent + process. This bool directly controls if the no_new_privs + flag will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as + Privileged 2) has CAP_SYS_ADMIN' type: boolean runAsGroup: description: The GID to run the entrypoint of the container process. Uses runtime default if unset. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. + May also be set in PodSecurityContext. If set in + both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. type: number runAsNonRoot: description: Indicates that the container must run - as a non-root user. If true, the Kubelet will - validate the image at runtime to ensure that it - does not run as UID 0 (root) and fail to start - the container if it does. If unset or false, no - such validation will be performed. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. + as a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not + run as UID 0 (root) and fail to start the container + if it does. If unset or false, no such validation + will be performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: description: Whether this container has a read-only @@ -2503,21 +2437,20 @@ openAPIV3Schema: type: number periodSeconds: description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. + probe. Default to 10 seconds. Minimum value is 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + description: TCPSocketAction describes an action based + on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -2527,28 +2460,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + description: 'Optional: Host name to connect to, + defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. + probe to be considered successful after having failed. + Defaults to 1. Must be 1 for liveness and startup. + Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -2556,15 +2489,15 @@ openAPIV3Schema: type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. + description: Command is the command line to execute + inside the container, the working directory + for the command is root ('/') in the container's + filesystem. The command is simply exec'd, it + is not run inside a shell, so traditional shell + instructions ('|', etc) won't work. To use a + shell, you need to explicitly call out to that + shell. Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. type: array items: type: string @@ -2577,16 +2510,16 @@ openAPIV3Schema: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + description: Scheme to use for connecting to the + host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -2596,7 +2529,7 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -2607,8 +2540,8 @@ openAPIV3Schema: HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes + description: HTTPHeader describes a custom header + to be used in HTTP probes type: object properties: name: @@ -2618,13 +2551,13 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: - description: List of environment variables to set in - the container. Cannot be updated. + description: List of environment variables to set in the + container. Cannot be updated. type: array items: description: EnvVar represents an environment variable @@ -2632,23 +2565,23 @@ openAPIV3Schema: type: object properties: name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. + description: Name of the environment variable. Must + be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, - the reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a - double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether - the variable exists or not. Defaults to "".' + description: 'Variable references $(VAR_NAME) are + expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will + never be expanded, regardless of whether the variable + exists or not. Defaults to "".' type: string valueFrom: - description: EnvVarSource represents a source - for the value of an EnvVar. + description: EnvVarSource represents a source for + the value of an EnvVar. type: object properties: secretKeyRef: @@ -2658,19 +2591,18 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the Secret or its key must be defined type: boolean key: - description: The key of the secret to - select from. Must be a valid secret - key. + description: The key of the secret to select + from. Must be a valid secret key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their @@ -2679,64 +2611,62 @@ openAPIV3Schema: properties: divisor: description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the - "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | - Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M - | G | T | P | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms - is used, no quantity may represent a - number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may - be extended in the future if we require - larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type again - when it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. - No fractional digits will be emitted c. - The exponent (or suffix) is as large - as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always - use canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing - some sort of special handling code in - the hopes that that will cause implementors - to also use a fixed point implementation.' + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= | + ::= + | | ::= + Ki | Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | + G | T | P | E (Note that 1024 = 1Ki + but 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No matter which + of the three exponent forms is used, no + quantity may represent a number greater + than 2^63-1 in magnitude, nor may it have + more than 3 decimal places. Numbers larger + or more precise will be capped or rounded + up. (E.g.: 0.1m will rounded up to 1m.) + This may be extended in the future if + we require larger or smaller quantities. When + a Quantity is parsed from a string, it + will remember the type of suffix it had, + and will use the same type again when + it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will be + adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. No + fractional digits will be emitted c. + The exponent (or suffix) is as large as + possible. The sign will be omitted unless + the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note that + the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always use + canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing some + sort of special handling code in the hopes + that that will cause implementors to also + use a fixed point implementation.' type: object properties: number: @@ -2744,25 +2674,25 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string containerName: - description: 'Container name: required - for volumes, optional for env vars' + description: 'Container name: required for + volumes, optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object properties: name: description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap @@ -2772,34 +2702,33 @@ openAPIV3Schema: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the - FieldPath is written in terms of, defaults - to "v1". + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". type: string fieldPath: description: Path of the field to select in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: description: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but - is primarily informational. Not specifying a port - here DOES NOT prevent that port from being exposed. - Any port which is listening on the default "0.0.0.0" - address inside a container will be accessible from - the network. Cannot be updated. + is primarily informational. Not specifying a port here + DOES NOT prevent that port from being exposed. Any port + which is listening on the default "0.0.0.0" address + inside a container will be accessible from the network. + Cannot be updated. type: array items: description: ContainerPort represents a network port @@ -2811,14 +2740,14 @@ openAPIV3Schema: or SCTP. Defaults to "TCP". type: string hostIP: - description: What host IP to bind the external - port to. + description: What host IP to bind the external port + to. type: string name: description: If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in - a pod must have a unique name. Name for the - port that can be referred to by services. + a pod must have a unique name. Name for the port + that can be referred to by services. type: string containerPort: description: Number of port to expose on the pod's @@ -2828,23 +2757,22 @@ openAPIV3Schema: hostPort: description: Number of port to expose on the host. If specified, this must be a valid port number, - 0 < x < 65536. If HostNetwork is specified, - this must match ContainerPort. Most containers - do not need this. + 0 < x < 65536. If HostNetwork is specified, this + must match ContainerPort. Most containers do not + need this. type: number required: - - containerPort + - containerPort command: - description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used if - this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. If - a variable cannot be resolved, the reference in the - input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be updated. - More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + description: 'Entrypoint array. Not executed within a + shell. The docker image''s ENTRYPOINT is used if this + is not provided. Variable references $(VAR_NAME) are + expanded using the container''s environment. If a variable + cannot be resolved, the reference in the input string + will be unchanged. The $(VAR_NAME) syntax can be escaped + with a double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string @@ -2853,8 +2781,8 @@ openAPIV3Schema: filesystem. Cannot be updated. type: array items: - description: VolumeMount describes a mounting of a - Volume within a container. + description: VolumeMount describes a mounting of a Volume + within a container. type: object properties: mountPath: @@ -2877,33 +2805,32 @@ openAPIV3Schema: false. type: boolean subPath: - description: Path within the volume from which - the container's volume should be mounted. Defaults + description: Path within the volume from which the + container's volume should be mounted. Defaults to "" (volume's root). type: string subPathExpr: description: Expanded path within the volume from which the container's volume should be mounted. - Behaves similarly to SubPath but environment - variable references $(VAR_NAME) are expanded - using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath - are mutually exclusive. This field is beta in - 1.15. + Behaves similarly to SubPath but environment variable + references $(VAR_NAME) are expanded using the + container's environment. Defaults to "" (volume's + root). SubPathExpr and SubPath are mutually exclusive. + This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. The - $(VAR_NAME) syntax can be escaped with a double $$, - ie: $$(VAR_NAME). Escaped references will never be - expanded, regardless of whether the variable exists - or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the reference + in the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be updated. + More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string @@ -2927,9 +2854,9 @@ openAPIV3Schema: type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, it produces or consumes the inner type. This allows you to have, for example, a JSON field that can accept a name or number. @@ -2942,29 +2869,29 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port exec: - description: ExecAction describes a "run in - container" action. + description: ExecAction describes a "run in container" + action. type: object properties: command: - description: Command is the command line - to execute inside the container, the working + description: Command is the command line to + execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. type: array items: type: string @@ -2974,17 +2901,16 @@ openAPIV3Schema: type: object properties: path: - description: Path to access on the HTTP - server. + description: Path to access on the HTTP server. type: string scheme: description: Scheme to use for connecting to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, it produces or consumes the inner type. This allows you to have, for example, a JSON field that can accept a name or number. @@ -2997,7 +2923,7 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -3019,10 +2945,10 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: description: Handler defines a specific action that should be taken @@ -3034,9 +2960,9 @@ openAPIV3Schema: type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, it produces or consumes the inner type. This allows you to have, for example, a JSON field that can accept a name or number. @@ -3049,29 +2975,29 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port exec: - description: ExecAction describes a "run in - container" action. + description: ExecAction describes a "run in container" + action. type: object properties: command: - description: Command is the command line - to execute inside the container, the working + description: Command is the command line to + execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. type: array items: type: string @@ -3081,17 +3007,16 @@ openAPIV3Schema: type: object properties: path: - description: Path to access on the HTTP - server. + description: Path to access on the HTTP server. type: string scheme: description: Scheme to use for connecting to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, it produces or consumes the inner type. This allows you to have, for example, a JSON field that can accept a name or number. @@ -3104,7 +3029,7 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -3126,19 +3051,19 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated. type: string tty: - description: Whether this container should allocate - a TTY for itself, also requires 'stdin' to be true. - Default is false. + description: Whether this container should allocate a + TTY for itself, also requires 'stdin' to be true. Default + is false. type: boolean readinessProbe: description: Probe describes a health check to be performed @@ -3153,21 +3078,20 @@ openAPIV3Schema: type: number periodSeconds: description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. + probe. Default to 10 seconds. Minimum value is 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + description: TCPSocketAction describes an action based + on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -3177,28 +3101,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + description: 'Optional: Host name to connect to, + defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. + probe to be considered successful after having failed. + Defaults to 1. Must be 1 for liveness and startup. + Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -3206,15 +3130,15 @@ openAPIV3Schema: type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. + description: Command is the command line to execute + inside the container, the working directory + for the command is root ('/') in the container's + filesystem. The command is simply exec'd, it + is not run inside a shell, so traditional shell + instructions ('|', etc) won't work. To use a + shell, you need to explicitly call out to that + shell. Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. type: array items: type: string @@ -3227,16 +3151,16 @@ openAPIV3Schema: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + description: Scheme to use for connecting to the + host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -3246,7 +3170,7 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -3257,8 +3181,8 @@ openAPIV3Schema: HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes + description: HTTPHeader describes a custom header + to be used in HTTP probes type: object properties: name: @@ -3268,32 +3192,32 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain - open across multiple attach sessions. If stdinOnce - is set to true, stdin is opened on container start, - is empty until the first client attaches to stdin, - and then remains open and accepts data until the client + open across multiple attach sessions. If stdinOnce is + set to true, stdin is opened on container start, is + empty until the first client attaches to stdin, and + then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false type: boolean envFrom: - description: List of sources to populate environment - variables in the container. The keys defined within - a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is - starting. When a key exists in multiple sources, the - value associated with the last source will take precedence. - Values defined by an Env with a duplicate key will - take precedence. Cannot be updated. + description: List of sources to populate environment variables + in the container. The keys defined within a source must + be a C_IDENTIFIER. All invalid keys will be reported + as an event when the container is starting. When a key + exists in multiple sources, the value associated with + the last source will take precedence. Values defined + by an Env with a duplicate key will take precedence. + Cannot be updated. type: array items: description: EnvFromSource represents the source of @@ -3310,34 +3234,33 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - must be defined + description: Specify whether the ConfigMap must + be defined type: boolean prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. + description: An optional identifier to prepend to + each key in the ConfigMap. Must be a C_IDENTIFIER. type: string secretRef: - description: SecretEnvSource selects a Secret - to populate the environment variables with. The + description: SecretEnvSource selects a Secret to + populate the environment variables with. The contents of the target Secret's Data field will - represent the key-value pairs as environment - variables. + represent the key-value pairs as environment variables. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the Secret must be defined type: boolean required: - - name + - name containerSecurityContext: type: object description: Container-level security attributes. Will override @@ -3346,19 +3269,19 @@ openAPIV3Schema: privileged: type: boolean description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent - to root on the host. Defaults to false. + in privileged containers are essentially equivalent to + root on the host. Defaults to false. runAsUser: type: number description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. + set in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. capabilities: type: object - description: Adds and removes POSIX capabilities from - running containers. + description: Adds and removes POSIX capabilities from running + containers. properties: add: type: array @@ -3398,12 +3321,12 @@ openAPIV3Schema: properties: gmsaCredentialSpec: type: string - description: GMSACredentialSpec is where the GMSA - admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named + by the GMSACredentialSpecName field. This field is + alpha-level and is only honored by servers that enable + the WindowsGMSA feature flag. runAsUserName: type: string description: The UserName in Windows to run the entrypoint @@ -3411,47 +3334,47 @@ openAPIV3Schema: in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and - it is only honored by servers that enable the WindowsRunAsUserName + takes precedence. This field is alpha-level and it + is only honored by servers that enable the WindowsRunAsUserName feature flag. gmsaCredentialSpecName: type: string - description: GMSACredentialSpecName is the name of - the GMSA credential spec to use. This field is alpha-level + description: GMSACredentialSpecName is the name of the + GMSA credential spec to use. This field is alpha-level and is only honored by servers that enable the WindowsGMSA feature flag. procMount: type: string - description: procMount denotes the type of proc mount - to use for the containers. The default is DefaultProcMount + description: procMount denotes the type of proc mount to + use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. allowPrivilegeEscalation: type: boolean description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent process. - This bool directly controls if the no_new_privs flag - will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' + a process can gain more privileges than its parent process. + This bool directly controls if the no_new_privs flag will + be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' runAsGroup: type: number description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be - set in PodSecurityContext. If set in both SecurityContext + process. Uses runtime default if unset. May also be set + in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. runAsNonRoot: type: boolean - description: Indicates that the container must run as - a non-root user. If true, the Kubelet will validate - the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if it - does. If unset or false, no such validation will be - performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. + description: Indicates that the container must run as a + non-root user. If true, the Kubelet will validate the + image at runtime to ensure that it does not run as UID + 0 (root) and fail to start the container if it does. If + unset or false, no such validation will be performed. + May also be set in PodSecurityContext. If set in both + SecurityContext and PodSecurityContext, the value specified + in SecurityContext takes precedence. readOnlyRootFilesystem: type: boolean description: Whether this container has a read-only root @@ -3459,8 +3382,8 @@ openAPIV3Schema: schedulerName: type: string description: If specified, the pod will be dispatched by specified - scheduler. If not specified, the pod will be dispatched - by default scheduler. + scheduler. If not specified, the pod will be dispatched by + default scheduler. initContainers: type: array description: Initialization containers to be included in the @@ -3475,33 +3398,32 @@ openAPIV3Schema: to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of a - raw block device within a container. + description: volumeDevice describes a mapping of a raw + block device within a container. type: object properties: devicePath: - description: devicePath is the path inside of - the container that the device will be mapped - to. + description: devicePath is the path inside of the + container that the device will be mapped to. type: string name: description: name must match the name of a persistentVolumeClaim in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' + This field is optional to allow higher level config + management to default or override container images in + workload controllers like Deployments and StatefulSets.' type: string imagePullPolicy: description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag is - specified, or IfNotPresent otherwise. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + IfNotPresent. Defaults to Always if :latest tag is specified, + or IfNotPresent otherwise. Cannot be updated. More info: + https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: description: Probe describes a health check to be performed @@ -3516,21 +3438,20 @@ openAPIV3Schema: type: number periodSeconds: description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. + probe. Default to 10 seconds. Minimum value is 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + description: TCPSocketAction describes an action based + on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -3540,28 +3461,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + description: 'Optional: Host name to connect to, + defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. + probe to be considered successful after having failed. + Defaults to 1. Must be 1 for liveness and startup. + Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -3569,15 +3490,15 @@ openAPIV3Schema: type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. + description: Command is the command line to execute + inside the container, the working directory + for the command is root ('/') in the container's + filesystem. The command is simply exec'd, it + is not run inside a shell, so traditional shell + instructions ('|', etc) won't work. To use a + shell, you need to explicitly call out to that + shell. Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. type: array items: type: string @@ -3590,16 +3511,16 @@ openAPIV3Schema: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + description: Scheme to use for connecting to the + host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -3609,7 +3530,7 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -3620,8 +3541,8 @@ openAPIV3Schema: HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes + description: HTTPHeader describes a custom header + to be used in HTTP probes type: object properties: name: @@ -3631,15 +3552,15 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: - description: Whether this container should allocate - a buffer for stdin in the container runtime. If this - is not set, reads from stdin in the container will - always result in EOF. Default is false. + description: Whether this container should allocate a + buffer for stdin in the container runtime. If this is + not set, reads from stdin in the container will always + result in EOF. Default is false. type: boolean terminationMessagePolicy: description: Indicate how the termination message should @@ -3649,25 +3570,23 @@ openAPIV3Schema: chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, - whichever is smaller. Defaults to File. Cannot be - updated. + whichever is smaller. Defaults to File. Cannot be updated. type: string terminationMessagePath: description: 'Optional: Path at which the file to which - the container''s termination message will be written - is mounted into the container''s filesystem. Message - written is intended to be brief final status, such - as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' + the container''s termination message will be written + is mounted into the container''s filesystem. Message + written is intended to be brief final status, such as + an assertion failure message. Will be truncated by the + node if greater than 4096 bytes. The total message length + across all containers will be limited to 12kb. Defaults + to /dev/termination-log. Cannot be updated.' type: string workingDir: description: Container's working directory. If not specified, the container runtime's default will be used, which - might be configured in the container image. Cannot - be updated. + might be configured in the container image. Cannot be + updated. type: string resources: description: ResourceRequirements describes the compute @@ -3676,16 +3595,16 @@ openAPIV3Schema: properties: requests: description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + of compute resources required. If Requests is omitted + for a container, it defaults to Limits if that is + explicitly specified, otherwise to an implementation-defined + value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object @@ -3703,15 +3622,15 @@ openAPIV3Schema: type: boolean runAsUser: description: The UID to run the entrypoint of the - container process. Defaults to user specified - in image metadata if unspecified. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. + container process. Defaults to user specified in + image metadata if unspecified. May also be set in + PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. type: number capabilities: - description: Adds and removes POSIX capabilities - from running containers. + description: Adds and removes POSIX capabilities from + running containers. type: object properties: add: @@ -3725,8 +3644,8 @@ openAPIV3Schema: items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to be - applied to the container + description: SELinuxOptions are the labels to be applied + to the container type: object properties: role: @@ -3751,8 +3670,8 @@ openAPIV3Schema: type: object properties: gmsaCredentialSpec: - description: GMSACredentialSpec is where the - GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. This field is alpha-level and is only honored @@ -3760,15 +3679,15 @@ openAPIV3Schema: flag. type: string runAsUserName: - description: The UserName in Windows to run - the entrypoint of the container process. Defaults - to the user specified in image metadata if - unspecified. May also be set in PodSecurityContext. - If set in both SecurityContext and PodSecurityContext, + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes - precedence. This field is alpha-level and - it is only honored by servers that enable - the WindowsRunAsUserName feature flag. + precedence. This field is alpha-level and it + is only honored by servers that enable the WindowsRunAsUserName + feature flag. type: string gmsaCredentialSpecName: description: GMSACredentialSpecName is the name @@ -3777,39 +3696,36 @@ openAPIV3Schema: that enable the WindowsGMSA feature flag. type: string procMount: - description: procMount denotes the type of proc - mount to use for the containers. The default is - DefaultProcMount which uses the container runtime - defaults for readonly paths and masked paths. - This requires the ProcMountType feature flag to - be enabled. + description: procMount denotes the type of proc mount + to use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. This requires the ProcMountType + feature flag to be enabled. type: string allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the container - process. AllowPrivilegeEscalation is true always - when the container is: 1) run as Privileged 2) - has CAP_SYS_ADMIN' + description: 'AllowPrivilegeEscalation controls whether + a process can gain more privileges than its parent + process. This bool directly controls if the no_new_privs + flag will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as + Privileged 2) has CAP_SYS_ADMIN' type: boolean runAsGroup: description: The GID to run the entrypoint of the container process. Uses runtime default if unset. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. + May also be set in PodSecurityContext. If set in + both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. type: number runAsNonRoot: description: Indicates that the container must run - as a non-root user. If true, the Kubelet will - validate the image at runtime to ensure that it - does not run as UID 0 (root) and fail to start - the container if it does. If unset or false, no - such validation will be performed. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in - SecurityContext takes precedence. + as a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not + run as UID 0 (root) and fail to start the container + if it does. If unset or false, no such validation + will be performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: description: Whether this container has a read-only @@ -3828,21 +3744,20 @@ openAPIV3Schema: type: number periodSeconds: description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. + probe. Default to 10 seconds. Minimum value is 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + description: TCPSocketAction describes an action based + on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -3852,28 +3767,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + description: 'Optional: Host name to connect to, + defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. + probe to be considered successful after having failed. + Defaults to 1. Must be 1 for liveness and startup. + Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -3881,15 +3796,15 @@ openAPIV3Schema: type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. + description: Command is the command line to execute + inside the container, the working directory + for the command is root ('/') in the container's + filesystem. The command is simply exec'd, it + is not run inside a shell, so traditional shell + instructions ('|', etc) won't work. To use a + shell, you need to explicitly call out to that + shell. Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. type: array items: type: string @@ -3902,16 +3817,16 @@ openAPIV3Schema: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + description: Scheme to use for connecting to the + host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -3921,7 +3836,7 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -3932,8 +3847,8 @@ openAPIV3Schema: HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes + description: HTTPHeader describes a custom header + to be used in HTTP probes type: object properties: name: @@ -3943,13 +3858,13 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: - description: List of environment variables to set in - the container. Cannot be updated. + description: List of environment variables to set in the + container. Cannot be updated. type: array items: description: EnvVar represents an environment variable @@ -3957,23 +3872,23 @@ openAPIV3Schema: type: object properties: name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. + description: Name of the environment variable. Must + be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, - the reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a - double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether - the variable exists or not. Defaults to "".' + description: 'Variable references $(VAR_NAME) are + expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will + never be expanded, regardless of whether the variable + exists or not. Defaults to "".' type: string valueFrom: - description: EnvVarSource represents a source - for the value of an EnvVar. + description: EnvVarSource represents a source for + the value of an EnvVar. type: object properties: secretKeyRef: @@ -3983,19 +3898,18 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the Secret or its key must be defined type: boolean key: - description: The key of the secret to - select from. Must be a valid secret - key. + description: The key of the secret to select + from. Must be a valid secret key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their @@ -4004,64 +3918,62 @@ openAPIV3Schema: properties: divisor: description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling in - JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the - "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" - | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi | - Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M - | G | T | P | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms - is used, no quantity may represent a - number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may - be extended in the future if we require - larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type again - when it is serialized. Before serializing, - Quantity will be put in "canonical form". - This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such - that: a. No precision is lost b. - No fractional digits will be emitted c. - The exponent (or suffix) is as large - as possible. The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as they - are well formed, but will be re-emitted - in their canonical form. (So always - use canonical form, or don''t diff.) This - format is intended to make it difficult - to use these numbers without writing - some sort of special handling code in - the hopes that that will cause implementors - to also use a fixed point implementation.' + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" + case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= | + ::= + | | ::= + Ki | Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | + G | T | P | E (Note that 1024 = 1Ki + but 1000 = 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No matter which + of the three exponent forms is used, no + quantity may represent a number greater + than 2^63-1 in magnitude, nor may it have + more than 3 decimal places. Numbers larger + or more precise will be capped or rounded + up. (E.g.: 0.1m will rounded up to 1m.) + This may be extended in the future if + we require larger or smaller quantities. When + a Quantity is parsed from a string, it + will remember the type of suffix it had, + and will use the same type again when + it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will be + adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. No + fractional digits will be emitted c. + The exponent (or suffix) is as large as + possible. The sign will be omitted unless + the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note that + the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always use + canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing some + sort of special handling code in the hopes + that that will cause implementors to also + use a fixed point implementation.' type: object properties: number: @@ -4069,25 +3981,25 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string containerName: - description: 'Container name: required - for volumes, optional for env vars' + description: 'Container name: required for + volumes, optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object properties: name: description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap @@ -4097,34 +4009,33 @@ openAPIV3Schema: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the - FieldPath is written in terms of, defaults - to "v1". + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". type: string fieldPath: description: Path of the field to select in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: description: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but - is primarily informational. Not specifying a port - here DOES NOT prevent that port from being exposed. - Any port which is listening on the default "0.0.0.0" - address inside a container will be accessible from - the network. Cannot be updated. + is primarily informational. Not specifying a port here + DOES NOT prevent that port from being exposed. Any port + which is listening on the default "0.0.0.0" address + inside a container will be accessible from the network. + Cannot be updated. type: array items: description: ContainerPort represents a network port @@ -4136,14 +4047,14 @@ openAPIV3Schema: or SCTP. Defaults to "TCP". type: string hostIP: - description: What host IP to bind the external - port to. + description: What host IP to bind the external port + to. type: string name: description: If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in - a pod must have a unique name. Name for the - port that can be referred to by services. + a pod must have a unique name. Name for the port + that can be referred to by services. type: string containerPort: description: Number of port to expose on the pod's @@ -4153,23 +4064,22 @@ openAPIV3Schema: hostPort: description: Number of port to expose on the host. If specified, this must be a valid port number, - 0 < x < 65536. If HostNetwork is specified, - this must match ContainerPort. Most containers - do not need this. + 0 < x < 65536. If HostNetwork is specified, this + must match ContainerPort. Most containers do not + need this. type: number required: - - containerPort + - containerPort command: - description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used if - this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. If - a variable cannot be resolved, the reference in the - input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be updated. - More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + description: 'Entrypoint array. Not executed within a + shell. The docker image''s ENTRYPOINT is used if this + is not provided. Variable references $(VAR_NAME) are + expanded using the container''s environment. If a variable + cannot be resolved, the reference in the input string + will be unchanged. The $(VAR_NAME) syntax can be escaped + with a double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string @@ -4178,8 +4088,8 @@ openAPIV3Schema: filesystem. Cannot be updated. type: array items: - description: VolumeMount describes a mounting of a - Volume within a container. + description: VolumeMount describes a mounting of a Volume + within a container. type: object properties: mountPath: @@ -4202,33 +4112,32 @@ openAPIV3Schema: false. type: boolean subPath: - description: Path within the volume from which - the container's volume should be mounted. Defaults + description: Path within the volume from which the + container's volume should be mounted. Defaults to "" (volume's root). type: string subPathExpr: description: Expanded path within the volume from which the container's volume should be mounted. - Behaves similarly to SubPath but environment - variable references $(VAR_NAME) are expanded - using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath - are mutually exclusive. This field is beta in - 1.15. + Behaves similarly to SubPath but environment variable + references $(VAR_NAME) are expanded using the + container's environment. Defaults to "" (volume's + root). SubPathExpr and SubPath are mutually exclusive. + This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. The - $(VAR_NAME) syntax can be escaped with a double $$, - ie: $$(VAR_NAME). Escaped references will never be - expanded, regardless of whether the variable exists - or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the reference + in the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be updated. + More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string @@ -4252,9 +4161,9 @@ openAPIV3Schema: type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, it produces or consumes the inner type. This allows you to have, for example, a JSON field that can accept a name or number. @@ -4267,29 +4176,29 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port exec: - description: ExecAction describes a "run in - container" action. + description: ExecAction describes a "run in container" + action. type: object properties: command: - description: Command is the command line - to execute inside the container, the working + description: Command is the command line to + execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. type: array items: type: string @@ -4299,17 +4208,16 @@ openAPIV3Schema: type: object properties: path: - description: Path to access on the HTTP - server. + description: Path to access on the HTTP server. type: string scheme: description: Scheme to use for connecting to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, it produces or consumes the inner type. This allows you to have, for example, a JSON field that can accept a name or number. @@ -4322,7 +4230,7 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -4344,10 +4252,10 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: description: Handler defines a specific action that should be taken @@ -4359,9 +4267,9 @@ openAPIV3Schema: type: object properties: port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, it produces or consumes the inner type. This allows you to have, for example, a JSON field that can accept a name or number. @@ -4374,29 +4282,29 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port exec: - description: ExecAction describes a "run in - container" action. + description: ExecAction describes a "run in container" + action. type: object properties: command: - description: Command is the command line - to execute inside the container, the working + description: Command is the command line to + execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command - is simply exec'd, it is not run inside - a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, - you need to explicitly call out to that - shell. Exit status of 0 is treated as - live/healthy and non-zero is unhealthy. + is simply exec'd, it is not run inside a + shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you + need to explicitly call out to that shell. + Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. type: array items: type: string @@ -4406,17 +4314,16 @@ openAPIV3Schema: type: object properties: path: - description: Path to access on the HTTP - server. + description: Path to access on the HTTP server. type: string scheme: description: Scheme to use for connecting to the host. Defaults to HTTP. type: string port: - description: IntOrString is a type that - can hold an int32 or a string. When used - in JSON or YAML marshalling and unmarshalling, + description: IntOrString is a type that can + hold an int32 or a string. When used in + JSON or YAML marshalling and unmarshalling, it produces or consumes the inner type. This allows you to have, for example, a JSON field that can accept a name or number. @@ -4429,7 +4336,7 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set @@ -4451,19 +4358,19 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated. type: string tty: - description: Whether this container should allocate - a TTY for itself, also requires 'stdin' to be true. - Default is false. + description: Whether this container should allocate a + TTY for itself, also requires 'stdin' to be true. Default + is false. type: boolean readinessProbe: description: Probe describes a health check to be performed @@ -4478,21 +4385,20 @@ openAPIV3Schema: type: number periodSeconds: description: How often (in seconds) to perform the - probe. Default to 10 seconds. Minimum value is - 1. + probe. Default to 10 seconds. Minimum value is 1. type: number tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + description: TCPSocketAction describes an action based + on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -4502,28 +4408,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + description: 'Optional: Host name to connect to, + defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: description: Minimum consecutive successes for the - probe to be considered successful after having - failed. Defaults to 1. Must be 1 for liveness - and startup. Minimum value is 1. + probe to be considered successful after having failed. + Defaults to 1. Must be 1 for liveness and startup. + Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -4531,15 +4437,15 @@ openAPIV3Schema: type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. + description: Command is the command line to execute + inside the container, the working directory + for the command is root ('/') in the container's + filesystem. The command is simply exec'd, it + is not run inside a shell, so traditional shell + instructions ('|', etc) won't work. To use a + shell, you need to explicitly call out to that + shell. Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. type: array items: type: string @@ -4552,16 +4458,16 @@ openAPIV3Schema: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + description: Scheme to use for connecting to the + host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -4571,7 +4477,7 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -4582,8 +4488,8 @@ openAPIV3Schema: HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes + description: HTTPHeader describes a custom header + to be used in HTTP probes type: object properties: name: @@ -4593,32 +4499,32 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain - open across multiple attach sessions. If stdinOnce - is set to true, stdin is opened on container start, - is empty until the first client attaches to stdin, - and then remains open and accepts data until the client + open across multiple attach sessions. If stdinOnce is + set to true, stdin is opened on container start, is + empty until the first client attaches to stdin, and + then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false type: boolean envFrom: - description: List of sources to populate environment - variables in the container. The keys defined within - a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is - starting. When a key exists in multiple sources, the - value associated with the last source will take precedence. - Values defined by an Env with a duplicate key will - take precedence. Cannot be updated. + description: List of sources to populate environment variables + in the container. The keys defined within a source must + be a C_IDENTIFIER. All invalid keys will be reported + as an event when the container is starting. When a key + exists in multiple sources, the value associated with + the last source will take precedence. Values defined + by an Env with a duplicate key will take precedence. + Cannot be updated. type: array items: description: EnvFromSource represents the source of @@ -4635,34 +4541,33 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - must be defined + description: Specify whether the ConfigMap must + be defined type: boolean prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. + description: An optional identifier to prepend to + each key in the ConfigMap. Must be a C_IDENTIFIER. type: string secretRef: - description: SecretEnvSource selects a Secret - to populate the environment variables with. The + description: SecretEnvSource selects a Secret to + populate the environment variables with. The contents of the target Secret's Data field will - represent the key-value pairs as environment - variables. + represent the key-value pairs as environment variables. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the Secret must be defined type: boolean required: - - name + - name shutdown: type: object description: Configures how the operator should shutdown the @@ -4670,41 +4575,41 @@ openAPIV3Schema: properties: ignoreSessions: type: boolean - description: For graceful shutdown only, indicates to - ignore pending HTTP sessions during in-flight work handling. + description: For graceful shutdown only, indicates to ignore + pending HTTP sessions during in-flight work handling. Not required. Defaults to false. shutdownType: type: string - description: Tells the operator how to shutdown server - instances. Not required. Defaults to graceful shutdown. + description: Tells the operator how to shutdown server instances. + Not required. Defaults to graceful shutdown. enum: - - Graceful - - Forced + - Graceful + - Forced timeoutSeconds: type: number description: For graceful shutdown only, number of seconds - to wait before aborting in-flight work and shutting - down the server. Not required. Defaults to 30 seconds. + to wait before aborting in-flight work and shutting down + the server. Not required. Defaults to 30 seconds. affinity: type: object description: If specified, the pod's scheduling constraints properties: nodeAffinity: type: object - description: Node affinity is a group of node affinity - scheduling rules. + description: Node affinity is a group of node affinity scheduling + rules. properties: requiredDuringSchedulingIgnoredDuringExecution: type: object - description: A node selector represents the union - of the results of one or more label queries over - a set of nodes; that is, it represents the OR of - the selectors represented by the node selector terms. + description: A node selector represents the union of + the results of one or more label queries over a set + of nodes; that is, it represents the OR of the selectors + represented by the node selector terms. properties: nodeSelectorTerms: type: array - description: Required. A list of node selector - terms. The terms are ORed. + description: Required. A list of node selector terms. + The terms are ORed. items: description: A null or empty node selector term matches no objects. The requirements of them @@ -4718,22 +4623,22 @@ openAPIV3Schema: type: array items: description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. + is a selector that contains values, a + key, and an operator that relates the + key and values. type: object properties: values: description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. type: array items: type: string @@ -4748,30 +4653,30 @@ openAPIV3Schema: Gt, and Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. type: array items: description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. + is a selector that contains values, a + key, and an operator that relates the + key and values. type: object properties: values: description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. type: array items: type: string @@ -4786,29 +4691,28 @@ openAPIV3Schema: Gt, and Lt. type: string required: - - key - - operator + - key + - operator required: - - nodeSelectorTerms + - nodeSelectorTerms preferredDuringSchedulingIgnoredDuringExecution: type: array - description: The scheduler will prefer to schedule - pods to nodes that satisfy the affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. The - node that is most preferred is the one with the - greatest sum of weights, i.e. for each node that - meets all of the scheduling requirements (resource - request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements - of this field and adding "weight" to the sum if - the node matches the corresponding matchExpressions; + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. items: - description: An empty preferred scheduling term - matches all objects with implicit weight 0 (i.e. - it's a no-op). A null preferred scheduling term - matches no objects (i.e. is also a no-op). + description: An empty preferred scheduling term matches + all objects with implicit weight 0 (i.e. it's a + no-op). A null preferred scheduling term matches + no objects (i.e. is also a no-op). type: object properties: preference: @@ -4824,22 +4728,22 @@ openAPIV3Schema: type: array items: description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. + is a selector that contains values, a + key, and an operator that relates the + key and values. type: object properties: values: description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. type: array items: type: string @@ -4854,30 +4758,30 @@ openAPIV3Schema: Gt, and Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. type: array items: description: A node selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. + is a selector that contains values, a + key, and an operator that relates the + key and values. type: object properties: values: description: An array of string values. - If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. - If the operator is Gt or Lt, the - values array must have a single - element, which will be interpreted - as an integer. This array is replaced - during a strategic merge patch. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. type: array items: type: string @@ -4892,16 +4796,16 @@ openAPIV3Schema: Gt, and Lt. type: string required: - - key - - operator + - key + - operator weight: - description: Weight associated with matching - the corresponding nodeSelectorTerm, in the - range 1-100. + description: Weight associated with matching the + corresponding nodeSelectorTerm, in the range + 1-100. type: number required: - - preference - - weight + - preference + - weight podAffinity: type: object description: Pod affinity is a group of inter pod affinity @@ -4911,89 +4815,87 @@ openAPIV3Schema: type: array description: If the affinity requirements specified by this field are not met at scheduling time, the - pod will not be scheduled onto the node. If the - affinity requirements specified by this field cease - to be met at some point during pod execution (e.g. - due to a pod label update), the system may or may - not try to eventually evict the pod from its node. - When there are multiple elements, the lists of nodes - corresponding to each podAffinityTerm are intersected, - i.e. all terms must be satisfied. + pod will not be scheduled onto the node. If the affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a + pod label update), the system may or may not try to + eventually evict the pod from its node. When there + are multiple elements, the lists of nodes corresponding + to each podAffinityTerm are intersected, i.e. all + terms must be satisfied. items: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) with, - where co-located is defined as running on a node - whose value of the label with key - matches that of any node on which a pod of the - set of pods is running + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or + not co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any + node on which a pod of the set of pods is running type: object properties: labelSelector: description: A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label - selector matches all objects. A null label - selector matches no objects. + selector matches all objects. A null label selector + matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The requirements + description: matchExpressions is a list of + label selector requirements. The requirements are ANDed. type: array items: description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. + is a selector that contains values, a + key, and an operator that relates the + key and values. type: object properties: values: - description: values is an array of - string values. If the operator is - In or NotIn, the values array must - be non-empty. If the operator is - Exists or DoesNotExist, the values - array must be empty. This array - is replaced during a strategic merge - patch. + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. type: array items: type: string key: - description: key is the label key - that the selector applies to. + description: key is the label key that + the selector applies to. type: string operator: - description: operator represents a - key's relationship to a set of values. - Valid operators are In, NotIn, Exists - and DoesNotExist. + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. additionalProperties: type: string type: object topologyKey: description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the - pods matching the labelSelector in the specified - namespaces, where co-located is defined as - running on a node whose value of the label - with key topologyKey matches that of any node - on which any of the selected pods is running. - Empty topologyKey is not allowed. + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified + namespaces, where co-located is defined as running + on a node whose value of the label with key + topologyKey matches that of any node on which + any of the selected pods is running. Empty topologyKey + is not allowed. type: string namespaces: description: namespaces specifies which namespaces @@ -5003,22 +4905,21 @@ openAPIV3Schema: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: type: array - description: The scheduler will prefer to schedule - pods to nodes that satisfy the affinity expressions - specified by this field, but it may choose a node - that violates one or more of the expressions. The - node that is most preferred is the one with the - greatest sum of weights, i.e. for each node that - meets all of the scheduling requirements (resource - request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements - of this field and adding "weight" to the sum if - the node has pods which matches the corresponding - podAffinityTerm; the node(s) with the highest sum - are the most preferred. + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node has pods which matches the + corresponding podAffinityTerm; the node(s) with the + highest sum are the most preferred. items: description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred @@ -5027,22 +4928,21 @@ openAPIV3Schema: properties: podAffinityTerm: description: Defines a set of pods (namely those - matching the labelSelector relative to the - given namespace(s)) that this pod should be - co-located (affinity) or not co-located (anti-affinity) + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key - matches that of any node on - which a pod of the set of pods is running + matches that of any node on which + a pod of the set of pods is running type: object properties: labelSelector: - description: A label selector is a label - query over a set of resources. The result - of matchLabels and matchExpressions are - ANDed. An empty label selector matches - all objects. A null label selector matches - no objects. + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty + label selector matches all objects. A null + label selector matches no objects. type: object properties: matchExpressions: @@ -5063,16 +4963,15 @@ openAPIV3Schema: is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the - values array must be empty. - This array is replaced during - a strategic merge patch. + values array must be empty. This + array is replaced during a strategic + merge patch. type: array items: type: string key: - description: key is the label - key that the selector applies - to. + description: key is the label key + that the selector applies to. type: string operator: description: operator represents @@ -5081,17 +4980,15 @@ openAPIV3Schema: In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: - description: matchLabels is a map of - {key,value} pairs. A single {key,value} - in the matchLabels map is equivalent - to an element of matchExpressions, + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains - only "value". The requirements are - ANDed. + only "value". The requirements are ANDed. additionalProperties: type: string type: object @@ -5100,122 +4997,119 @@ openAPIV3Schema: (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located - is defined as running on a node whose - value of the label with key topologyKey - matches that of any node on which any - of the selected pods is running. Empty - topologyKey is not allowed. + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. type: string namespaces: - description: namespaces specifies which - namespaces the labelSelector applies to - (matches against); null or empty list - means "this pod's namespace" + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" type: array items: type: string required: - - topologyKey + - topologyKey weight: - description: weight associated with matching - the corresponding podAffinityTerm, in the - range 1-100. + description: weight associated with matching the + corresponding podAffinityTerm, in the range + 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight podAntiAffinity: type: object - description: Pod anti affinity is a group of inter pod - anti affinity scheduling rules. + description: Pod anti affinity is a group of inter pod anti + affinity scheduling rules. properties: requiredDuringSchedulingIgnoredDuringExecution: type: array description: If the anti-affinity requirements specified by this field are not met at scheduling time, the - pod will not be scheduled onto the node. If the - anti-affinity requirements specified by this field - cease to be met at some point during pod execution - (e.g. due to a pod label update), the system may - or may not try to eventually evict the pod from - its node. When there are multiple elements, the - lists of nodes corresponding to each podAffinityTerm - are intersected, i.e. all terms must be satisfied. + pod will not be scheduled onto the node. If the anti-affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a + pod label update), the system may or may not try to + eventually evict the pod from its node. When there + are multiple elements, the lists of nodes corresponding + to each podAffinityTerm are intersected, i.e. all + terms must be satisfied. items: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) with, - where co-located is defined as running on a node - whose value of the label with key - matches that of any node on which a pod of the - set of pods is running + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or + not co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any + node on which a pod of the set of pods is running type: object properties: labelSelector: description: A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label - selector matches all objects. A null label - selector matches no objects. + selector matches all objects. A null label selector + matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The requirements + description: matchExpressions is a list of + label selector requirements. The requirements are ANDed. type: array items: description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. + is a selector that contains values, a + key, and an operator that relates the + key and values. type: object properties: values: - description: values is an array of - string values. If the operator is - In or NotIn, the values array must - be non-empty. If the operator is - Exists or DoesNotExist, the values - array must be empty. This array - is replaced during a strategic merge - patch. + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. type: array items: type: string key: - description: key is the label key - that the selector applies to. + description: key is the label key that + the selector applies to. type: string operator: - description: operator represents a - key's relationship to a set of values. - Valid operators are In, NotIn, Exists - and DoesNotExist. + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. additionalProperties: type: string type: object topologyKey: description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the - pods matching the labelSelector in the specified - namespaces, where co-located is defined as - running on a node whose value of the label - with key topologyKey matches that of any node - on which any of the selected pods is running. - Empty topologyKey is not allowed. + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified + namespaces, where co-located is defined as running + on a node whose value of the label with key + topologyKey matches that of any node on which + any of the selected pods is running. Empty topologyKey + is not allowed. type: string namespaces: description: namespaces specifies which namespaces @@ -5225,22 +5119,21 @@ openAPIV3Schema: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: type: array - description: The scheduler will prefer to schedule - pods to nodes that satisfy the anti-affinity expressions + description: The scheduler will prefer to schedule pods + to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The - node that is most preferred is the one with the - greatest sum of weights, i.e. for each node that - meets all of the scheduling requirements (resource - request, requiredDuringScheduling anti-affinity - expressions, etc.), compute a sum by iterating through - the elements of this field and adding "weight" to - the sum if the node has pods which matches the corresponding - podAffinityTerm; the node(s) with the highest sum - are the most preferred. + node that is most preferred is the one with the greatest + sum of weights, i.e. for each node that meets all + of the scheduling requirements (resource request, + requiredDuringScheduling anti-affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if the + node has pods which matches the corresponding podAffinityTerm; + the node(s) with the highest sum are the most preferred. items: description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred @@ -5249,22 +5142,21 @@ openAPIV3Schema: properties: podAffinityTerm: description: Defines a set of pods (namely those - matching the labelSelector relative to the - given namespace(s)) that this pod should be - co-located (affinity) or not co-located (anti-affinity) + matching the labelSelector relative to the given + namespace(s)) that this pod should be co-located + (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key - matches that of any node on - which a pod of the set of pods is running + matches that of any node on which + a pod of the set of pods is running type: object properties: labelSelector: - description: A label selector is a label - query over a set of resources. The result - of matchLabels and matchExpressions are - ANDed. An empty label selector matches - all objects. A null label selector matches - no objects. + description: A label selector is a label query + over a set of resources. The result of matchLabels + and matchExpressions are ANDed. An empty + label selector matches all objects. A null + label selector matches no objects. type: object properties: matchExpressions: @@ -5285,16 +5177,15 @@ openAPIV3Schema: is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the - values array must be empty. - This array is replaced during - a strategic merge patch. + values array must be empty. This + array is replaced during a strategic + merge patch. type: array items: type: string key: - description: key is the label - key that the selector applies - to. + description: key is the label key + that the selector applies to. type: string operator: description: operator represents @@ -5303,17 +5194,15 @@ openAPIV3Schema: In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: - description: matchLabels is a map of - {key,value} pairs. A single {key,value} - in the matchLabels map is equivalent - to an element of matchExpressions, + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains - only "value". The requirements are - ANDed. + only "value". The requirements are ANDed. additionalProperties: type: string type: object @@ -5322,38 +5211,37 @@ openAPIV3Schema: (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located - is defined as running on a node whose - value of the label with key topologyKey - matches that of any node on which any - of the selected pods is running. Empty - topologyKey is not allowed. + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. type: string namespaces: - description: namespaces specifies which - namespaces the labelSelector applies to - (matches against); null or empty list - means "this pod's namespace" + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" type: array items: type: string required: - - topologyKey + - topologyKey weight: - description: weight associated with matching - the corresponding podAffinityTerm, in the - range 1-100. + description: weight associated with matching the + corresponding podAffinityTerm, in the range + 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight serverStartPolicy: type: string description: The strategy for deciding whether to start a server. Legal values are ALWAYS, NEVER, or IF_NEEDED. enum: - - ALWAYS - - NEVER - - IF_NEEDED + - ALWAYS + - NEVER + - IF_NEEDED adminService: type: object description: Configures which of the Administration Server's WebLogic @@ -5373,26 +5261,26 @@ openAPIV3Schema: type: object properties: channelName: - description: "Name of channel.\n'default' refers to\ - \ the Administration Server's default channel (configured\ - \ via the ServerMBean's ListenPort) \n'default-secure'\ - \ refers to the Administration Server's default secure\ - \ channel (configured via the ServerMBean's SSLMBean's\ - \ ListenPort) \n'default-admin' refers to the Administration\ - \ Server's default administrative channel (configured\ - \ via the DomainMBean's AdministrationPort) \nOtherwise,\ - \ the name is the name of one of the Administration\ - \ Server's network access points (configured via the\ - \ ServerMBean's NetworkAccessMBeans)." + description: "Name of channel.\n'default' refers to the\ + \ Administration Server's default channel (configured\ + \ via the ServerMBean's ListenPort) \n'default-secure'\ + \ refers to the Administration Server's default secure\ + \ channel (configured via the ServerMBean's SSLMBean's\ + \ ListenPort) \n'default-admin' refers to the Administration\ + \ Server's default administrative channel (configured\ + \ via the DomainMBean's AdministrationPort) \nOtherwise,\ + \ the name is the name of one of the Administration\ + \ Server's network access points (configured via the\ + \ ServerMBean's NetworkAccessMBeans)." type: string nodePort: description: Specifies the port number used to access the WebLogic channel outside of the Kubernetes cluster. - If not specified, defaults to the port defined by - the WebLogic channel. + If not specified, defaults to the port defined by the + WebLogic channel. type: number required: - - channelName + - channelName annotations: type: object additionalProperties: @@ -5403,25 +5291,23 @@ openAPIV3Schema: type: object additionalProperties: type: string - description: Labels to associate with the external channel - service. + description: Labels to associate with the external channel service. restartVersion: type: string - description: If present, every time this value is updated the - operator will restart the required servers. + description: If present, every time this value is updated the operator + will restart the required servers. serverPod: type: object description: Configuration affecting server pods. properties: nodeName: type: string - description: NodeName is a request to schedule this pod onto a - specific node. If it is non-empty, the scheduler simply schedules - this pod onto that node, assuming that it fits resource requirements. + description: NodeName is a request to schedule this pod onto a specific + node. If it is non-empty, the scheduler simply schedules this + pod onto that node, assuming that it fits resource requirements. livenessProbe: type: object - description: Settings for the liveness probe associated with a - server. + description: Settings for the liveness probe associated with a server. properties: periodSeconds: type: number @@ -5432,30 +5318,30 @@ openAPIV3Schema: a failure. initialDelaySeconds: type: number - description: The number of seconds before the first check - is performed. + description: The number of seconds before the first check is + performed. readinessGates: type: array description: 'If specified, all readiness gates will be evaluated - for pod readiness. A pod is ready when all its containers are - ready AND all conditions specified in the readiness gates have - status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + for pod readiness. A pod is ready when all its containers are + ready AND all conditions specified in the readiness gates have + status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' items: description: PodReadinessGate contains the reference to a pod condition type: object properties: conditionType: - description: ConditionType refers to a condition in the - pod's condition list with matching type. + description: ConditionType refers to a condition in the pod's + condition list with matching type. type: string required: - - conditionType + - conditionType serviceAccountName: type: string - description: Name of the ServiceAccount to be used to run this - pod. If it is not set, default ServiceAccount will be used. - The ServiceAccount has to exist at the time the pod is created. + description: Name of the ServiceAccount to be used to run this pod. + If it is not set, default ServiceAccount will be used. The ServiceAccount + has to exist at the time the pod is created. podSecurityContext: type: object description: Pod-level security attributes. @@ -5463,10 +5349,10 @@ openAPIV3Schema: runAsUser: type: number description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata if - unspecified. May also be set in SecurityContext. If set - in both SecurityContext and PodSecurityContext, the value - specified in SecurityContext takes precedence for that container. + process. Defaults to user specified in image metadata if unspecified. + May also be set in SecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence for that container. seLinuxOptions: type: object description: SELinuxOptions are the labels to be applied to @@ -5474,30 +5360,30 @@ openAPIV3Schema: properties: role: type: string - description: Role is a SELinux role label that applies - to the container. + description: Role is a SELinux role label that applies to + the container. level: type: string - description: Level is SELinux level label that applies - to the container. + description: Level is SELinux level label that applies to + the container. type: type: string - description: Type is a SELinux type label that applies - to the container. + description: Type is a SELinux type label that applies to + the container. user: type: string - description: User is a SELinux user label that applies - to the container. + description: User is a SELinux user label that applies to + the container. fsGroup: type: number - description: 'A special supplemental group that applies to - all containers in a pod. Some volume types allow the Kubelet - to change the ownership of that volume to be owned by the - pod: 1. The owning GID will be the FSGroup 2. The setgid - bit is set (new files created in the volume will be owned - by FSGroup) 3. The permission bits are OR''d with rw-rw---- If - unset, the Kubelet will not modify the ownership and permissions - of any volume.' + description: 'A special supplemental group that applies to all + containers in a pod. Some volume types allow the Kubelet to + change the ownership of that volume to be owned by the pod: 1. + The owning GID will be the FSGroup 2. The setgid bit is set + (new files created in the volume will be owned by FSGroup) + 3. The permission bits are OR''d with rw-rw---- If unset, + the Kubelet will not modify the ownership and permissions + of any volume.' windowsOptions: type: object description: WindowsSecurityContextOptions contain Windows-specific @@ -5515,41 +5401,40 @@ openAPIV3Schema: type: string description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set in - PodSecurityContext. If set in both SecurityContext and - PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and it is - only honored by servers that enable the WindowsRunAsUserName - feature flag. + in image metadata if unspecified. May also be set in PodSecurityContext. + If set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + This field is alpha-level and it is only honored by servers + that enable the WindowsRunAsUserName feature flag. gmsaCredentialSpecName: type: string - description: GMSACredentialSpecName is the name of the - GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA + description: GMSACredentialSpecName is the name of the GMSA + credential spec to use. This field is alpha-level and + is only honored by servers that enable the WindowsGMSA feature flag. supplementalGroups: type: array - description: A list of groups applied to the first process - run in each container, in addition to the container's primary + description: A list of groups applied to the first process run + in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container. items: type: number runAsGroup: type: number description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be set - in SecurityContext. If set in both SecurityContext and - PodSecurityContext, the value specified in SecurityContext - takes precedence for that container. + process. Uses runtime default if unset. May also be set in + SecurityContext. If set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence for + that container. runAsNonRoot: type: boolean description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime - to ensure that it does not run as UID 0 (root) and fail - to start the container if it does. If unset or false, no - such validation will be performed. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. + to ensure that it does not run as UID 0 (root) and fail to + start the container if it does. If unset or false, no such + validation will be performed. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, the value + specified in SecurityContext takes precedence. sysctls: type: array description: Sysctls hold a list of namespaced sysctls used @@ -5566,22 +5451,22 @@ openAPIV3Schema: description: Value of a property to set type: string required: - - name - - value + - name + - value priorityClassName: type: string description: If specified, indicates the pod's priority. "system-node-critical" - and "system-cluster-critical" are two special keywords which - indicate the highest priorities with the former being the highest - priority. Any other name must be defined by creating a PriorityClass - object with that name. If not specified, the pod priority will - be default or zero if there is no default. + and "system-cluster-critical" are two special keywords which indicate + the highest priorities with the former being the highest priority. + Any other name must be defined by creating a PriorityClass object + with that name. If not specified, the pod priority will be default + or zero if there is no default. volumes: type: array description: Additional volumes to be created in the server pod. items: - description: Volume represents a named volume in a pod that - may be accessed by any container in the pod. + description: Volume represents a named volume in a pod that may + be accessed by any container in the pod. type: object properties: quobyte: @@ -5596,22 +5481,22 @@ openAPIV3Schema: type: string registry: description: Registry represents a single or multiple - Quobyte Registry services specified as a string as - host:port pair (multiple entries are separated with - commas) which acts as the central registry for volumes + Quobyte Registry services specified as a string as host:port + pair (multiple entries are separated with commas) which + acts as the central registry for volumes type: string readOnly: description: ReadOnly here will force the Quobyte volume - to be mounted with read-only permissions. Defaults - to false. + to be mounted with read-only permissions. Defaults to + false. type: boolean user: description: User to map volume access to Defaults to serivceaccount user type: string tenant: - description: Tenant owning the given Quobyte volume - in the Backend Used with dynamically provisioned Quobyte + description: Tenant owning the given Quobyte volume in + the Backend Used with dynamically provisioned Quobyte volumes, value is set by the plugin type: string group: @@ -5619,16 +5504,16 @@ openAPIV3Schema: no group type: string required: - - registry - - volume + - registry + - volume azureFile: - description: AzureFile represents an Azure File Service - mount on the host and bind mount to the pod. + description: AzureFile represents an Azure File Service mount + on the host and bind mount to the pod. type: object properties: secretName: - description: the name of secret that contains Azure - Storage Account Name and Key + description: the name of secret that contains Azure Storage + Account Name and Key type: string readOnly: description: Defaults to false (read/write). ReadOnly @@ -5638,16 +5523,16 @@ openAPIV3Schema: description: Share Name type: string required: - - secretName - - shareName + - secretName + - shareName flexVolume: description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. type: object properties: driver: - description: Driver is the name of the driver to use - for this volume. + description: Driver is the name of the driver to use for + this volume. type: string options: description: 'Optional: Extra command options if any.' @@ -5656,8 +5541,8 @@ openAPIV3Schema: type: object secretRef: description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. + to let you locate the referenced object inside the same + namespace. type: object properties: name: @@ -5665,7 +5550,7 @@ openAPIV3Schema: type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' + ReadOnly here will force the ReadOnly setting in VolumeMounts.' type: boolean fsType: description: Filesystem type to mount. Must be a filesystem @@ -5674,68 +5559,66 @@ openAPIV3Schema: script. type: string required: - - driver + - driver secret: description: Adapts a Secret into a volume. The contents - of the target Secret's Data field will be presented in - a volume as files using the keys in the Data field as - the file names. Secret volumes support ownership management + of the target Secret's Data field will be presented in a + volume as files using the keys in the Data field as the + file names. Secret volumes support ownership management and SELinux relabeling. type: object properties: secretName: description: 'Name of the secret in the pod''s namespace - to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' type: string defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and 0777. - Defaults to 0644. Directories within the path are - not affected by this setting. This might be in conflict - with other options that affect the file mode, like - fsGroup, and the result can be other mode bits set.' + description: 'Optional: mode bits to use on created files + by default. Must be a value between 0 and 0777. Defaults + to 0644. Directories within the path are not affected + by this setting. This might be in conflict with other + options that affect the file mode, like fsGroup, and + the result can be other mode bits set.' type: number optional: - description: Specify whether the Secret or its keys - must be defined + description: Specify whether the Secret or its keys must + be defined type: boolean items: - description: If unspecified, each key-value pair in - the Data field of the referenced Secret will be projected + description: If unspecified, each key-value pair in the + Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will - error unless it is marked optional. Paths must be - relative and may not contain the '..' path or start - with '..'. + error unless it is marked optional. Paths must be relative + and may not contain the '..' path or start with '..'. type: array items: - description: Maps a string key to a path within a - volume. + description: Maps a string key to a path within a volume. type: object properties: mode: description: 'Optional: mode bits to use on this - file, must be a value between 0 and 0777. If - not specified, the volume defaultMode will be - used. This might be in conflict with other options - that affect the file mode, like fsGroup, and - the result can be other mode bits set.' + file, must be a value between 0 and 0777. If not + specified, the volume defaultMode will be used. + This might be in conflict with other options that + affect the file mode, like fsGroup, and the result + can be other mode bits set.' type: number path: - description: The relative path of the file to - map the key to. May not be an absolute path. - May not contain the path element '..'. May not - start with the string '..'. + description: The relative path of the file to map + the key to. May not be an absolute path. May not + contain the path element '..'. May not start with + the string '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path projected: description: Represents a projected volume source type: object @@ -5749,10 +5632,10 @@ openAPIV3Schema: type: object properties: downwardAPI: - description: Represents downward API info for - projecting into a projected volume. Note that - this is identical to a downwardAPI volume source - without the default mode. + description: Represents downward API info for projecting + into a projected volume. Note that this is identical + to a downwardAPI volume source without the default + mode. type: object properties: items: @@ -5766,97 +5649,95 @@ openAPIV3Schema: type: object properties: mode: - description: 'Optional: mode bits to - use on this file, must be a value - between 0 and 0777. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might + be in conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode bits + set.' type: number path: - description: 'Required: Path is the - relative path name of the file to - be created. Must not be absolute or - contain the ''..'' path. Must be utf-8 - encoded. The first item of the relative - path must not start with ''..''' + description: 'Required: Path is the relative + path name of the file to be created. + Must not be absolute or contain the + ''..'' path. Must be utf-8 encoded. + The first item of the relative path + must not start with ''..''' type: string resourceFieldRef: description: ResourceFieldSelector represents - container resources (cpu, memory) - and their output format + container resources (cpu, memory) and + their output format type: object properties: divisor: description: 'Quantity is a fixed-point - representation of a number. It - provides convenient marshaling/unmarshaling - in JSON and YAML, in addition - to String() and AsInt64() accessors. The - serialization format is: ::= - (Note - that may be empty, from - the "" case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | - . | . ::= - "+" | "-" ::= - | ::= - | - | ::= - Ki | Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | - k | M | G | T | P | E (Note - that 1024 = 1Ki but 1000 = 1k; - I didn''t choose the capitalization.) - ::= "e" - | "E" No matter - which of the three exponent forms - is used, no quantity may represent - a number greater than 2^63-1 in - magnitude, nor may it have more - than 3 decimal places. Numbers - larger or more precise will be - capped or rounded up. (E.g.: 0.1m - will rounded up to 1m.) This may - be extended in the future if we - require larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same - type again when it is serialized. Before - serializing, Quantity will be - put in "canonical form". This - means that Exponent/suffix will - be adjusted up or down (with a - corresponding increase or decrease - in Mantissa) such that: a. No - precision is lost b. No fractional - digits will be emitted c. The - exponent (or suffix) is as large - as possible. The sign will be - omitted unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be - internally represented by a floating - point number. That is the whole - point of this exercise. Non-canonical - values will still parse as long - as they are well formed, but will - be re-emitted in their canonical - form. (So always use canonical - form, or don''t diff.) This format - is intended to make it difficult - to use these numbers without writing - some sort of special handling - code in the hopes that that will - cause implementors to also use - a fixed point implementation.' + representation of a number. It provides + convenient marshaling/unmarshaling + in JSON and YAML, in addition to + String() and AsInt64() accessors. The + serialization format is: ::= + (Note that + may be empty, from the + "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= + "+" | "-" ::= + | ::= + | | + ::= + Ki | Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k + | M | G | T | P | E (Note that + 1024 = 1Ki but 1000 = 1k; I didn''t + choose the capitalization.) + ::= "e" | "E" No + matter which of the three exponent + forms is used, no quantity may represent + a number greater than 2^63-1 in + magnitude, nor may it have more + than 3 decimal places. Numbers larger + or more precise will be capped or + rounded up. (E.g.: 0.1m will rounded + up to 1m.) This may be extended + in the future if we require larger + or smaller quantities. When a Quantity + is parsed from a string, it will + remember the type of suffix it had, + and will use the same type again + when it is serialized. Before serializing, + Quantity will be put in "canonical + form". This means that Exponent/suffix + will be adjusted up or down (with + a corresponding increase or decrease + in Mantissa) such that: a. No + precision is lost b. No fractional + digits will be emitted c. The + exponent (or suffix) is as large + as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be + internally represented by a floating + point number. That is the whole + point of this exercise. Non-canonical + values will still parse as long + as they are well formed, but will + be re-emitted in their canonical + form. (So always use canonical form, + or don''t diff.) This format is + intended to make it difficult to + use these numbers without writing + some sort of special handling code + in the hopes that that will cause + implementors to also use a fixed + point implementation.' type: object properties: number: @@ -5864,20 +5745,19 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: - description: 'Required: resource - to select' + description: 'Required: resource to + select' type: string containerName: description: 'Container name: required - for volumes, optional for env - vars' + for volumes, optional for env vars' type: string required: - - resource + - resource fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -5893,130 +5773,127 @@ openAPIV3Schema: select in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - path + - path configMap: description: Adapts a ConfigMap into a projected volume. The contents of the target ConfigMap's - Data field will be presented in a projected - volume as files using the keys in the Data field - as the file names, unless the items element - is populated with specific mappings of keys - to paths. Note that this is identical to a configmap - volume source without the default mode. + Data field will be presented in a projected volume + as files using the keys in the Data field as the + file names, unless the items element is populated + with specific mappings of keys to paths. Note + that this is identical to a configmap volume source + without the default mode. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its keys must be defined + description: Specify whether the ConfigMap or + its keys must be defined type: boolean items: description: If unspecified, each key-value - pair in the Data field of the referenced - ConfigMap will be projected into the volume - as a file whose name is the key and content - is the value. If specified, the listed keys - will be projected into the specified paths, - and unlisted keys will not be present. If - a key is specified which is not present - in the ConfigMap, the volume setup will - error unless it is marked optional. Paths - must be relative and may not contain the - '..' path or start with '..'. + pair in the Data field of the referenced ConfigMap + will be projected into the volume as a file + whose name is the key and content is the value. + If specified, the listed keys will be projected + into the specified paths, and unlisted keys + will not be present. If a key is specified + which is not present in the ConfigMap, the + volume setup will error unless it is marked + optional. Paths must be relative and may not + contain the '..' path or start with '..'. type: array items: - description: Maps a string key to a path - within a volume. + description: Maps a string key to a path within + a volume. type: object properties: mode: - description: 'Optional: mode bits to - use on this file, must be a value - between 0 and 0777. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might + be in conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode bits + set.' type: number path: description: The relative path of the - file to map the key to. May not be - an absolute path. May not contain - the path element '..'. May not start - with the string '..'. + file to map the key to. May not be an + absolute path. May not contain the path + element '..'. May not start with the + string '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path secret: - description: Adapts a secret into a projected - volume. The contents of the target Secret's - Data field will be presented in a projected - volume as files using the keys in the Data field - as the file names. Note that this is identical - to a secret volume source without the default - mode. + description: Adapts a secret into a projected volume. The + contents of the target Secret's Data field will + be presented in a projected volume as files using + the keys in the Data field as the file names. + Note that this is identical to a secret volume + source without the default mode. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret or - its key must be defined + description: Specify whether the Secret or its + key must be defined type: boolean items: description: If unspecified, each key-value - pair in the Data field of the referenced - Secret will be projected into the volume - as a file whose name is the key and content - is the value. If specified, the listed keys - will be projected into the specified paths, - and unlisted keys will not be present. If - a key is specified which is not present - in the Secret, the volume setup will error - unless it is marked optional. Paths must - be relative and may not contain the '..' - path or start with '..'. + pair in the Data field of the referenced Secret + will be projected into the volume as a file + whose name is the key and content is the value. + If specified, the listed keys will be projected + into the specified paths, and unlisted keys + will not be present. If a key is specified + which is not present in the Secret, the volume + setup will error unless it is marked optional. + Paths must be relative and may not contain + the '..' path or start with '..'. type: array items: - description: Maps a string key to a path - within a volume. + description: Maps a string key to a path within + a volume. type: object properties: mode: - description: 'Optional: mode bits to - use on this file, must be a value - between 0 and 0777. If not specified, - the volume defaultMode will be used. - This might be in conflict with other - options that affect the file mode, - like fsGroup, and the result can be - other mode bits set.' + description: 'Optional: mode bits to use + on this file, must be a value between + 0 and 0777. If not specified, the volume + defaultMode will be used. This might + be in conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode bits + set.' type: number path: description: The relative path of the - file to map the key to. May not be - an absolute path. May not contain - the path element '..'. May not start - with the string '..'. + file to map the key to. May not be an + absolute path. May not contain the path + element '..'. May not start with the + string '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path serviceAccountToken: description: ServiceAccountTokenProjection represents a projected service account token volume. This @@ -6026,9 +5903,9 @@ openAPIV3Schema: type: object properties: path: - description: Path is the path relative to - the mount point of the file to project the - token into. + description: Path is the path relative to the + mount point of the file to project the token + into. type: string audience: description: Audience is the intended audience @@ -6044,24 +5921,23 @@ openAPIV3Schema: token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet - will start trying to rotate the token if - the token is older than 80 percent of its - time to live or if the token is older than - 24 hours.Defaults to 1 hour and must be - at least 10 minutes. + will start trying to rotate the token if the + token is older than 80 percent of its time + to live or if the token is older than 24 hours.Defaults + to 1 hour and must be at least 10 minutes. type: number required: - - path + - path defaultMode: description: Mode bits to use on created files by default. Must be a value between 0 and 0777. Directories within the path are not affected by this setting. This might - be in conflict with other options that affect the - file mode, like fsGroup, and the result can be other - mode bits set. + be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode + bits set. type: number required: - - sources + - sources cephfs: description: Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support ownership @@ -6070,12 +5946,12 @@ openAPIV3Schema: properties: path: description: 'Optional: Used as the mounted root, rather - than the full Ceph tree, default is /' + than the full Ceph tree, default is /' type: string secretRef: description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. + to let you locate the referenced object inside the same + namespace. type: object properties: name: @@ -6083,29 +5959,29 @@ openAPIV3Schema: type: string secretFile: description: 'Optional: SecretFile is the path to key - ring for User, default is /etc/ceph/user.secret More - info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + ring for User, default is /etc/ceph/user.secret More + info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + ReadOnly here will force the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: boolean user: - description: 'Optional: User is the rados user name, - default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + description: 'Optional: User is the rados user name, default + is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string monitors: - description: 'Required: Monitors is a collection of - Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + description: 'Required: Monitors is a collection of Ceph + monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: array items: type: string required: - - monitors + - monitors scaleIO: - description: ScaleIOVolumeSource represents a persistent - ScaleIO volume + description: ScaleIOVolumeSource represents a persistent ScaleIO + volume type: object properties: system: @@ -6126,14 +6002,13 @@ openAPIV3Schema: is ThinProvisioned. type: string volumeName: - description: The name of a volume already created in - the ScaleIO system that is associated with this volume - source. + description: The name of a volume already created in the + ScaleIO system that is associated with this volume source. type: string secretRef: description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. + to let you locate the referenced object inside the same + namespace. type: object properties: name: @@ -6156,9 +6031,9 @@ openAPIV3Schema: description: The host address of the ScaleIO API Gateway. type: string required: - - gateway - - secretRef - - system + - gateway + - secretRef + - system emptyDir: description: Represents an empty directory for a pod. Empty directory volumes support ownership management and SELinux @@ -6167,50 +6042,48 @@ openAPIV3Schema: properties: sizeLimit: description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and AsInt64() - accessors. The serialization format is: ::= - (Note that may be - empty, from the "" case in .) ::= - 0 | 1 | ... | 9 ::= | - ::= | . - | . | . ::= "+" - | "-" ::= | - ::= | - | ::= Ki | Mi | Gi | - Ti | Pi | Ei (International System of units; See: - http://physics.nist.gov/cuu/Units/binary.html) ::= - m | "" | k | M | G | T | P | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms is used, - no quantity may represent a number greater than 2^63-1 - in magnitude, nor may it have more than 3 decimal - places. Numbers larger or more precise will be capped - or rounded up. (E.g.: 0.1m will rounded up to 1m.) - This may be extended in the future if we require larger - or smaller quantities. When a Quantity is parsed - from a string, it will remember the type of suffix - it had, and will use the same type again when it is - serialized. Before serializing, Quantity will be - put in "canonical form". This means that Exponent/suffix - will be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such that: a. - No precision is lost b. No fractional digits will - be emitted c. The exponent (or suffix) is as large - as possible. The sign will be omitted unless the number - is negative. Examples: 1.5 will be serialized as - "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole point - of this exercise. Non-canonical values will still - parse as long as they are well formed, but will be - re-emitted in their canonical form. (So always use - canonical form, or don''t diff.) This format is intended - to make it difficult to use these numbers without - writing some sort of special handling code in the - hopes that that will cause implementors to also use - a fixed point implementation.' + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and AsInt64() + accessors. The serialization format is: ::= + (Note that may be + empty, from the "" case in .) ::= + 0 | 1 | ... | 9 ::= | + ::= | . | + . | . ::= "+" | "-" + ::= | ::= + | | ::= + Ki | Mi | Gi | Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T | P | E (Note + that 1024 = 1Ki but 1000 = 1k; I didn''t choose the + capitalization.) ::= "e" + | "E" No matter which of the three exponent + forms is used, no quantity may represent a number greater + than 2^63-1 in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more precise will + be capped or rounded up. (E.g.: 0.1m will rounded up + to 1m.) This may be extended in the future if we require + larger or smaller quantities. When a Quantity is parsed + from a string, it will remember the type of suffix it + had, and will use the same type again when it is serialized. Before + serializing, Quantity will be put in "canonical form". + This means that Exponent/suffix will be adjusted up + or down (with a corresponding increase or decrease in + Mantissa) such that: a. No precision is lost b. + No fractional digits will be emitted c. The exponent + (or suffix) is as large as possible. The sign will be + omitted unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi will be serialized + as "1536Mi" Note that the quantity will NEVER be internally + represented by a floating point number. That is the + whole point of this exercise. Non-canonical values + will still parse as long as they are well formed, but + will be re-emitted in their canonical form. (So always + use canonical form, or don''t diff.) This format is + intended to make it difficult to use these numbers without + writing some sort of special handling code in the hopes + that that will cause implementors to also use a fixed + point implementation.' type: object properties: number: @@ -6218,72 +6091,71 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI medium: description: 'What type of storage medium should back - this directory. The default is "" which means to use - the node''s default medium. Must be an empty string - (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + this directory. The default is "" which means to use + the node''s default medium. Must be an empty string + (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' type: string glusterfs: - description: Represents a Glusterfs mount that lasts the - lifetime of a pod. Glusterfs volumes do not support ownership - management or SELinux relabeling. + description: Represents a Glusterfs mount that lasts the lifetime + of a pod. Glusterfs volumes do not support ownership management + or SELinux relabeling. type: object properties: path: description: 'Path is the Glusterfs volume path. More - info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string endpoints: description: 'EndpointsName is the endpoint name that - details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string readOnly: - description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. Defaults - to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + description: 'ReadOnly here will force the Glusterfs volume + to be mounted with read-only permissions. Defaults to + false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: boolean required: - - endpoints - - path + - endpoints + - path gcePersistentDisk: description: Represents a Persistent Disk resource in Google Compute Engine. A GCE PD must exist before mounting to a container. The disk must also be in the same GCE project - and zone as the kubelet. A GCE PD can only be mounted - as read/write once or read-only many times. GCE PDs support + and zone as the kubelet. A GCE PD can only be mounted as + read/write once or read-only many times. GCE PDs support ownership management and SELinux relabeling. type: object properties: partition: description: 'The partition in the volume that you want - to mount. If omitted, the default is to mount by volume - name. Examples: For volume /dev/sda1, you specify - the partition as "1". Similarly, the volume partition - for /dev/sda is "0" (or you can leave the property - empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + to mount. If omitted, the default is to mount by volume + name. Examples: For volume /dev/sda1, you specify the + partition as "1". Similarly, the volume partition for + /dev/sda is "0" (or you can leave the property empty). + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: number readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + description: 'ReadOnly here will force the ReadOnly setting + in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: boolean pdName: - description: 'Unique name of the PD resource in GCE. - Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + description: 'Unique name of the PD resource in GCE. Used + to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + description: 'Filesystem type of the volume that you want + to mount. Tip: Ensure that the filesystem type is supported + by the host operating system. Examples: "ext4", "xfs", + "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string required: - - pdName + - pdName photonPersistentDisk: description: Represents a Photon Controller persistent disk resource. @@ -6296,11 +6168,10 @@ openAPIV3Schema: fsType: description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. + "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string required: - - pdID + - pdID azureDisk: description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. @@ -6310,11 +6181,10 @@ openAPIV3Schema: description: The Name of the data disk in the blob storage type: string kind: - description: 'Expected values Shared: multiple blob - disks per storage account Dedicated: single blob - disk per storage account Managed: azure managed data - disk (only in managed availability set). defaults - to shared' + description: 'Expected values Shared: multiple blob disks + per storage account Dedicated: single blob disk per + storage account Managed: azure managed data disk (only + in managed availability set). defaults to shared' type: string readOnly: description: Defaults to false (read/write). ReadOnly @@ -6322,7 +6192,7 @@ openAPIV3Schema: type: boolean cachingMode: description: 'Host Caching mode: None, Read Only, Read - Write.' + Write.' type: string diskURI: description: The URI the data disk in the blob storage @@ -6330,12 +6200,11 @@ openAPIV3Schema: fsType: description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. + "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string required: - - diskName - - diskURI + - diskName + - diskURI cinder: description: Represents a cinder volume resource in Openstack. A Cinder volume must exist before mounting to a container. @@ -6346,47 +6215,46 @@ openAPIV3Schema: properties: secretRef: description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. + to let you locate the referenced object inside the same + namespace. type: object properties: name: description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string volumeID: - description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + description: 'volume id used to identify the volume in + cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + ReadOnly here will force the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: boolean fsType: description: 'Filesystem type to mount. Must be a filesystem - type supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type supported by the host operating system. Examples: + "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: string required: - - volumeID + - volumeID downwardAPI: - description: DownwardAPIVolumeSource represents a volume - containing downward API info. Downward API volumes support - ownership management and SELinux relabeling. + description: DownwardAPIVolumeSource represents a volume containing + downward API info. Downward API volumes support ownership + management and SELinux relabeling. type: object properties: defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and 0777. - Defaults to 0644. Directories within the path are - not affected by this setting. This might be in conflict - with other options that affect the file mode, like - fsGroup, and the result can be other mode bits set.' + description: 'Optional: mode bits to use on created files + by default. Must be a value between 0 and 0777. Defaults + to 0644. Directories within the path are not affected + by this setting. This might be in conflict with other + options that affect the file mode, like fsGroup, and + the result can be other mode bits set.' type: number items: - description: Items is a list of downward API volume - file + description: Items is a list of downward API volume file type: array items: description: DownwardAPIVolumeFile represents information @@ -6395,80 +6263,78 @@ openAPIV3Schema: properties: mode: description: 'Optional: mode bits to use on this - file, must be a value between 0 and 0777. If - not specified, the volume defaultMode will be - used. This might be in conflict with other options - that affect the file mode, like fsGroup, and - the result can be other mode bits set.' + file, must be a value between 0 and 0777. If not + specified, the volume defaultMode will be used. + This might be in conflict with other options that + affect the file mode, like fsGroup, and the result + can be other mode bits set.' type: number path: - description: 'Required: Path is the relative - path name of the file to be created. Must not - be absolute or contain the ''..'' path. Must - be utf-8 encoded. The first item of the relative - path must not start with ''..''' + description: 'Required: Path is the relative path + name of the file to be created. Must not be absolute + or contain the ''..'' path. Must be utf-8 encoded. + The first item of the relative path must not start + with ''..''' type: string resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format + description: ResourceFieldSelector represents container + resources (cpu, memory) and their output format type: object properties: divisor: description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" | - "-" ::= | - ::= | - | ::= Ki | - Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G - | T | P | E (Note that 1024 = 1Ki but - 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No matter which of - the three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be - extended in the future if we require larger - or smaller quantities. When a Quantity - is parsed from a string, it will remember - the type of suffix it had, and will use - the same type again when it is serialized. Before - serializing, Quantity will be put in "canonical - form". This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. The - sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as - "1536Mi" Note that the quantity will NEVER - be internally represented by a floating - point number. That is the whole point of - this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or - don''t diff.) This format is intended to - make it difficult to use these numbers without - writing some sort of special handling code - in the hopes that that will cause implementors - to also use a fixed point implementation.' + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" case + in .) ::= 0 | + 1 | ... | 9 ::= + | ::= + | . | . | . + ::= "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | Ti | + Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | + T | P | E (Note that 1024 = 1Ki but 1000 + = 1k; I didn''t choose the capitalization.) + ::= "e" | + "E" No matter which of the + three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than 3 + decimal places. Numbers larger or more precise + will be capped or rounded up. (E.g.: 0.1m + will rounded up to 1m.) This may be extended + in the future if we require larger or smaller + quantities. When a Quantity is parsed from + a string, it will remember the type of suffix + it had, and will use the same type again when + it is serialized. Before serializing, Quantity + will be put in "canonical form". This means + that Exponent/suffix will be adjusted up or + down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision + is lost b. No fractional digits will be + emitted c. The exponent (or suffix) is as + large as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi will + be serialized as "1536Mi" Note that the quantity + will NEVER be internally represented by a + floating point number. That is the whole point + of this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or don''t + diff.) This format is intended to make it + difficult to use these numbers without writing + some sort of special handling code in the + hopes that that will cause implementors to + also use a fixed point implementation.' type: object properties: number: @@ -6476,18 +6342,18 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string containerName: - description: 'Container name: required for - volumes, optional for env vars' + description: 'Container name: required for volumes, + optional for env vars' type: string required: - - resource + - resource fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -6502,9 +6368,9 @@ openAPIV3Schema: the specified API version. type: string required: - - fieldPath + - fieldPath required: - - path + - path awsElasticBlockStore: description: Represents a Persistent Disk resource in AWS. An AWS EBS disk must exist before mounting to a container. @@ -6516,40 +6382,39 @@ openAPIV3Schema: properties: partition: description: 'The partition in the volume that you want - to mount. If omitted, the default is to mount by volume - name. Examples: For volume /dev/sda1, you specify - the partition as "1". Similarly, the volume partition - for /dev/sda is "0" (or you can leave the property - empty).' + to mount. If omitted, the default is to mount by volume + name. Examples: For volume /dev/sda1, you specify the + partition as "1". Similarly, the volume partition for + /dev/sda is "0" (or you can leave the property empty).' type: number volumeID: description: 'Unique ID of the persistent disk resource - in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string readOnly: description: 'Specify "true" to force and set the ReadOnly - property in VolumeMounts to "true". If omitted, the - default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + property in VolumeMounts to "true". If omitted, the + default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: boolean fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + description: 'Filesystem type of the volume that you want + to mount. Tip: Ensure that the filesystem type is supported + by the host operating system. Examples: "ext4", "xfs", + "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string required: - - volumeID + - volumeID flocker: - description: Represents a Flocker volume mounted by the - Flocker agent. One and only one of datasetName and datasetUUID - should be set. Flocker volumes do not support ownership - management or SELinux relabeling. + description: Represents a Flocker volume mounted by the Flocker + agent. One and only one of datasetName and datasetUUID should + be set. Flocker volumes do not support ownership management + or SELinux relabeling. type: object properties: datasetName: - description: Name of the dataset stored as metadata - -> name on the dataset for Flocker should be considered + description: Name of the dataset stored as metadata -> + name on the dataset for Flocker should be considered as deprecated type: string datasetUUID: @@ -6557,17 +6422,17 @@ openAPIV3Schema: of a Flocker dataset type: string iscsi: - description: Represents an ISCSI disk. ISCSI volumes can - only be mounted as read/write once. ISCSI volumes support - ownership management and SELinux relabeling. + description: Represents an ISCSI disk. ISCSI volumes can only + be mounted as read/write once. ISCSI volumes support ownership + management and SELinux relabeling. type: object properties: chapAuthSession: description: whether support iSCSI Session CHAP authentication type: boolean iscsiInterface: - description: iSCSI Interface Name that uses an iSCSI - transport. Defaults to 'default' (tcp). + description: iSCSI Interface Name that uses an iSCSI transport. + Defaults to 'default' (tcp). type: string lun: description: iSCSI Target Lun number. @@ -6579,16 +6444,16 @@ openAPIV3Schema: description: Target iSCSI Qualified Name. type: string portals: - description: iSCSI Target Portal List. The portal is - either an IP or ip_addr:port if the port is other - than default (typically TCP ports 860 and 3260). + description: iSCSI Target Portal List. The portal is either + an IP or ip_addr:port if the port is other than default + (typically TCP ports 860 and 3260). type: array items: type: string secretRef: description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. + to let you locate the referenced object inside the same + namespace. type: object properties: name: @@ -6597,19 +6462,19 @@ openAPIV3Schema: initiatorName: description: Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new - iSCSI interface : will - be created for the connection. + iSCSI interface : will be + created for the connection. type: string readOnly: description: ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. type: boolean fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' + description: 'Filesystem type of the volume that you want + to mount. Tip: Ensure that the filesystem type is supported + by the host operating system. Examples: "ext4", "xfs", + "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' type: string targetPortal: description: iSCSI Target Portal. The Portal is either @@ -6617,13 +6482,13 @@ openAPIV3Schema: (typically TCP ports 860 and 3260). type: string required: - - iqn - - lun - - targetPortal + - iqn + - lun + - targetPortal rbd: - description: Represents a Rados Block Device mount that - lasts the lifetime of a pod. RBD volumes support ownership - management and SELinux relabeling. + description: Represents a Rados Block Device mount that lasts + the lifetime of a pod. RBD volumes support ownership management + and SELinux relabeling. type: object properties: image: @@ -6631,62 +6496,61 @@ openAPIV3Schema: type: string pool: description: 'The rados pool name. Default is rbd. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string secretRef: description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. + to let you locate the referenced object inside the same + namespace. type: object properties: name: description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + description: 'ReadOnly here will force the ReadOnly setting + in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: boolean fsType: - description: 'Filesystem type of the volume that you - want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' + description: 'Filesystem type of the volume that you want + to mount. Tip: Ensure that the filesystem type is supported + by the host operating system. Examples: "ext4", "xfs", + "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' type: string keyring: description: 'Keyring is the path to key ring for RBDUser. - Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string user: - description: 'The rados user name. Default is admin. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + description: 'The rados user name. Default is admin. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string monitors: description: 'A collection of Ceph monitors. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: array items: type: string required: - - image - - monitors + - image + - monitors configMap: description: Adapts a ConfigMap into a volume. The contents - of the target ConfigMap's Data field will be presented - in a volume as files using the keys in the Data field - as the file names, unless the items element is populated - with specific mappings of keys to paths. ConfigMap volumes - support ownership management and SELinux relabeling. + of the target ConfigMap's Data field will be presented in + a volume as files using the keys in the Data field as the + file names, unless the items element is populated with specific + mappings of keys to paths. ConfigMap volumes support ownership + management and SELinux relabeling. type: object properties: defaultMode: - description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 and 0777. - Defaults to 0644. Directories within the path are - not affected by this setting. This might be in conflict - with other options that affect the file mode, like - fsGroup, and the result can be other mode bits set.' + description: 'Optional: mode bits to use on created files + by default. Must be a value between 0 and 0777. Defaults + to 0644. Directories within the path are not affected + by this setting. This might be in conflict with other + options that affect the file mode, like fsGroup, and + the result can be other mode bits set.' type: number name: description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' @@ -6696,56 +6560,53 @@ openAPIV3Schema: must be defined type: boolean items: - description: If unspecified, each key-value pair in - the Data field of the referenced ConfigMap will be - projected into the volume as a file whose name is - the key and content is the value. If specified, the - listed keys will be projected into the specified paths, - and unlisted keys will not be present. If a key is - specified which is not present in the ConfigMap, the - volume setup will error unless it is marked optional. - Paths must be relative and may not contain the '..' - path or start with '..'. + description: If unspecified, each key-value pair in the + Data field of the referenced ConfigMap will be projected + into the volume as a file whose name is the key and + content is the value. If specified, the listed keys + will be projected into the specified paths, and unlisted + keys will not be present. If a key is specified which + is not present in the ConfigMap, the volume setup will + error unless it is marked optional. Paths must be relative + and may not contain the '..' path or start with '..'. type: array items: - description: Maps a string key to a path within a - volume. + description: Maps a string key to a path within a volume. type: object properties: mode: description: 'Optional: mode bits to use on this - file, must be a value between 0 and 0777. If - not specified, the volume defaultMode will be - used. This might be in conflict with other options - that affect the file mode, like fsGroup, and - the result can be other mode bits set.' + file, must be a value between 0 and 0777. If not + specified, the volume defaultMode will be used. + This might be in conflict with other options that + affect the file mode, like fsGroup, and the result + can be other mode bits set.' type: number path: - description: The relative path of the file to - map the key to. May not be an absolute path. - May not contain the path element '..'. May not - start with the string '..'. + description: The relative path of the file to map + the key to. May not be an absolute path. May not + contain the path element '..'. May not start with + the string '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path storageos: description: Represents a StorageOS persistent volume resource. type: object properties: volumeNamespace: - description: VolumeNamespace specifies the scope of - the volume within StorageOS. If no namespace is specified + description: VolumeNamespace specifies the scope of the + volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows - the Kubernetes name scoping to be mirrored within - StorageOS for tighter integration. Set VolumeName - to any name to override the default behaviour. Set - to "default" if you are not using namespaces within - StorageOS. Namespaces that do not pre-exist within - StorageOS will be created. + the Kubernetes name scoping to be mirrored within StorageOS + for tighter integration. Set VolumeName to any name + to override the default behaviour. Set to "default" + if you are not using namespaces within StorageOS. Namespaces + that do not pre-exist within StorageOS will be created. type: string volumeName: description: VolumeName is the human-readable name of @@ -6754,8 +6615,8 @@ openAPIV3Schema: type: string secretRef: description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. + to let you locate the referenced object inside the same + namespace. type: object properties: name: @@ -6768,12 +6629,11 @@ openAPIV3Schema: fsType: description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. + "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string csi: - description: Represents a source location of a volume to - mount, managed by an external CSI driver + description: Represents a source location of a volume to mount, + managed by an external CSI driver type: object properties: driver: @@ -6783,35 +6643,35 @@ openAPIV3Schema: type: string nodePublishSecretRef: description: LocalObjectReference contains enough information - to let you locate the referenced object inside the - same namespace. + to let you locate the referenced object inside the same + namespace. type: object properties: name: description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: - description: Specifies a read-only configuration for - the volume. Defaults to false (read/write). + description: Specifies a read-only configuration for the + volume. Defaults to false (read/write). type: boolean fsType: description: Filesystem type to mount. Ex. "ext4", "xfs", - "ntfs". If not provided, the empty value is passed - to the associated CSI driver which will determine - the default filesystem to apply. + "ntfs". If not provided, the empty value is passed to + the associated CSI driver which will determine the default + filesystem to apply. type: string volumeAttributes: - description: VolumeAttributes stores driver-specific - properties that are passed to the CSI driver. Consult - your driver's documentation for supported values. + description: VolumeAttributes stores driver-specific properties + that are passed to the CSI driver. Consult your driver's + documentation for supported values. additionalProperties: type: string type: object required: - - driver + - driver name: description: 'Volume''s name. Must be a DNS_LABEL and unique - within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string nfs: description: Represents an NFS mount that lasts the lifetime @@ -6821,20 +6681,20 @@ openAPIV3Schema: properties: path: description: 'Path that is exported by the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string server: description: 'Server is the hostname or IP address of - the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string readOnly: description: 'ReadOnly here will force the NFS export - to be mounted with read-only permissions. Defaults - to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + to be mounted with read-only permissions. Defaults to + false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: boolean required: - - path - - server + - path + - server persistentVolumeClaim: description: PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. This volume finds @@ -6845,48 +6705,47 @@ openAPIV3Schema: properties: claimName: description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + in the same namespace as the pod using this volume. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' type: string readOnly: description: Will force the ReadOnly setting in VolumeMounts. Default false. type: boolean required: - - claimName + - claimName gitRepo: - description: 'Represents a volume that is populated with - the contents of a git repository. Git repo volumes do - not support ownership management. Git repo volumes support - SELinux relabeling. DEPRECATED: GitRepo is deprecated. - To provision a container with a git repo, mount an EmptyDir - into an InitContainer that clones the repo using git, - then mount the EmptyDir into the Pod''s container.' + description: 'Represents a volume that is populated with the + contents of a git repository. Git repo volumes do not support + ownership management. Git repo volumes support SELinux relabeling. DEPRECATED: + GitRepo is deprecated. To provision a container with a git + repo, mount an EmptyDir into an InitContainer that clones + the repo using git, then mount the EmptyDir into the Pod''s + container.' type: object properties: repository: description: Repository URL type: string directory: - description: Target directory name. Must not contain - or start with '..'. If '.' is supplied, the volume - directory will be the git repository. Otherwise, - if specified, the volume will contain the git repository - in the subdirectory with the given name. + description: Target directory name. Must not contain or + start with '..'. If '.' is supplied, the volume directory + will be the git repository. Otherwise, if specified, + the volume will contain the git repository in the subdirectory + with the given name. type: string revision: description: Commit hash for the specified revision. type: string required: - - repository + - repository portworxVolume: - description: PortworxVolumeSource represents a Portworx - volume resource. + description: PortworxVolumeSource represents a Portworx volume + resource. type: object properties: volumeID: - description: VolumeID uniquely identifies a Portworx - volume + description: VolumeID uniquely identifies a Portworx volume type: string readOnly: description: Defaults to false (read/write). ReadOnly @@ -6899,18 +6758,18 @@ openAPIV3Schema: to be "ext4" if unspecified. type: string required: - - volumeID + - volumeID vsphereVolume: description: Represents a vSphere volume resource. type: object properties: storagePolicyName: - description: Storage Policy Based Management (SPBM) - profile name. + description: Storage Policy Based Management (SPBM) profile + name. type: string storagePolicyID: - description: Storage Policy Based Management (SPBM) - profile ID associated with the StoragePolicyName. + description: Storage Policy Based Management (SPBM) profile + ID associated with the StoragePolicyName. type: string volumePath: description: Path that identifies vSphere volume vmdk @@ -6918,16 +6777,14 @@ openAPIV3Schema: fsType: description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. + "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string required: - - volumePath + - volumePath fc: description: Represents a Fibre Channel volume. Fibre Channel - volumes can only be mounted as read/write once. Fibre - Channel volumes support ownership management and SELinux - relabeling. + volumes can only be mounted as read/write once. Fibre Channel + volumes support ownership management and SELinux relabeling. type: object properties: lun: @@ -6940,20 +6797,19 @@ openAPIV3Schema: type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' + ReadOnly here will force the ReadOnly setting in VolumeMounts.' type: boolean wwids: description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' + (wwids) Either wwids or combination of targetWWNs and + lun must be set, but not both simultaneously.' type: array items: type: string fsType: description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if - unspecified. + "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string hostPath: description: Represents a host path mapped into a pod. Host @@ -6962,18 +6818,18 @@ openAPIV3Schema: type: object properties: path: - description: 'Path of the directory on the host. If - the path is a symlink, it will follow the link to - the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + description: 'Path of the directory on the host. If the + path is a symlink, it will follow the link to the real + path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string type: description: 'Type for HostPath Volume Defaults to "" - More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string required: - - path + - path required: - - name + - name resources: type: object description: Memory and CPU minimum requirements and limits for @@ -6984,15 +6840,15 @@ openAPIV3Schema: additionalProperties: type: string description: 'Requests describes the minimum amount of compute - resources required. If Requests is omitted for a container, - it defaults to Limits if that is explicitly specified, otherwise - to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + resources required. If Requests is omitted for a container, + it defaults to Limits if that is explicitly specified, otherwise + to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' limits: type: object additionalProperties: type: string description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' annotations: type: object additionalProperties: @@ -7007,18 +6863,17 @@ openAPIV3Schema: type: object properties: name: - description: Name of the environment variable. Must be a - C_IDENTIFIER. + description: Name of the environment variable. Must be a C_IDENTIFIER. type: string value: description: 'Variable references $(VAR_NAME) are expanded - using the previous defined environment variables in the - container and any service environment variables. If a - variable cannot be resolved, the reference in the input - string will be unchanged. The $(VAR_NAME) syntax can be - escaped with a double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether the variable - exists or not. Defaults to "".' + using the previous defined environment variables in the + container and any service environment variables. If a variable + cannot be resolved, the reference in the input string will + be unchanged. The $(VAR_NAME) syntax can be escaped with + a double $$, ie: $$(VAR_NAME). Escaped references will never + be expanded, regardless of whether the variable exists or + not. Defaults to "".' type: string valueFrom: description: EnvVarSource represents a source for the value @@ -7041,7 +6896,7 @@ openAPIV3Schema: be a valid secret key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents container resources (cpu, memory) and their output format @@ -7049,53 +6904,51 @@ openAPIV3Schema: properties: divisor: description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and - AsInt64() accessors. The serialization format - is: ::= (Note - that may be empty, from the "" case in - .) ::= 0 | 1 | ... - | 9 ::= | - ::= | . - | . | . ::= - "+" | "-" ::= | - ::= | - | ::= Ki | Mi | - Gi | Ti | Pi | Ei (International System of units; - See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T | - P | E (Note that 1024 = 1Ki but 1000 = 1k; I - didn''t choose the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms is used, - no quantity may represent a number greater than - 2^63-1 in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more precise - will be capped or rounded up. (E.g.: 0.1m will - rounded up to 1m.) This may be extended in the - future if we require larger or smaller quantities. When - a Quantity is parsed from a string, it will remember - the type of suffix it had, and will use the same - type again when it is serialized. Before serializing, - Quantity will be put in "canonical form". This - means that Exponent/suffix will be adjusted up - or down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision is lost b. - No fractional digits will be emitted c. The - exponent (or suffix) is as large as possible. - The sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole - point of this exercise. Non-canonical values - will still parse as long as they are well formed, - but will be re-emitted in their canonical form. - (So always use canonical form, or don''t diff.) This - format is intended to make it difficult to use - these numbers without writing some sort of special - handling code in the hopes that that will cause - implementors to also use a fixed point implementation.' + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and AsInt64() + accessors. The serialization format is: ::= + (Note that may + be empty, from the "" case in .) ::= + 0 | 1 | ... | 9 ::= | + ::= | + . | . | . ::= + "+" | "-" ::= | + ::= | + | ::= Ki | Mi | Gi + | Ti | Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T | P + | E (Note that 1024 = 1Ki but 1000 = 1k; I didn''t + choose the capitalization.) ::= + "e" | "E" No matter + which of the three exponent forms is used, no quantity + may represent a number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal places. Numbers + larger or more precise will be capped or rounded + up. (E.g.: 0.1m will rounded up to 1m.) This may + be extended in the future if we require larger or + smaller quantities. When a Quantity is parsed from + a string, it will remember the type of suffix it + had, and will use the same type again when it is + serialized. Before serializing, Quantity will be + put in "canonical form". This means that Exponent/suffix + will be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such that: a. + No precision is lost b. No fractional digits will + be emitted c. The exponent (or suffix) is as large + as possible. The sign will be omitted unless the + number is negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole point + of this exercise. Non-canonical values will still + parse as long as they are well formed, but will + be re-emitted in their canonical form. (So always + use canonical form, or don''t diff.) This format + is intended to make it difficult to use these numbers + without writing some sort of special handling code + in the hopes that that will cause implementors to + also use a fixed point implementation.' type: object properties: number: @@ -7103,18 +6956,18 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string containerName: description: 'Container name: required for volumes, - optional for env vars' + optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object @@ -7130,35 +6983,35 @@ openAPIV3Schema: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. type: object properties: apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". + description: Version of the schema the FieldPath is + written in terms of, defaults to "v1". type: string fieldPath: - description: Path of the field to select in the - specified API version. + description: Path of the field to select in the specified + API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name restartPolicy: type: string description: 'Restart policy for all containers within the pod. - One of Always, OnFailure, Never. Default to Always. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + One of Always, OnFailure, Never. Default to Always. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' nodeSelector: type: object additionalProperties: type: string - description: Selector which must match a node's labels for the - pod to be scheduled on that node. + description: Selector which must match a node's labels for the pod + to be scheduled on that node. volumeMounts: type: array description: Additional volume mounts for the server pod. @@ -7172,10 +7025,10 @@ openAPIV3Schema: should be mounted. Must not contain ':'. type: string mountPropagation: - description: mountPropagation determines how mounts are - propagated from the host to container and the other way - around. When not set, MountPropagationNone is used. This - field is beta in 1.10. + description: mountPropagation determines how mounts are propagated + from the host to container and the other way around. When + not set, MountPropagationNone is used. This field is beta + in 1.10. type: string name: description: This must match the Name of a Volume. @@ -7189,52 +7042,52 @@ openAPIV3Schema: volume should be mounted. Defaults to "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves similarly + description: Expanded path within the volume from which the + container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name labels: type: object additionalProperties: type: string - description: The labels to be attached to generated resources. - The label names must not start with 'weblogic.'. + description: The labels to be attached to generated resources. The + label names must not start with 'weblogic.'. runtimeClassName: type: string - description: 'RuntimeClassName refers to a RuntimeClass object - in the node.k8s.io group, which should be used to run this pod. If - no RuntimeClass resource matches the named class, the pod will - not be run. If unset or empty, the "legacy" RuntimeClass will - be used, which is an implicit class with an empty definition - that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md - This is an alpha feature and may change in the future.' + description: 'RuntimeClassName refers to a RuntimeClass object in + the node.k8s.io group, which should be used to run this pod. If + no RuntimeClass resource matches the named class, the pod will + not be run. If unset or empty, the "legacy" RuntimeClass will + be used, which is an implicit class with an empty definition that + uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future.' tolerations: type: array description: If specified, the pod's tolerations. items: description: The pod this Toleration is attached to tolerates - any taint that matches the triple using - the matching operator . + any taint that matches the triple using the + matching operator . type: object properties: effect: - description: Effect indicates the taint effect to match. - Empty means match all taint effects. When specified, allowed - values are NoSchedule, PreferNoSchedule and NoExecute. + description: Effect indicates the taint effect to match. Empty + means match all taint effects. When specified, allowed values + are NoSchedule, PreferNoSchedule and NoExecute. type: string tolerationSeconds: - description: TolerationSeconds represents the period of - time the toleration (which must be of effect NoExecute, - otherwise this field is ignored) tolerates the taint. - By default, it is not set, which means tolerate the taint - forever (do not evict). Zero and negative values will - be treated as 0 (evict immediately) by the system. + description: TolerationSeconds represents the period of time + the toleration (which must be of effect NoExecute, otherwise + this field is ignored) tolerates the taint. By default, + it is not set, which means tolerate the taint forever (do + not evict). Zero and negative values will be treated as + 0 (evict immediately) by the system. type: number value: description: Value is the taint value the toleration matches @@ -7248,16 +7101,15 @@ openAPIV3Schema: all values and all keys. type: string operator: - description: Operator represents a key's relationship to - the value. Valid operators are Exists and Equal. Defaults - to Equal. Exists is equivalent to wildcard for value, - so that a pod can tolerate all taints of a particular - category. + description: Operator represents a key's relationship to the + value. Valid operators are Exists and Equal. Defaults to + Equal. Exists is equivalent to wildcard for value, so that + a pod can tolerate all taints of a particular category. type: string readinessProbe: type: object - description: Settings for the readiness probe associated with - a server. + description: Settings for the readiness probe associated with a + server. properties: periodSeconds: type: number @@ -7268,47 +7120,47 @@ openAPIV3Schema: a failure. initialDelaySeconds: type: number - description: The number of seconds before the first check - is performed. + description: The number of seconds before the first check is + performed. containers: type: array description: Additional containers to be included in the server pod. items: - description: A single application container that you want to - run within a pod. + description: A single application container that you want to run + within a pod. type: object properties: volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. + description: volumeDevices is the list of block devices to + be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of a raw - block device within a container. + description: volumeDevice describes a mapping of a raw block + device within a container. type: object properties: devicePath: - description: devicePath is the path inside of the - container that the device will be mapped to. + description: devicePath is the path inside of the container + that the device will be mapped to. type: string name: description: name must match the name of a persistentVolumeClaim in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config management - to default or override container images in workload controllers - like Deployments and StatefulSets.' + This field is optional to allow higher level config management + to default or override container images in workload controllers + like Deployments and StatefulSets.' type: string imagePullPolicy: description: 'Image pull policy. One of Always, Never, IfNotPresent. - Defaults to Always if :latest tag is specified, or IfNotPresent - otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + Defaults to Always if :latest tag is specified, or IfNotPresent + otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: description: Probe describes a health check to be performed @@ -7331,12 +7183,11 @@ openAPIV3Schema: type: object properties: port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. + description: IntOrString is a type that can hold an + int32 or a string. When used in JSON or YAML marshalling + and unmarshalling, it produces or consumes the inner + type. This allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -7346,28 +7197,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' + description: 'Optional: Host name to connect to, defaults + to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + times out. Defaults to 1 second. Minimum value is 1. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum - value is 1. + to 1. Must be 1 for liveness and startup. Minimum value + is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + description: 'Number of seconds after the container has + started before liveness probes are initiated. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -7377,35 +7228,33 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. + the command is root ('/') in the container's filesystem. + The command is simply exec'd, it is not run inside + a shell, so traditional shell instructions ('|', + etc) won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is treated + as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. + description: HTTPGetAction describes an action based on + HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. + description: Scheme to use for connecting to the host. + Defaults to HTTP. type: string port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. + description: IntOrString is a type that can hold an + int32 or a string. When used in JSON or YAML marshalling + and unmarshalling, it produces or consumes the inner + type. This allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -7415,11 +7264,11 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. + the pod IP. You probably want to set "Host" in httpHeaders + instead. type: string httpHeaders: description: Custom headers to set in the request. @@ -7437,10 +7286,10 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, @@ -7448,24 +7297,23 @@ openAPIV3Schema: EOF. Default is false. type: boolean terminationMessagePolicy: - description: Indicate how the termination message should - be populated. File will use the contents of terminationMessagePath + description: Indicate how the termination message should be + populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log - output is limited to 2048 bytes or 80 lines, whichever - is smaller. Defaults to File. Cannot be updated. + output is limited to 2048 bytes or 80 lines, whichever is + smaller. Defaults to File. Cannot be updated. type: string terminationMessagePath: - description: 'Optional: Path at which the file to which - the container''s termination message will be written is - mounted into the container''s filesystem. Message written - is intended to be brief final status, such as an assertion - failure message. Will be truncated by the node if greater - than 4096 bytes. The total message length across all containers - will be limited to 12kb. Defaults to /dev/termination-log. - Cannot be updated.' + description: 'Optional: Path at which the file to which the + container''s termination message will be written is mounted + into the container''s filesystem. Message written is intended + to be brief final status, such as an assertion failure message. + Will be truncated by the node if greater than 4096 bytes. + The total message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot be updated.' type: string workingDir: description: Container's working directory. If not specified, @@ -7473,30 +7321,30 @@ openAPIV3Schema: be configured in the container image. Cannot be updated. type: string resources: - description: ResourceRequirements describes the compute - resource requirements. + description: ResourceRequirements describes the compute resource + requirements. type: object properties: requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is omitted - for a container, it defaults to Limits if that is - explicitly specified, otherwise to an implementation-defined - value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Requests describes the minimum amount of + compute resources required. If Requests is omitted for + a container, it defaults to Limits if that is explicitly + specified, otherwise to an implementation-defined value. + More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: - description: 'Limits describes the maximum amount of - compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object securityContext: description: SecurityContext holds security configuration that will be applied to a container. Some fields are present - in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take precedence. + in both SecurityContext and PodSecurityContext. When both + are set, the values in SecurityContext take precedence. type: object properties: privileged: @@ -7561,21 +7409,20 @@ openAPIV3Schema: that enable the WindowsGMSA feature flag. type: string runAsUserName: - description: The UserName in Windows to run the - entrypoint of the container process. Defaults - to the user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - This field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and + it is only honored by servers that enable the WindowsRunAsUserName feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + description: GMSACredentialSpecName is the name of + the GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. type: string procMount: description: procMount denotes the type of proc mount @@ -7586,11 +7433,11 @@ openAPIV3Schema: type: string allowPrivilegeEscalation: description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent - process. This bool directly controls if the no_new_privs - flag will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' + a process can gain more privileges than its parent process. + This bool directly controls if the no_new_privs flag + will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' type: boolean runAsGroup: description: The GID to run the entrypoint of the container @@ -7603,15 +7450,15 @@ openAPIV3Schema: description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if - it does. If unset or false, no such validation will - be performed. May also be set in PodSecurityContext. If + as UID 0 (root) and fail to start the container if it + does. If unset or false, no such validation will be + performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. + description: Whether this container has a read-only root + filesystem. Default is false. type: boolean startupProbe: description: Probe describes a health check to be performed @@ -7634,12 +7481,11 @@ openAPIV3Schema: type: object properties: port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. + description: IntOrString is a type that can hold an + int32 or a string. When used in JSON or YAML marshalling + and unmarshalling, it produces or consumes the inner + type. This allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -7649,28 +7495,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' + description: 'Optional: Host name to connect to, defaults + to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + times out. Defaults to 1 second. Minimum value is 1. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum - value is 1. + to 1. Must be 1 for liveness and startup. Minimum value + is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + description: 'Number of seconds after the container has + started before liveness probes are initiated. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -7680,35 +7526,33 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. + the command is root ('/') in the container's filesystem. + The command is simply exec'd, it is not run inside + a shell, so traditional shell instructions ('|', + etc) won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is treated + as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. + description: HTTPGetAction describes an action based on + HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. + description: Scheme to use for connecting to the host. + Defaults to HTTP. type: string port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. + description: IntOrString is a type that can hold an + int32 or a string. When used in JSON or YAML marshalling + and unmarshalling, it produces or consumes the inner + type. This allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -7718,11 +7562,11 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. + the pod IP. You probably want to set "Host" in httpHeaders + instead. type: string httpHeaders: description: Custom headers to set in the request. @@ -7740,17 +7584,17 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: - description: List of environment variables to set in the - container. Cannot be updated. + description: List of environment variables to set in the container. + Cannot be updated. type: array items: - description: EnvVar represents an environment variable - present in a Container. + description: EnvVar represents an environment variable present + in a Container. type: object properties: name: @@ -7758,19 +7602,19 @@ openAPIV3Schema: be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) are - expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Defaults to "".' + description: 'Variable references $(VAR_NAME) are expanded + using the previous defined environment variables in + the container and any service environment variables. + If a variable cannot be resolved, the reference in + the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Defaults to + "".' type: string valueFrom: - description: EnvVarSource represents a source for - the value of an EnvVar. + description: EnvVarSource represents a source for the + value of an EnvVar. type: object properties: secretKeyRef: @@ -7780,79 +7624,77 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret or - its key must be defined + description: Specify whether the Secret or its + key must be defined type: boolean key: description: The key of the secret to select from. Must be a valid secret key. type: string required: - - key + - key resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format + description: ResourceFieldSelector represents container + resources (cpu, memory) and their output format type: object properties: divisor: description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" | - "-" ::= | - ::= | - | ::= Ki | - Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G - | T | P | E (Note that 1024 = 1Ki but - 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No matter which of - the three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be - extended in the future if we require larger - or smaller quantities. When a Quantity - is parsed from a string, it will remember - the type of suffix it had, and will use - the same type again when it is serialized. Before - serializing, Quantity will be put in "canonical - form". This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. The - sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as - "1536Mi" Note that the quantity will NEVER - be internally represented by a floating - point number. That is the whole point of - this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or - don''t diff.) This format is intended to - make it difficult to use these numbers without - writing some sort of special handling code - in the hopes that that will cause implementors - to also use a fixed point implementation.' + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" case + in .) ::= 0 | + 1 | ... | 9 ::= + | ::= + | . | . | . + ::= "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | Ti | + Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | + T | P | E (Note that 1024 = 1Ki but 1000 + = 1k; I didn''t choose the capitalization.) + ::= "e" | + "E" No matter which of the + three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than 3 + decimal places. Numbers larger or more precise + will be capped or rounded up. (E.g.: 0.1m + will rounded up to 1m.) This may be extended + in the future if we require larger or smaller + quantities. When a Quantity is parsed from + a string, it will remember the type of suffix + it had, and will use the same type again when + it is serialized. Before serializing, Quantity + will be put in "canonical form". This means + that Exponent/suffix will be adjusted up or + down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision + is lost b. No fractional digits will be + emitted c. The exponent (or suffix) is as + large as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi will + be serialized as "1536Mi" Note that the quantity + will NEVER be internally represented by a + floating point number. That is the whole point + of this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or don''t + diff.) This format is intended to make it + difficult to use these numbers without writing + some sort of special handling code in the + hopes that that will cause implementors to + also use a fixed point implementation.' type: object properties: number: @@ -7860,35 +7702,35 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string containerName: - description: 'Container name: required for - volumes, optional for env vars' + description: 'Container name: required for volumes, + optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its key must be defined + description: Specify whether the ConfigMap or + its key must be defined type: boolean key: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -7903,18 +7745,17 @@ openAPIV3Schema: the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional information - about the network connections a container uses, but is - primarily informational. Not specifying a port here DOES - NOT prevent that port from being exposed. Any port which - is listening on the default "0.0.0.0" address inside a - container will be accessible from the network. Cannot - be updated. + description: List of ports to expose from the container. Exposing + a port here gives the system additional information about + the network connections a container uses, but is primarily + informational. Not specifying a port here DOES NOT prevent + that port from being exposed. Any port which is listening + on the default "0.0.0.0" address inside a container will + be accessible from the network. Cannot be updated. type: array items: description: ContainerPort represents a network port in @@ -7922,8 +7763,8 @@ openAPIV3Schema: type: object properties: protocol: - description: Protocol for port. Must be UDP, TCP, - or SCTP. Defaults to "TCP". + description: Protocol for port. Must be UDP, TCP, or + SCTP. Defaults to "TCP". type: string hostIP: description: What host IP to bind the external port @@ -7931,34 +7772,33 @@ openAPIV3Schema: type: string name: description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in a - pod must have a unique name. Name for the port that - can be referred to by services. + and unique within the pod. Each named port in a pod + must have a unique name. Name for the port that can + be referred to by services. type: string containerPort: - description: Number of port to expose on the pod's - IP address. This must be a valid port number, 0 - < x < 65536. + description: Number of port to expose on the pod's IP + address. This must be a valid port number, 0 < x < + 65536. type: number hostPort: - description: Number of port to expose on the host. - If specified, this must be a valid port number, - 0 < x < 65536. If HostNetwork is specified, this - must match ContainerPort. Most containers do not - need this. + description: Number of port to expose on the host. If + specified, this must be a valid port number, 0 < x + < 65536. If HostNetwork is specified, this must match + ContainerPort. Most containers do not need this. type: number required: - - containerPort + - containerPort command: description: 'Entrypoint array. Not executed within a shell. - The docker image''s ENTRYPOINT is used if this is not - provided. Variable references $(VAR_NAME) are expanded - using the container''s environment. If a variable cannot - be resolved, the reference in the input string will be - unchanged. The $(VAR_NAME) syntax can be escaped with - a double $$, ie: $$(VAR_NAME). Escaped references will - never be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + The docker image''s ENTRYPOINT is used if this is not provided. + Variable references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the reference + in the input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). Escaped + references will never be expanded, regardless of whether + the variable exists or not. Cannot be updated. More info: + https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string @@ -7985,65 +7825,63 @@ openAPIV3Schema: description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to false. + description: Mounted read-only if true, read-write otherwise + (false or unspecified). Defaults to false. type: boolean subPath: - description: Path within the volume from which the - container's volume should be mounted. Defaults to - "" (volume's root). + description: Path within the volume from which the container's + volume should be mounted. Defaults to "" (volume's + root). type: string subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment variable - references $(VAR_NAME) are expanded using the container's - environment. Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field is - beta in 1.15. + description: Expanded path within the volume from which + the container's volume should be mounted. Behaves + similarly to SubPath but environment variable references + $(VAR_NAME) are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker image''s - CMD is used if this is not provided. Variable references - $(VAR_NAME) are expanded using the container''s environment. - If a variable cannot be resolved, the reference in the - input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). Escaped - references will never be expanded, regardless of whether - the variable exists or not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + CMD is used if this is not provided. Variable references + $(VAR_NAME) are expanded using the container''s environment. + If a variable cannot be resolved, the reference in the input + string will be unchanged. The $(VAR_NAME) syntax can be + escaped with a double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string lifecycle: description: Lifecycle describes actions that the management - system should take in response to container lifecycle - events. For the PostStart and PreStop lifecycle handlers, - management of the container blocks until the action is - complete, unless the container process fails, in which - case the handler is aborted. + system should take in response to container lifecycle events. + For the PostStart and PreStop lifecycle handlers, management + of the container blocks until the action is complete, unless + the container process fails, in which case the handler is + aborted. type: object properties: postStart: - description: Handler defines a specific action that - should be taken + description: Handler defines a specific action that should + be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + description: TCPSocketAction describes an action based + on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -8053,28 +7891,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + description: 'Optional: Host name to connect to, + defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. + description: Command is the command line to execute + inside the container, the working directory + for the command is root ('/') in the container's + filesystem. The command is simply exec'd, it + is not run inside a shell, so traditional shell + instructions ('|', etc) won't work. To use a + shell, you need to explicitly call out to that + shell. Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. type: array items: type: string @@ -8087,16 +7925,16 @@ openAPIV3Schema: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + description: Scheme to use for connecting to the + host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -8106,7 +7944,7 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -8117,8 +7955,8 @@ openAPIV3Schema: HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes + description: HTTPHeader describes a custom header + to be used in HTTP probes type: object properties: name: @@ -8128,27 +7966,27 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: - description: Handler defines a specific action that - should be taken + description: Handler defines a specific action that should + be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + description: TCPSocketAction describes an action based + on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -8158,28 +7996,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + description: 'Optional: Host name to connect to, + defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. + description: Command is the command line to execute + inside the container, the working directory + for the command is root ('/') in the container's + filesystem. The command is simply exec'd, it + is not run inside a shell, so traditional shell + instructions ('|', etc) won't work. To use a + shell, you need to explicitly call out to that + shell. Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. type: array items: type: string @@ -8192,16 +8030,16 @@ openAPIV3Schema: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + description: Scheme to use for connecting to the + host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -8211,7 +8049,7 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -8222,8 +8060,8 @@ openAPIV3Schema: HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes + description: HTTPHeader describes a custom header + to be used in HTTP probes type: object properties: name: @@ -8233,10 +8071,10 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). @@ -8244,8 +8082,8 @@ openAPIV3Schema: type: string tty: description: Whether this container should allocate a TTY - for itself, also requires 'stdin' to be true. Default - is false. + for itself, also requires 'stdin' to be true. Default is + false. type: boolean readinessProbe: description: Probe describes a health check to be performed @@ -8268,12 +8106,11 @@ openAPIV3Schema: type: object properties: port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. + description: IntOrString is a type that can hold an + int32 or a string. When used in JSON or YAML marshalling + and unmarshalling, it produces or consumes the inner + type. This allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -8283,28 +8120,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' + description: 'Optional: Host name to connect to, defaults + to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + times out. Defaults to 1 second. Minimum value is 1. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum - value is 1. + to 1. Must be 1 for liveness and startup. Minimum value + is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + description: 'Number of seconds after the container has + started before liveness probes are initiated. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -8314,35 +8151,33 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. + the command is root ('/') in the container's filesystem. + The command is simply exec'd, it is not run inside + a shell, so traditional shell instructions ('|', + etc) won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is treated + as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. + description: HTTPGetAction describes an action based on + HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. + description: Scheme to use for connecting to the host. + Defaults to HTTP. type: string port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. + description: IntOrString is a type that can hold an + int32 or a string. When used in JSON or YAML marshalling + and unmarshalling, it produces or consumes the inner + type. This allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -8352,11 +8187,11 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. + the pod IP. You probably want to set "Host" in httpHeaders + instead. type: string httpHeaders: description: Custom headers to set in the request. @@ -8374,22 +8209,21 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: - description: Whether the container runtime should close - the stdin channel after it has been opened by a single - attach. When stdin is true the stdin stream will remain - open across multiple attach sessions. If stdinOnce is - set to true, stdin is opened on container start, is empty - until the first client attaches to stdin, and then remains - open and accepts data until the client disconnects, at - which time stdin is closed and remains closed until the - container is restarted. If this flag is false, a container - processes that reads from stdin will never receive an - EOF. Default is false + description: Whether the container runtime should close the + stdin channel after it has been opened by a single attach. + When stdin is true the stdin stream will remain open across + multiple attach sessions. If stdinOnce is set to true, stdin + is opened on container start, is empty until the first client + attaches to stdin, and then remains open and accepts data + until the client disconnects, at which time stdin is closed + and remains closed until the container is restarted. If + this flag is false, a container processes that reads from + stdin will never receive an EOF. Default is false type: boolean envFrom: description: List of sources to populate environment variables @@ -8397,50 +8231,48 @@ openAPIV3Schema: be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last - source will take precedence. Values defined by an Env - with a duplicate key will take precedence. Cannot be updated. + source will take precedence. Values defined by an Env with + a duplicate key will take precedence. Cannot be updated. type: array items: - description: EnvFromSource represents the source of a - set of ConfigMaps + description: EnvFromSource represents the source of a set + of ConfigMaps type: object properties: configMapRef: description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field will - represent the key-value pairs as environment variables. + to populate the environment variables with. The contents + of the target ConfigMap's Data field will represent + the key-value pairs as environment variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap must be defined type: boolean prefix: - description: An optional identifier to prepend to - each key in the ConfigMap. Must be a C_IDENTIFIER. + description: An optional identifier to prepend to each + key in the ConfigMap. Must be a C_IDENTIFIER. type: string secretRef: description: SecretEnvSource selects a Secret to populate - the environment variables with. The contents of - the target Secret's Data field will represent the - key-value pairs as environment variables. + the environment variables with. The contents of the + target Secret's Data field will represent the key-value + pairs as environment variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the Secret must be defined type: boolean required: - - name + - name containerSecurityContext: type: object description: Container-level security attributes. Will override @@ -8449,15 +8281,15 @@ openAPIV3Schema: privileged: type: boolean description: Run container in privileged mode. Processes in - privileged containers are essentially equivalent to root - on the host. Defaults to false. + privileged containers are essentially equivalent to root on + the host. Defaults to false. runAsUser: type: number description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata if - unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. + process. Defaults to user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. capabilities: type: object description: Adds and removes POSIX capabilities from running @@ -8480,20 +8312,20 @@ openAPIV3Schema: properties: role: type: string - description: Role is a SELinux role label that applies - to the container. + description: Role is a SELinux role label that applies to + the container. level: type: string - description: Level is SELinux level label that applies - to the container. + description: Level is SELinux level label that applies to + the container. type: type: string - description: Type is a SELinux type label that applies - to the container. + description: Type is a SELinux type label that applies to + the container. user: type: string - description: User is a SELinux user label that applies - to the container. + description: User is a SELinux user label that applies to + the container. windowsOptions: type: object description: WindowsSecurityContextOptions contain Windows-specific @@ -8511,17 +8343,16 @@ openAPIV3Schema: type: string description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set in - PodSecurityContext. If set in both SecurityContext and - PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is alpha-level and it is - only honored by servers that enable the WindowsRunAsUserName - feature flag. + in image metadata if unspecified. May also be set in PodSecurityContext. + If set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + This field is alpha-level and it is only honored by servers + that enable the WindowsRunAsUserName feature flag. gmsaCredentialSpecName: type: string - description: GMSACredentialSpecName is the name of the - GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA + description: GMSACredentialSpecName is the name of the GMSA + credential spec to use. This field is alpha-level and + is only honored by servers that enable the WindowsGMSA feature flag. procMount: type: string @@ -8532,28 +8363,26 @@ openAPIV3Schema: to be enabled. allowPrivilegeEscalation: type: boolean - description: 'AllowPrivilegeEscalation controls whether a - process can gain more privileges than its parent process. - This bool directly controls if the no_new_privs flag will - be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' + description: 'AllowPrivilegeEscalation controls whether a process + can gain more privileges than its parent process. This bool + directly controls if the no_new_privs flag will be set on + the container process. AllowPrivilegeEscalation is true always + when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' runAsGroup: type: number description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be set - in PodSecurityContext. If set in both SecurityContext and - PodSecurityContext, the value specified in SecurityContext - takes precedence. + process. Uses runtime default if unset. May also be set in + PodSecurityContext. If set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. runAsNonRoot: type: boolean description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime - to ensure that it does not run as UID 0 (root) and fail - to start the container if it does. If unset or false, no - such validation will be performed. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. + to ensure that it does not run as UID 0 (root) and fail to + start the container if it does. If unset or false, no such + validation will be performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, the value + specified in SecurityContext takes precedence. readOnlyRootFilesystem: type: boolean description: Whether this container has a read-only root filesystem. @@ -8568,40 +8397,40 @@ openAPIV3Schema: description: Initialization containers to be included in the server pod. items: - description: A single application container that you want to - run within a pod. + description: A single application container that you want to run + within a pod. type: object properties: volumeDevices: - description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. + description: volumeDevices is the list of block devices to + be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of a raw - block device within a container. + description: volumeDevice describes a mapping of a raw block + device within a container. type: object properties: devicePath: - description: devicePath is the path inside of the - container that the device will be mapped to. + description: devicePath is the path inside of the container + that the device will be mapped to. type: string name: description: name must match the name of a persistentVolumeClaim in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config management - to default or override container images in workload controllers - like Deployments and StatefulSets.' + This field is optional to allow higher level config management + to default or override container images in workload controllers + like Deployments and StatefulSets.' type: string imagePullPolicy: description: 'Image pull policy. One of Always, Never, IfNotPresent. - Defaults to Always if :latest tag is specified, or IfNotPresent - otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + Defaults to Always if :latest tag is specified, or IfNotPresent + otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: description: Probe describes a health check to be performed @@ -8624,12 +8453,11 @@ openAPIV3Schema: type: object properties: port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. + description: IntOrString is a type that can hold an + int32 or a string. When used in JSON or YAML marshalling + and unmarshalling, it produces or consumes the inner + type. This allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -8639,28 +8467,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' + description: 'Optional: Host name to connect to, defaults + to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + times out. Defaults to 1 second. Minimum value is 1. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum - value is 1. + to 1. Must be 1 for liveness and startup. Minimum value + is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + description: 'Number of seconds after the container has + started before liveness probes are initiated. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -8670,35 +8498,33 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. + the command is root ('/') in the container's filesystem. + The command is simply exec'd, it is not run inside + a shell, so traditional shell instructions ('|', + etc) won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is treated + as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. + description: HTTPGetAction describes an action based on + HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. + description: Scheme to use for connecting to the host. + Defaults to HTTP. type: string port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. + description: IntOrString is a type that can hold an + int32 or a string. When used in JSON or YAML marshalling + and unmarshalling, it produces or consumes the inner + type. This allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -8708,11 +8534,11 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. + the pod IP. You probably want to set "Host" in httpHeaders + instead. type: string httpHeaders: description: Custom headers to set in the request. @@ -8730,10 +8556,10 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, @@ -8741,24 +8567,23 @@ openAPIV3Schema: EOF. Default is false. type: boolean terminationMessagePolicy: - description: Indicate how the termination message should - be populated. File will use the contents of terminationMessagePath + description: Indicate how the termination message should be + populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log - output is limited to 2048 bytes or 80 lines, whichever - is smaller. Defaults to File. Cannot be updated. + output is limited to 2048 bytes or 80 lines, whichever is + smaller. Defaults to File. Cannot be updated. type: string terminationMessagePath: - description: 'Optional: Path at which the file to which - the container''s termination message will be written is - mounted into the container''s filesystem. Message written - is intended to be brief final status, such as an assertion - failure message. Will be truncated by the node if greater - than 4096 bytes. The total message length across all containers - will be limited to 12kb. Defaults to /dev/termination-log. - Cannot be updated.' + description: 'Optional: Path at which the file to which the + container''s termination message will be written is mounted + into the container''s filesystem. Message written is intended + to be brief final status, such as an assertion failure message. + Will be truncated by the node if greater than 4096 bytes. + The total message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot be updated.' type: string workingDir: description: Container's working directory. If not specified, @@ -8766,30 +8591,30 @@ openAPIV3Schema: be configured in the container image. Cannot be updated. type: string resources: - description: ResourceRequirements describes the compute - resource requirements. + description: ResourceRequirements describes the compute resource + requirements. type: object properties: requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is omitted - for a container, it defaults to Limits if that is - explicitly specified, otherwise to an implementation-defined - value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Requests describes the minimum amount of + compute resources required. If Requests is omitted for + a container, it defaults to Limits if that is explicitly + specified, otherwise to an implementation-defined value. + More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: - description: 'Limits describes the maximum amount of - compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object securityContext: description: SecurityContext holds security configuration that will be applied to a container. Some fields are present - in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take precedence. + in both SecurityContext and PodSecurityContext. When both + are set, the values in SecurityContext take precedence. type: object properties: privileged: @@ -8854,21 +8679,20 @@ openAPIV3Schema: that enable the WindowsGMSA feature flag. type: string runAsUserName: - description: The UserName in Windows to run the - entrypoint of the container process. Defaults - to the user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - This field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and + it is only honored by servers that enable the WindowsRunAsUserName feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + description: GMSACredentialSpecName is the name of + the GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. type: string procMount: description: procMount denotes the type of proc mount @@ -8879,11 +8703,11 @@ openAPIV3Schema: type: string allowPrivilegeEscalation: description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent - process. This bool directly controls if the no_new_privs - flag will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' + a process can gain more privileges than its parent process. + This bool directly controls if the no_new_privs flag + will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' type: boolean runAsGroup: description: The GID to run the entrypoint of the container @@ -8896,15 +8720,15 @@ openAPIV3Schema: description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if - it does. If unset or false, no such validation will - be performed. May also be set in PodSecurityContext. If + as UID 0 (root) and fail to start the container if it + does. If unset or false, no such validation will be + performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. + description: Whether this container has a read-only root + filesystem. Default is false. type: boolean startupProbe: description: Probe describes a health check to be performed @@ -8927,12 +8751,11 @@ openAPIV3Schema: type: object properties: port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. + description: IntOrString is a type that can hold an + int32 or a string. When used in JSON or YAML marshalling + and unmarshalling, it produces or consumes the inner + type. This allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -8942,28 +8765,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' + description: 'Optional: Host name to connect to, defaults + to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + times out. Defaults to 1 second. Minimum value is 1. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum - value is 1. + to 1. Must be 1 for liveness and startup. Minimum value + is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + description: 'Number of seconds after the container has + started before liveness probes are initiated. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -8973,35 +8796,33 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. + the command is root ('/') in the container's filesystem. + The command is simply exec'd, it is not run inside + a shell, so traditional shell instructions ('|', + etc) won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is treated + as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. + description: HTTPGetAction describes an action based on + HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. + description: Scheme to use for connecting to the host. + Defaults to HTTP. type: string port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. + description: IntOrString is a type that can hold an + int32 or a string. When used in JSON or YAML marshalling + and unmarshalling, it produces or consumes the inner + type. This allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -9011,11 +8832,11 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. + the pod IP. You probably want to set "Host" in httpHeaders + instead. type: string httpHeaders: description: Custom headers to set in the request. @@ -9033,17 +8854,17 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: - description: List of environment variables to set in the - container. Cannot be updated. + description: List of environment variables to set in the container. + Cannot be updated. type: array items: - description: EnvVar represents an environment variable - present in a Container. + description: EnvVar represents an environment variable present + in a Container. type: object properties: name: @@ -9051,19 +8872,19 @@ openAPIV3Schema: be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) are - expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Defaults to "".' + description: 'Variable references $(VAR_NAME) are expanded + using the previous defined environment variables in + the container and any service environment variables. + If a variable cannot be resolved, the reference in + the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Defaults to + "".' type: string valueFrom: - description: EnvVarSource represents a source for - the value of an EnvVar. + description: EnvVarSource represents a source for the + value of an EnvVar. type: object properties: secretKeyRef: @@ -9073,79 +8894,77 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret or - its key must be defined + description: Specify whether the Secret or its + key must be defined type: boolean key: description: The key of the secret to select from. Must be a valid secret key. type: string required: - - key + - key resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format + description: ResourceFieldSelector represents container + resources (cpu, memory) and their output format type: object properties: divisor: description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" | - "-" ::= | - ::= | - | ::= Ki | - Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G - | T | P | E (Note that 1024 = 1Ki but - 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No matter which of - the three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be - extended in the future if we require larger - or smaller quantities. When a Quantity - is parsed from a string, it will remember - the type of suffix it had, and will use - the same type again when it is serialized. Before - serializing, Quantity will be put in "canonical - form". This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. The - sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as - "1536Mi" Note that the quantity will NEVER - be internally represented by a floating - point number. That is the whole point of - this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or - don''t diff.) This format is intended to - make it difficult to use these numbers without - writing some sort of special handling code - in the hopes that that will cause implementors - to also use a fixed point implementation.' + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" case + in .) ::= 0 | + 1 | ... | 9 ::= + | ::= + | . | . | . + ::= "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | Ti | + Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | + T | P | E (Note that 1024 = 1Ki but 1000 + = 1k; I didn''t choose the capitalization.) + ::= "e" | + "E" No matter which of the + three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than 3 + decimal places. Numbers larger or more precise + will be capped or rounded up. (E.g.: 0.1m + will rounded up to 1m.) This may be extended + in the future if we require larger or smaller + quantities. When a Quantity is parsed from + a string, it will remember the type of suffix + it had, and will use the same type again when + it is serialized. Before serializing, Quantity + will be put in "canonical form". This means + that Exponent/suffix will be adjusted up or + down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision + is lost b. No fractional digits will be + emitted c. The exponent (or suffix) is as + large as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi will + be serialized as "1536Mi" Note that the quantity + will NEVER be internally represented by a + floating point number. That is the whole point + of this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or don''t + diff.) This format is intended to make it + difficult to use these numbers without writing + some sort of special handling code in the + hopes that that will cause implementors to + also use a fixed point implementation.' type: object properties: number: @@ -9153,35 +8972,35 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string containerName: - description: 'Container name: required for - volumes, optional for env vars' + description: 'Container name: required for volumes, + optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its key must be defined + description: Specify whether the ConfigMap or + its key must be defined type: boolean key: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -9196,18 +9015,17 @@ openAPIV3Schema: the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: - description: List of ports to expose from the container. - Exposing a port here gives the system additional information - about the network connections a container uses, but is - primarily informational. Not specifying a port here DOES - NOT prevent that port from being exposed. Any port which - is listening on the default "0.0.0.0" address inside a - container will be accessible from the network. Cannot - be updated. + description: List of ports to expose from the container. Exposing + a port here gives the system additional information about + the network connections a container uses, but is primarily + informational. Not specifying a port here DOES NOT prevent + that port from being exposed. Any port which is listening + on the default "0.0.0.0" address inside a container will + be accessible from the network. Cannot be updated. type: array items: description: ContainerPort represents a network port in @@ -9215,8 +9033,8 @@ openAPIV3Schema: type: object properties: protocol: - description: Protocol for port. Must be UDP, TCP, - or SCTP. Defaults to "TCP". + description: Protocol for port. Must be UDP, TCP, or + SCTP. Defaults to "TCP". type: string hostIP: description: What host IP to bind the external port @@ -9224,34 +9042,33 @@ openAPIV3Schema: type: string name: description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in a - pod must have a unique name. Name for the port that - can be referred to by services. + and unique within the pod. Each named port in a pod + must have a unique name. Name for the port that can + be referred to by services. type: string containerPort: - description: Number of port to expose on the pod's - IP address. This must be a valid port number, 0 - < x < 65536. + description: Number of port to expose on the pod's IP + address. This must be a valid port number, 0 < x < + 65536. type: number hostPort: - description: Number of port to expose on the host. - If specified, this must be a valid port number, - 0 < x < 65536. If HostNetwork is specified, this - must match ContainerPort. Most containers do not - need this. + description: Number of port to expose on the host. If + specified, this must be a valid port number, 0 < x + < 65536. If HostNetwork is specified, this must match + ContainerPort. Most containers do not need this. type: number required: - - containerPort + - containerPort command: description: 'Entrypoint array. Not executed within a shell. - The docker image''s ENTRYPOINT is used if this is not - provided. Variable references $(VAR_NAME) are expanded - using the container''s environment. If a variable cannot - be resolved, the reference in the input string will be - unchanged. The $(VAR_NAME) syntax can be escaped with - a double $$, ie: $$(VAR_NAME). Escaped references will - never be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + The docker image''s ENTRYPOINT is used if this is not provided. + Variable references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the reference + in the input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). Escaped + references will never be expanded, regardless of whether + the variable exists or not. Cannot be updated. More info: + https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string @@ -9278,65 +9095,63 @@ openAPIV3Schema: description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to false. + description: Mounted read-only if true, read-write otherwise + (false or unspecified). Defaults to false. type: boolean subPath: - description: Path within the volume from which the - container's volume should be mounted. Defaults to - "" (volume's root). + description: Path within the volume from which the container's + volume should be mounted. Defaults to "" (volume's + root). type: string subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment variable - references $(VAR_NAME) are expanded using the container's - environment. Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field is - beta in 1.15. + description: Expanded path within the volume from which + the container's volume should be mounted. Behaves + similarly to SubPath but environment variable references + $(VAR_NAME) are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker image''s - CMD is used if this is not provided. Variable references - $(VAR_NAME) are expanded using the container''s environment. - If a variable cannot be resolved, the reference in the - input string will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). Escaped - references will never be expanded, regardless of whether - the variable exists or not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + CMD is used if this is not provided. Variable references + $(VAR_NAME) are expanded using the container''s environment. + If a variable cannot be resolved, the reference in the input + string will be unchanged. The $(VAR_NAME) syntax can be + escaped with a double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether the variable + exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string lifecycle: description: Lifecycle describes actions that the management - system should take in response to container lifecycle - events. For the PostStart and PreStop lifecycle handlers, - management of the container blocks until the action is - complete, unless the container process fails, in which - case the handler is aborted. + system should take in response to container lifecycle events. + For the PostStart and PreStop lifecycle handlers, management + of the container blocks until the action is complete, unless + the container process fails, in which case the handler is + aborted. type: object properties: postStart: - description: Handler defines a specific action that - should be taken + description: Handler defines a specific action that should + be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + description: TCPSocketAction describes an action based + on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -9346,28 +9161,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + description: 'Optional: Host name to connect to, + defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. + description: Command is the command line to execute + inside the container, the working directory + for the command is root ('/') in the container's + filesystem. The command is simply exec'd, it + is not run inside a shell, so traditional shell + instructions ('|', etc) won't work. To use a + shell, you need to explicitly call out to that + shell. Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. type: array items: type: string @@ -9380,16 +9195,16 @@ openAPIV3Schema: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + description: Scheme to use for connecting to the + host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -9399,7 +9214,7 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -9410,8 +9225,8 @@ openAPIV3Schema: HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes + description: HTTPHeader describes a custom header + to be used in HTTP probes type: object properties: name: @@ -9421,27 +9236,27 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: - description: Handler defines a specific action that - should be taken + description: Handler defines a specific action that should + be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an action - based on opening a socket + description: TCPSocketAction describes an action based + on opening a socket type: object properties: port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -9451,28 +9266,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' + description: 'Optional: Host name to connect to, + defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. type: object properties: command: - description: Command is the command line to - execute inside the container, the working - directory for the command is root ('/') in - the container's filesystem. The command is - simply exec'd, it is not run inside a shell, - so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is - treated as live/healthy and non-zero is unhealthy. + description: Command is the command line to execute + inside the container, the working directory + for the command is root ('/') in the container's + filesystem. The command is simply exec'd, it + is not run inside a shell, so traditional shell + instructions ('|', etc) won't work. To use a + shell, you need to explicitly call out to that + shell. Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. type: array items: type: string @@ -9485,16 +9300,16 @@ openAPIV3Schema: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to - the host. Defaults to HTTP. + description: Scheme to use for connecting to the + host. Defaults to HTTP. type: string port: - description: IntOrString is a type that can - hold an int32 or a string. When used in JSON - or YAML marshalling and unmarshalling, it - produces or consumes the inner type. This - allows you to have, for example, a JSON field - that can accept a name or number. + description: IntOrString is a type that can hold + an int32 or a string. When used in JSON or + YAML marshalling and unmarshalling, it produces + or consumes the inner type. This allows you + to have, for example, a JSON field that can + accept a name or number. type: object properties: intValue: @@ -9504,7 +9319,7 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" @@ -9515,8 +9330,8 @@ openAPIV3Schema: HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a custom - header to be used in HTTP probes + description: HTTPHeader describes a custom header + to be used in HTTP probes type: object properties: name: @@ -9526,10 +9341,10 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). @@ -9537,8 +9352,8 @@ openAPIV3Schema: type: string tty: description: Whether this container should allocate a TTY - for itself, also requires 'stdin' to be true. Default - is false. + for itself, also requires 'stdin' to be true. Default is + false. type: boolean readinessProbe: description: Probe describes a health check to be performed @@ -9561,12 +9376,11 @@ openAPIV3Schema: type: object properties: port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. + description: IntOrString is a type that can hold an + int32 or a string. When used in JSON or YAML marshalling + and unmarshalling, it produces or consumes the inner + type. This allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -9576,28 +9390,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' + description: 'Optional: Host name to connect to, defaults + to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the probe - times out. Defaults to 1 second. Minimum value is - 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + times out. Defaults to 1 second. Minimum value is 1. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum - value is 1. + to 1. Must be 1 for liveness and startup. Minimum value + is 1. type: number initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + description: 'Number of seconds after the container has + started before liveness probes are initiated. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -9607,35 +9421,33 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. + the command is root ('/') in the container's filesystem. + The command is simply exec'd, it is not run inside + a shell, so traditional shell instructions ('|', + etc) won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is treated + as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action based - on HTTP Get requests. + description: HTTPGetAction describes an action based on + HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. + description: Scheme to use for connecting to the host. + Defaults to HTTP. type: string port: - description: IntOrString is a type that can hold - an int32 or a string. When used in JSON or YAML - marshalling and unmarshalling, it produces or - consumes the inner type. This allows you to have, - for example, a JSON field that can accept a name - or number. + description: IntOrString is a type that can hold an + int32 or a string. When used in JSON or YAML marshalling + and unmarshalling, it produces or consumes the inner + type. This allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -9645,11 +9457,11 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. + the pod IP. You probably want to set "Host" in httpHeaders + instead. type: string httpHeaders: description: Custom headers to set in the request. @@ -9667,22 +9479,21 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: - description: Whether the container runtime should close - the stdin channel after it has been opened by a single - attach. When stdin is true the stdin stream will remain - open across multiple attach sessions. If stdinOnce is - set to true, stdin is opened on container start, is empty - until the first client attaches to stdin, and then remains - open and accepts data until the client disconnects, at - which time stdin is closed and remains closed until the - container is restarted. If this flag is false, a container - processes that reads from stdin will never receive an - EOF. Default is false + description: Whether the container runtime should close the + stdin channel after it has been opened by a single attach. + When stdin is true the stdin stream will remain open across + multiple attach sessions. If stdinOnce is set to true, stdin + is opened on container start, is empty until the first client + attaches to stdin, and then remains open and accepts data + until the client disconnects, at which time stdin is closed + and remains closed until the container is restarted. If + this flag is false, a container processes that reads from + stdin will never receive an EOF. Default is false type: boolean envFrom: description: List of sources to populate environment variables @@ -9690,50 +9501,48 @@ openAPIV3Schema: be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last - source will take precedence. Values defined by an Env - with a duplicate key will take precedence. Cannot be updated. + source will take precedence. Values defined by an Env with + a duplicate key will take precedence. Cannot be updated. type: array items: - description: EnvFromSource represents the source of a - set of ConfigMaps + description: EnvFromSource represents the source of a set + of ConfigMaps type: object properties: configMapRef: description: ConfigMapEnvSource selects a ConfigMap - to populate the environment variables with. The - contents of the target ConfigMap's Data field will - represent the key-value pairs as environment variables. + to populate the environment variables with. The contents + of the target ConfigMap's Data field will represent + the key-value pairs as environment variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap must be defined type: boolean prefix: - description: An optional identifier to prepend to - each key in the ConfigMap. Must be a C_IDENTIFIER. + description: An optional identifier to prepend to each + key in the ConfigMap. Must be a C_IDENTIFIER. type: string secretRef: description: SecretEnvSource selects a Secret to populate - the environment variables with. The contents of - the target Secret's Data field will represent the - key-value pairs as environment variables. + the environment variables with. The contents of the + target Secret's Data field will represent the key-value + pairs as environment variables. type: object properties: name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the Secret must be defined type: boolean required: - - name + - name shutdown: type: object description: Configures how the operator should shutdown the server @@ -9749,13 +9558,13 @@ openAPIV3Schema: description: Tells the operator how to shutdown server instances. Not required. Defaults to graceful shutdown. enum: - - Graceful - - Forced + - Graceful + - Forced timeoutSeconds: type: number - description: For graceful shutdown only, number of seconds - to wait before aborting in-flight work and shutting down - the server. Not required. Defaults to 30 seconds. + description: For graceful shutdown only, number of seconds to + wait before aborting in-flight work and shutting down the + server. Not required. Defaults to 30 seconds. affinity: type: object description: If specified, the pod's scheduling constraints @@ -9777,10 +9586,10 @@ openAPIV3Schema: description: Required. A list of node selector terms. The terms are ORed. items: - description: A null or empty node selector term - matches no objects. The requirements of them are - ANDed. The TopologySelectorTerm type implements - a subset of the NodeSelectorTerm. + description: A null or empty node selector term matches + no objects. The requirements of them are ANDed. + The TopologySelectorTerm type implements a subset + of the NodeSelectorTerm. type: object properties: matchExpressions: @@ -9789,22 +9598,20 @@ openAPIV3Schema: type: array items: description: A node selector requirement is - a selector that contains values, a key, - and an operator that relates the key and - values. + a selector that contains values, a key, and + an operator that relates the key and values. type: object properties: values: description: An array of string values. - If the operator is In or NotIn, the - values array must be non-empty. If the - operator is Exists or DoesNotExist, - the values array must be empty. If the - operator is Gt or Lt, the values array - must have a single element, which will - be interpreted as an integer. This array - is replaced during a strategic merge - patch. + If the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values + array must be empty. If the operator is + Gt or Lt, the values array must have a + single element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. type: array items: type: string @@ -9814,35 +9621,33 @@ openAPIV3Schema: type: string operator: description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. type: array items: description: A node selector requirement is - a selector that contains values, a key, - and an operator that relates the key and - values. + a selector that contains values, a key, and + an operator that relates the key and values. type: object properties: values: description: An array of string values. - If the operator is In or NotIn, the - values array must be non-empty. If the - operator is Exists or DoesNotExist, - the values array must be empty. If the - operator is Gt or Lt, the values array - must have a single element, which will - be interpreted as an integer. This array - is replaced during a strategic merge - patch. + If the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values + array must be empty. If the operator is + Gt or Lt, the values array must have a + single element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. type: array items: type: string @@ -9852,15 +9657,15 @@ openAPIV3Schema: type: string operator: description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. type: string required: - - key - - operator + - key + - operator required: - - nodeSelectorTerms + - nodeSelectorTerms preferredDuringSchedulingIgnoredDuringExecution: type: array description: The scheduler will prefer to schedule pods @@ -9868,12 +9673,12 @@ openAPIV3Schema: by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, - i.e. for each node that meets all of the scheduling - requirements (resource request, requiredDuringScheduling - affinity expressions, etc.), compute a sum by iterating - through the elements of this field and adding "weight" - to the sum if the node matches the corresponding matchExpressions; - the node(s) with the highest sum are the most preferred. + i.e. for each node that meets all of the scheduling requirements + (resource request, requiredDuringScheduling affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if the node + matches the corresponding matchExpressions; the node(s) + with the highest sum are the most preferred. items: description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). @@ -9882,10 +9687,10 @@ openAPIV3Schema: type: object properties: preference: - description: A null or empty node selector term - matches no objects. The requirements of them are - ANDed. The TopologySelectorTerm type implements - a subset of the NodeSelectorTerm. + description: A null or empty node selector term matches + no objects. The requirements of them are ANDed. + The TopologySelectorTerm type implements a subset + of the NodeSelectorTerm. type: object properties: matchExpressions: @@ -9894,22 +9699,20 @@ openAPIV3Schema: type: array items: description: A node selector requirement is - a selector that contains values, a key, - and an operator that relates the key and - values. + a selector that contains values, a key, and + an operator that relates the key and values. type: object properties: values: description: An array of string values. - If the operator is In or NotIn, the - values array must be non-empty. If the - operator is Exists or DoesNotExist, - the values array must be empty. If the - operator is Gt or Lt, the values array - must have a single element, which will - be interpreted as an integer. This array - is replaced during a strategic merge - patch. + If the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values + array must be empty. If the operator is + Gt or Lt, the values array must have a + single element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. type: array items: type: string @@ -9919,35 +9722,33 @@ openAPIV3Schema: type: string operator: description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. type: array items: description: A node selector requirement is - a selector that contains values, a key, - and an operator that relates the key and - values. + a selector that contains values, a key, and + an operator that relates the key and values. type: object properties: values: description: An array of string values. - If the operator is In or NotIn, the - values array must be non-empty. If the - operator is Exists or DoesNotExist, - the values array must be empty. If the - operator is Gt or Lt, the values array - must have a single element, which will - be interpreted as an integer. This array - is replaced during a strategic merge - patch. + If the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values + array must be empty. If the operator is + Gt or Lt, the values array must have a + single element, which will be interpreted + as an integer. This array is replaced + during a strategic merge patch. type: array items: type: string @@ -9957,52 +9758,52 @@ openAPIV3Schema: type: string operator: description: Represents a key's relationship - to a set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. type: string required: - - key - - operator + - key + - operator weight: - description: Weight associated with matching the - corresponding nodeSelectorTerm, in the range 1-100. + description: Weight associated with matching the corresponding + nodeSelectorTerm, in the range 1-100. type: number required: - - preference - - weight + - preference + - weight podAffinity: type: object - description: Pod affinity is a group of inter pod affinity - scheduling rules. + description: Pod affinity is a group of inter pod affinity scheduling + rules. properties: requiredDuringSchedulingIgnoredDuringExecution: type: array - description: If the affinity requirements specified by - this field are not met at scheduling time, the pod will - not be scheduled onto the node. If the affinity requirements + description: If the affinity requirements specified by this + field are not met at scheduling time, the pod will not + be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the - pod from its node. When there are multiple elements, - the lists of nodes corresponding to each podAffinityTerm - are intersected, i.e. all terms must be satisfied. + pod from its node. When there are multiple elements, the + lists of nodes corresponding to each podAffinityTerm are + intersected, i.e. all terms must be satisfied. items: description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not - co-located (anti-affinity) with, where co-located - is defined as running on a node whose value of the - label with key matches that of any node - on which a pod of the set of pods is running + co-located (anti-affinity) with, where co-located is + defined as running on a node whose value of the label + with key matches that of any node on which + a pod of the set of pods is running type: object properties: labelSelector: description: A label selector is a label query over - a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label selector - matches no objects. + a set of resources. The result of matchLabels and + matchExpressions are ANDed. An empty label selector + matches all objects. A null label selector matches + no objects. type: object properties: matchExpressions: @@ -10011,42 +9812,39 @@ openAPIV3Schema: ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. + description: A label selector requirement is + a selector that contains values, a key, and + an operator that relates the key and values. type: object properties: values: description: values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. This array + is replaced during a strategic merge patch. type: array items: type: string key: - description: key is the label key that - the selector applies to. + description: key is the label key that the + selector applies to. type: string operator: description: operator represents a key's relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. + operators are In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". + whose key field is "key", the operator is "In", + and the values array contains only "value". The requirements are ANDed. additionalProperties: type: string @@ -10056,9 +9854,9 @@ openAPIV3Schema: or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node - whose value of the label with key topologyKey - matches that of any node on which any of the selected - pods is running. Empty topologyKey is not allowed. + whose value of the label with key topologyKey matches + that of any node on which any of the selected pods + is running. Empty topologyKey is not allowed. type: string namespaces: description: namespaces specifies which namespaces @@ -10068,7 +9866,7 @@ openAPIV3Schema: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: type: array description: The scheduler will prefer to schedule pods @@ -10076,13 +9874,12 @@ openAPIV3Schema: by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, - i.e. for each node that meets all of the scheduling - requirements (resource request, requiredDuringScheduling - affinity expressions, etc.), compute a sum by iterating - through the elements of this field and adding "weight" - to the sum if the node has pods which matches the corresponding - podAffinityTerm; the node(s) with the highest sum are - the most preferred. + i.e. for each node that meets all of the scheduling requirements + (resource request, requiredDuringScheduling affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if the node + has pods which matches the corresponding podAffinityTerm; + the node(s) with the highest sum are the most preferred. items: description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred @@ -10090,80 +9887,78 @@ openAPIV3Schema: type: object properties: podAffinityTerm: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) with, - where co-located is defined as running on a node - whose value of the label with key - matches that of any node on which a pod of the - set of pods is running + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or + not co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any + node on which a pod of the set of pods is running type: object properties: labelSelector: description: A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label - selector matches all objects. A null label - selector matches no objects. + selector matches all objects. A null label selector + matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The requirements + description: matchExpressions is a list of + label selector requirements. The requirements are ANDed. type: array items: description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. + is a selector that contains values, a + key, and an operator that relates the + key and values. type: object properties: values: - description: values is an array of - string values. If the operator is - In or NotIn, the values array must - be non-empty. If the operator is - Exists or DoesNotExist, the values - array must be empty. This array - is replaced during a strategic merge - patch. + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. type: array items: type: string key: - description: key is the label key - that the selector applies to. + description: key is the label key that + the selector applies to. type: string operator: - description: operator represents a - key's relationship to a set of values. - Valid operators are In, NotIn, Exists - and DoesNotExist. + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. additionalProperties: type: string type: object topologyKey: description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the - pods matching the labelSelector in the specified - namespaces, where co-located is defined as - running on a node whose value of the label - with key topologyKey matches that of any node - on which any of the selected pods is running. - Empty topologyKey is not allowed. + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified + namespaces, where co-located is defined as running + on a node whose value of the label with key + topologyKey matches that of any node on which + any of the selected pods is running. Empty topologyKey + is not allowed. type: string namespaces: description: namespaces specifies which namespaces @@ -10173,14 +9968,14 @@ openAPIV3Schema: items: type: string required: - - topologyKey + - topologyKey weight: - description: weight associated with matching the - corresponding podAffinityTerm, in the range 1-100. + description: weight associated with matching the corresponding + podAffinityTerm, in the range 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight podAntiAffinity: type: object description: Pod anti affinity is a group of inter pod anti @@ -10191,28 +9986,28 @@ openAPIV3Schema: description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity - requirements specified by this field cease to be met - at some point during pod execution (e.g. due to a pod - label update), the system may or may not try to eventually - evict the pod from its node. When there are multiple - elements, the lists of nodes corresponding to each podAffinityTerm + requirements specified by this field cease to be met at + some point during pod execution (e.g. due to a pod label + update), the system may or may not try to eventually evict + the pod from its node. When there are multiple elements, + the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. items: description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not - co-located (anti-affinity) with, where co-located - is defined as running on a node whose value of the - label with key matches that of any node - on which a pod of the set of pods is running + co-located (anti-affinity) with, where co-located is + defined as running on a node whose value of the label + with key matches that of any node on which + a pod of the set of pods is running type: object properties: labelSelector: description: A label selector is a label query over - a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty label - selector matches all objects. A null label selector - matches no objects. + a set of resources. The result of matchLabels and + matchExpressions are ANDed. An empty label selector + matches all objects. A null label selector matches + no objects. type: object properties: matchExpressions: @@ -10221,42 +10016,39 @@ openAPIV3Schema: ANDed. type: array items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. + description: A label selector requirement is + a selector that contains values, a key, and + an operator that relates the key and values. type: object properties: values: description: values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. This array + is replaced during a strategic merge patch. type: array items: type: string key: - description: key is the label key that - the selector applies to. + description: key is the label key that the + selector applies to. type: string operator: description: operator represents a key's relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. + operators are In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". + whose key field is "key", the operator is "In", + and the values array contains only "value". The requirements are ANDed. additionalProperties: type: string @@ -10266,9 +10058,9 @@ openAPIV3Schema: or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node - whose value of the label with key topologyKey - matches that of any node on which any of the selected - pods is running. Empty topologyKey is not allowed. + whose value of the label with key topologyKey matches + that of any node on which any of the selected pods + is running. Empty topologyKey is not allowed. type: string namespaces: description: namespaces specifies which namespaces @@ -10278,19 +10070,19 @@ openAPIV3Schema: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: type: array description: The scheduler will prefer to schedule pods - to nodes that satisfy the anti-affinity expressions - specified by this field, but it may choose a node that - violates one or more of the expressions. The node that - is most preferred is the one with the greatest sum of - weights, i.e. for each node that meets all of the scheduling - requirements (resource request, requiredDuringScheduling - anti-affinity expressions, etc.), compute a sum by iterating - through the elements of this field and adding "weight" - to the sum if the node has pods which matches the corresponding + to nodes that satisfy the anti-affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling requirements + (resource request, requiredDuringScheduling anti-affinity + expressions, etc.), compute a sum by iterating through + the elements of this field and adding "weight" to the + sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. items: @@ -10300,80 +10092,78 @@ openAPIV3Schema: type: object properties: podAffinityTerm: - description: Defines a set of pods (namely those - matching the labelSelector relative to the given - namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) with, - where co-located is defined as running on a node - whose value of the label with key - matches that of any node on which a pod of the - set of pods is running + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or + not co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any + node on which a pod of the set of pods is running type: object properties: labelSelector: description: A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label - selector matches all objects. A null label - selector matches no objects. + selector matches all objects. A null label selector + matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a list - of label selector requirements. The requirements + description: matchExpressions is a list of + label selector requirements. The requirements are ANDed. type: array items: description: A label selector requirement - is a selector that contains values, - a key, and an operator that relates - the key and values. + is a selector that contains values, a + key, and an operator that relates the + key and values. type: object properties: values: - description: values is an array of - string values. If the operator is - In or NotIn, the values array must - be non-empty. If the operator is - Exists or DoesNotExist, the values - array must be empty. This array - is replaced during a strategic merge - patch. + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. type: array items: type: string key: - description: key is the label key - that the selector applies to. + description: key is the label key that + the selector applies to. type: string operator: - description: operator represents a - key's relationship to a set of values. - Valid operators are In, NotIn, Exists - and DoesNotExist. + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, - whose key field is "key", the operator - is "In", and the values array contains - only "value". The requirements are ANDed. + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. additionalProperties: type: string type: object topologyKey: description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the - pods matching the labelSelector in the specified - namespaces, where co-located is defined as - running on a node whose value of the label - with key topologyKey matches that of any node - on which any of the selected pods is running. - Empty topologyKey is not allowed. + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified + namespaces, where co-located is defined as running + on a node whose value of the label with key + topologyKey matches that of any node on which + any of the selected pods is running. Empty topologyKey + is not allowed. type: string namespaces: description: namespaces specifies which namespaces @@ -10383,38 +10173,38 @@ openAPIV3Schema: items: type: string required: - - topologyKey + - topologyKey weight: - description: weight associated with matching the - corresponding podAffinityTerm, in the range 1-100. + description: weight associated with matching the corresponding + podAffinityTerm, in the range 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight logHome: type: string description: The in-pod name of the directory in which to store the domain, Node Manager, server logs, and server *.out files includeServerOutInPodLog: type: boolean - description: If true (the default), then the server .out file will - be included in the pod's stdout. + description: If true (the default), then the server .out file will be + included in the pod's stdout. managedServers: type: array description: Configuration for individual Managed Servers. items: - description: ManagedServer represents the operator configuration - for a single Managed Server. + description: ManagedServer represents the operator configuration for + a single Managed Server. type: object properties: serverStartState: - description: The state in which the server is to be started. - Use ADMIN if server should start in the admin state. Defaults - to RUNNING. + description: The state in which the server is to be started. Use + ADMIN if server should start in the admin state. Defaults to + RUNNING. type: string enum: - - RUNNING - - ADMIN + - RUNNING + - ADMIN serverService: description: Customization affecting ClusterIP Kubernetes services for WebLogic Server instances. @@ -10425,8 +10215,7 @@ openAPIV3Schema: even for server instances without running pods. type: boolean annotations: - description: The annotations to be attached to generated - resources. + description: The annotations to be attached to generated resources. additionalProperties: type: string type: object @@ -10444,33 +10233,32 @@ openAPIV3Schema: type: object properties: nodeName: - description: NodeName is a request to schedule this pod - onto a specific node. If it is non-empty, the scheduler - simply schedules this pod onto that node, assuming that - it fits resource requirements. + description: NodeName is a request to schedule this pod onto + a specific node. If it is non-empty, the scheduler simply + schedules this pod onto that node, assuming that it fits + resource requirements. type: string livenessProbe: - description: Settings for the liveness probe associated - with a server. + description: Settings for the liveness probe associated with + a server. type: object properties: periodSeconds: description: The number of seconds between checks. type: number timeoutSeconds: - description: The number of seconds with no response - that indicates a failure. + description: The number of seconds with no response that + indicates a failure. type: number initialDelaySeconds: - description: The number of seconds before the first - check is performed. + description: The number of seconds before the first check + is performed. type: number readinessGates: - description: 'If specified, all readiness gates will be - evaluated for pod readiness. A pod is ready when all its - containers are ready AND all conditions specified in the - readiness gates have status equal to "True" More info: - https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + description: 'If specified, all readiness gates will be evaluated + for pod readiness. A pod is ready when all its containers + are ready AND all conditions specified in the readiness + gates have status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' type: array items: description: PodReadinessGate contains the reference to @@ -10482,7 +10270,7 @@ openAPIV3Schema: the pod's condition list with matching type. type: string required: - - conditionType + - conditionType serviceAccountName: description: Name of the ServiceAccount to be used to run this pod. If it is not set, default ServiceAccount will @@ -10524,14 +10312,14 @@ openAPIV3Schema: type: string fsGroup: description: 'A special supplemental group that applies - to all containers in a pod. Some volume types allow - the Kubelet to change the ownership of that volume - to be owned by the pod: 1. The owning GID will be - the FSGroup 2. The setgid bit is set (new files created - in the volume will be owned by FSGroup) 3. The permission - bits are OR''d with rw-rw---- If unset, the Kubelet - will not modify the ownership and permissions of any - volume.' + to all containers in a pod. Some volume types allow + the Kubelet to change the ownership of that volume to + be owned by the pod: 1. The owning GID will be the + FSGroup 2. The setgid bit is set (new files created + in the volume will be owned by FSGroup) 3. The permission + bits are OR''d with rw-rw---- If unset, the Kubelet + will not modify the ownership and permissions of any + volume.' type: number windowsOptions: description: WindowsSecurityContextOptions contain Windows-specific @@ -10547,21 +10335,20 @@ openAPIV3Schema: that enable the WindowsGMSA feature flag. type: string runAsUserName: - description: The UserName in Windows to run the - entrypoint of the container process. Defaults - to the user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - This field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and + it is only honored by servers that enable the WindowsRunAsUserName feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + description: GMSACredentialSpecName is the name of + the GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. type: string supplementalGroups: description: A list of groups applied to the first process @@ -10582,11 +10369,11 @@ openAPIV3Schema: description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if - it does. If unset or false, no such validation will - be performed. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. + as UID 0 (root) and fail to start the container if it + does. If unset or false, no such validation will be + performed. May also be set in SecurityContext. If set + in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. type: boolean sysctls: description: Sysctls hold a list of namespaced sysctls @@ -10594,8 +10381,8 @@ openAPIV3Schema: the container runtime) might fail to launch. type: array items: - description: Sysctl defines a kernel parameter to - be set + description: Sysctl defines a kernel parameter to be + set type: object properties: name: @@ -10605,29 +10392,29 @@ openAPIV3Schema: description: Value of a property to set type: string required: - - name - - value + - name + - value priorityClassName: - description: If specified, indicates the pod's priority. - "system-node-critical" and "system-cluster-critical" are - two special keywords which indicate the highest priorities - with the former being the highest priority. Any other - name must be defined by creating a PriorityClass object - with that name. If not specified, the pod priority will - be default or zero if there is no default. + description: If specified, indicates the pod's priority. "system-node-critical" + and "system-cluster-critical" are two special keywords which + indicate the highest priorities with the former being the + highest priority. Any other name must be defined by creating + a PriorityClass object with that name. If not specified, + the pod priority will be default or zero if there is no + default. type: string volumes: description: Additional volumes to be created in the server pod. type: array items: - description: Volume represents a named volume in a pod - that may be accessed by any container in the pod. + description: Volume represents a named volume in a pod that + may be accessed by any container in the pod. type: object properties: quobyte: - description: Represents a Quobyte mount that lasts - the lifetime of a pod. Quobyte volumes do not support + description: Represents a Quobyte mount that lasts the + lifetime of a pod. Quobyte volumes do not support ownership management or SELinux relabeling. type: object properties: @@ -10661,16 +10448,16 @@ openAPIV3Schema: is no group type: string required: - - registry - - volume + - registry + - volume azureFile: description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. type: object properties: secretName: - description: the name of secret that contains - Azure Storage Account Name and Key + description: the name of secret that contains Azure + Storage Account Name and Key type: string readOnly: description: Defaults to false (read/write). ReadOnly @@ -10680,8 +10467,8 @@ openAPIV3Schema: description: Share Name type: string required: - - secretName - - shareName + - secretName + - shareName flexVolume: description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec @@ -10689,75 +10476,75 @@ openAPIV3Schema: type: object properties: driver: - description: Driver is the name of the driver - to use for this volume. + description: Driver is the name of the driver to + use for this volume. type: string options: - description: 'Optional: Extra command options - if any.' + description: 'Optional: Extra command options if + any.' additionalProperties: type: string type: object secretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' type: boolean fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. type: string required: - - driver + - driver secret: description: Adapts a Secret into a volume. The contents of the target Secret's Data field will be presented - in a volume as files using the keys in the Data - field as the file names. Secret volumes support - ownership management and SELinux relabeling. + in a volume as files using the keys in the Data field + as the file names. Secret volumes support ownership + management and SELinux relabeling. type: object properties: secretName: - description: 'Name of the secret in the pod''s - namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + description: 'Name of the secret in the pod''s namespace + to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' type: string defaultMode: description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 - and 0777. Defaults to 0644. Directories within - the path are not affected by this setting. This - might be in conflict with other options that - affect the file mode, like fsGroup, and the - result can be other mode bits set.' + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the + path are not affected by this setting. This might + be in conflict with other options that affect + the file mode, like fsGroup, and the result can + be other mode bits set.' type: number optional: - description: Specify whether the Secret or its - keys must be defined + description: Specify whether the Secret or its keys + must be defined type: boolean items: description: If unspecified, each key-value pair in the Data field of the referenced Secret will - be projected into the volume as a file whose - name is the key and content is the value. If - specified, the listed keys will be projected - into the specified paths, and unlisted keys - will not be present. If a key is specified which - is not present in the Secret, the volume setup - will error unless it is marked optional. Paths - must be relative and may not contain the '..' - path or start with '..'. + be projected into the volume as a file whose name + is the key and content is the value. If specified, + the listed keys will be projected into the specified + paths, and unlisted keys will not be present. + If a key is specified which is not present in + the Secret, the volume setup will error unless + it is marked optional. Paths must be relative + and may not contain the '..' path or start with + '..'. type: array items: description: Maps a string key to a path within @@ -10765,26 +10552,26 @@ openAPIV3Schema: type: object properties: mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might be - in conflict with other options that affect - the file mode, like fsGroup, and the result - can be other mode bits set.' + description: 'Optional: mode bits to use on + this file, must be a value between 0 and + 0777. If not specified, the volume defaultMode + will be used. This might be in conflict + with other options that affect the file + mode, like fsGroup, and the result can be + other mode bits set.' type: number path: description: The relative path of the file to map the key to. May not be an absolute - path. May not contain the path element - '..'. May not start with the string '..'. + path. May not contain the path element '..'. + May not start with the string '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path projected: description: Represents a projected volume source type: object @@ -10809,31 +10596,30 @@ openAPIV3Schema: file type: array items: - description: DownwardAPIVolumeFile - represents information to create - the file containing the pod field + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field type: object properties: mode: description: 'Optional: mode bits - to use on this file, must be - a value between 0 and 0777. - If not specified, the volume - defaultMode will be used. This - might be in conflict with other - options that affect the file - mode, like fsGroup, and the - result can be other mode bits - set.' + to use on this file, must be a + value between 0 and 0777. If not + specified, the volume defaultMode + will be used. This might be in + conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode + bits set.' type: number path: description: 'Required: Path is the - relative path name of the file - to be created. Must not be absolute - or contain the ''..'' path. - Must be utf-8 encoded. The first - item of the relative path must - not start with ''..''' + relative path name of the file + to be created. Must not be absolute + or contain the ''..'' path. Must + be utf-8 encoded. The first item + of the relative path must not + start with ''..''' type: string resourceFieldRef: description: ResourceFieldSelector @@ -10843,89 +10629,86 @@ openAPIV3Schema: type: object properties: divisor: - description: 'Quantity is - a fixed-point representation - of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition - to String() and AsInt64() - accessors. The serialization - format is: ::= - (Note - that may be empty, - from the "" case in .) - ::= 0 - | 1 | ... | 9 ::= - | - ::= - | . | . - | . ::= - "+" | "-" ::= - | - ::= - | | - ::= Ki - | Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m - | "" | k | M | G | T | P - | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t - choose the capitalization.) - ::= "e" - | "E" No - matter which of the three - exponent forms is used, - no quantity may represent - a number greater than 2^63-1 - in magnitude, nor may it - have more than 3 decimal - places. Numbers larger or - more precise will be capped - or rounded up. (E.g.: 0.1m - will rounded up to 1m.) - This may be extended in - the future if we require - larger or smaller quantities. When - a Quantity is parsed from - a string, it will remember - the type of suffix it had, - and will use the same type - again when it is serialized. Before - serializing, Quantity will - be put in "canonical form". - This means that Exponent/suffix - will be adjusted up or down - (with a corresponding increase - or decrease in Mantissa) - such that: a. No precision - is lost b. No fractional - digits will be emitted c. - The exponent (or suffix) - is as large as possible. - The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER - be internally represented - by a floating point number. - That is the whole point - of this exercise. Non-canonical - values will still parse - as long as they are well - formed, but will be re-emitted - in their canonical form. - (So always use canonical - form, or don''t diff.) This - format is intended to make - it difficult to use these - numbers without writing - some sort of special handling - code in the hopes that that - will cause implementors - to also use a fixed point - implementation.' + description: 'Quantity is a + fixed-point representation + of a number. It provides convenient + marshaling/unmarshaling in + JSON and YAML, in addition + to String() and AsInt64() + accessors. The serialization + format is: ::= + (Note + that may be empty, + from the "" case in .) + ::= 0 | + 1 | ... | 9 ::= + | + ::= + | . | . + | . ::= + "+" | "-" ::= + | + ::= + | | + ::= Ki | + Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | + "" | k | M | G | T | P | E (Note + that 1024 = 1Ki but 1000 = + 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No + matter which of the three + exponent forms is used, no + quantity may represent a number + greater than 2^63-1 in magnitude, + nor may it have more than + 3 decimal places. Numbers + larger or more precise will + be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) + This may be extended in the + future if we require larger + or smaller quantities. When + a Quantity is parsed from + a string, it will remember + the type of suffix it had, + and will use the same type + again when it is serialized. Before + serializing, Quantity will + be put in "canonical form". + This means that Exponent/suffix + will be adjusted up or down + (with a corresponding increase + or decrease in Mantissa) such + that: a. No precision is + lost b. No fractional digits + will be emitted c. The exponent + (or suffix) is as large as + possible. The sign will be + omitted unless the number + is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER + be internally represented + by a floating point number. + That is the whole point of + this exercise. Non-canonical + values will still parse as + long as they are well formed, + but will be re-emitted in + their canonical form. (So + always use canonical form, + or don''t diff.) This format + is intended to make it difficult + to use these numbers without + writing some sort of special + handling code in the hopes + that that will cause implementors + to also use a fixed point + implementation.' type: object properties: number: @@ -10933,20 +10716,20 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource - to select' + to select' type: string containerName: description: 'Container name: - required for volumes, optional - for env vars' + required for volumes, optional + for env vars' type: string required: - - resource + - resource fieldRef: description: ObjectFieldSelector selects an APIVersioned field @@ -10955,9 +10738,8 @@ openAPIV3Schema: properties: apiVersion: description: Version of the - schema the FieldPath is - written in terms of, defaults - to "v1". + schema the FieldPath is written + in terms of, defaults to "v1". type: string fieldPath: description: Path of the field @@ -10965,24 +10747,24 @@ openAPIV3Schema: API version. type: string required: - - fieldPath + - fieldPath required: - - path + - path configMap: description: Adapts a ConfigMap into a projected volume. The contents of the target ConfigMap's Data field will be presented in a projected - volume as files using the keys in the - Data field as the file names, unless the - items element is populated with specific - mappings of keys to paths. Note that this - is identical to a configmap volume source - without the default mode. + volume as files using the keys in the Data + field as the file names, unless the items + element is populated with specific mappings + of keys to paths. Note that this is identical + to a configmap volume source without the + default mode. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap @@ -10992,62 +10774,60 @@ openAPIV3Schema: description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the - volume as a file whose name is the - key and content is the value. If specified, - the listed keys will be projected - into the specified paths, and unlisted - keys will not be present. If a key - is specified which is not present - in the ConfigMap, the volume setup - will error unless it is marked optional. - Paths must be relative and may not - contain the '..' path or start with - '..'. + volume as a file whose name is the key + and content is the value. If specified, + the listed keys will be projected into + the specified paths, and unlisted keys + will not be present. If a key is specified + which is not present in the ConfigMap, + the volume setup will error unless it + is marked optional. Paths must be relative + and may not contain the '..' path or + start with '..'. type: array items: - description: Maps a string key to - a path within a volume. + description: Maps a string key to a + path within a volume. type: object properties: mode: description: 'Optional: mode bits - to use on this file, must be - a value between 0 and 0777. - If not specified, the volume - defaultMode will be used. This - might be in conflict with other - options that affect the file - mode, like fsGroup, and the - result can be other mode bits - set.' + to use on this file, must be a + value between 0 and 0777. If not + specified, the volume defaultMode + will be used. This might be in + conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode + bits set.' type: number path: - description: The relative path - of the file to map the key to. - May not be an absolute path. - May not contain the path element - '..'. May not start with the - string '..'. + description: The relative path of + the file to map the key to. May + not be an absolute path. May not + contain the path element '..'. + May not start with the string + '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path secret: description: Adapts a secret into a projected volume. The contents of the target Secret's Data field will be presented in a projected - volume as files using the keys in the - Data field as the file names. Note that - this is identical to a secret volume source - without the default mode. + volume as files using the keys in the Data + field as the file names. Note that this + is identical to a secret volume source without + the default mode. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the Secret @@ -11056,99 +10836,96 @@ openAPIV3Schema: items: description: If unspecified, each key-value pair in the Data field of the referenced - Secret will be projected into the - volume as a file whose name is the - key and content is the value. If specified, - the listed keys will be projected - into the specified paths, and unlisted - keys will not be present. If a key - is specified which is not present - in the Secret, the volume setup will - error unless it is marked optional. - Paths must be relative and may not - contain the '..' path or start with - '..'. + Secret will be projected into the volume + as a file whose name is the key and + content is the value. If specified, + the listed keys will be projected into + the specified paths, and unlisted keys + will not be present. If a key is specified + which is not present in the Secret, + the volume setup will error unless it + is marked optional. Paths must be relative + and may not contain the '..' path or + start with '..'. type: array items: - description: Maps a string key to - a path within a volume. + description: Maps a string key to a + path within a volume. type: object properties: mode: description: 'Optional: mode bits - to use on this file, must be - a value between 0 and 0777. - If not specified, the volume - defaultMode will be used. This - might be in conflict with other - options that affect the file - mode, like fsGroup, and the - result can be other mode bits - set.' + to use on this file, must be a + value between 0 and 0777. If not + specified, the volume defaultMode + will be used. This might be in + conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode + bits set.' type: number path: - description: The relative path - of the file to map the key to. - May not be an absolute path. - May not contain the path element - '..'. May not start with the - string '..'. + description: The relative path of + the file to map the key to. May + not be an absolute path. May not + contain the path element '..'. + May not start with the string + '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path serviceAccountToken: description: ServiceAccountTokenProjection - represents a projected service account - token volume. This projection can be used - to insert a service account token into - the pods runtime filesystem for use against - APIs (Kubernetes API Server or otherwise). + represents a projected service account token + volume. This projection can be used to insert + a service account token into the pods runtime + filesystem for use against APIs (Kubernetes + API Server or otherwise). type: object properties: path: description: Path is the path relative - to the mount point of the file to - project the token into. + to the mount point of the file to project + the token into. type: string audience: description: Audience is the intended - audience of the token. A recipient - of a token must identify itself with - an identifier specified in the audience - of the token, and otherwise should - reject the token. The audience defaults - to the identifier of the apiserver. + audience of the token. A recipient of + a token must identify itself with an + identifier specified in the audience + of the token, and otherwise should reject + the token. The audience defaults to + the identifier of the apiserver. type: string expirationSeconds: description: ExpirationSeconds is the - requested duration of validity of - the service account token. As the - token approaches expiration, the kubelet - volume plugin will proactively rotate - the service account token. The kubelet - will start trying to rotate the token - if the token is older than 80 percent - of its time to live or if the token - is older than 24 hours.Defaults to - 1 hour and must be at least 10 minutes. + requested duration of validity of the + service account token. As the token + approaches expiration, the kubelet volume + plugin will proactively rotate the service + account token. The kubelet will start + trying to rotate the token if the token + is older than 80 percent of its time + to live or if the token is older than + 24 hours.Defaults to 1 hour and must + be at least 10 minutes. type: number required: - - path + - path defaultMode: - description: Mode bits to use on created files - by default. Must be a value between 0 and 0777. - Directories within the path are not affected - by this setting. This might be in conflict with - other options that affect the file mode, like - fsGroup, and the result can be other mode bits - set. + description: Mode bits to use on created files by + default. Must be a value between 0 and 0777. Directories + within the path are not affected by this setting. + This might be in conflict with other options that + affect the file mode, like fsGroup, and the result + can be other mode bits set. type: number required: - - sources + - sources cephfs: description: Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not @@ -11157,48 +10934,48 @@ openAPIV3Schema: properties: path: description: 'Optional: Used as the mounted root, - rather than the full Ceph tree, default is /' + rather than the full Ceph tree, default is /' type: string secretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string secretFile: - description: 'Optional: SecretFile is the path - to key ring for User, default is /etc/ceph/user.secret - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + description: 'Optional: SecretFile is the path to + key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: boolean user: - description: 'Optional: User is the rados user - name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + description: 'Optional: User is the rados user name, + default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string monitors: description: 'Required: Monitors is a collection - of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: array items: type: string required: - - monitors + - monitors scaleIO: description: ScaleIOVolumeSource represents a persistent ScaleIO volume type: object properties: system: - description: The name of the storage system as - configured in ScaleIO. + description: The name of the storage system as configured + in ScaleIO. type: string protectionDomain: description: The name of the ScaleIO Protection @@ -11209,8 +10986,8 @@ openAPIV3Schema: with Gateway, default false type: boolean storageMode: - description: Indicates whether the storage for - a volume should be ThickProvisioned or ThinProvisioned. + description: Indicates whether the storage for a + volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned. type: string volumeName: @@ -11220,21 +10997,21 @@ openAPIV3Schema: type: string secretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs". type: string @@ -11247,9 +11024,9 @@ openAPIV3Schema: Gateway. type: string required: - - gateway - - secretRef - - system + - gateway + - secretRef + - system emptyDir: description: Represents an empty directory for a pod. Empty directory volumes support ownership management @@ -11258,54 +11035,53 @@ openAPIV3Schema: properties: sizeLimit: description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and - AsInt64() accessors. The serialization format - is: ::= (Note - that may be empty, from the "" case - in .) ::= 0 | 1 - | ... | 9 ::= | - ::= | . - | . | . ::= - "+" | "-" ::= | - ::= | - | ::= Ki | Mi - | Gi | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T - | P | E (Note that 1024 = 1Ki but 1000 = 1k; - I didn''t choose the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms is - used, no quantity may represent a number greater - than 2^63-1 in magnitude, nor may it have more - than 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be extended - in the future if we require larger or smaller - quantities. When a Quantity is parsed from - a string, it will remember the type of suffix - it had, and will use the same type again when - it is serialized. Before serializing, Quantity - will be put in "canonical form". This means - that Exponent/suffix will be adjusted up or - down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision is - lost b. No fractional digits will be emitted c. - The exponent (or suffix) is as large as possible. - The sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole - point of this exercise. Non-canonical values - will still parse as long as they are well formed, - but will be re-emitted in their canonical form. - (So always use canonical form, or don''t diff.) This - format is intended to make it difficult to use - these numbers without writing some sort of special - handling code in the hopes that that will cause - implementors to also use a fixed point implementation.' + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and + AsInt64() accessors. The serialization format + is: ::= (Note + that may be empty, from the "" case in + .) ::= 0 | 1 | ... + | 9 ::= | + ::= | . + | . | . ::= + "+" | "-" ::= | + ::= | + | ::= Ki | Mi | + Gi | Ti | Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T | + P | E (Note that 1024 = 1Ki but 1000 = 1k; I + didn''t choose the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms is used, + no quantity may represent a number greater than + 2^63-1 in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more precise + will be capped or rounded up. (E.g.: 0.1m will + rounded up to 1m.) This may be extended in the + future if we require larger or smaller quantities. When + a Quantity is parsed from a string, it will remember + the type of suffix it had, and will use the same + type again when it is serialized. Before serializing, + Quantity will be put in "canonical form". This + means that Exponent/suffix will be adjusted up + or down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision is lost b. + No fractional digits will be emitted c. The + exponent (or suffix) is as large as possible. + The sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole + point of this exercise. Non-canonical values + will still parse as long as they are well formed, + but will be re-emitted in their canonical form. + (So always use canonical form, or don''t diff.) This + format is intended to make it difficult to use + these numbers without writing some sort of special + handling code in the hopes that that will cause + implementors to also use a fixed point implementation.' type: object properties: number: @@ -11313,78 +11089,74 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI medium: description: 'What type of storage medium should - back this directory. The default is "" which - means to use the node''s default medium. Must - be an empty string (default) or Memory. More - info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + back this directory. The default is "" which means + to use the node''s default medium. Must be an + empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' type: string glusterfs: description: Represents a Glusterfs mount that lasts - the lifetime of a pod. Glusterfs volumes do not - support ownership management or SELinux relabeling. + the lifetime of a pod. Glusterfs volumes do not support + ownership management or SELinux relabeling. type: object properties: path: description: 'Path is the Glusterfs volume path. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string endpoints: description: 'EndpointsName is the endpoint name - that details Glusterfs topology. More info: - https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string readOnly: description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. - Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + volume to be mounted with read-only permissions. + Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: boolean required: - - endpoints - - path + - endpoints + - path gcePersistentDisk: - description: Represents a Persistent Disk resource - in Google Compute Engine. A GCE PD must exist before + description: Represents a Persistent Disk resource in + Google Compute Engine. A GCE PD must exist before mounting to a container. The disk must also be in - the same GCE project and zone as the kubelet. A - GCE PD can only be mounted as read/write once or - read-only many times. GCE PDs support ownership - management and SELinux relabeling. + the same GCE project and zone as the kubelet. A GCE + PD can only be mounted as read/write once or read-only + many times. GCE PDs support ownership management and + SELinux relabeling. type: object properties: partition: - description: 'The partition in the volume that - you want to mount. If omitted, the default is - to mount by volume name. Examples: For volume - /dev/sda1, you specify the partition as "1". - Similarly, the volume partition for /dev/sda - is "0" (or you can leave the property empty). - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + description: 'The partition in the volume that you + want to mount. If omitted, the default is to mount + by volume name. Examples: For volume /dev/sda1, + you specify the partition as "1". Similarly, the + volume partition for /dev/sda is "0" (or you can + leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: number readOnly: description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + setting in VolumeMounts. Defaults to false. More + info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: boolean pdName: description: 'Unique name of the PD resource in - GCE. Used to identify the disk in GCE. More - info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + GCE. Used to identify the disk in GCE. More info: + https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string fsType: description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string required: - - pdName + - pdName photonPersistentDisk: description: Represents a Photon Controller persistent disk resource. @@ -11395,28 +11167,28 @@ openAPIV3Schema: persistent disk type: string fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string required: - - pdID + - pdID azureDisk: description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. type: object properties: diskName: - description: The Name of the data disk in the - blob storage + description: The Name of the data disk in the blob + storage type: string kind: - description: 'Expected values Shared: multiple - blob disks per storage account Dedicated: single - blob disk per storage account Managed: azure - managed data disk (only in managed availability - set). defaults to shared' + description: 'Expected values Shared: multiple blob + disks per storage account Dedicated: single blob + disk per storage account Managed: azure managed + data disk (only in managed availability set). + defaults to shared' type: string readOnly: description: Defaults to false (read/write). ReadOnly @@ -11424,21 +11196,20 @@ openAPIV3Schema: type: boolean cachingMode: description: 'Host Caching mode: None, Read Only, - Read Write.' + Read Write.' type: string diskURI: - description: The URI the data disk in the blob - storage + description: The URI the data disk in the blob storage type: string fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string required: - - diskName - - diskURI + - diskName + - diskURI cinder: description: Represents a cinder volume resource in Openstack. A Cinder volume must exist before mounting @@ -11449,47 +11220,46 @@ openAPIV3Schema: properties: secretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string volumeID: description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: boolean fsType: description: 'Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://examples.k8s.io/mysql-cinder-pd/README.md' + a filesystem type supported by the host operating + system. Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://examples.k8s.io/mysql-cinder-pd/README.md' type: string required: - - volumeID + - volumeID downwardAPI: - description: DownwardAPIVolumeSource represents a - volume containing downward API info. Downward API - volumes support ownership management and SELinux - relabeling. + description: DownwardAPIVolumeSource represents a volume + containing downward API info. Downward API volumes + support ownership management and SELinux relabeling. type: object properties: defaultMode: description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 - and 0777. Defaults to 0644. Directories within - the path are not affected by this setting. This - might be in conflict with other options that - affect the file mode, like fsGroup, and the - result can be other mode bits set.' + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the + path are not affected by this setting. This might + be in conflict with other options that affect + the file mode, like fsGroup, and the result can + be other mode bits set.' type: number items: description: Items is a list of downward API volume @@ -11497,96 +11267,92 @@ openAPIV3Schema: type: array items: description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field + information to create the file containing the + pod field type: object properties: mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might be - in conflict with other options that affect - the file mode, like fsGroup, and the result - can be other mode bits set.' + description: 'Optional: mode bits to use on + this file, must be a value between 0 and + 0777. If not specified, the volume defaultMode + will be used. This might be in conflict + with other options that affect the file + mode, like fsGroup, and the result can be + other mode bits set.' type: number path: description: 'Required: Path is the relative - path name of the file to be created. Must - not be absolute or contain the ''..'' - path. Must be utf-8 encoded. The first - item of the relative path must not start - with ''..''' + path name of the file to be created. Must + not be absolute or contain the ''..'' path. + Must be utf-8 encoded. The first item of + the relative path must not start with ''..''' type: string resourceFieldRef: description: ResourceFieldSelector represents - container resources (cpu, memory) and - their output format + container resources (cpu, memory) and their + output format type: object properties: divisor: description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= - (Note that - may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= - "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi - | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | - M | G | T | P | E (Note that 1024 - = 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent - forms is used, no quantity may represent - a number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This - may be extended in the future if we - require larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type - again when it is serialized. Before - serializing, Quantity will be put - in "canonical form". This means that - Exponent/suffix will be adjusted up - or down (with a corresponding increase - or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. - The sign will be omitted unless the - number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as - they are well formed, but will be - re-emitted in their canonical form. - (So always use canonical form, or - don''t diff.) This format is intended - to make it difficult to use these - numbers without writing some sort - of special handling code in the hopes - that that will cause implementors - to also use a fixed point implementation.' + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the + "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | + Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M + | G | T | P | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms + is used, no quantity may represent a + number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may + be extended in the future if we require + larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type again + when it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. + No fractional digits will be emitted c. + The exponent (or suffix) is as large + as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always + use canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing + some sort of special handling code in + the hopes that that will cause implementors + to also use a fixed point implementation.' type: object properties: number: @@ -11594,75 +11360,71 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: - description: 'Required: resource to - select' + description: 'Required: resource to select' type: string containerName: description: 'Container name: required - for volumes, optional for env vars' + for volumes, optional for env vars' type: string required: - - resource + - resource fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. + description: ObjectFieldSelector selects an + APIVersioned field of an object. type: object properties: apiVersion: description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". + FieldPath is written in terms of, defaults + to "v1". type: string fieldPath: description: Path of the field to select in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - path + - path awsElasticBlockStore: - description: Represents a Persistent Disk resource - in AWS. An AWS EBS disk must exist before mounting - to a container. The disk must also be in the same - AWS zone as the kubelet. An AWS EBS disk can only - be mounted as read/write once. AWS EBS volumes support - ownership management and SELinux relabeling. + description: Represents a Persistent Disk resource in + AWS. An AWS EBS disk must exist before mounting to + a container. The disk must also be in the same AWS + zone as the kubelet. An AWS EBS disk can only be mounted + as read/write once. AWS EBS volumes support ownership + management and SELinux relabeling. type: object properties: partition: - description: 'The partition in the volume that - you want to mount. If omitted, the default is - to mount by volume name. Examples: For volume - /dev/sda1, you specify the partition as "1". - Similarly, the volume partition for /dev/sda - is "0" (or you can leave the property empty).' + description: 'The partition in the volume that you + want to mount. If omitted, the default is to mount + by volume name. Examples: For volume /dev/sda1, + you specify the partition as "1". Similarly, the + volume partition for /dev/sda is "0" (or you can + leave the property empty).' type: number volumeID: - description: 'Unique ID of the persistent disk - resource in AWS (Amazon EBS volume). More info: - https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + description: 'Unique ID of the persistent disk resource + in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string readOnly: - description: 'Specify "true" to force and set - the ReadOnly property in VolumeMounts to "true". - If omitted, the default is "false". More info: - https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + description: 'Specify "true" to force and set the + ReadOnly property in VolumeMounts to "true". If + omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: boolean fsType: description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string required: - - volumeID + - volumeID flocker: description: Represents a Flocker volume mounted by the Flocker agent. One and only one of datasetName @@ -11672,8 +11434,8 @@ openAPIV3Schema: properties: datasetName: description: Name of the dataset stored as metadata - -> name on the dataset for Flocker should be - considered as deprecated + -> name on the dataset for Flocker should be considered + as deprecated type: string datasetUUID: description: UUID of the dataset. This is unique @@ -11690,8 +11452,8 @@ openAPIV3Schema: authentication type: boolean iscsiInterface: - description: iSCSI Interface Name that uses an - iSCSI transport. Defaults to 'default' (tcp). + description: iSCSI Interface Name that uses an iSCSI + transport. Defaults to 'default' (tcp). type: string lun: description: iSCSI Target Lun number. @@ -11705,27 +11467,27 @@ openAPIV3Schema: type: string portals: description: iSCSI Target Portal List. The portal - is either an IP or ip_addr:port if the port - is other than default (typically TCP ports 860 - and 3260). + is either an IP or ip_addr:port if the port is + other than default (typically TCP ports 860 and + 3260). type: array items: type: string secretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string initiatorName: description: Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, - new iSCSI interface : will be created for the connection. + new iSCSI interface : + will be created for the connection. type: string readOnly: description: ReadOnly here will force the ReadOnly @@ -11733,116 +11495,111 @@ openAPIV3Schema: type: boolean fsType: description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#iscsi' + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' type: string targetPortal: description: iSCSI Target Portal. The Portal is - either an IP or ip_addr:port if the port is - other than default (typically TCP ports 860 - and 3260). + either an IP or ip_addr:port if the port is other + than default (typically TCP ports 860 and 3260). type: string required: - - iqn - - lun - - targetPortal + - iqn + - lun + - targetPortal rbd: - description: Represents a Rados Block Device mount - that lasts the lifetime of a pod. RBD volumes support - ownership management and SELinux relabeling. + description: Represents a Rados Block Device mount that + lasts the lifetime of a pod. RBD volumes support ownership + management and SELinux relabeling. type: object properties: image: - description: 'The rados image name. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string pool: - description: 'The rados pool name. Default is - rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + description: 'The rados pool name. Default is rbd. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string secretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + setting in VolumeMounts. Defaults to false. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: boolean fsType: description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#rbd' + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' type: string keyring: - description: 'Keyring is the path to key ring - for RBDUser. Default is /etc/ceph/keyring. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + description: 'Keyring is the path to key ring for + RBDUser. Default is /etc/ceph/keyring. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string user: - description: 'The rados user name. Default is - admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + description: 'The rados user name. Default is admin. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string monitors: description: 'A collection of Ceph monitors. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: array items: type: string required: - - image - - monitors + - image + - monitors configMap: description: Adapts a ConfigMap into a volume. The contents of the target ConfigMap's Data field will - be presented in a volume as files using the keys - in the Data field as the file names, unless the - items element is populated with specific mappings - of keys to paths. ConfigMap volumes support ownership - management and SELinux relabeling. + be presented in a volume as files using the keys in + the Data field as the file names, unless the items + element is populated with specific mappings of keys + to paths. ConfigMap volumes support ownership management + and SELinux relabeling. type: object properties: defaultMode: description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 - and 0777. Defaults to 0644. Directories within - the path are not affected by this setting. This - might be in conflict with other options that - affect the file mode, like fsGroup, and the - result can be other mode bits set.' + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the + path are not affected by this setting. This might + be in conflict with other options that affect + the file mode, like fsGroup, and the result can + be other mode bits set.' type: number name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap or - its keys must be defined + description: Specify whether the ConfigMap or its + keys must be defined type: boolean items: description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap - will be projected into the volume as a file - whose name is the key and content is the value. - If specified, the listed keys will be projected - into the specified paths, and unlisted keys - will not be present. If a key is specified which - is not present in the ConfigMap, the volume - setup will error unless it is marked optional. - Paths must be relative and may not contain the - '..' path or start with '..'. + will be projected into the volume as a file whose + name is the key and content is the value. If specified, + the listed keys will be projected into the specified + paths, and unlisted keys will not be present. + If a key is specified which is not present in + the ConfigMap, the volume setup will error unless + it is marked optional. Paths must be relative + and may not contain the '..' path or start with + '..'. type: array items: description: Maps a string key to a path within @@ -11850,26 +11607,26 @@ openAPIV3Schema: type: object properties: mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might be - in conflict with other options that affect - the file mode, like fsGroup, and the result - can be other mode bits set.' + description: 'Optional: mode bits to use on + this file, must be a value between 0 and + 0777. If not specified, the volume defaultMode + will be used. This might be in conflict + with other options that affect the file + mode, like fsGroup, and the result can be + other mode bits set.' type: number path: description: The relative path of the file to map the key to. May not be an absolute - path. May not contain the path element - '..'. May not start with the string '..'. + path. May not contain the path element '..'. + May not start with the string '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path storageos: description: Represents a StorageOS persistent volume resource. @@ -11880,35 +11637,34 @@ openAPIV3Schema: of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping - to be mirrored within StorageOS for tighter - integration. Set VolumeName to any name to override - the default behaviour. Set to "default" if you - are not using namespaces within StorageOS. Namespaces - that do not pre-exist within StorageOS will - be created. + to be mirrored within StorageOS for tighter integration. + Set VolumeName to any name to override the default + behaviour. Set to "default" if you are not using + namespaces within StorageOS. Namespaces that do + not pre-exist within StorageOS will be created. type: string volumeName: - description: VolumeName is the human-readable - name of the StorageOS volume. Volume names - are only unique within a namespace. + description: VolumeName is the human-readable name + of the StorageOS volume. Volume names are only + unique within a namespace. type: string secretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string @@ -11919,19 +11675,18 @@ openAPIV3Schema: properties: driver: description: Driver is the name of the CSI driver - that handles this volume. Consult with your - admin for the correct name as registered in - the cluster. + that handles this volume. Consult with your admin + for the correct name as registered in the cluster. type: string nodePublishSecretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: description: Specifies a read-only configuration @@ -11940,8 +11695,8 @@ openAPIV3Schema: fsType: description: Filesystem type to mount. Ex. "ext4", "xfs", "ntfs". If not provided, the empty value - is passed to the associated CSI driver which - will determine the default filesystem to apply. + is passed to the associated CSI driver which will + determine the default filesystem to apply. type: string volumeAttributes: description: VolumeAttributes stores driver-specific @@ -11952,10 +11707,10 @@ openAPIV3Schema: type: string type: object required: - - driver + - driver name: - description: 'Volume''s name. Must be a DNS_LABEL - and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Volume''s name. Must be a DNS_LABEL and + unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string nfs: description: Represents an NFS mount that lasts the @@ -11964,50 +11719,50 @@ openAPIV3Schema: type: object properties: path: - description: 'Path that is exported by the NFS - server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + description: 'Path that is exported by the NFS server. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string server: description: 'Server is the hostname or IP address - of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string readOnly: - description: 'ReadOnly here will force the NFS - export to be mounted with read-only permissions. - Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + description: 'ReadOnly here will force the NFS export + to be mounted with read-only permissions. Defaults + to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: boolean required: - - path - - server + - path + - server persistentVolumeClaim: description: PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. This volume finds the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource is, essentially, - a wrapper around another type of volume that is - owned by someone else (the system). + a wrapper around another type of volume that is owned + by someone else (the system). type: object properties: claimName: description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this - volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + in the same namespace as the pod using this volume. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' type: string readOnly: description: Will force the ReadOnly setting in VolumeMounts. Default false. type: boolean required: - - claimName + - claimName gitRepo: description: 'Represents a volume that is populated - with the contents of a git repository. Git repo - volumes do not support ownership management. Git - repo volumes support SELinux relabeling. DEPRECATED: - GitRepo is deprecated. To provision a container - with a git repo, mount an EmptyDir into an InitContainer - that clones the repo using git, then mount the EmptyDir - into the Pod''s container.' + with the contents of a git repository. Git repo volumes + do not support ownership management. Git repo volumes + support SELinux relabeling. DEPRECATED: GitRepo is + deprecated. To provision a container with a git repo, + mount an EmptyDir into an InitContainer that clones + the repo using git, then mount the EmptyDir into the + Pod''s container.' type: object properties: repository: @@ -12015,8 +11770,8 @@ openAPIV3Schema: type: string directory: description: Target directory name. Must not contain - or start with '..'. If '.' is supplied, the - volume directory will be the git repository. Otherwise, + or start with '..'. If '.' is supplied, the volume + directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name. @@ -12025,7 +11780,7 @@ openAPIV3Schema: description: Commit hash for the specified revision. type: string required: - - repository + - repository portworxVolume: description: PortworxVolumeSource represents a Portworx volume resource. @@ -12040,13 +11795,13 @@ openAPIV3Schema: here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: FSType represents the filesystem - type to mount Must be a filesystem type supported - by the host operating system. Ex. "ext4", "xfs". + description: FSType represents the filesystem type + to mount Must be a filesystem type supported by + the host operating system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. type: string required: - - volumeID + - volumeID vsphereVolume: description: Represents a vSphere volume resource. type: object @@ -12064,13 +11819,13 @@ openAPIV3Schema: vmdk type: string fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string required: - - volumePath + - volumePath fc: description: Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write @@ -12083,80 +11838,78 @@ openAPIV3Schema: type: number targetWWNs: description: 'Optional: FC target worldwide names - (WWNs)' + (WWNs)' type: array items: type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' type: boolean wwids: description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' + (wwids) Either wwids or combination of targetWWNs + and lun must be set, but not both simultaneously.' type: array items: type: string fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string hostPath: - description: Represents a host path mapped into a - pod. Host path volumes do not support ownership - management or SELinux relabeling. + description: Represents a host path mapped into a pod. + Host path volumes do not support ownership management + or SELinux relabeling. type: object properties: path: description: 'Path of the directory on the host. - If the path is a symlink, it will follow the - link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + If the path is a symlink, it will follow the link + to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string type: description: 'Type for HostPath Volume Defaults - to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string required: - - path + - path required: - - name + - name resources: description: Memory and CPU minimum requirements and limits for the server. type: object properties: requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is omitted - for a container, it defaults to Limits if that is - explicitly specified, otherwise to an implementation-defined - value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Requests describes the minimum amount of + compute resources required. If Requests is omitted for + a container, it defaults to Limits if that is explicitly + specified, otherwise to an implementation-defined value. + More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: - description: 'Limits describes the maximum amount of - compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object annotations: - description: The annotations to be attached to generated - resources. + description: The annotations to be attached to generated resources. additionalProperties: type: string type: object env: - description: A list of environment variables to add to a - server. + description: A list of environment variables to add to a server. type: array items: - description: EnvVar represents an environment variable - present in a Container. + description: EnvVar represents an environment variable present + in a Container. type: object properties: name: @@ -12164,19 +11917,19 @@ openAPIV3Schema: be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) are - expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Defaults to "".' + description: 'Variable references $(VAR_NAME) are expanded + using the previous defined environment variables in + the container and any service environment variables. + If a variable cannot be resolved, the reference in + the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Defaults to + "".' type: string valueFrom: - description: EnvVarSource represents a source for - the value of an EnvVar. + description: EnvVarSource represents a source for the + value of an EnvVar. type: object properties: secretKeyRef: @@ -12186,115 +11939,113 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret or - its key must be defined + description: Specify whether the Secret or its + key must be defined type: boolean key: description: The key of the secret to select from. Must be a valid secret key. type: string required: - - key + - key resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format + description: ResourceFieldSelector represents container + resources (cpu, memory) and their output format type: object properties: divisor: description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" | - "-" ::= | - ::= | - | ::= Ki | - Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G - | T | P | E (Note that 1024 = 1Ki but - 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No matter which of - the three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be - extended in the future if we require larger - or smaller quantities. When a Quantity - is parsed from a string, it will remember - the type of suffix it had, and will use - the same type again when it is serialized. Before - serializing, Quantity will be put in "canonical - form". This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. The - sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as - "1536Mi" Note that the quantity will NEVER - be internally represented by a floating - point number. That is the whole point of - this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or - don''t diff.) This format is intended to - make it difficult to use these numbers without - writing some sort of special handling code - in the hopes that that will cause implementors - to also use a fixed point implementation.' - type: object - properties: - number: + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" case + in .) ::= 0 | + 1 | ... | 9 ::= + | ::= + | . | . | . + ::= "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | Ti | + Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | + T | P | E (Note that 1024 = 1Ki but 1000 + = 1k; I didn''t choose the capitalization.) + ::= "e" | + "E" No matter which of the + three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than 3 + decimal places. Numbers larger or more precise + will be capped or rounded up. (E.g.: 0.1m + will rounded up to 1m.) This may be extended + in the future if we require larger or smaller + quantities. When a Quantity is parsed from + a string, it will remember the type of suffix + it had, and will use the same type again when + it is serialized. Before serializing, Quantity + will be put in "canonical form". This means + that Exponent/suffix will be adjusted up or + down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision + is lost b. No fractional digits will be + emitted c. The exponent (or suffix) is as + large as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi will + be serialized as "1536Mi" Note that the quantity + will NEVER be internally represented by a + floating point number. That is the whole point + of this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or don''t + diff.) This format is intended to make it + difficult to use these numbers without writing + some sort of special handling code in the + hopes that that will cause implementors to + also use a fixed point implementation.' + type: object + properties: + number: type: number format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string containerName: - description: 'Container name: required for - volumes, optional for env vars' + description: 'Container name: required for volumes, + optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its key must be defined + description: Specify whether the ConfigMap or + its key must be defined type: boolean key: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -12309,13 +12060,13 @@ openAPIV3Schema: the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name restartPolicy: description: 'Restart policy for all containers within the - pod. One of Always, OnFailure, Never. Default to Always. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + pod. One of Always, OnFailure, Never. Default to Always. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' type: string nodeSelector: description: Selector which must match a node's labels for @@ -12345,26 +12096,25 @@ openAPIV3Schema: description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to false. + description: Mounted read-only if true, read-write otherwise + (false or unspecified). Defaults to false. type: boolean subPath: - description: Path within the volume from which the - container's volume should be mounted. Defaults to - "" (volume's root). + description: Path within the volume from which the container's + volume should be mounted. Defaults to "" (volume's + root). type: string subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment variable - references $(VAR_NAME) are expanded using the container's - environment. Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field is - beta in 1.15. + description: Expanded path within the volume from which + the container's volume should be mounted. Behaves + similarly to SubPath but environment variable references + $(VAR_NAME) are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name labels: description: The labels to be attached to generated resources. The label names must not start with 'weblogic.'. @@ -12372,76 +12122,75 @@ openAPIV3Schema: type: string type: object runtimeClassName: - description: 'RuntimeClassName refers to a RuntimeClass - object in the node.k8s.io group, which should be used - to run this pod. If no RuntimeClass resource matches - the named class, the pod will not be run. If unset or - empty, the "legacy" RuntimeClass will be used, which is - an implicit class with an empty definition that uses the - default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md - This is an alpha feature and may change in the future.' + description: 'RuntimeClassName refers to a RuntimeClass object + in the node.k8s.io group, which should be used to run this + pod. If no RuntimeClass resource matches the named class, + the pod will not be run. If unset or empty, the "legacy" + RuntimeClass will be used, which is an implicit class with + an empty definition that uses the default runtime handler. + More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future.' type: string tolerations: description: If specified, the pod's tolerations. type: array items: description: The pod this Toleration is attached to tolerates - any taint that matches the triple - using the matching operator . + any taint that matches the triple using + the matching operator . type: object properties: effect: - description: Effect indicates the taint effect to - match. Empty means match all taint effects. When - specified, allowed values are NoSchedule, PreferNoSchedule - and NoExecute. + description: Effect indicates the taint effect to match. + Empty means match all taint effects. When specified, + allowed values are NoSchedule, PreferNoSchedule and + NoExecute. type: string tolerationSeconds: description: TolerationSeconds represents the period - of time the toleration (which must be of effect - NoExecute, otherwise this field is ignored) tolerates - the taint. By default, it is not set, which means - tolerate the taint forever (do not evict). Zero - and negative values will be treated as 0 (evict - immediately) by the system. + of time the toleration (which must be of effect NoExecute, + otherwise this field is ignored) tolerates the taint. + By default, it is not set, which means tolerate the + taint forever (do not evict). Zero and negative values + will be treated as 0 (evict immediately) by the system. type: number value: description: Value is the taint value the toleration - matches to. If the operator is Exists, the value - should be empty, otherwise just a regular string. + matches to. If the operator is Exists, the value should + be empty, otherwise just a regular string. type: string key: description: Key is the taint key that the toleration - applies to. Empty means match all taint keys. If - the key is empty, operator must be Exists; this - combination means to match all values and all keys. + applies to. Empty means match all taint keys. If the + key is empty, operator must be Exists; this combination + means to match all values and all keys. type: string operator: description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard - for value, so that a pod can tolerate all taints - of a particular category. + for value, so that a pod can tolerate all taints of + a particular category. type: string readinessProbe: - description: Settings for the readiness probe associated - with a server. + description: Settings for the readiness probe associated with + a server. type: object properties: periodSeconds: description: The number of seconds between checks. type: number timeoutSeconds: - description: The number of seconds with no response - that indicates a failure. + description: The number of seconds with no response that + indicates a failure. type: number initialDelaySeconds: - description: The number of seconds before the first - check is performed. + description: The number of seconds before the first check + is performed. type: number containers: - description: Additional containers to be included in the - server pod. + description: Additional containers to be included in the server + pod. type: array items: description: A single application container that you want @@ -12453,8 +12202,8 @@ openAPIV3Schema: to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of - a raw block device within a container. + description: volumeDevice describes a mapping of a + raw block device within a container. type: object properties: devicePath: @@ -12467,35 +12216,35 @@ openAPIV3Schema: in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' type: string imagePullPolicy: description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. Cannot - be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + IfNotPresent. Defaults to Always if :latest tag is + specified, or IfNotPresent otherwise. Cannot be updated. + More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. type: number tcpSocket: description: TCPSocketAction describes an action @@ -12504,11 +12253,11 @@ openAPIV3Schema: properties: port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -12518,28 +12267,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -12549,36 +12298,35 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + description: HTTPGetAction describes an action based + on HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + description: Scheme to use for connecting to + the host. Defaults to HTTP. type: string port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -12588,15 +12336,15 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + to the pod IP. You probably want to set "Host" + in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. + description: Custom headers to set in the request. + HTTP allows repeated headers. type: array items: description: HTTPHeader describes a custom @@ -12610,43 +12358,43 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: description: Whether this container should allocate - a buffer for stdin in the container runtime. If - this is not set, reads from stdin in the container - will always result in EOF. Default is false. + a buffer for stdin in the container runtime. If this + is not set, reads from stdin in the container will + always result in EOF. Default is false. type: boolean terminationMessagePolicy: - description: Indicate how the termination message - should be populated. File will use the contents - of terminationMessagePath to populate the container - status message on both success and failure. FallbackToLogsOnError - will use the last chunk of container log output - if the termination message file is empty and the - container exited with an error. The log output is - limited to 2048 bytes or 80 lines, whichever is - smaller. Defaults to File. Cannot be updated. + description: Indicate how the termination message should + be populated. File will use the contents of terminationMessagePath + to populate the container status message on both success + and failure. FallbackToLogsOnError will use the last + chunk of container log output if the termination message + file is empty and the container exited with an error. + The log output is limited to 2048 bytes or 80 lines, + whichever is smaller. Defaults to File. Cannot be + updated. type: string terminationMessagePath: - description: 'Optional: Path at which the file to - which the container''s termination message will - be written is mounted into the container''s filesystem. - Message written is intended to be brief final status, - such as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' + description: 'Optional: Path at which the file to which + the container''s termination message will be written + is mounted into the container''s filesystem. Message + written is intended to be brief final status, such + as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' type: string workingDir: - description: Container's working directory. If not - specified, the container runtime's default will - be used, which might be configured in the container - image. Cannot be updated. + description: Container's working directory. If not specified, + the container runtime's default will be used, which + might be configured in the container image. Cannot + be updated. type: string resources: description: ResourceRequirements describes the compute @@ -12655,41 +12403,38 @@ openAPIV3Schema: properties: requests: description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object securityContext: description: SecurityContext holds security configuration - that will be applied to a container. Some fields - are present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take - precedence. + that will be applied to a container. Some fields are + present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take precedence. type: object properties: privileged: - description: Run container in privileged mode. - Processes in privileged containers are essentially - equivalent to root on the host. Defaults to - false. + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. type: boolean runAsUser: - description: The UID to run the entrypoint of - the container process. Defaults to user specified + description: The UID to run the entrypoint of the + container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. + and PodSecurityContext, the value specified in + SecurityContext takes precedence. type: number capabilities: description: Adds and removes POSIX capabilities @@ -12707,25 +12452,25 @@ openAPIV3Schema: items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to - be applied to the container + description: SELinuxOptions are the labels to be + applied to the container type: object properties: role: - description: Role is a SELinux role label - that applies to the container. + description: Role is a SELinux role label that + applies to the container. type: string level: - description: Level is SELinux level label - that applies to the container. + description: Level is SELinux level label that + applies to the container. type: string type: - description: Type is a SELinux type label - that applies to the container. + description: Type is a SELinux type label that + applies to the container. type: string user: - description: User is a SELinux user label - that applies to the container. + description: User is a SELinux user label that + applies to the container. type: string windowsOptions: description: WindowsSecurityContextOptions contain @@ -12736,86 +12481,82 @@ openAPIV3Schema: description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName - field. This field is alpha-level and is - only honored by servers that enable the - WindowsGMSA feature flag. + spec named by the GMSACredentialSpecName field. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. type: string runAsUserName: description: The UserName in Windows to run - the entrypoint of the container process. - Defaults to the user specified in image - metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. This - field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. + the entrypoint of the container process. Defaults + to the user specified in image metadata if + unspecified. May also be set in PodSecurityContext. + If set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. This field is alpha-level and + it is only honored by servers that enable + the WindowsRunAsUserName feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the - name of the GMSA credential spec to use. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. type: string procMount: description: procMount denotes the type of proc - mount to use for the containers. The default - is DefaultProcMount which uses the container - runtime defaults for readonly paths and masked - paths. This requires the ProcMountType feature - flag to be enabled. + mount to use for the containers. The default is + DefaultProcMount which uses the container runtime + defaults for readonly paths and masked paths. + This requires the ProcMountType feature flag to + be enabled. type: string allowPrivilegeEscalation: description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the - container process. AllowPrivilegeEscalation - is true always when the container is: 1) run - as Privileged 2) has CAP_SYS_ADMIN' + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the container + process. AllowPrivilegeEscalation is true always + when the container is: 1) run as Privileged 2) + has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of - the container process. Uses runtime default - if unset. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. - type: number - runAsNonRoot: - description: Indicates that the container must - run as a non-root user. If true, the Kubelet - will validate the image at runtime to ensure - that it does not run as UID 0 (root) and fail - to start the container if it does. If unset - or false, no such validation will be performed. + description: The GID to run the entrypoint of the + container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. + the value specified in SecurityContext takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run + as a non-root user. If true, the Kubelet will + validate the image at runtime to ensure that it + does not run as UID 0 (root) and fail to start + the container if it does. If unset or false, no + such validation will be performed. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in + SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: description: Whether this container has a read-only root filesystem. Default is false. type: boolean startupProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. type: number tcpSocket: description: TCPSocketAction describes an action @@ -12824,11 +12565,11 @@ openAPIV3Schema: properties: port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -12838,28 +12579,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -12869,36 +12610,35 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + description: HTTPGetAction describes an action based + on HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + description: Scheme to use for connecting to + the host. Defaults to HTTP. type: string port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -12908,15 +12648,15 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + to the pod IP. You probably want to set "Host" + in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. + description: Custom headers to set in the request. + HTTP allows repeated headers. type: array items: description: HTTPHeader describes a custom @@ -12930,13 +12670,13 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: - description: List of environment variables to set - in the container. Cannot be updated. + description: List of environment variables to set in + the container. Cannot be updated. type: array items: description: EnvVar represents an environment variable @@ -12949,15 +12689,14 @@ openAPIV3Schema: type: string value: description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service - environment variables. If a variable cannot - be resolved, the reference in the input string - will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, - regardless of whether the variable exists - or not. Defaults to "".' + are expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, + the reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a + double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether + the variable exists or not. Defaults to "".' type: string valueFrom: description: EnvVarSource represents a source @@ -12965,13 +12704,13 @@ openAPIV3Schema: type: object properties: secretKeyRef: - description: SecretKeySelector selects a - key of a Secret. + description: SecretKeySelector selects a key + of a Secret. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the Secret @@ -12983,76 +12722,73 @@ openAPIV3Schema: key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents - container resources (cpu, memory) and - their output format + container resources (cpu, memory) and their + output format type: object properties: divisor: description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= - (Note that - may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= - "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi - | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | - M | G | T | P | E (Note that 1024 - = 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent - forms is used, no quantity may represent - a number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This - may be extended in the future if we - require larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type - again when it is serialized. Before - serializing, Quantity will be put - in "canonical form". This means that - Exponent/suffix will be adjusted up - or down (with a corresponding increase - or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. - The sign will be omitted unless the - number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as - they are well formed, but will be - re-emitted in their canonical form. - (So always use canonical form, or - don''t diff.) This format is intended - to make it difficult to use these - numbers without writing some sort - of special handling code in the hopes - that that will cause implementors - to also use a fixed point implementation.' + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the + "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | + Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M + | G | T | P | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms + is used, no quantity may represent a + number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may + be extended in the future if we require + larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type again + when it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. + No fractional digits will be emitted c. + The exponent (or suffix) is as large + as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always + use canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing + some sort of special handling code in + the hopes that that will cause implementors + to also use a fixed point implementation.' type: object properties: number: @@ -13060,26 +12796,25 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: - description: 'Required: resource to - select' + description: 'Required: resource to select' type: string containerName: description: 'Container name: required - for volumes, optional for env vars' + for volumes, optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap @@ -13089,43 +12824,43 @@ openAPIV3Schema: description: The key to select. type: string required: - - key + - key fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. + description: ObjectFieldSelector selects an + APIVersioned field of an object. type: object properties: apiVersion: description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". + FieldPath is written in terms of, defaults + to "v1". type: string fieldPath: description: Path of the field to select in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: description: List of ports to expose from the container. - Exposing a port here gives the system additional - information about the network connections a container - uses, but is primarily informational. Not specifying - a port here DOES NOT prevent that port from being - exposed. Any port which is listening on the default - "0.0.0.0" address inside a container will be accessible - from the network. Cannot be updated. + Exposing a port here gives the system additional information + about the network connections a container uses, but + is primarily informational. Not specifying a port + here DOES NOT prevent that port from being exposed. + Any port which is listening on the default "0.0.0.0" + address inside a container will be accessible from + the network. Cannot be updated. type: array items: - description: ContainerPort represents a network - port in a single container. + description: ContainerPort represents a network port + in a single container. type: object properties: protocol: - description: Protocol for port. Must be UDP, - TCP, or SCTP. Defaults to "TCP". + description: Protocol for port. Must be UDP, TCP, + or SCTP. Defaults to "TCP". type: string hostIP: description: What host IP to bind the external @@ -13133,35 +12868,35 @@ openAPIV3Schema: type: string name: description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port - in a pod must have a unique name. Name for - the port that can be referred to by services. + and unique within the pod. Each named port in + a pod must have a unique name. Name for the + port that can be referred to by services. type: string containerPort: - description: Number of port to expose on the - pod's IP address. This must be a valid port - number, 0 < x < 65536. + description: Number of port to expose on the pod's + IP address. This must be a valid port number, + 0 < x < 65536. type: number hostPort: - description: Number of port to expose on the - host. If specified, this must be a valid port - number, 0 < x < 65536. If HostNetwork is specified, + description: Number of port to expose on the host. + If specified, this must be a valid port number, + 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. type: number required: - - containerPort + - containerPort command: description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used - if this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. - If a variable cannot be resolved, the reference - in the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be - updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + a shell. The docker image''s ENTRYPOINT is used if + this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. If + a variable cannot be resolved, the reference in the + input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be updated. + More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string @@ -13170,8 +12905,8 @@ openAPIV3Schema: filesystem. Cannot be updated. type: array items: - description: VolumeMount describes a mounting of - a Volume within a container. + description: VolumeMount describes a mounting of a + Volume within a container. type: object properties: mountPath: @@ -13180,9 +12915,9 @@ openAPIV3Schema: ':'. type: string mountPropagation: - description: mountPropagation determines how - mounts are propagated from the host to container - and the other way around. When not set, MountPropagationNone + description: mountPropagation determines how mounts + are propagated from the host to container and + the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. type: string name: @@ -13190,68 +12925,66 @@ openAPIV3Schema: type: string readOnly: description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults - to false. + otherwise (false or unspecified). Defaults to + false. type: boolean subPath: description: Path within the volume from which - the container's volume should be mounted. - Defaults to "" (volume's root). + the container's volume should be mounted. Defaults + to "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume - from which the container's volume should be - mounted. Behaves similarly to SubPath but - environment variable references $(VAR_NAME) - are expanded using the container's environment. - Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field - is beta in 1.15. + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment + variable references $(VAR_NAME) are expanded + using the container's environment. Defaults + to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in + 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. The + $(VAR_NAME) syntax can be escaped with a double $$, + ie: $$(VAR_NAME). Escaped references will never be + expanded, regardless of whether the variable exists + or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string lifecycle: - description: Lifecycle describes actions that the - management system should take in response to container - lifecycle events. For the PostStart and PreStop - lifecycle handlers, management of the container - blocks until the action is complete, unless the - container process fails, in which case the handler - is aborted. + description: Lifecycle describes actions that the management + system should take in response to container lifecycle + events. For the PostStart and PreStop lifecycle handlers, + management of the container blocks until the action + is complete, unless the container process fails, in + which case the handler is aborted. type: object properties: postStart: - description: Handler defines a specific action - that should be taken + description: Handler defines a specific action that + should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket + description: TCPSocketAction describes an action + based on opening a socket type: object properties: port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -13261,13 +12994,13 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -13275,16 +13008,15 @@ openAPIV3Schema: properties: command: description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. type: array items: type: string @@ -13303,12 +13035,11 @@ openAPIV3Schema: type: string port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -13318,19 +13049,19 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. + description: Custom headers to set in the + request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a - custom header to be used in HTTP probes + description: HTTPHeader describes a custom + header to be used in HTTP probes type: object properties: name: @@ -13340,28 +13071,27 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: - description: Handler defines a specific action - that should be taken + description: Handler defines a specific action that + should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket + description: TCPSocketAction describes an action + based on opening a socket type: object properties: port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -13371,13 +13101,13 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -13385,16 +13115,15 @@ openAPIV3Schema: properties: command: description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. type: array items: type: string @@ -13413,12 +13142,11 @@ openAPIV3Schema: type: string port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -13428,19 +13156,19 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. + description: Custom headers to set in the + request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a - custom header to be used in HTTP probes + description: HTTPHeader describes a custom + header to be used in HTTP probes type: object properties: name: @@ -13450,14 +13178,14 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: - description: Name of the container specified as a - DNS_LABEL. Each container in a pod must have a unique - name (DNS_LABEL). Cannot be updated. + description: Name of the container specified as a DNS_LABEL. + Each container in a pod must have a unique name (DNS_LABEL). + Cannot be updated. type: string tty: description: Whether this container should allocate @@ -13465,20 +13193,20 @@ openAPIV3Schema: Default is false. type: boolean readinessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. type: number tcpSocket: description: TCPSocketAction describes an action @@ -13487,11 +13215,11 @@ openAPIV3Schema: properties: port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -13501,28 +13229,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -13532,36 +13260,35 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + description: HTTPGetAction describes an action based + on HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + description: Scheme to use for connecting to + the host. Defaults to HTTP. type: string port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -13571,15 +13298,15 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + to the pod IP. You probably want to set "Host" + in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. + description: Custom headers to set in the request. + HTTP allows repeated headers. type: array items: description: HTTPHeader describes a custom @@ -13593,37 +13320,36 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: - description: Whether the container runtime should - close the stdin channel after it has been opened - by a single attach. When stdin is true the stdin - stream will remain open across multiple attach sessions. - If stdinOnce is set to true, stdin is opened on - container start, is empty until the first client - attaches to stdin, and then remains open and accepts - data until the client disconnects, at which time - stdin is closed and remains closed until the container - is restarted. If this flag is false, a container - processes that reads from stdin will never receive - an EOF. Default is false + description: Whether the container runtime should close + the stdin channel after it has been opened by a single + attach. When stdin is true the stdin stream will remain + open across multiple attach sessions. If stdinOnce + is set to true, stdin is opened on container start, + is empty until the first client attaches to stdin, + and then remains open and accepts data until the client + disconnects, at which time stdin is closed and remains + closed until the container is restarted. If this flag + is false, a container processes that reads from stdin + will never receive an EOF. Default is false type: boolean envFrom: description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container - is starting. When a key exists in multiple sources, - the value associated with the last source will take - precedence. Values defined by an Env with a duplicate - key will take precedence. Cannot be updated. + will be reported as an event when the container is + starting. When a key exists in multiple sources, the + value associated with the last source will take precedence. + Values defined by an Env with a duplicate key will + take precedence. Cannot be updated. type: array items: - description: EnvFromSource represents the source - of a set of ConfigMaps + description: EnvFromSource represents the source of + a set of ConfigMaps type: object properties: configMapRef: @@ -13635,8 +13361,8 @@ openAPIV3Schema: type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap @@ -13649,21 +13375,21 @@ openAPIV3Schema: secretRef: description: SecretEnvSource selects a Secret to populate the environment variables with. The - contents of the target Secret's Data field - will represent the key-value pairs as environment + contents of the target Secret's Data field will + represent the key-value pairs as environment variables. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - must be defined + description: Specify whether the Secret must + be defined type: boolean required: - - name + - name containerSecurityContext: description: Container-level security attributes. Will override any matching pod-level attributes. @@ -13731,21 +13457,20 @@ openAPIV3Schema: that enable the WindowsGMSA feature flag. type: string runAsUserName: - description: The UserName in Windows to run the - entrypoint of the container process. Defaults - to the user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - This field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and + it is only honored by servers that enable the WindowsRunAsUserName feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + description: GMSACredentialSpecName is the name of + the GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. type: string procMount: description: procMount denotes the type of proc mount @@ -13756,11 +13481,11 @@ openAPIV3Schema: type: string allowPrivilegeEscalation: description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent - process. This bool directly controls if the no_new_privs - flag will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' + a process can gain more privileges than its parent process. + This bool directly controls if the no_new_privs flag + will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' type: boolean runAsGroup: description: The GID to run the entrypoint of the container @@ -13773,24 +13498,24 @@ openAPIV3Schema: description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if - it does. If unset or false, no such validation will - be performed. May also be set in PodSecurityContext. If + as UID 0 (root) and fail to start the container if it + does. If unset or false, no such validation will be + performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. + description: Whether this container has a read-only root + filesystem. Default is false. type: boolean schedulerName: - description: If specified, the pod will be dispatched by - specified scheduler. If not specified, the pod will be - dispatched by default scheduler. + description: If specified, the pod will be dispatched by specified + scheduler. If not specified, the pod will be dispatched + by default scheduler. type: string initContainers: - description: Initialization containers to be included in - the server pod. + description: Initialization containers to be included in the + server pod. type: array items: description: A single application container that you want @@ -13802,8 +13527,8 @@ openAPIV3Schema: to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of - a raw block device within a container. + description: volumeDevice describes a mapping of a + raw block device within a container. type: object properties: devicePath: @@ -13816,35 +13541,35 @@ openAPIV3Schema: in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' type: string imagePullPolicy: description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. Cannot - be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + IfNotPresent. Defaults to Always if :latest tag is + specified, or IfNotPresent otherwise. Cannot be updated. + More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. type: number tcpSocket: description: TCPSocketAction describes an action @@ -13853,11 +13578,11 @@ openAPIV3Schema: properties: port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -13867,28 +13592,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -13898,36 +13623,35 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + description: HTTPGetAction describes an action based + on HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + description: Scheme to use for connecting to + the host. Defaults to HTTP. type: string port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -13937,15 +13661,15 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + to the pod IP. You probably want to set "Host" + in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. + description: Custom headers to set in the request. + HTTP allows repeated headers. type: array items: description: HTTPHeader describes a custom @@ -13959,43 +13683,43 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: description: Whether this container should allocate - a buffer for stdin in the container runtime. If - this is not set, reads from stdin in the container - will always result in EOF. Default is false. + a buffer for stdin in the container runtime. If this + is not set, reads from stdin in the container will + always result in EOF. Default is false. type: boolean terminationMessagePolicy: - description: Indicate how the termination message - should be populated. File will use the contents - of terminationMessagePath to populate the container - status message on both success and failure. FallbackToLogsOnError - will use the last chunk of container log output - if the termination message file is empty and the - container exited with an error. The log output is - limited to 2048 bytes or 80 lines, whichever is - smaller. Defaults to File. Cannot be updated. + description: Indicate how the termination message should + be populated. File will use the contents of terminationMessagePath + to populate the container status message on both success + and failure. FallbackToLogsOnError will use the last + chunk of container log output if the termination message + file is empty and the container exited with an error. + The log output is limited to 2048 bytes or 80 lines, + whichever is smaller. Defaults to File. Cannot be + updated. type: string terminationMessagePath: - description: 'Optional: Path at which the file to - which the container''s termination message will - be written is mounted into the container''s filesystem. - Message written is intended to be brief final status, - such as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' + description: 'Optional: Path at which the file to which + the container''s termination message will be written + is mounted into the container''s filesystem. Message + written is intended to be brief final status, such + as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' type: string workingDir: - description: Container's working directory. If not - specified, the container runtime's default will - be used, which might be configured in the container - image. Cannot be updated. + description: Container's working directory. If not specified, + the container runtime's default will be used, which + might be configured in the container image. Cannot + be updated. type: string resources: description: ResourceRequirements describes the compute @@ -14004,41 +13728,38 @@ openAPIV3Schema: properties: requests: description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object securityContext: description: SecurityContext holds security configuration - that will be applied to a container. Some fields - are present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take - precedence. + that will be applied to a container. Some fields are + present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take precedence. type: object properties: privileged: - description: Run container in privileged mode. - Processes in privileged containers are essentially - equivalent to root on the host. Defaults to - false. + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. type: boolean runAsUser: - description: The UID to run the entrypoint of - the container process. Defaults to user specified + description: The UID to run the entrypoint of the + container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. + and PodSecurityContext, the value specified in + SecurityContext takes precedence. type: number capabilities: description: Adds and removes POSIX capabilities @@ -14056,25 +13777,25 @@ openAPIV3Schema: items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to - be applied to the container + description: SELinuxOptions are the labels to be + applied to the container type: object properties: role: - description: Role is a SELinux role label - that applies to the container. + description: Role is a SELinux role label that + applies to the container. type: string level: - description: Level is SELinux level label - that applies to the container. + description: Level is SELinux level label that + applies to the container. type: string type: - description: Type is a SELinux type label - that applies to the container. + description: Type is a SELinux type label that + applies to the container. type: string user: - description: User is a SELinux user label - that applies to the container. + description: User is a SELinux user label that + applies to the container. type: string windowsOptions: description: WindowsSecurityContextOptions contain @@ -14085,86 +13806,82 @@ openAPIV3Schema: description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName - field. This field is alpha-level and is - only honored by servers that enable the - WindowsGMSA feature flag. + spec named by the GMSACredentialSpecName field. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. type: string runAsUserName: description: The UserName in Windows to run - the entrypoint of the container process. - Defaults to the user specified in image - metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. This - field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. + the entrypoint of the container process. Defaults + to the user specified in image metadata if + unspecified. May also be set in PodSecurityContext. + If set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. This field is alpha-level and + it is only honored by servers that enable + the WindowsRunAsUserName feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the - name of the GMSA credential spec to use. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. type: string procMount: description: procMount denotes the type of proc - mount to use for the containers. The default - is DefaultProcMount which uses the container - runtime defaults for readonly paths and masked - paths. This requires the ProcMountType feature - flag to be enabled. + mount to use for the containers. The default is + DefaultProcMount which uses the container runtime + defaults for readonly paths and masked paths. + This requires the ProcMountType feature flag to + be enabled. type: string allowPrivilegeEscalation: description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the - container process. AllowPrivilegeEscalation - is true always when the container is: 1) run - as Privileged 2) has CAP_SYS_ADMIN' + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the container + process. AllowPrivilegeEscalation is true always + when the container is: 1) run as Privileged 2) + has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of - the container process. Uses runtime default - if unset. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. - type: number - runAsNonRoot: - description: Indicates that the container must - run as a non-root user. If true, the Kubelet - will validate the image at runtime to ensure - that it does not run as UID 0 (root) and fail - to start the container if it does. If unset - or false, no such validation will be performed. + description: The GID to run the entrypoint of the + container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. + the value specified in SecurityContext takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run + as a non-root user. If true, the Kubelet will + validate the image at runtime to ensure that it + does not run as UID 0 (root) and fail to start + the container if it does. If unset or false, no + such validation will be performed. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in + SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: description: Whether this container has a read-only root filesystem. Default is false. type: boolean startupProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. type: number tcpSocket: description: TCPSocketAction describes an action @@ -14173,11 +13890,11 @@ openAPIV3Schema: properties: port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -14187,28 +13904,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -14218,36 +13935,35 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + description: HTTPGetAction describes an action based + on HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + description: Scheme to use for connecting to + the host. Defaults to HTTP. type: string port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -14257,15 +13973,15 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + to the pod IP. You probably want to set "Host" + in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. + description: Custom headers to set in the request. + HTTP allows repeated headers. type: array items: description: HTTPHeader describes a custom @@ -14279,13 +13995,13 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: - description: List of environment variables to set - in the container. Cannot be updated. + description: List of environment variables to set in + the container. Cannot be updated. type: array items: description: EnvVar represents an environment variable @@ -14298,15 +14014,14 @@ openAPIV3Schema: type: string value: description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service - environment variables. If a variable cannot - be resolved, the reference in the input string - will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, - regardless of whether the variable exists - or not. Defaults to "".' + are expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, + the reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a + double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether + the variable exists or not. Defaults to "".' type: string valueFrom: description: EnvVarSource represents a source @@ -14314,13 +14029,13 @@ openAPIV3Schema: type: object properties: secretKeyRef: - description: SecretKeySelector selects a - key of a Secret. + description: SecretKeySelector selects a key + of a Secret. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the Secret @@ -14332,76 +14047,73 @@ openAPIV3Schema: key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents - container resources (cpu, memory) and - their output format + container resources (cpu, memory) and their + output format type: object properties: divisor: description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= - (Note that - may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= - "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi - | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | - M | G | T | P | E (Note that 1024 - = 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent - forms is used, no quantity may represent - a number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This - may be extended in the future if we - require larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type - again when it is serialized. Before - serializing, Quantity will be put - in "canonical form". This means that - Exponent/suffix will be adjusted up - or down (with a corresponding increase - or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. - The sign will be omitted unless the - number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as - they are well formed, but will be - re-emitted in their canonical form. - (So always use canonical form, or - don''t diff.) This format is intended - to make it difficult to use these - numbers without writing some sort - of special handling code in the hopes - that that will cause implementors - to also use a fixed point implementation.' + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the + "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | + Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M + | G | T | P | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms + is used, no quantity may represent a + number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may + be extended in the future if we require + larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type again + when it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. + No fractional digits will be emitted c. + The exponent (or suffix) is as large + as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always + use canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing + some sort of special handling code in + the hopes that that will cause implementors + to also use a fixed point implementation.' type: object properties: number: @@ -14409,26 +14121,25 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: - description: 'Required: resource to - select' + description: 'Required: resource to select' type: string containerName: description: 'Container name: required - for volumes, optional for env vars' + for volumes, optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap @@ -14438,43 +14149,43 @@ openAPIV3Schema: description: The key to select. type: string required: - - key + - key fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. + description: ObjectFieldSelector selects an + APIVersioned field of an object. type: object properties: apiVersion: description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". + FieldPath is written in terms of, defaults + to "v1". type: string fieldPath: description: Path of the field to select in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: description: List of ports to expose from the container. - Exposing a port here gives the system additional - information about the network connections a container - uses, but is primarily informational. Not specifying - a port here DOES NOT prevent that port from being - exposed. Any port which is listening on the default - "0.0.0.0" address inside a container will be accessible - from the network. Cannot be updated. + Exposing a port here gives the system additional information + about the network connections a container uses, but + is primarily informational. Not specifying a port + here DOES NOT prevent that port from being exposed. + Any port which is listening on the default "0.0.0.0" + address inside a container will be accessible from + the network. Cannot be updated. type: array items: - description: ContainerPort represents a network - port in a single container. + description: ContainerPort represents a network port + in a single container. type: object properties: protocol: - description: Protocol for port. Must be UDP, - TCP, or SCTP. Defaults to "TCP". + description: Protocol for port. Must be UDP, TCP, + or SCTP. Defaults to "TCP". type: string hostIP: description: What host IP to bind the external @@ -14482,35 +14193,35 @@ openAPIV3Schema: type: string name: description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port - in a pod must have a unique name. Name for - the port that can be referred to by services. + and unique within the pod. Each named port in + a pod must have a unique name. Name for the + port that can be referred to by services. type: string containerPort: - description: Number of port to expose on the - pod's IP address. This must be a valid port - number, 0 < x < 65536. + description: Number of port to expose on the pod's + IP address. This must be a valid port number, + 0 < x < 65536. type: number hostPort: - description: Number of port to expose on the - host. If specified, this must be a valid port - number, 0 < x < 65536. If HostNetwork is specified, + description: Number of port to expose on the host. + If specified, this must be a valid port number, + 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. type: number required: - - containerPort + - containerPort command: description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used - if this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. - If a variable cannot be resolved, the reference - in the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be - updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + a shell. The docker image''s ENTRYPOINT is used if + this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. If + a variable cannot be resolved, the reference in the + input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be updated. + More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string @@ -14519,8 +14230,8 @@ openAPIV3Schema: filesystem. Cannot be updated. type: array items: - description: VolumeMount describes a mounting of - a Volume within a container. + description: VolumeMount describes a mounting of a + Volume within a container. type: object properties: mountPath: @@ -14529,9 +14240,9 @@ openAPIV3Schema: ':'. type: string mountPropagation: - description: mountPropagation determines how - mounts are propagated from the host to container - and the other way around. When not set, MountPropagationNone + description: mountPropagation determines how mounts + are propagated from the host to container and + the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. type: string name: @@ -14539,68 +14250,66 @@ openAPIV3Schema: type: string readOnly: description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults - to false. + otherwise (false or unspecified). Defaults to + false. type: boolean subPath: description: Path within the volume from which - the container's volume should be mounted. - Defaults to "" (volume's root). + the container's volume should be mounted. Defaults + to "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume - from which the container's volume should be - mounted. Behaves similarly to SubPath but - environment variable references $(VAR_NAME) - are expanded using the container's environment. - Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field - is beta in 1.15. + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment + variable references $(VAR_NAME) are expanded + using the container's environment. Defaults + to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in + 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. The + $(VAR_NAME) syntax can be escaped with a double $$, + ie: $$(VAR_NAME). Escaped references will never be + expanded, regardless of whether the variable exists + or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string lifecycle: - description: Lifecycle describes actions that the - management system should take in response to container - lifecycle events. For the PostStart and PreStop - lifecycle handlers, management of the container - blocks until the action is complete, unless the - container process fails, in which case the handler - is aborted. + description: Lifecycle describes actions that the management + system should take in response to container lifecycle + events. For the PostStart and PreStop lifecycle handlers, + management of the container blocks until the action + is complete, unless the container process fails, in + which case the handler is aborted. type: object properties: postStart: - description: Handler defines a specific action - that should be taken + description: Handler defines a specific action that + should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket + description: TCPSocketAction describes an action + based on opening a socket type: object properties: port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -14610,13 +14319,13 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -14624,16 +14333,15 @@ openAPIV3Schema: properties: command: description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. type: array items: type: string @@ -14652,12 +14360,11 @@ openAPIV3Schema: type: string port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -14667,19 +14374,19 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. + description: Custom headers to set in the + request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a - custom header to be used in HTTP probes + description: HTTPHeader describes a custom + header to be used in HTTP probes type: object properties: name: @@ -14689,28 +14396,27 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: - description: Handler defines a specific action - that should be taken + description: Handler defines a specific action that + should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket + description: TCPSocketAction describes an action + based on opening a socket type: object properties: port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -14720,13 +14426,13 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -14734,16 +14440,15 @@ openAPIV3Schema: properties: command: description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. type: array items: type: string @@ -14762,12 +14467,11 @@ openAPIV3Schema: type: string port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -14777,19 +14481,19 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. + description: Custom headers to set in the + request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a - custom header to be used in HTTP probes + description: HTTPHeader describes a custom + header to be used in HTTP probes type: object properties: name: @@ -14799,14 +14503,14 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: - description: Name of the container specified as a - DNS_LABEL. Each container in a pod must have a unique - name (DNS_LABEL). Cannot be updated. + description: Name of the container specified as a DNS_LABEL. + Each container in a pod must have a unique name (DNS_LABEL). + Cannot be updated. type: string tty: description: Whether this container should allocate @@ -14814,20 +14518,20 @@ openAPIV3Schema: Default is false. type: boolean readinessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. type: number tcpSocket: description: TCPSocketAction describes an action @@ -14836,11 +14540,11 @@ openAPIV3Schema: properties: port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -14850,28 +14554,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -14881,36 +14585,35 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + description: HTTPGetAction describes an action based + on HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + description: Scheme to use for connecting to + the host. Defaults to HTTP. type: string port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -14920,15 +14623,15 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + to the pod IP. You probably want to set "Host" + in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. + description: Custom headers to set in the request. + HTTP allows repeated headers. type: array items: description: HTTPHeader describes a custom @@ -14942,37 +14645,36 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: - description: Whether the container runtime should - close the stdin channel after it has been opened - by a single attach. When stdin is true the stdin - stream will remain open across multiple attach sessions. - If stdinOnce is set to true, stdin is opened on - container start, is empty until the first client - attaches to stdin, and then remains open and accepts - data until the client disconnects, at which time - stdin is closed and remains closed until the container - is restarted. If this flag is false, a container - processes that reads from stdin will never receive - an EOF. Default is false + description: Whether the container runtime should close + the stdin channel after it has been opened by a single + attach. When stdin is true the stdin stream will remain + open across multiple attach sessions. If stdinOnce + is set to true, stdin is opened on container start, + is empty until the first client attaches to stdin, + and then remains open and accepts data until the client + disconnects, at which time stdin is closed and remains + closed until the container is restarted. If this flag + is false, a container processes that reads from stdin + will never receive an EOF. Default is false type: boolean envFrom: description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container - is starting. When a key exists in multiple sources, - the value associated with the last source will take - precedence. Values defined by an Env with a duplicate - key will take precedence. Cannot be updated. + will be reported as an event when the container is + starting. When a key exists in multiple sources, the + value associated with the last source will take precedence. + Values defined by an Env with a duplicate key will + take precedence. Cannot be updated. type: array items: - description: EnvFromSource represents the source - of a set of ConfigMaps + description: EnvFromSource represents the source of + a set of ConfigMaps type: object properties: configMapRef: @@ -14984,8 +14686,8 @@ openAPIV3Schema: type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap @@ -14998,38 +14700,38 @@ openAPIV3Schema: secretRef: description: SecretEnvSource selects a Secret to populate the environment variables with. The - contents of the target Secret's Data field - will represent the key-value pairs as environment + contents of the target Secret's Data field will + represent the key-value pairs as environment variables. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - must be defined + description: Specify whether the Secret must + be defined type: boolean required: - - name + - name shutdown: - description: Configures how the operator should shutdown - the server instance. + description: Configures how the operator should shutdown the + server instance. type: object properties: ignoreSessions: description: For graceful shutdown only, indicates to - ignore pending HTTP sessions during in-flight work - handling. Not required. Defaults to false. + ignore pending HTTP sessions during in-flight work handling. + Not required. Defaults to false. type: boolean shutdownType: description: Tells the operator how to shutdown server instances. Not required. Defaults to graceful shutdown. type: string enum: - - Graceful - - Forced + - Graceful + - Forced timeoutSeconds: description: For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting @@ -15047,9 +14749,8 @@ openAPIV3Schema: requiredDuringSchedulingIgnoredDuringExecution: description: A node selector represents the union of the results of one or more label queries over - a set of nodes; that is, it represents the OR - of the selectors represented by the node selector - terms. + a set of nodes; that is, it represents the OR of + the selectors represented by the node selector terms. type: object properties: nodeSelectorTerms: @@ -15057,10 +14758,10 @@ openAPIV3Schema: terms. The terms are ORed. type: array items: - description: A null or empty node selector - term matches no objects. The requirements - of them are ANDed. The TopologySelectorTerm - type implements a subset of the NodeSelectorTerm. + description: A null or empty node selector term + matches no objects. The requirements of them + are ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. type: object properties: matchExpressions: @@ -15075,13 +14776,12 @@ openAPIV3Schema: type: object properties: values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced @@ -15090,19 +14790,18 @@ openAPIV3Schema: items: type: string key: - description: The label key that - the selector applies to. + description: The label key that the + selector applies to. type: string operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. @@ -15115,13 +14814,12 @@ openAPIV3Schema: type: object properties: values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced @@ -15130,35 +14828,33 @@ openAPIV3Schema: items: type: string key: - description: The label key that - the selector applies to. + description: The label key that the + selector applies to. type: string operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. type: string required: - - key - - operator + - key + - operator required: - - nodeSelectorTerms + - nodeSelectorTerms preferredDuringSchedulingIgnoredDuringExecution: description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node - that violates one or more of the expressions. - The node that is most preferred is the one with - the greatest sum of weights, i.e. for each node - that meets all of the scheduling requirements - (resource request, requiredDuringScheduling affinity - expressions, etc.), compute a sum by iterating - through the elements of this field and adding - "weight" to the sum if the node matches the corresponding - matchExpressions; the node(s) with the highest - sum are the most preferred. + that violates one or more of the expressions. The + node that is most preferred is the one with the + greatest sum of weights, i.e. for each node that + meets all of the scheduling requirements (resource + request, requiredDuringScheduling affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if + the node matches the corresponding matchExpressions; + the node(s) with the highest sum are the most preferred. type: array items: description: An empty preferred scheduling term @@ -15168,10 +14864,10 @@ openAPIV3Schema: type: object properties: preference: - description: A null or empty node selector - term matches no objects. The requirements - of them are ANDed. The TopologySelectorTerm - type implements a subset of the NodeSelectorTerm. + description: A null or empty node selector term + matches no objects. The requirements of them + are ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. type: object properties: matchExpressions: @@ -15186,13 +14882,12 @@ openAPIV3Schema: type: object properties: values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced @@ -15201,19 +14896,18 @@ openAPIV3Schema: items: type: string key: - description: The label key that - the selector applies to. + description: The label key that the + selector applies to. type: string operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. @@ -15226,13 +14920,12 @@ openAPIV3Schema: type: object properties: values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced @@ -15241,27 +14934,26 @@ openAPIV3Schema: items: type: string key: - description: The label key that - the selector applies to. + description: The label key that the + selector applies to. type: string operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. type: string required: - - key - - operator + - key + - operator weight: description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. type: number required: - - preference - - weight + - preference + - weight podAffinity: description: Pod affinity is a group of inter pod affinity scheduling rules. @@ -15269,39 +14961,39 @@ openAPIV3Schema: properties: requiredDuringSchedulingIgnoredDuringExecution: description: If the affinity requirements specified - by this field are not met at scheduling time, - the pod will not be scheduled onto the node. If - the affinity requirements specified by this field - cease to be met at some point during pod execution - (e.g. due to a pod label update), the system may - or may not try to eventually evict the pod from - its node. When there are multiple elements, the - lists of nodes corresponding to each podAffinityTerm - are intersected, i.e. all terms must be satisfied. + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the + affinity requirements specified by this field cease + to be met at some point during pod execution (e.g. + due to a pod label update), the system may or may + not try to eventually evict the pod from its node. + When there are multiple elements, the lists of nodes + corresponding to each podAffinityTerm are intersected, + i.e. all terms must be satisfied. type: array items: description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which - a pod of the set of pods is running + (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node + whose value of the label with key + matches that of any node on which a pod of the + set of pods is running type: object properties: labelSelector: description: A label selector is a label query over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty - label selector matches all objects. A null - label selector matches no objects. + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label + selector matches no objects. type: object properties: matchExpressions: description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. + of label selector requirements. The requirements + are ANDed. type: array items: description: A label selector requirement @@ -15311,14 +15003,14 @@ openAPIV3Schema: type: object properties: values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. This - array is replaced during a strategic - merge patch. + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. This array + is replaced during a strategic merge + patch. type: array items: type: string @@ -15327,14 +15019,14 @@ openAPIV3Schema: that the selector applies to. type: string operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -15346,15 +15038,14 @@ openAPIV3Schema: type: string type: object topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose value - of the label with key topologyKey matches - that of any node on which any of the selected - pods is running. Empty topologyKey is not - allowed. + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the + pods matching the labelSelector in the specified + namespaces, where co-located is defined as + running on a node whose value of the label + with key topologyKey matches that of any node + on which any of the selected pods is running. + Empty topologyKey is not allowed. type: string namespaces: description: namespaces specifies which namespaces @@ -15364,53 +15055,52 @@ openAPIV3Schema: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node - that violates one or more of the expressions. - The node that is most preferred is the one with - the greatest sum of weights, i.e. for each node - that meets all of the scheduling requirements - (resource request, requiredDuringScheduling affinity - expressions, etc.), compute a sum by iterating - through the elements of this field and adding - "weight" to the sum if the node has pods which - matches the corresponding podAffinityTerm; the - node(s) with the highest sum are the most preferred. + that violates one or more of the expressions. The + node that is most preferred is the one with the + greatest sum of weights, i.e. for each node that + meets all of the scheduling requirements (resource + request, requiredDuringScheduling affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if + the node has pods which matches the corresponding + podAffinityTerm; the node(s) with the highest sum + are the most preferred. type: array items: - description: The weights of all of the matched - WeightedPodAffinityTerm fields are added per-node - to find the most preferred node(s) + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) type: object properties: podAffinityTerm: - description: Defines a set of pods (namely - those matching the labelSelector relative - to the given namespace(s)) that this pod - should be co-located (affinity) or not co-located - (anti-affinity) with, where co-located is - defined as running on a node whose value - of the label with key matches - that of any node on which a pod of the set - of pods is running + description: Defines a set of pods (namely those + matching the labelSelector relative to the + given namespace(s)) that this pod should be + co-located (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on + which a pod of the set of pods is running type: object properties: labelSelector: description: A label selector is a label query over a set of resources. The result - of matchLabels and matchExpressions - are ANDed. An empty label selector matches + of matchLabels and matchExpressions are + ANDed. An empty label selector matches all objects. A null label selector matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a - list of label selector requirements. - The requirements are ANDed. + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. type: array items: description: A label selector requirement @@ -15422,13 +15112,12 @@ openAPIV3Schema: values: description: values is an array of string values. If the operator - is In or NotIn, the values - array must be non-empty. If - the operator is Exists or - DoesNotExist, the values array - must be empty. This array - is replaced during a strategic - merge patch. + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. type: array items: type: string @@ -15439,17 +15128,16 @@ openAPIV3Schema: type: string operator: description: operator represents - a key's relationship to a - set of values. Valid operators - are In, NotIn, Exists and - DoesNotExist. + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: - description: matchLabels is a map - of {key,value} pairs. A single {key,value} + description: matchLabels is a map of + {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator @@ -15472,22 +15160,22 @@ openAPIV3Schema: type: string namespaces: description: namespaces specifies which - namespaces the labelSelector applies - to (matches against); null or empty - list means "this pod's namespace" + namespaces the labelSelector applies to + (matches against); null or empty list + means "this pod's namespace" type: array items: type: string required: - - topologyKey + - topologyKey weight: description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight podAntiAffinity: description: Pod anti affinity is a group of inter pod anti affinity scheduling rules. @@ -15495,40 +15183,39 @@ openAPIV3Schema: properties: requiredDuringSchedulingIgnoredDuringExecution: description: If the anti-affinity requirements specified - by this field are not met at scheduling time, - the pod will not be scheduled onto the node. If - the anti-affinity requirements specified by this - field cease to be met at some point during pod - execution (e.g. due to a pod label update), the - system may or may not try to eventually evict - the pod from its node. When there are multiple - elements, the lists of nodes corresponding to - each podAffinityTerm are intersected, i.e. all - terms must be satisfied. + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the + anti-affinity requirements specified by this field + cease to be met at some point during pod execution + (e.g. due to a pod label update), the system may + or may not try to eventually evict the pod from + its node. When there are multiple elements, the + lists of nodes corresponding to each podAffinityTerm + are intersected, i.e. all terms must be satisfied. type: array items: description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which - a pod of the set of pods is running + (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node + whose value of the label with key + matches that of any node on which a pod of the + set of pods is running type: object properties: labelSelector: description: A label selector is a label query over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty - label selector matches all objects. A null - label selector matches no objects. + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label + selector matches no objects. type: object properties: matchExpressions: description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. + of label selector requirements. The requirements + are ANDed. type: array items: description: A label selector requirement @@ -15538,14 +15225,14 @@ openAPIV3Schema: type: object properties: values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. This - array is replaced during a strategic - merge patch. + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. This array + is replaced during a strategic merge + patch. type: array items: type: string @@ -15554,14 +15241,14 @@ openAPIV3Schema: that the selector applies to. type: string operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -15573,15 +15260,14 @@ openAPIV3Schema: type: string type: object topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose value - of the label with key topologyKey matches - that of any node on which any of the selected - pods is running. Empty topologyKey is not - allowed. + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the + pods matching the labelSelector in the specified + namespaces, where co-located is defined as + running on a node whose value of the label + with key topologyKey matches that of any node + on which any of the selected pods is running. + Empty topologyKey is not allowed. type: string namespaces: description: namespaces specifies which namespaces @@ -15591,53 +15277,52 @@ openAPIV3Schema: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node - that violates one or more of the expressions. - The node that is most preferred is the one with - the greatest sum of weights, i.e. for each node - that meets all of the scheduling requirements - (resource request, requiredDuringScheduling anti-affinity - expressions, etc.), compute a sum by iterating - through the elements of this field and adding - "weight" to the sum if the node has pods which - matches the corresponding podAffinityTerm; the - node(s) with the highest sum are the most preferred. + that violates one or more of the expressions. The + node that is most preferred is the one with the + greatest sum of weights, i.e. for each node that + meets all of the scheduling requirements (resource + request, requiredDuringScheduling anti-affinity + expressions, etc.), compute a sum by iterating through + the elements of this field and adding "weight" to + the sum if the node has pods which matches the corresponding + podAffinityTerm; the node(s) with the highest sum + are the most preferred. type: array items: - description: The weights of all of the matched - WeightedPodAffinityTerm fields are added per-node - to find the most preferred node(s) + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) type: object properties: podAffinityTerm: - description: Defines a set of pods (namely - those matching the labelSelector relative - to the given namespace(s)) that this pod - should be co-located (affinity) or not co-located - (anti-affinity) with, where co-located is - defined as running on a node whose value - of the label with key matches - that of any node on which a pod of the set - of pods is running + description: Defines a set of pods (namely those + matching the labelSelector relative to the + given namespace(s)) that this pod should be + co-located (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on + which a pod of the set of pods is running type: object properties: labelSelector: description: A label selector is a label query over a set of resources. The result - of matchLabels and matchExpressions - are ANDed. An empty label selector matches + of matchLabels and matchExpressions are + ANDed. An empty label selector matches all objects. A null label selector matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a - list of label selector requirements. - The requirements are ANDed. + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. type: array items: description: A label selector requirement @@ -15649,13 +15334,12 @@ openAPIV3Schema: values: description: values is an array of string values. If the operator - is In or NotIn, the values - array must be non-empty. If - the operator is Exists or - DoesNotExist, the values array - must be empty. This array - is replaced during a strategic - merge patch. + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. type: array items: type: string @@ -15666,17 +15350,16 @@ openAPIV3Schema: type: string operator: description: operator represents - a key's relationship to a - set of values. Valid operators - are In, NotIn, Exists and - DoesNotExist. + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: - description: matchLabels is a map - of {key,value} pairs. A single {key,value} + description: matchLabels is a map of + {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator @@ -15699,36 +15382,36 @@ openAPIV3Schema: type: string namespaces: description: namespaces specifies which - namespaces the labelSelector applies - to (matches against); null or empty - list means "this pod's namespace" + namespaces the labelSelector applies to + (matches against); null or empty list + means "this pod's namespace" type: array items: type: string required: - - topologyKey + - topologyKey weight: description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight serverStartPolicy: description: The strategy for deciding whether to start a server. Legal values are ALWAYS, NEVER, or IF_NEEDED. type: string enum: - - ALWAYS - - NEVER - - IF_NEEDED + - ALWAYS + - NEVER + - IF_NEEDED restartVersion: description: If present, every time this value is updated the operator will restart the required servers. type: string required: - - serverName + - serverName clusters: type: array description: Configuration for the clusters. @@ -15737,13 +15420,13 @@ openAPIV3Schema: type: object properties: serverStartState: - description: The state in which the server is to be started. - Use ADMIN if server should start in the admin state. Defaults - to RUNNING. + description: The state in which the server is to be started. Use + ADMIN if server should start in the admin state. Defaults to + RUNNING. type: string enum: - - RUNNING - - ADMIN + - RUNNING + - ADMIN serverService: description: Customization affecting ClusterIP Kubernetes services for WebLogic Server instances. @@ -15754,8 +15437,7 @@ openAPIV3Schema: even for server instances without running pods. type: boolean annotations: - description: The annotations to be attached to generated - resources. + description: The annotations to be attached to generated resources. additionalProperties: type: string type: object @@ -15766,8 +15448,8 @@ openAPIV3Schema: type: string type: object maxUnavailable: - description: The maximum number of cluster members that can - be temporarily unavailable. Defaults to 1. + description: The maximum number of cluster members that can be + temporarily unavailable. Defaults to 1. type: number minimum: 1.0 replicas: @@ -15782,33 +15464,32 @@ openAPIV3Schema: type: object properties: nodeName: - description: NodeName is a request to schedule this pod - onto a specific node. If it is non-empty, the scheduler - simply schedules this pod onto that node, assuming that - it fits resource requirements. + description: NodeName is a request to schedule this pod onto + a specific node. If it is non-empty, the scheduler simply + schedules this pod onto that node, assuming that it fits + resource requirements. type: string livenessProbe: - description: Settings for the liveness probe associated - with a server. + description: Settings for the liveness probe associated with + a server. type: object properties: periodSeconds: description: The number of seconds between checks. type: number timeoutSeconds: - description: The number of seconds with no response - that indicates a failure. + description: The number of seconds with no response that + indicates a failure. type: number initialDelaySeconds: - description: The number of seconds before the first - check is performed. + description: The number of seconds before the first check + is performed. type: number readinessGates: - description: 'If specified, all readiness gates will be - evaluated for pod readiness. A pod is ready when all its - containers are ready AND all conditions specified in the - readiness gates have status equal to "True" More info: - https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' + description: 'If specified, all readiness gates will be evaluated + for pod readiness. A pod is ready when all its containers + are ready AND all conditions specified in the readiness + gates have status equal to "True" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md' type: array items: description: PodReadinessGate contains the reference to @@ -15820,7 +15501,7 @@ openAPIV3Schema: the pod's condition list with matching type. type: string required: - - conditionType + - conditionType serviceAccountName: description: Name of the ServiceAccount to be used to run this pod. If it is not set, default ServiceAccount will @@ -15862,14 +15543,14 @@ openAPIV3Schema: type: string fsGroup: description: 'A special supplemental group that applies - to all containers in a pod. Some volume types allow - the Kubelet to change the ownership of that volume - to be owned by the pod: 1. The owning GID will be - the FSGroup 2. The setgid bit is set (new files created - in the volume will be owned by FSGroup) 3. The permission - bits are OR''d with rw-rw---- If unset, the Kubelet - will not modify the ownership and permissions of any - volume.' + to all containers in a pod. Some volume types allow + the Kubelet to change the ownership of that volume to + be owned by the pod: 1. The owning GID will be the + FSGroup 2. The setgid bit is set (new files created + in the volume will be owned by FSGroup) 3. The permission + bits are OR''d with rw-rw---- If unset, the Kubelet + will not modify the ownership and permissions of any + volume.' type: number windowsOptions: description: WindowsSecurityContextOptions contain Windows-specific @@ -15885,21 +15566,20 @@ openAPIV3Schema: that enable the WindowsGMSA feature flag. type: string runAsUserName: - description: The UserName in Windows to run the - entrypoint of the container process. Defaults - to the user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - This field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and + it is only honored by servers that enable the WindowsRunAsUserName feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + description: GMSACredentialSpecName is the name of + the GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. type: string supplementalGroups: description: A list of groups applied to the first process @@ -15920,11 +15600,11 @@ openAPIV3Schema: description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if - it does. If unset or false, no such validation will - be performed. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. + as UID 0 (root) and fail to start the container if it + does. If unset or false, no such validation will be + performed. May also be set in SecurityContext. If set + in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. type: boolean sysctls: description: Sysctls hold a list of namespaced sysctls @@ -15932,8 +15612,8 @@ openAPIV3Schema: the container runtime) might fail to launch. type: array items: - description: Sysctl defines a kernel parameter to - be set + description: Sysctl defines a kernel parameter to be + set type: object properties: name: @@ -15943,29 +15623,29 @@ openAPIV3Schema: description: Value of a property to set type: string required: - - name - - value + - name + - value priorityClassName: - description: If specified, indicates the pod's priority. - "system-node-critical" and "system-cluster-critical" are - two special keywords which indicate the highest priorities - with the former being the highest priority. Any other - name must be defined by creating a PriorityClass object - with that name. If not specified, the pod priority will - be default or zero if there is no default. + description: If specified, indicates the pod's priority. "system-node-critical" + and "system-cluster-critical" are two special keywords which + indicate the highest priorities with the former being the + highest priority. Any other name must be defined by creating + a PriorityClass object with that name. If not specified, + the pod priority will be default or zero if there is no + default. type: string volumes: description: Additional volumes to be created in the server pod. type: array items: - description: Volume represents a named volume in a pod - that may be accessed by any container in the pod. + description: Volume represents a named volume in a pod that + may be accessed by any container in the pod. type: object properties: quobyte: - description: Represents a Quobyte mount that lasts - the lifetime of a pod. Quobyte volumes do not support + description: Represents a Quobyte mount that lasts the + lifetime of a pod. Quobyte volumes do not support ownership management or SELinux relabeling. type: object properties: @@ -15999,16 +15679,16 @@ openAPIV3Schema: is no group type: string required: - - registry - - volume + - registry + - volume azureFile: description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. type: object properties: secretName: - description: the name of secret that contains - Azure Storage Account Name and Key + description: the name of secret that contains Azure + Storage Account Name and Key type: string readOnly: description: Defaults to false (read/write). ReadOnly @@ -16018,8 +15698,8 @@ openAPIV3Schema: description: Share Name type: string required: - - secretName - - shareName + - secretName + - shareName flexVolume: description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec @@ -16027,75 +15707,75 @@ openAPIV3Schema: type: object properties: driver: - description: Driver is the name of the driver - to use for this volume. + description: Driver is the name of the driver to + use for this volume. type: string options: - description: 'Optional: Extra command options - if any.' + description: 'Optional: Extra command options if + any.' additionalProperties: type: string type: object secretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' type: boolean fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. type: string required: - - driver + - driver secret: description: Adapts a Secret into a volume. The contents of the target Secret's Data field will be presented - in a volume as files using the keys in the Data - field as the file names. Secret volumes support - ownership management and SELinux relabeling. + in a volume as files using the keys in the Data field + as the file names. Secret volumes support ownership + management and SELinux relabeling. type: object properties: secretName: - description: 'Name of the secret in the pod''s - namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + description: 'Name of the secret in the pod''s namespace + to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' type: string defaultMode: description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 - and 0777. Defaults to 0644. Directories within - the path are not affected by this setting. This - might be in conflict with other options that - affect the file mode, like fsGroup, and the - result can be other mode bits set.' + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the + path are not affected by this setting. This might + be in conflict with other options that affect + the file mode, like fsGroup, and the result can + be other mode bits set.' type: number optional: - description: Specify whether the Secret or its - keys must be defined + description: Specify whether the Secret or its keys + must be defined type: boolean items: description: If unspecified, each key-value pair in the Data field of the referenced Secret will - be projected into the volume as a file whose - name is the key and content is the value. If - specified, the listed keys will be projected - into the specified paths, and unlisted keys - will not be present. If a key is specified which - is not present in the Secret, the volume setup - will error unless it is marked optional. Paths - must be relative and may not contain the '..' - path or start with '..'. + be projected into the volume as a file whose name + is the key and content is the value. If specified, + the listed keys will be projected into the specified + paths, and unlisted keys will not be present. + If a key is specified which is not present in + the Secret, the volume setup will error unless + it is marked optional. Paths must be relative + and may not contain the '..' path or start with + '..'. type: array items: description: Maps a string key to a path within @@ -16103,26 +15783,26 @@ openAPIV3Schema: type: object properties: mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might be - in conflict with other options that affect - the file mode, like fsGroup, and the result - can be other mode bits set.' + description: 'Optional: mode bits to use on + this file, must be a value between 0 and + 0777. If not specified, the volume defaultMode + will be used. This might be in conflict + with other options that affect the file + mode, like fsGroup, and the result can be + other mode bits set.' type: number path: description: The relative path of the file to map the key to. May not be an absolute - path. May not contain the path element - '..'. May not start with the string '..'. + path. May not contain the path element '..'. + May not start with the string '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path projected: description: Represents a projected volume source type: object @@ -16147,31 +15827,30 @@ openAPIV3Schema: file type: array items: - description: DownwardAPIVolumeFile - represents information to create - the file containing the pod field + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field type: object properties: mode: description: 'Optional: mode bits - to use on this file, must be - a value between 0 and 0777. - If not specified, the volume - defaultMode will be used. This - might be in conflict with other - options that affect the file - mode, like fsGroup, and the - result can be other mode bits - set.' + to use on this file, must be a + value between 0 and 0777. If not + specified, the volume defaultMode + will be used. This might be in + conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode + bits set.' type: number path: description: 'Required: Path is the - relative path name of the file - to be created. Must not be absolute - or contain the ''..'' path. - Must be utf-8 encoded. The first - item of the relative path must - not start with ''..''' + relative path name of the file + to be created. Must not be absolute + or contain the ''..'' path. Must + be utf-8 encoded. The first item + of the relative path must not + start with ''..''' type: string resourceFieldRef: description: ResourceFieldSelector @@ -16181,89 +15860,86 @@ openAPIV3Schema: type: object properties: divisor: - description: 'Quantity is - a fixed-point representation - of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition - to String() and AsInt64() - accessors. The serialization - format is: ::= - (Note - that may be empty, - from the "" case in .) - ::= 0 - | 1 | ... | 9 ::= - | - ::= - | . | . - | . ::= - "+" | "-" ::= - | - ::= - | | - ::= Ki - | Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m - | "" | k | M | G | T | P - | E (Note that 1024 = - 1Ki but 1000 = 1k; I didn''t - choose the capitalization.) - ::= "e" - | "E" No - matter which of the three - exponent forms is used, - no quantity may represent - a number greater than 2^63-1 - in magnitude, nor may it - have more than 3 decimal - places. Numbers larger or - more precise will be capped - or rounded up. (E.g.: 0.1m - will rounded up to 1m.) - This may be extended in - the future if we require - larger or smaller quantities. When - a Quantity is parsed from - a string, it will remember - the type of suffix it had, - and will use the same type - again when it is serialized. Before - serializing, Quantity will - be put in "canonical form". - This means that Exponent/suffix - will be adjusted up or down - (with a corresponding increase - or decrease in Mantissa) - such that: a. No precision - is lost b. No fractional - digits will be emitted c. - The exponent (or suffix) - is as large as possible. - The sign will be omitted - unless the number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER - be internally represented - by a floating point number. - That is the whole point - of this exercise. Non-canonical - values will still parse - as long as they are well - formed, but will be re-emitted - in their canonical form. - (So always use canonical - form, or don''t diff.) This - format is intended to make - it difficult to use these - numbers without writing - some sort of special handling - code in the hopes that that - will cause implementors - to also use a fixed point - implementation.' + description: 'Quantity is a + fixed-point representation + of a number. It provides convenient + marshaling/unmarshaling in + JSON and YAML, in addition + to String() and AsInt64() + accessors. The serialization + format is: ::= + (Note + that may be empty, + from the "" case in .) + ::= 0 | + 1 | ... | 9 ::= + | + ::= + | . | . + | . ::= + "+" | "-" ::= + | + ::= + | | + ::= Ki | + Mi | Gi | Ti | Pi | Ei (International + System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | + "" | k | M | G | T | P | E (Note + that 1024 = 1Ki but 1000 = + 1k; I didn''t choose the capitalization.) + ::= "e" + | "E" No + matter which of the three + exponent forms is used, no + quantity may represent a number + greater than 2^63-1 in magnitude, + nor may it have more than + 3 decimal places. Numbers + larger or more precise will + be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) + This may be extended in the + future if we require larger + or smaller quantities. When + a Quantity is parsed from + a string, it will remember + the type of suffix it had, + and will use the same type + again when it is serialized. Before + serializing, Quantity will + be put in "canonical form". + This means that Exponent/suffix + will be adjusted up or down + (with a corresponding increase + or decrease in Mantissa) such + that: a. No precision is + lost b. No fractional digits + will be emitted c. The exponent + (or suffix) is as large as + possible. The sign will be + omitted unless the number + is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER + be internally represented + by a floating point number. + That is the whole point of + this exercise. Non-canonical + values will still parse as + long as they are well formed, + but will be re-emitted in + their canonical form. (So + always use canonical form, + or don''t diff.) This format + is intended to make it difficult + to use these numbers without + writing some sort of special + handling code in the hopes + that that will cause implementors + to also use a fixed point + implementation.' type: object properties: number: @@ -16271,20 +15947,20 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource - to select' + to select' type: string containerName: description: 'Container name: - required for volumes, optional - for env vars' + required for volumes, optional + for env vars' type: string required: - - resource + - resource fieldRef: description: ObjectFieldSelector selects an APIVersioned field @@ -16293,9 +15969,8 @@ openAPIV3Schema: properties: apiVersion: description: Version of the - schema the FieldPath is - written in terms of, defaults - to "v1". + schema the FieldPath is written + in terms of, defaults to "v1". type: string fieldPath: description: Path of the field @@ -16303,24 +15978,24 @@ openAPIV3Schema: API version. type: string required: - - fieldPath + - fieldPath required: - - path + - path configMap: description: Adapts a ConfigMap into a projected volume. The contents of the target ConfigMap's Data field will be presented in a projected - volume as files using the keys in the - Data field as the file names, unless the - items element is populated with specific - mappings of keys to paths. Note that this - is identical to a configmap volume source - without the default mode. + volume as files using the keys in the Data + field as the file names, unless the items + element is populated with specific mappings + of keys to paths. Note that this is identical + to a configmap volume source without the + default mode. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap @@ -16330,62 +16005,60 @@ openAPIV3Schema: description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the - volume as a file whose name is the - key and content is the value. If specified, - the listed keys will be projected - into the specified paths, and unlisted - keys will not be present. If a key - is specified which is not present - in the ConfigMap, the volume setup - will error unless it is marked optional. - Paths must be relative and may not - contain the '..' path or start with - '..'. + volume as a file whose name is the key + and content is the value. If specified, + the listed keys will be projected into + the specified paths, and unlisted keys + will not be present. If a key is specified + which is not present in the ConfigMap, + the volume setup will error unless it + is marked optional. Paths must be relative + and may not contain the '..' path or + start with '..'. type: array items: - description: Maps a string key to - a path within a volume. + description: Maps a string key to a + path within a volume. type: object properties: mode: description: 'Optional: mode bits - to use on this file, must be - a value between 0 and 0777. - If not specified, the volume - defaultMode will be used. This - might be in conflict with other - options that affect the file - mode, like fsGroup, and the - result can be other mode bits - set.' + to use on this file, must be a + value between 0 and 0777. If not + specified, the volume defaultMode + will be used. This might be in + conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode + bits set.' type: number path: - description: The relative path - of the file to map the key to. - May not be an absolute path. - May not contain the path element - '..'. May not start with the - string '..'. + description: The relative path of + the file to map the key to. May + not be an absolute path. May not + contain the path element '..'. + May not start with the string + '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path secret: description: Adapts a secret into a projected volume. The contents of the target Secret's Data field will be presented in a projected - volume as files using the keys in the - Data field as the file names. Note that - this is identical to a secret volume source - without the default mode. + volume as files using the keys in the Data + field as the file names. Note that this + is identical to a secret volume source without + the default mode. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the Secret @@ -16394,99 +16067,96 @@ openAPIV3Schema: items: description: If unspecified, each key-value pair in the Data field of the referenced - Secret will be projected into the - volume as a file whose name is the - key and content is the value. If specified, - the listed keys will be projected - into the specified paths, and unlisted - keys will not be present. If a key - is specified which is not present - in the Secret, the volume setup will - error unless it is marked optional. - Paths must be relative and may not - contain the '..' path or start with - '..'. + Secret will be projected into the volume + as a file whose name is the key and + content is the value. If specified, + the listed keys will be projected into + the specified paths, and unlisted keys + will not be present. If a key is specified + which is not present in the Secret, + the volume setup will error unless it + is marked optional. Paths must be relative + and may not contain the '..' path or + start with '..'. type: array items: - description: Maps a string key to - a path within a volume. + description: Maps a string key to a + path within a volume. type: object properties: mode: description: 'Optional: mode bits - to use on this file, must be - a value between 0 and 0777. - If not specified, the volume - defaultMode will be used. This - might be in conflict with other - options that affect the file - mode, like fsGroup, and the - result can be other mode bits - set.' + to use on this file, must be a + value between 0 and 0777. If not + specified, the volume defaultMode + will be used. This might be in + conflict with other options that + affect the file mode, like fsGroup, + and the result can be other mode + bits set.' type: number path: - description: The relative path - of the file to map the key to. - May not be an absolute path. - May not contain the path element - '..'. May not start with the - string '..'. + description: The relative path of + the file to map the key to. May + not be an absolute path. May not + contain the path element '..'. + May not start with the string + '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path serviceAccountToken: description: ServiceAccountTokenProjection - represents a projected service account - token volume. This projection can be used - to insert a service account token into - the pods runtime filesystem for use against - APIs (Kubernetes API Server or otherwise). + represents a projected service account token + volume. This projection can be used to insert + a service account token into the pods runtime + filesystem for use against APIs (Kubernetes + API Server or otherwise). type: object properties: path: description: Path is the path relative - to the mount point of the file to - project the token into. + to the mount point of the file to project + the token into. type: string audience: description: Audience is the intended - audience of the token. A recipient - of a token must identify itself with - an identifier specified in the audience - of the token, and otherwise should - reject the token. The audience defaults - to the identifier of the apiserver. + audience of the token. A recipient of + a token must identify itself with an + identifier specified in the audience + of the token, and otherwise should reject + the token. The audience defaults to + the identifier of the apiserver. type: string expirationSeconds: description: ExpirationSeconds is the - requested duration of validity of - the service account token. As the - token approaches expiration, the kubelet - volume plugin will proactively rotate - the service account token. The kubelet - will start trying to rotate the token - if the token is older than 80 percent - of its time to live or if the token - is older than 24 hours.Defaults to - 1 hour and must be at least 10 minutes. + requested duration of validity of the + service account token. As the token + approaches expiration, the kubelet volume + plugin will proactively rotate the service + account token. The kubelet will start + trying to rotate the token if the token + is older than 80 percent of its time + to live or if the token is older than + 24 hours.Defaults to 1 hour and must + be at least 10 minutes. type: number required: - - path + - path defaultMode: - description: Mode bits to use on created files - by default. Must be a value between 0 and 0777. - Directories within the path are not affected - by this setting. This might be in conflict with - other options that affect the file mode, like - fsGroup, and the result can be other mode bits - set. + description: Mode bits to use on created files by + default. Must be a value between 0 and 0777. Directories + within the path are not affected by this setting. + This might be in conflict with other options that + affect the file mode, like fsGroup, and the result + can be other mode bits set. type: number required: - - sources + - sources cephfs: description: Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not @@ -16495,48 +16165,48 @@ openAPIV3Schema: properties: path: description: 'Optional: Used as the mounted root, - rather than the full Ceph tree, default is /' + rather than the full Ceph tree, default is /' type: string secretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string secretFile: - description: 'Optional: SecretFile is the path - to key ring for User, default is /etc/ceph/user.secret - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + description: 'Optional: SecretFile is the path to + key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: boolean user: - description: 'Optional: User is the rados user - name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + description: 'Optional: User is the rados user name, + default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: string monitors: description: 'Required: Monitors is a collection - of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' type: array items: type: string required: - - monitors + - monitors scaleIO: description: ScaleIOVolumeSource represents a persistent ScaleIO volume type: object properties: system: - description: The name of the storage system as - configured in ScaleIO. + description: The name of the storage system as configured + in ScaleIO. type: string protectionDomain: description: The name of the ScaleIO Protection @@ -16547,8 +16217,8 @@ openAPIV3Schema: with Gateway, default false type: boolean storageMode: - description: Indicates whether the storage for - a volume should be ThickProvisioned or ThinProvisioned. + description: Indicates whether the storage for a + volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned. type: string volumeName: @@ -16558,21 +16228,21 @@ openAPIV3Schema: type: string secretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs". type: string @@ -16585,9 +16255,9 @@ openAPIV3Schema: Gateway. type: string required: - - gateway - - secretRef - - system + - gateway + - secretRef + - system emptyDir: description: Represents an empty directory for a pod. Empty directory volumes support ownership management @@ -16596,54 +16266,53 @@ openAPIV3Schema: properties: sizeLimit: description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() and - AsInt64() accessors. The serialization format - is: ::= (Note - that may be empty, from the "" case - in .) ::= 0 | 1 - | ... | 9 ::= | - ::= | . - | . | . ::= - "+" | "-" ::= | - ::= | - | ::= Ki | Mi - | Gi | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T - | P | E (Note that 1024 = 1Ki but 1000 = 1k; - I didn''t choose the capitalization.) - ::= "e" | "E" No - matter which of the three exponent forms is - used, no quantity may represent a number greater - than 2^63-1 in magnitude, nor may it have more - than 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be extended - in the future if we require larger or smaller - quantities. When a Quantity is parsed from - a string, it will remember the type of suffix - it had, and will use the same type again when - it is serialized. Before serializing, Quantity - will be put in "canonical form". This means - that Exponent/suffix will be adjusted up or - down (with a corresponding increase or decrease - in Mantissa) such that: a. No precision is - lost b. No fractional digits will be emitted c. - The exponent (or suffix) is as large as possible. - The sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as "1536Mi" Note - that the quantity will NEVER be internally represented - by a floating point number. That is the whole - point of this exercise. Non-canonical values - will still parse as long as they are well formed, - but will be re-emitted in their canonical form. - (So always use canonical form, or don''t diff.) This - format is intended to make it difficult to use - these numbers without writing some sort of special - handling code in the hopes that that will cause - implementors to also use a fixed point implementation.' + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() and + AsInt64() accessors. The serialization format + is: ::= (Note + that may be empty, from the "" case in + .) ::= 0 | 1 | ... + | 9 ::= | + ::= | . + | . | . ::= + "+" | "-" ::= | + ::= | + | ::= Ki | Mi | + Gi | Ti | Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T | + P | E (Note that 1024 = 1Ki but 1000 = 1k; I + didn''t choose the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms is used, + no quantity may represent a number greater than + 2^63-1 in magnitude, nor may it have more than + 3 decimal places. Numbers larger or more precise + will be capped or rounded up. (E.g.: 0.1m will + rounded up to 1m.) This may be extended in the + future if we require larger or smaller quantities. When + a Quantity is parsed from a string, it will remember + the type of suffix it had, and will use the same + type again when it is serialized. Before serializing, + Quantity will be put in "canonical form". This + means that Exponent/suffix will be adjusted up + or down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision is lost b. + No fractional digits will be emitted c. The + exponent (or suffix) is as large as possible. + The sign will be omitted unless the number is + negative. Examples: 1.5 will be serialized + as "1500m" 1.5Gi will be serialized as "1536Mi" Note + that the quantity will NEVER be internally represented + by a floating point number. That is the whole + point of this exercise. Non-canonical values + will still parse as long as they are well formed, + but will be re-emitted in their canonical form. + (So always use canonical form, or don''t diff.) This + format is intended to make it difficult to use + these numbers without writing some sort of special + handling code in the hopes that that will cause + implementors to also use a fixed point implementation.' type: object properties: number: @@ -16651,78 +16320,74 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI medium: description: 'What type of storage medium should - back this directory. The default is "" which - means to use the node''s default medium. Must - be an empty string (default) or Memory. More - info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + back this directory. The default is "" which means + to use the node''s default medium. Must be an + empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' type: string glusterfs: description: Represents a Glusterfs mount that lasts - the lifetime of a pod. Glusterfs volumes do not - support ownership management or SELinux relabeling. + the lifetime of a pod. Glusterfs volumes do not support + ownership management or SELinux relabeling. type: object properties: path: description: 'Path is the Glusterfs volume path. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string endpoints: description: 'EndpointsName is the endpoint name - that details Glusterfs topology. More info: - https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: string readOnly: description: 'ReadOnly here will force the Glusterfs - volume to be mounted with read-only permissions. - Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + volume to be mounted with read-only permissions. + Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' type: boolean required: - - endpoints - - path + - endpoints + - path gcePersistentDisk: - description: Represents a Persistent Disk resource - in Google Compute Engine. A GCE PD must exist before + description: Represents a Persistent Disk resource in + Google Compute Engine. A GCE PD must exist before mounting to a container. The disk must also be in - the same GCE project and zone as the kubelet. A - GCE PD can only be mounted as read/write once or - read-only many times. GCE PDs support ownership - management and SELinux relabeling. + the same GCE project and zone as the kubelet. A GCE + PD can only be mounted as read/write once or read-only + many times. GCE PDs support ownership management and + SELinux relabeling. type: object properties: partition: - description: 'The partition in the volume that - you want to mount. If omitted, the default is - to mount by volume name. Examples: For volume - /dev/sda1, you specify the partition as "1". - Similarly, the volume partition for /dev/sda - is "0" (or you can leave the property empty). - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + description: 'The partition in the volume that you + want to mount. If omitted, the default is to mount + by volume name. Examples: For volume /dev/sda1, + you specify the partition as "1". Similarly, the + volume partition for /dev/sda is "0" (or you can + leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: number readOnly: description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + setting in VolumeMounts. Defaults to false. More + info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: boolean pdName: description: 'Unique name of the PD resource in - GCE. Used to identify the disk in GCE. More - info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + GCE. Used to identify the disk in GCE. More info: + https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string fsType: description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' type: string required: - - pdName + - pdName photonPersistentDisk: description: Represents a Photon Controller persistent disk resource. @@ -16733,28 +16398,28 @@ openAPIV3Schema: persistent disk type: string fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string required: - - pdID + - pdID azureDisk: description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. type: object properties: diskName: - description: The Name of the data disk in the - blob storage + description: The Name of the data disk in the blob + storage type: string kind: - description: 'Expected values Shared: multiple - blob disks per storage account Dedicated: single - blob disk per storage account Managed: azure - managed data disk (only in managed availability - set). defaults to shared' + description: 'Expected values Shared: multiple blob + disks per storage account Dedicated: single blob + disk per storage account Managed: azure managed + data disk (only in managed availability set). + defaults to shared' type: string readOnly: description: Defaults to false (read/write). ReadOnly @@ -16762,21 +16427,20 @@ openAPIV3Schema: type: boolean cachingMode: description: 'Host Caching mode: None, Read Only, - Read Write.' + Read Write.' type: string diskURI: - description: The URI the data disk in the blob - storage + description: The URI the data disk in the blob storage type: string fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string required: - - diskName - - diskURI + - diskName + - diskURI cinder: description: Represents a cinder volume resource in Openstack. A Cinder volume must exist before mounting @@ -16787,47 +16451,46 @@ openAPIV3Schema: properties: secretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string volumeID: description: 'volume id used to identify the volume - in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + ReadOnly here will force the ReadOnly setting + in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' type: boolean fsType: description: 'Filesystem type to mount. Must be - a filesystem type supported by the host operating - system. Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://examples.k8s.io/mysql-cinder-pd/README.md' + a filesystem type supported by the host operating + system. Examples: "ext4", "xfs", "ntfs". Implicitly + inferred to be "ext4" if unspecified. More info: + https://examples.k8s.io/mysql-cinder-pd/README.md' type: string required: - - volumeID + - volumeID downwardAPI: - description: DownwardAPIVolumeSource represents a - volume containing downward API info. Downward API - volumes support ownership management and SELinux - relabeling. + description: DownwardAPIVolumeSource represents a volume + containing downward API info. Downward API volumes + support ownership management and SELinux relabeling. type: object properties: defaultMode: description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 - and 0777. Defaults to 0644. Directories within - the path are not affected by this setting. This - might be in conflict with other options that - affect the file mode, like fsGroup, and the - result can be other mode bits set.' + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the + path are not affected by this setting. This might + be in conflict with other options that affect + the file mode, like fsGroup, and the result can + be other mode bits set.' type: number items: description: Items is a list of downward API volume @@ -16835,96 +16498,92 @@ openAPIV3Schema: type: array items: description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field + information to create the file containing the + pod field type: object properties: mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might be - in conflict with other options that affect - the file mode, like fsGroup, and the result - can be other mode bits set.' + description: 'Optional: mode bits to use on + this file, must be a value between 0 and + 0777. If not specified, the volume defaultMode + will be used. This might be in conflict + with other options that affect the file + mode, like fsGroup, and the result can be + other mode bits set.' type: number path: description: 'Required: Path is the relative - path name of the file to be created. Must - not be absolute or contain the ''..'' - path. Must be utf-8 encoded. The first - item of the relative path must not start - with ''..''' + path name of the file to be created. Must + not be absolute or contain the ''..'' path. + Must be utf-8 encoded. The first item of + the relative path must not start with ''..''' type: string resourceFieldRef: description: ResourceFieldSelector represents - container resources (cpu, memory) and - their output format + container resources (cpu, memory) and their + output format type: object properties: divisor: description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= - (Note that - may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= - "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi - | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | - M | G | T | P | E (Note that 1024 - = 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent - forms is used, no quantity may represent - a number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This - may be extended in the future if we - require larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type - again when it is serialized. Before - serializing, Quantity will be put - in "canonical form". This means that - Exponent/suffix will be adjusted up - or down (with a corresponding increase - or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. - The sign will be omitted unless the - number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as - they are well formed, but will be - re-emitted in their canonical form. - (So always use canonical form, or - don''t diff.) This format is intended - to make it difficult to use these - numbers without writing some sort - of special handling code in the hopes - that that will cause implementors - to also use a fixed point implementation.' + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the + "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | + Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M + | G | T | P | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms + is used, no quantity may represent a + number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may + be extended in the future if we require + larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type again + when it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. + No fractional digits will be emitted c. + The exponent (or suffix) is as large + as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always + use canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing + some sort of special handling code in + the hopes that that will cause implementors + to also use a fixed point implementation.' type: object properties: number: @@ -16932,75 +16591,71 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: - description: 'Required: resource to - select' + description: 'Required: resource to select' type: string containerName: description: 'Container name: required - for volumes, optional for env vars' + for volumes, optional for env vars' type: string required: - - resource + - resource fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. + description: ObjectFieldSelector selects an + APIVersioned field of an object. type: object properties: apiVersion: description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". + FieldPath is written in terms of, defaults + to "v1". type: string fieldPath: description: Path of the field to select in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - path + - path awsElasticBlockStore: - description: Represents a Persistent Disk resource - in AWS. An AWS EBS disk must exist before mounting - to a container. The disk must also be in the same - AWS zone as the kubelet. An AWS EBS disk can only - be mounted as read/write once. AWS EBS volumes support - ownership management and SELinux relabeling. + description: Represents a Persistent Disk resource in + AWS. An AWS EBS disk must exist before mounting to + a container. The disk must also be in the same AWS + zone as the kubelet. An AWS EBS disk can only be mounted + as read/write once. AWS EBS volumes support ownership + management and SELinux relabeling. type: object properties: partition: - description: 'The partition in the volume that - you want to mount. If omitted, the default is - to mount by volume name. Examples: For volume - /dev/sda1, you specify the partition as "1". - Similarly, the volume partition for /dev/sda - is "0" (or you can leave the property empty).' + description: 'The partition in the volume that you + want to mount. If omitted, the default is to mount + by volume name. Examples: For volume /dev/sda1, + you specify the partition as "1". Similarly, the + volume partition for /dev/sda is "0" (or you can + leave the property empty).' type: number volumeID: - description: 'Unique ID of the persistent disk - resource in AWS (Amazon EBS volume). More info: - https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + description: 'Unique ID of the persistent disk resource + in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string readOnly: - description: 'Specify "true" to force and set - the ReadOnly property in VolumeMounts to "true". - If omitted, the default is "false". More info: - https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + description: 'Specify "true" to force and set the + ReadOnly property in VolumeMounts to "true". If + omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: boolean fsType: description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' type: string required: - - volumeID + - volumeID flocker: description: Represents a Flocker volume mounted by the Flocker agent. One and only one of datasetName @@ -17010,8 +16665,8 @@ openAPIV3Schema: properties: datasetName: description: Name of the dataset stored as metadata - -> name on the dataset for Flocker should be - considered as deprecated + -> name on the dataset for Flocker should be considered + as deprecated type: string datasetUUID: description: UUID of the dataset. This is unique @@ -17028,8 +16683,8 @@ openAPIV3Schema: authentication type: boolean iscsiInterface: - description: iSCSI Interface Name that uses an - iSCSI transport. Defaults to 'default' (tcp). + description: iSCSI Interface Name that uses an iSCSI + transport. Defaults to 'default' (tcp). type: string lun: description: iSCSI Target Lun number. @@ -17043,27 +16698,27 @@ openAPIV3Schema: type: string portals: description: iSCSI Target Portal List. The portal - is either an IP or ip_addr:port if the port - is other than default (typically TCP ports 860 - and 3260). + is either an IP or ip_addr:port if the port is + other than default (typically TCP ports 860 and + 3260). type: array items: type: string secretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string initiatorName: description: Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, - new iSCSI interface : will be created for the connection. + new iSCSI interface : + will be created for the connection. type: string readOnly: description: ReadOnly here will force the ReadOnly @@ -17071,116 +16726,111 @@ openAPIV3Schema: type: boolean fsType: description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#iscsi' + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi' type: string targetPortal: description: iSCSI Target Portal. The Portal is - either an IP or ip_addr:port if the port is - other than default (typically TCP ports 860 - and 3260). + either an IP or ip_addr:port if the port is other + than default (typically TCP ports 860 and 3260). type: string required: - - iqn - - lun - - targetPortal + - iqn + - lun + - targetPortal rbd: - description: Represents a Rados Block Device mount - that lasts the lifetime of a pod. RBD volumes support - ownership management and SELinux relabeling. + description: Represents a Rados Block Device mount that + lasts the lifetime of a pod. RBD volumes support ownership + management and SELinux relabeling. type: object properties: image: - description: 'The rados image name. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string pool: - description: 'The rados pool name. Default is - rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + description: 'The rados pool name. Default is rbd. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string secretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: description: 'ReadOnly here will force the ReadOnly - setting in VolumeMounts. Defaults to false. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + setting in VolumeMounts. Defaults to false. More + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: boolean fsType: description: 'Filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly - inferred to be "ext4" if unspecified. More info: - https://kubernetes.io/docs/concepts/storage/volumes#rbd' + you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred + to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd' type: string keyring: - description: 'Keyring is the path to key ring - for RBDUser. Default is /etc/ceph/keyring. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + description: 'Keyring is the path to key ring for + RBDUser. Default is /etc/ceph/keyring. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string user: - description: 'The rados user name. Default is - admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + description: 'The rados user name. Default is admin. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: string monitors: description: 'A collection of Ceph monitors. More - info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' type: array items: type: string required: - - image - - monitors + - image + - monitors configMap: description: Adapts a ConfigMap into a volume. The contents of the target ConfigMap's Data field will - be presented in a volume as files using the keys - in the Data field as the file names, unless the - items element is populated with specific mappings - of keys to paths. ConfigMap volumes support ownership - management and SELinux relabeling. + be presented in a volume as files using the keys in + the Data field as the file names, unless the items + element is populated with specific mappings of keys + to paths. ConfigMap volumes support ownership management + and SELinux relabeling. type: object properties: defaultMode: description: 'Optional: mode bits to use on created - files by default. Must be a value between 0 - and 0777. Defaults to 0644. Directories within - the path are not affected by this setting. This - might be in conflict with other options that - affect the file mode, like fsGroup, and the - result can be other mode bits set.' + files by default. Must be a value between 0 and + 0777. Defaults to 0644. Directories within the + path are not affected by this setting. This might + be in conflict with other options that affect + the file mode, like fsGroup, and the result can + be other mode bits set.' type: number name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap or - its keys must be defined + description: Specify whether the ConfigMap or its + keys must be defined type: boolean items: description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap - will be projected into the volume as a file - whose name is the key and content is the value. - If specified, the listed keys will be projected - into the specified paths, and unlisted keys - will not be present. If a key is specified which - is not present in the ConfigMap, the volume - setup will error unless it is marked optional. - Paths must be relative and may not contain the - '..' path or start with '..'. + will be projected into the volume as a file whose + name is the key and content is the value. If specified, + the listed keys will be projected into the specified + paths, and unlisted keys will not be present. + If a key is specified which is not present in + the ConfigMap, the volume setup will error unless + it is marked optional. Paths must be relative + and may not contain the '..' path or start with + '..'. type: array items: description: Maps a string key to a path within @@ -17188,26 +16838,26 @@ openAPIV3Schema: type: object properties: mode: - description: 'Optional: mode bits to use - on this file, must be a value between - 0 and 0777. If not specified, the volume - defaultMode will be used. This might be - in conflict with other options that affect - the file mode, like fsGroup, and the result - can be other mode bits set.' + description: 'Optional: mode bits to use on + this file, must be a value between 0 and + 0777. If not specified, the volume defaultMode + will be used. This might be in conflict + with other options that affect the file + mode, like fsGroup, and the result can be + other mode bits set.' type: number path: description: The relative path of the file to map the key to. May not be an absolute - path. May not contain the path element - '..'. May not start with the string '..'. + path. May not contain the path element '..'. + May not start with the string '..'. type: string key: description: The key to project. type: string required: - - key - - path + - key + - path storageos: description: Represents a StorageOS persistent volume resource. @@ -17218,35 +16868,34 @@ openAPIV3Schema: of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping - to be mirrored within StorageOS for tighter - integration. Set VolumeName to any name to override - the default behaviour. Set to "default" if you - are not using namespaces within StorageOS. Namespaces - that do not pre-exist within StorageOS will - be created. + to be mirrored within StorageOS for tighter integration. + Set VolumeName to any name to override the default + behaviour. Set to "default" if you are not using + namespaces within StorageOS. Namespaces that do + not pre-exist within StorageOS will be created. type: string volumeName: - description: VolumeName is the human-readable - name of the StorageOS volume. Volume names - are only unique within a namespace. + description: VolumeName is the human-readable name + of the StorageOS volume. Volume names are only + unique within a namespace. type: string secretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string @@ -17257,19 +16906,18 @@ openAPIV3Schema: properties: driver: description: Driver is the name of the CSI driver - that handles this volume. Consult with your - admin for the correct name as registered in - the cluster. + that handles this volume. Consult with your admin + for the correct name as registered in the cluster. type: string nodePublishSecretRef: description: LocalObjectReference contains enough - information to let you locate the referenced - object inside the same namespace. + information to let you locate the referenced object + inside the same namespace. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string readOnly: description: Specifies a read-only configuration @@ -17278,8 +16926,8 @@ openAPIV3Schema: fsType: description: Filesystem type to mount. Ex. "ext4", "xfs", "ntfs". If not provided, the empty value - is passed to the associated CSI driver which - will determine the default filesystem to apply. + is passed to the associated CSI driver which will + determine the default filesystem to apply. type: string volumeAttributes: description: VolumeAttributes stores driver-specific @@ -17290,10 +16938,10 @@ openAPIV3Schema: type: string type: object required: - - driver + - driver name: - description: 'Volume''s name. Must be a DNS_LABEL - and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Volume''s name. Must be a DNS_LABEL and + unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string nfs: description: Represents an NFS mount that lasts the @@ -17302,50 +16950,50 @@ openAPIV3Schema: type: object properties: path: - description: 'Path that is exported by the NFS - server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + description: 'Path that is exported by the NFS server. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string server: description: 'Server is the hostname or IP address - of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: string readOnly: - description: 'ReadOnly here will force the NFS - export to be mounted with read-only permissions. - Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + description: 'ReadOnly here will force the NFS export + to be mounted with read-only permissions. Defaults + to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' type: boolean required: - - path - - server + - path + - server persistentVolumeClaim: description: PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. This volume finds the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource is, essentially, - a wrapper around another type of volume that is - owned by someone else (the system). + a wrapper around another type of volume that is owned + by someone else (the system). type: object properties: claimName: description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this - volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + in the same namespace as the pod using this volume. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' type: string readOnly: description: Will force the ReadOnly setting in VolumeMounts. Default false. type: boolean required: - - claimName + - claimName gitRepo: description: 'Represents a volume that is populated - with the contents of a git repository. Git repo - volumes do not support ownership management. Git - repo volumes support SELinux relabeling. DEPRECATED: - GitRepo is deprecated. To provision a container - with a git repo, mount an EmptyDir into an InitContainer - that clones the repo using git, then mount the EmptyDir - into the Pod''s container.' + with the contents of a git repository. Git repo volumes + do not support ownership management. Git repo volumes + support SELinux relabeling. DEPRECATED: GitRepo is + deprecated. To provision a container with a git repo, + mount an EmptyDir into an InitContainer that clones + the repo using git, then mount the EmptyDir into the + Pod''s container.' type: object properties: repository: @@ -17353,8 +17001,8 @@ openAPIV3Schema: type: string directory: description: Target directory name. Must not contain - or start with '..'. If '.' is supplied, the - volume directory will be the git repository. Otherwise, + or start with '..'. If '.' is supplied, the volume + directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name. @@ -17363,7 +17011,7 @@ openAPIV3Schema: description: Commit hash for the specified revision. type: string required: - - repository + - repository portworxVolume: description: PortworxVolumeSource represents a Portworx volume resource. @@ -17378,13 +17026,13 @@ openAPIV3Schema: here will force the ReadOnly setting in VolumeMounts. type: boolean fsType: - description: FSType represents the filesystem - type to mount Must be a filesystem type supported - by the host operating system. Ex. "ext4", "xfs". + description: FSType represents the filesystem type + to mount Must be a filesystem type supported by + the host operating system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. type: string required: - - volumeID + - volumeID vsphereVolume: description: Represents a vSphere volume resource. type: object @@ -17402,13 +17050,13 @@ openAPIV3Schema: vmdk type: string fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string required: - - volumePath + - volumePath fc: description: Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write @@ -17421,80 +17069,78 @@ openAPIV3Schema: type: number targetWWNs: description: 'Optional: FC target worldwide names - (WWNs)' + (WWNs)' type: array items: type: string readOnly: description: 'Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting - in VolumeMounts.' + ReadOnly here will force the ReadOnly setting + in VolumeMounts.' type: boolean wwids: description: 'Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs - and lun must be set, but not both simultaneously.' + (wwids) Either wwids or combination of targetWWNs + and lun must be set, but not both simultaneously.' type: array items: type: string fsType: - description: Filesystem type to mount. Must be - a filesystem type supported by the host operating + description: Filesystem type to mount. Must be a + filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. type: string hostPath: - description: Represents a host path mapped into a - pod. Host path volumes do not support ownership - management or SELinux relabeling. + description: Represents a host path mapped into a pod. + Host path volumes do not support ownership management + or SELinux relabeling. type: object properties: path: description: 'Path of the directory on the host. - If the path is a symlink, it will follow the - link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + If the path is a symlink, it will follow the link + to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string type: description: 'Type for HostPath Volume Defaults - to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' type: string required: - - path + - path required: - - name + - name resources: description: Memory and CPU minimum requirements and limits for the server. type: object properties: requests: - description: 'Requests describes the minimum amount - of compute resources required. If Requests is omitted - for a container, it defaults to Limits if that is - explicitly specified, otherwise to an implementation-defined - value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Requests describes the minimum amount of + compute resources required. If Requests is omitted for + a container, it defaults to Limits if that is explicitly + specified, otherwise to an implementation-defined value. + More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: - description: 'Limits describes the maximum amount of - compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object annotations: - description: The annotations to be attached to generated - resources. + description: The annotations to be attached to generated resources. additionalProperties: type: string type: object env: - description: A list of environment variables to add to a - server. + description: A list of environment variables to add to a server. type: array items: - description: EnvVar represents an environment variable - present in a Container. + description: EnvVar represents an environment variable present + in a Container. type: object properties: name: @@ -17502,19 +17148,19 @@ openAPIV3Schema: be a C_IDENTIFIER. type: string value: - description: 'Variable references $(VAR_NAME) are - expanded using the previous defined environment - variables in the container and any service environment - variables. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Defaults to "".' + description: 'Variable references $(VAR_NAME) are expanded + using the previous defined environment variables in + the container and any service environment variables. + If a variable cannot be resolved, the reference in + the input string will be unchanged. The $(VAR_NAME) + syntax can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Defaults to + "".' type: string valueFrom: - description: EnvVarSource represents a source for - the value of an EnvVar. + description: EnvVarSource represents a source for the + value of an EnvVar. type: object properties: secretKeyRef: @@ -17524,79 +17170,77 @@ openAPIV3Schema: properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret or - its key must be defined + description: Specify whether the Secret or its + key must be defined type: boolean key: description: The key of the secret to select from. Must be a valid secret key. type: string required: - - key + - key resourceFieldRef: - description: ResourceFieldSelector represents - container resources (cpu, memory) and their - output format + description: ResourceFieldSelector represents container + resources (cpu, memory) and their output format type: object properties: divisor: description: 'Quantity is a fixed-point representation - of a number. It provides convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= (Note - that may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= "+" | - "-" ::= | - ::= | - | ::= Ki | - Mi | Gi | Ti | Pi | Ei (International - System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G - | T | P | E (Note that 1024 = 1Ki but - 1000 = 1k; I didn''t choose the capitalization.) - ::= "e" - | "E" No matter which of - the three exponent forms is used, no quantity - may represent a number greater than 2^63-1 - in magnitude, nor may it have more than - 3 decimal places. Numbers larger or more - precise will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This may be - extended in the future if we require larger - or smaller quantities. When a Quantity - is parsed from a string, it will remember - the type of suffix it had, and will use - the same type again when it is serialized. Before - serializing, Quantity will be put in "canonical - form". This means that Exponent/suffix will - be adjusted up or down (with a corresponding - increase or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. The - sign will be omitted unless the number is - negative. Examples: 1.5 will be serialized - as "1500m" 1.5Gi will be serialized as - "1536Mi" Note that the quantity will NEVER - be internally represented by a floating - point number. That is the whole point of - this exercise. Non-canonical values will - still parse as long as they are well formed, - but will be re-emitted in their canonical - form. (So always use canonical form, or - don''t diff.) This format is intended to - make it difficult to use these numbers without - writing some sort of special handling code - in the hopes that that will cause implementors - to also use a fixed point implementation.' + of a number. It provides convenient marshaling/unmarshaling + in JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the "" case + in .) ::= 0 | + 1 | ... | 9 ::= + | ::= + | . | . | . + ::= "+" | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | Ti | + Pi | Ei (International System of units; + See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | + T | P | E (Note that 1024 = 1Ki but 1000 + = 1k; I didn''t choose the capitalization.) + ::= "e" | + "E" No matter which of the + three exponent forms is used, no quantity + may represent a number greater than 2^63-1 + in magnitude, nor may it have more than 3 + decimal places. Numbers larger or more precise + will be capped or rounded up. (E.g.: 0.1m + will rounded up to 1m.) This may be extended + in the future if we require larger or smaller + quantities. When a Quantity is parsed from + a string, it will remember the type of suffix + it had, and will use the same type again when + it is serialized. Before serializing, Quantity + will be put in "canonical form". This means + that Exponent/suffix will be adjusted up or + down (with a corresponding increase or decrease + in Mantissa) such that: a. No precision + is lost b. No fractional digits will be + emitted c. The exponent (or suffix) is as + large as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi will + be serialized as "1536Mi" Note that the quantity + will NEVER be internally represented by a + floating point number. That is the whole point + of this exercise. Non-canonical values will + still parse as long as they are well formed, + but will be re-emitted in their canonical + form. (So always use canonical form, or don''t + diff.) This format is intended to make it + difficult to use these numbers without writing + some sort of special handling code in the + hopes that that will cause implementors to + also use a fixed point implementation.' type: object properties: number: @@ -17604,35 +17248,35 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: description: 'Required: resource to select' type: string containerName: - description: 'Container name: required for - volumes, optional for env vars' + description: 'Container name: required for volumes, + optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object properties: name: description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the ConfigMap - or its key must be defined + description: Specify whether the ConfigMap or + its key must be defined type: boolean key: description: The key to select. type: string required: - - key + - key fieldRef: description: ObjectFieldSelector selects an APIVersioned field of an object. @@ -17647,13 +17291,13 @@ openAPIV3Schema: the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name restartPolicy: description: 'Restart policy for all containers within the - pod. One of Always, OnFailure, Never. Default to Always. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + pod. One of Always, OnFailure, Never. Default to Always. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' type: string nodeSelector: description: Selector which must match a node's labels for @@ -17683,26 +17327,25 @@ openAPIV3Schema: description: This must match the Name of a Volume. type: string readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to false. + description: Mounted read-only if true, read-write otherwise + (false or unspecified). Defaults to false. type: boolean subPath: - description: Path within the volume from which the - container's volume should be mounted. Defaults to - "" (volume's root). + description: Path within the volume from which the container's + volume should be mounted. Defaults to "" (volume's + root). type: string subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment variable - references $(VAR_NAME) are expanded using the container's - environment. Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field is - beta in 1.15. + description: Expanded path within the volume from which + the container's volume should be mounted. Behaves + similarly to SubPath but environment variable references + $(VAR_NAME) are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in 1.15. type: string required: - - mountPath - - name + - mountPath + - name labels: description: The labels to be attached to generated resources. The label names must not start with 'weblogic.'. @@ -17710,76 +17353,75 @@ openAPIV3Schema: type: string type: object runtimeClassName: - description: 'RuntimeClassName refers to a RuntimeClass - object in the node.k8s.io group, which should be used - to run this pod. If no RuntimeClass resource matches - the named class, the pod will not be run. If unset or - empty, the "legacy" RuntimeClass will be used, which is - an implicit class with an empty definition that uses the - default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md - This is an alpha feature and may change in the future.' + description: 'RuntimeClassName refers to a RuntimeClass object + in the node.k8s.io group, which should be used to run this + pod. If no RuntimeClass resource matches the named class, + the pod will not be run. If unset or empty, the "legacy" + RuntimeClass will be used, which is an implicit class with + an empty definition that uses the default runtime handler. + More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + This is an alpha feature and may change in the future.' type: string tolerations: description: If specified, the pod's tolerations. type: array items: description: The pod this Toleration is attached to tolerates - any taint that matches the triple - using the matching operator . + any taint that matches the triple using + the matching operator . type: object properties: effect: - description: Effect indicates the taint effect to - match. Empty means match all taint effects. When - specified, allowed values are NoSchedule, PreferNoSchedule - and NoExecute. + description: Effect indicates the taint effect to match. + Empty means match all taint effects. When specified, + allowed values are NoSchedule, PreferNoSchedule and + NoExecute. type: string tolerationSeconds: description: TolerationSeconds represents the period - of time the toleration (which must be of effect - NoExecute, otherwise this field is ignored) tolerates - the taint. By default, it is not set, which means - tolerate the taint forever (do not evict). Zero - and negative values will be treated as 0 (evict - immediately) by the system. + of time the toleration (which must be of effect NoExecute, + otherwise this field is ignored) tolerates the taint. + By default, it is not set, which means tolerate the + taint forever (do not evict). Zero and negative values + will be treated as 0 (evict immediately) by the system. type: number value: description: Value is the taint value the toleration - matches to. If the operator is Exists, the value - should be empty, otherwise just a regular string. + matches to. If the operator is Exists, the value should + be empty, otherwise just a regular string. type: string key: description: Key is the taint key that the toleration - applies to. Empty means match all taint keys. If - the key is empty, operator must be Exists; this - combination means to match all values and all keys. + applies to. Empty means match all taint keys. If the + key is empty, operator must be Exists; this combination + means to match all values and all keys. type: string operator: description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard - for value, so that a pod can tolerate all taints - of a particular category. + for value, so that a pod can tolerate all taints of + a particular category. type: string readinessProbe: - description: Settings for the readiness probe associated - with a server. + description: Settings for the readiness probe associated with + a server. type: object properties: periodSeconds: description: The number of seconds between checks. type: number timeoutSeconds: - description: The number of seconds with no response - that indicates a failure. + description: The number of seconds with no response that + indicates a failure. type: number initialDelaySeconds: - description: The number of seconds before the first - check is performed. + description: The number of seconds before the first check + is performed. type: number containers: - description: Additional containers to be included in the - server pod. + description: Additional containers to be included in the server + pod. type: array items: description: A single application container that you want @@ -17791,8 +17433,8 @@ openAPIV3Schema: to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of - a raw block device within a container. + description: volumeDevice describes a mapping of a + raw block device within a container. type: object properties: devicePath: @@ -17805,35 +17447,35 @@ openAPIV3Schema: in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' type: string imagePullPolicy: description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. Cannot - be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + IfNotPresent. Defaults to Always if :latest tag is + specified, or IfNotPresent otherwise. Cannot be updated. + More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. type: number tcpSocket: description: TCPSocketAction describes an action @@ -17842,11 +17484,11 @@ openAPIV3Schema: properties: port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -17856,28 +17498,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -17887,36 +17529,35 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + description: HTTPGetAction describes an action based + on HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + description: Scheme to use for connecting to + the host. Defaults to HTTP. type: string port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -17926,15 +17567,15 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + to the pod IP. You probably want to set "Host" + in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. + description: Custom headers to set in the request. + HTTP allows repeated headers. type: array items: description: HTTPHeader describes a custom @@ -17948,43 +17589,43 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: description: Whether this container should allocate - a buffer for stdin in the container runtime. If - this is not set, reads from stdin in the container - will always result in EOF. Default is false. + a buffer for stdin in the container runtime. If this + is not set, reads from stdin in the container will + always result in EOF. Default is false. type: boolean terminationMessagePolicy: - description: Indicate how the termination message - should be populated. File will use the contents - of terminationMessagePath to populate the container - status message on both success and failure. FallbackToLogsOnError - will use the last chunk of container log output - if the termination message file is empty and the - container exited with an error. The log output is - limited to 2048 bytes or 80 lines, whichever is - smaller. Defaults to File. Cannot be updated. + description: Indicate how the termination message should + be populated. File will use the contents of terminationMessagePath + to populate the container status message on both success + and failure. FallbackToLogsOnError will use the last + chunk of container log output if the termination message + file is empty and the container exited with an error. + The log output is limited to 2048 bytes or 80 lines, + whichever is smaller. Defaults to File. Cannot be + updated. type: string terminationMessagePath: - description: 'Optional: Path at which the file to - which the container''s termination message will - be written is mounted into the container''s filesystem. - Message written is intended to be brief final status, - such as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' + description: 'Optional: Path at which the file to which + the container''s termination message will be written + is mounted into the container''s filesystem. Message + written is intended to be brief final status, such + as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' type: string workingDir: - description: Container's working directory. If not - specified, the container runtime's default will - be used, which might be configured in the container - image. Cannot be updated. + description: Container's working directory. If not specified, + the container runtime's default will be used, which + might be configured in the container image. Cannot + be updated. type: string resources: description: ResourceRequirements describes the compute @@ -17993,41 +17634,38 @@ openAPIV3Schema: properties: requests: description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object securityContext: description: SecurityContext holds security configuration - that will be applied to a container. Some fields - are present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take - precedence. + that will be applied to a container. Some fields are + present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take precedence. type: object properties: privileged: - description: Run container in privileged mode. - Processes in privileged containers are essentially - equivalent to root on the host. Defaults to - false. + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. type: boolean runAsUser: - description: The UID to run the entrypoint of - the container process. Defaults to user specified + description: The UID to run the entrypoint of the + container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. + and PodSecurityContext, the value specified in + SecurityContext takes precedence. type: number capabilities: description: Adds and removes POSIX capabilities @@ -18045,25 +17683,25 @@ openAPIV3Schema: items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to - be applied to the container + description: SELinuxOptions are the labels to be + applied to the container type: object properties: role: - description: Role is a SELinux role label - that applies to the container. + description: Role is a SELinux role label that + applies to the container. type: string level: - description: Level is SELinux level label - that applies to the container. + description: Level is SELinux level label that + applies to the container. type: string type: - description: Type is a SELinux type label - that applies to the container. + description: Type is a SELinux type label that + applies to the container. type: string user: - description: User is a SELinux user label - that applies to the container. + description: User is a SELinux user label that + applies to the container. type: string windowsOptions: description: WindowsSecurityContextOptions contain @@ -18074,86 +17712,82 @@ openAPIV3Schema: description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName - field. This field is alpha-level and is - only honored by servers that enable the - WindowsGMSA feature flag. + spec named by the GMSACredentialSpecName field. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. type: string runAsUserName: description: The UserName in Windows to run - the entrypoint of the container process. - Defaults to the user specified in image - metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. This - field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. + the entrypoint of the container process. Defaults + to the user specified in image metadata if + unspecified. May also be set in PodSecurityContext. + If set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. This field is alpha-level and + it is only honored by servers that enable + the WindowsRunAsUserName feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the - name of the GMSA credential spec to use. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. type: string procMount: description: procMount denotes the type of proc - mount to use for the containers. The default - is DefaultProcMount which uses the container - runtime defaults for readonly paths and masked - paths. This requires the ProcMountType feature - flag to be enabled. + mount to use for the containers. The default is + DefaultProcMount which uses the container runtime + defaults for readonly paths and masked paths. + This requires the ProcMountType feature flag to + be enabled. type: string allowPrivilegeEscalation: description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the - container process. AllowPrivilegeEscalation - is true always when the container is: 1) run - as Privileged 2) has CAP_SYS_ADMIN' + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the container + process. AllowPrivilegeEscalation is true always + when the container is: 1) run as Privileged 2) + has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of - the container process. Uses runtime default - if unset. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. - type: number - runAsNonRoot: - description: Indicates that the container must - run as a non-root user. If true, the Kubelet - will validate the image at runtime to ensure - that it does not run as UID 0 (root) and fail - to start the container if it does. If unset - or false, no such validation will be performed. + description: The GID to run the entrypoint of the + container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. + the value specified in SecurityContext takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run + as a non-root user. If true, the Kubelet will + validate the image at runtime to ensure that it + does not run as UID 0 (root) and fail to start + the container if it does. If unset or false, no + such validation will be performed. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in + SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: description: Whether this container has a read-only root filesystem. Default is false. type: boolean startupProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. type: number tcpSocket: description: TCPSocketAction describes an action @@ -18162,11 +17796,11 @@ openAPIV3Schema: properties: port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -18176,28 +17810,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -18207,36 +17841,35 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + description: HTTPGetAction describes an action based + on HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + description: Scheme to use for connecting to + the host. Defaults to HTTP. type: string port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -18246,15 +17879,15 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + to the pod IP. You probably want to set "Host" + in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. + description: Custom headers to set in the request. + HTTP allows repeated headers. type: array items: description: HTTPHeader describes a custom @@ -18268,13 +17901,13 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: - description: List of environment variables to set - in the container. Cannot be updated. + description: List of environment variables to set in + the container. Cannot be updated. type: array items: description: EnvVar represents an environment variable @@ -18287,15 +17920,14 @@ openAPIV3Schema: type: string value: description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service - environment variables. If a variable cannot - be resolved, the reference in the input string - will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, - regardless of whether the variable exists - or not. Defaults to "".' + are expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, + the reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a + double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether + the variable exists or not. Defaults to "".' type: string valueFrom: description: EnvVarSource represents a source @@ -18303,13 +17935,13 @@ openAPIV3Schema: type: object properties: secretKeyRef: - description: SecretKeySelector selects a - key of a Secret. + description: SecretKeySelector selects a key + of a Secret. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the Secret @@ -18321,76 +17953,73 @@ openAPIV3Schema: key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents - container resources (cpu, memory) and - their output format + container resources (cpu, memory) and their + output format type: object properties: divisor: description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= - (Note that - may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= - "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi - | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | - M | G | T | P | E (Note that 1024 - = 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent - forms is used, no quantity may represent - a number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This - may be extended in the future if we - require larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type - again when it is serialized. Before - serializing, Quantity will be put - in "canonical form". This means that - Exponent/suffix will be adjusted up - or down (with a corresponding increase - or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. - The sign will be omitted unless the - number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as - they are well formed, but will be - re-emitted in their canonical form. - (So always use canonical form, or - don''t diff.) This format is intended - to make it difficult to use these - numbers without writing some sort - of special handling code in the hopes - that that will cause implementors - to also use a fixed point implementation.' + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the + "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | + Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M + | G | T | P | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms + is used, no quantity may represent a + number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may + be extended in the future if we require + larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type again + when it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. + No fractional digits will be emitted c. + The exponent (or suffix) is as large + as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always + use canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing + some sort of special handling code in + the hopes that that will cause implementors + to also use a fixed point implementation.' type: object properties: number: @@ -18398,26 +18027,25 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: - description: 'Required: resource to - select' + description: 'Required: resource to select' type: string containerName: description: 'Container name: required - for volumes, optional for env vars' + for volumes, optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap @@ -18427,43 +18055,43 @@ openAPIV3Schema: description: The key to select. type: string required: - - key + - key fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. + description: ObjectFieldSelector selects an + APIVersioned field of an object. type: object properties: apiVersion: description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". + FieldPath is written in terms of, defaults + to "v1". type: string fieldPath: description: Path of the field to select in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: description: List of ports to expose from the container. - Exposing a port here gives the system additional - information about the network connections a container - uses, but is primarily informational. Not specifying - a port here DOES NOT prevent that port from being - exposed. Any port which is listening on the default - "0.0.0.0" address inside a container will be accessible - from the network. Cannot be updated. + Exposing a port here gives the system additional information + about the network connections a container uses, but + is primarily informational. Not specifying a port + here DOES NOT prevent that port from being exposed. + Any port which is listening on the default "0.0.0.0" + address inside a container will be accessible from + the network. Cannot be updated. type: array items: - description: ContainerPort represents a network - port in a single container. + description: ContainerPort represents a network port + in a single container. type: object properties: protocol: - description: Protocol for port. Must be UDP, - TCP, or SCTP. Defaults to "TCP". + description: Protocol for port. Must be UDP, TCP, + or SCTP. Defaults to "TCP". type: string hostIP: description: What host IP to bind the external @@ -18471,35 +18099,35 @@ openAPIV3Schema: type: string name: description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port - in a pod must have a unique name. Name for - the port that can be referred to by services. + and unique within the pod. Each named port in + a pod must have a unique name. Name for the + port that can be referred to by services. type: string containerPort: - description: Number of port to expose on the - pod's IP address. This must be a valid port - number, 0 < x < 65536. + description: Number of port to expose on the pod's + IP address. This must be a valid port number, + 0 < x < 65536. type: number hostPort: - description: Number of port to expose on the - host. If specified, this must be a valid port - number, 0 < x < 65536. If HostNetwork is specified, + description: Number of port to expose on the host. + If specified, this must be a valid port number, + 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. type: number required: - - containerPort + - containerPort command: description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used - if this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. - If a variable cannot be resolved, the reference - in the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be - updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + a shell. The docker image''s ENTRYPOINT is used if + this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. If + a variable cannot be resolved, the reference in the + input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be updated. + More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string @@ -18508,8 +18136,8 @@ openAPIV3Schema: filesystem. Cannot be updated. type: array items: - description: VolumeMount describes a mounting of - a Volume within a container. + description: VolumeMount describes a mounting of a + Volume within a container. type: object properties: mountPath: @@ -18518,9 +18146,9 @@ openAPIV3Schema: ':'. type: string mountPropagation: - description: mountPropagation determines how - mounts are propagated from the host to container - and the other way around. When not set, MountPropagationNone + description: mountPropagation determines how mounts + are propagated from the host to container and + the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. type: string name: @@ -18528,68 +18156,66 @@ openAPIV3Schema: type: string readOnly: description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults - to false. + otherwise (false or unspecified). Defaults to + false. type: boolean subPath: description: Path within the volume from which - the container's volume should be mounted. - Defaults to "" (volume's root). + the container's volume should be mounted. Defaults + to "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume - from which the container's volume should be - mounted. Behaves similarly to SubPath but - environment variable references $(VAR_NAME) - are expanded using the container's environment. - Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field - is beta in 1.15. + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment + variable references $(VAR_NAME) are expanded + using the container's environment. Defaults + to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in + 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. The + $(VAR_NAME) syntax can be escaped with a double $$, + ie: $$(VAR_NAME). Escaped references will never be + expanded, regardless of whether the variable exists + or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string lifecycle: - description: Lifecycle describes actions that the - management system should take in response to container - lifecycle events. For the PostStart and PreStop - lifecycle handlers, management of the container - blocks until the action is complete, unless the - container process fails, in which case the handler - is aborted. + description: Lifecycle describes actions that the management + system should take in response to container lifecycle + events. For the PostStart and PreStop lifecycle handlers, + management of the container blocks until the action + is complete, unless the container process fails, in + which case the handler is aborted. type: object properties: postStart: - description: Handler defines a specific action - that should be taken + description: Handler defines a specific action that + should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket + description: TCPSocketAction describes an action + based on opening a socket type: object properties: port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -18599,13 +18225,13 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -18613,16 +18239,15 @@ openAPIV3Schema: properties: command: description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. type: array items: type: string @@ -18641,12 +18266,11 @@ openAPIV3Schema: type: string port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -18656,19 +18280,19 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. + description: Custom headers to set in the + request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a - custom header to be used in HTTP probes + description: HTTPHeader describes a custom + header to be used in HTTP probes type: object properties: name: @@ -18678,28 +18302,27 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: - description: Handler defines a specific action - that should be taken + description: Handler defines a specific action that + should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket + description: TCPSocketAction describes an action + based on opening a socket type: object properties: port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -18709,13 +18332,13 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -18723,16 +18346,15 @@ openAPIV3Schema: properties: command: description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. type: array items: type: string @@ -18751,12 +18373,11 @@ openAPIV3Schema: type: string port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -18766,19 +18387,19 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. + description: Custom headers to set in the + request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a - custom header to be used in HTTP probes + description: HTTPHeader describes a custom + header to be used in HTTP probes type: object properties: name: @@ -18788,14 +18409,14 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: - description: Name of the container specified as a - DNS_LABEL. Each container in a pod must have a unique - name (DNS_LABEL). Cannot be updated. + description: Name of the container specified as a DNS_LABEL. + Each container in a pod must have a unique name (DNS_LABEL). + Cannot be updated. type: string tty: description: Whether this container should allocate @@ -18803,20 +18424,20 @@ openAPIV3Schema: Default is false. type: boolean readinessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. type: number tcpSocket: description: TCPSocketAction describes an action @@ -18825,11 +18446,11 @@ openAPIV3Schema: properties: port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -18839,28 +18460,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -18870,36 +18491,35 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + description: HTTPGetAction describes an action based + on HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + description: Scheme to use for connecting to + the host. Defaults to HTTP. type: string port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -18909,15 +18529,15 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + to the pod IP. You probably want to set "Host" + in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. + description: Custom headers to set in the request. + HTTP allows repeated headers. type: array items: description: HTTPHeader describes a custom @@ -18931,37 +18551,36 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: - description: Whether the container runtime should - close the stdin channel after it has been opened - by a single attach. When stdin is true the stdin - stream will remain open across multiple attach sessions. - If stdinOnce is set to true, stdin is opened on - container start, is empty until the first client - attaches to stdin, and then remains open and accepts - data until the client disconnects, at which time - stdin is closed and remains closed until the container - is restarted. If this flag is false, a container - processes that reads from stdin will never receive - an EOF. Default is false + description: Whether the container runtime should close + the stdin channel after it has been opened by a single + attach. When stdin is true the stdin stream will remain + open across multiple attach sessions. If stdinOnce + is set to true, stdin is opened on container start, + is empty until the first client attaches to stdin, + and then remains open and accepts data until the client + disconnects, at which time stdin is closed and remains + closed until the container is restarted. If this flag + is false, a container processes that reads from stdin + will never receive an EOF. Default is false type: boolean envFrom: description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container - is starting. When a key exists in multiple sources, - the value associated with the last source will take - precedence. Values defined by an Env with a duplicate - key will take precedence. Cannot be updated. + will be reported as an event when the container is + starting. When a key exists in multiple sources, the + value associated with the last source will take precedence. + Values defined by an Env with a duplicate key will + take precedence. Cannot be updated. type: array items: - description: EnvFromSource represents the source - of a set of ConfigMaps + description: EnvFromSource represents the source of + a set of ConfigMaps type: object properties: configMapRef: @@ -18973,8 +18592,8 @@ openAPIV3Schema: type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap @@ -18987,21 +18606,21 @@ openAPIV3Schema: secretRef: description: SecretEnvSource selects a Secret to populate the environment variables with. The - contents of the target Secret's Data field - will represent the key-value pairs as environment + contents of the target Secret's Data field will + represent the key-value pairs as environment variables. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - must be defined + description: Specify whether the Secret must + be defined type: boolean required: - - name + - name containerSecurityContext: description: Container-level security attributes. Will override any matching pod-level attributes. @@ -19069,21 +18688,20 @@ openAPIV3Schema: that enable the WindowsGMSA feature flag. type: string runAsUserName: - description: The UserName in Windows to run the - entrypoint of the container process. Defaults - to the user specified in image metadata if unspecified. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - This field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and + it is only honored by servers that enable the WindowsRunAsUserName feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + description: GMSACredentialSpecName is the name of + the GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. type: string procMount: description: procMount denotes the type of proc mount @@ -19094,11 +18712,11 @@ openAPIV3Schema: type: string allowPrivilegeEscalation: description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent - process. This bool directly controls if the no_new_privs - flag will be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN' + a process can gain more privileges than its parent process. + This bool directly controls if the no_new_privs flag + will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' type: boolean runAsGroup: description: The GID to run the entrypoint of the container @@ -19111,24 +18729,24 @@ openAPIV3Schema: description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run - as UID 0 (root) and fail to start the container if - it does. If unset or false, no such validation will - be performed. May also be set in PodSecurityContext. If + as UID 0 (root) and fail to start the container if it + does. If unset or false, no such validation will be + performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. + description: Whether this container has a read-only root + filesystem. Default is false. type: boolean schedulerName: - description: If specified, the pod will be dispatched by - specified scheduler. If not specified, the pod will be - dispatched by default scheduler. + description: If specified, the pod will be dispatched by specified + scheduler. If not specified, the pod will be dispatched + by default scheduler. type: string initContainers: - description: Initialization containers to be included in - the server pod. + description: Initialization containers to be included in the + server pod. type: array items: description: A single application container that you want @@ -19140,8 +18758,8 @@ openAPIV3Schema: to be used by the container. This is a beta feature. type: array items: - description: volumeDevice describes a mapping of - a raw block device within a container. + description: volumeDevice describes a mapping of a + raw block device within a container. type: object properties: devicePath: @@ -19154,35 +18772,35 @@ openAPIV3Schema: in the pod type: string required: - - devicePath - - name + - devicePath + - name image: description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config - management to default or override container images - in workload controllers like Deployments and StatefulSets.' + This field is optional to allow higher level config + management to default or override container images + in workload controllers like Deployments and StatefulSets.' type: string imagePullPolicy: description: 'Image pull policy. One of Always, Never, - IfNotPresent. Defaults to Always if :latest tag - is specified, or IfNotPresent otherwise. Cannot - be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + IfNotPresent. Defaults to Always if :latest tag is + specified, or IfNotPresent otherwise. Cannot be updated. + More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' type: string livenessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. type: number tcpSocket: description: TCPSocketAction describes an action @@ -19191,11 +18809,11 @@ openAPIV3Schema: properties: port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -19205,28 +18823,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -19236,36 +18854,35 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + description: HTTPGetAction describes an action based + on HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + description: Scheme to use for connecting to + the host. Defaults to HTTP. type: string port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -19275,15 +18892,15 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + to the pod IP. You probably want to set "Host" + in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. + description: Custom headers to set in the request. + HTTP allows repeated headers. type: array items: description: HTTPHeader describes a custom @@ -19297,43 +18914,43 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdin: description: Whether this container should allocate - a buffer for stdin in the container runtime. If - this is not set, reads from stdin in the container - will always result in EOF. Default is false. + a buffer for stdin in the container runtime. If this + is not set, reads from stdin in the container will + always result in EOF. Default is false. type: boolean terminationMessagePolicy: - description: Indicate how the termination message - should be populated. File will use the contents - of terminationMessagePath to populate the container - status message on both success and failure. FallbackToLogsOnError - will use the last chunk of container log output - if the termination message file is empty and the - container exited with an error. The log output is - limited to 2048 bytes or 80 lines, whichever is - smaller. Defaults to File. Cannot be updated. + description: Indicate how the termination message should + be populated. File will use the contents of terminationMessagePath + to populate the container status message on both success + and failure. FallbackToLogsOnError will use the last + chunk of container log output if the termination message + file is empty and the container exited with an error. + The log output is limited to 2048 bytes or 80 lines, + whichever is smaller. Defaults to File. Cannot be + updated. type: string terminationMessagePath: - description: 'Optional: Path at which the file to - which the container''s termination message will - be written is mounted into the container''s filesystem. - Message written is intended to be brief final status, - such as an assertion failure message. Will be truncated - by the node if greater than 4096 bytes. The total - message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot - be updated.' + description: 'Optional: Path at which the file to which + the container''s termination message will be written + is mounted into the container''s filesystem. Message + written is intended to be brief final status, such + as an assertion failure message. Will be truncated + by the node if greater than 4096 bytes. The total + message length across all containers will be limited + to 12kb. Defaults to /dev/termination-log. Cannot + be updated.' type: string workingDir: - description: Container's working directory. If not - specified, the container runtime's default will - be used, which might be configured in the container - image. Cannot be updated. + description: Container's working directory. If not specified, + the container runtime's default will be used, which + might be configured in the container image. Cannot + be updated. type: string resources: description: ResourceRequirements describes the compute @@ -19342,41 +18959,38 @@ openAPIV3Schema: properties: requests: description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object limits: description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' additionalProperties: type: string type: object securityContext: description: SecurityContext holds security configuration - that will be applied to a container. Some fields - are present in both SecurityContext and PodSecurityContext. When - both are set, the values in SecurityContext take - precedence. + that will be applied to a container. Some fields are + present in both SecurityContext and PodSecurityContext. When + both are set, the values in SecurityContext take precedence. type: object properties: privileged: - description: Run container in privileged mode. - Processes in privileged containers are essentially - equivalent to root on the host. Defaults to - false. + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. type: boolean runAsUser: - description: The UID to run the entrypoint of - the container process. Defaults to user specified + description: The UID to run the entrypoint of the + container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. + and PodSecurityContext, the value specified in + SecurityContext takes precedence. type: number capabilities: description: Adds and removes POSIX capabilities @@ -19394,25 +19008,25 @@ openAPIV3Schema: items: type: string seLinuxOptions: - description: SELinuxOptions are the labels to - be applied to the container + description: SELinuxOptions are the labels to be + applied to the container type: object properties: role: - description: Role is a SELinux role label - that applies to the container. + description: Role is a SELinux role label that + applies to the container. type: string level: - description: Level is SELinux level label - that applies to the container. + description: Level is SELinux level label that + applies to the container. type: string type: - description: Type is a SELinux type label - that applies to the container. + description: Type is a SELinux type label that + applies to the container. type: string user: - description: User is a SELinux user label - that applies to the container. + description: User is a SELinux user label that + applies to the container. type: string windowsOptions: description: WindowsSecurityContextOptions contain @@ -19423,86 +19037,82 @@ openAPIV3Schema: description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName - field. This field is alpha-level and is - only honored by servers that enable the - WindowsGMSA feature flag. + spec named by the GMSACredentialSpecName field. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. type: string runAsUserName: description: The UserName in Windows to run - the entrypoint of the container process. - Defaults to the user specified in image - metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. This - field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. + the entrypoint of the container process. Defaults + to the user specified in image metadata if + unspecified. May also be set in PodSecurityContext. + If set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. This field is alpha-level and + it is only honored by servers that enable + the WindowsRunAsUserName feature flag. type: string gmsaCredentialSpecName: - description: GMSACredentialSpecName is the - name of the GMSA credential spec to use. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. type: string procMount: description: procMount denotes the type of proc - mount to use for the containers. The default - is DefaultProcMount which uses the container - runtime defaults for readonly paths and masked - paths. This requires the ProcMountType feature - flag to be enabled. + mount to use for the containers. The default is + DefaultProcMount which uses the container runtime + defaults for readonly paths and masked paths. + This requires the ProcMountType feature flag to + be enabled. type: string allowPrivilegeEscalation: description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the - container process. AllowPrivilegeEscalation - is true always when the container is: 1) run - as Privileged 2) has CAP_SYS_ADMIN' + whether a process can gain more privileges than + its parent process. This bool directly controls + if the no_new_privs flag will be set on the container + process. AllowPrivilegeEscalation is true always + when the container is: 1) run as Privileged 2) + has CAP_SYS_ADMIN' type: boolean runAsGroup: - description: The GID to run the entrypoint of - the container process. Uses runtime default - if unset. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. - type: number - runAsNonRoot: - description: Indicates that the container must - run as a non-root user. If true, the Kubelet - will validate the image at runtime to ensure - that it does not run as UID 0 (root) and fail - to start the container if it does. If unset - or false, no such validation will be performed. + description: The GID to run the entrypoint of the + container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. + the value specified in SecurityContext takes precedence. + type: number + runAsNonRoot: + description: Indicates that the container must run + as a non-root user. If true, the Kubelet will + validate the image at runtime to ensure that it + does not run as UID 0 (root) and fail to start + the container if it does. If unset or false, no + such validation will be performed. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in + SecurityContext takes precedence. type: boolean readOnlyRootFilesystem: description: Whether this container has a read-only root filesystem. Default is false. type: boolean startupProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. type: number tcpSocket: description: TCPSocketAction describes an action @@ -19511,11 +19121,11 @@ openAPIV3Schema: properties: port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -19525,28 +19135,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -19556,36 +19166,35 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + description: HTTPGetAction describes an action based + on HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + description: Scheme to use for connecting to + the host. Defaults to HTTP. type: string port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -19595,15 +19204,15 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + to the pod IP. You probably want to set "Host" + in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. + description: Custom headers to set in the request. + HTTP allows repeated headers. type: array items: description: HTTPHeader describes a custom @@ -19617,13 +19226,13 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port env: - description: List of environment variables to set - in the container. Cannot be updated. + description: List of environment variables to set in + the container. Cannot be updated. type: array items: description: EnvVar represents an environment variable @@ -19636,15 +19245,14 @@ openAPIV3Schema: type: string value: description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service - environment variables. If a variable cannot - be resolved, the reference in the input string - will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, - regardless of whether the variable exists - or not. Defaults to "".' + are expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, + the reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a + double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether + the variable exists or not. Defaults to "".' type: string valueFrom: description: EnvVarSource represents a source @@ -19652,13 +19260,13 @@ openAPIV3Schema: type: object properties: secretKeyRef: - description: SecretKeySelector selects a - key of a Secret. + description: SecretKeySelector selects a key + of a Secret. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the Secret @@ -19670,76 +19278,73 @@ openAPIV3Schema: key. type: string required: - - key + - key resourceFieldRef: description: ResourceFieldSelector represents - container resources (cpu, memory) and - their output format + container resources (cpu, memory) and their + output format type: object properties: divisor: description: 'Quantity is a fixed-point - representation of a number. It provides - convenient marshaling/unmarshaling - in JSON and YAML, in addition to String() - and AsInt64() accessors. The serialization - format is: ::= - (Note that - may be empty, from the "" - case in .) ::= - 0 | 1 | ... | 9 ::= - | ::= - | . | . - | . ::= - "+" | "-" ::= - | ::= - | | - ::= Ki | Mi | Gi - | Ti | Pi | Ei (International System - of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | - M | G | T | P | E (Note that 1024 - = 1Ki but 1000 = 1k; I didn''t choose - the capitalization.) - ::= "e" | "E" No - matter which of the three exponent - forms is used, no quantity may represent - a number greater than 2^63-1 in magnitude, - nor may it have more than 3 decimal - places. Numbers larger or more precise - will be capped or rounded up. (E.g.: - 0.1m will rounded up to 1m.) This - may be extended in the future if we - require larger or smaller quantities. When - a Quantity is parsed from a string, - it will remember the type of suffix - it had, and will use the same type - again when it is serialized. Before - serializing, Quantity will be put - in "canonical form". This means that - Exponent/suffix will be adjusted up - or down (with a corresponding increase - or decrease in Mantissa) such that: a. - No precision is lost b. No fractional - digits will be emitted c. The exponent - (or suffix) is as large as possible. - The sign will be omitted unless the - number is negative. Examples: 1.5 - will be serialized as "1500m" 1.5Gi - will be serialized as "1536Mi" Note - that the quantity will NEVER be internally - represented by a floating point number. - That is the whole point of this exercise. Non-canonical - values will still parse as long as - they are well formed, but will be - re-emitted in their canonical form. - (So always use canonical form, or - don''t diff.) This format is intended - to make it difficult to use these - numbers without writing some sort - of special handling code in the hopes - that that will cause implementors - to also use a fixed point implementation.' + representation of a number. It provides + convenient marshaling/unmarshaling in + JSON and YAML, in addition to String() + and AsInt64() accessors. The serialization + format is: ::= (Note + that may be empty, from the + "" case in .) ::= + 0 | 1 | ... | 9 ::= + | ::= + | . | . + | . ::= "+" + | "-" ::= + | ::= + | | + ::= Ki | Mi | Gi | + Ti | Pi | Ei (International System + of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M + | G | T | P | E (Note that 1024 = + 1Ki but 1000 = 1k; I didn''t choose + the capitalization.) + ::= "e" | "E" No + matter which of the three exponent forms + is used, no quantity may represent a + number greater than 2^63-1 in magnitude, + nor may it have more than 3 decimal + places. Numbers larger or more precise + will be capped or rounded up. (E.g.: + 0.1m will rounded up to 1m.) This may + be extended in the future if we require + larger or smaller quantities. When + a Quantity is parsed from a string, + it will remember the type of suffix + it had, and will use the same type again + when it is serialized. Before serializing, + Quantity will be put in "canonical form". + This means that Exponent/suffix will + be adjusted up or down (with a corresponding + increase or decrease in Mantissa) such + that: a. No precision is lost b. + No fractional digits will be emitted c. + The exponent (or suffix) is as large + as possible. The sign will be omitted + unless the number is negative. Examples: 1.5 + will be serialized as "1500m" 1.5Gi + will be serialized as "1536Mi" Note + that the quantity will NEVER be internally + represented by a floating point number. + That is the whole point of this exercise. Non-canonical + values will still parse as long as they + are well formed, but will be re-emitted + in their canonical form. (So always + use canonical form, or don''t diff.) This + format is intended to make it difficult + to use these numbers without writing + some sort of special handling code in + the hopes that that will cause implementors + to also use a fixed point implementation.' type: object properties: number: @@ -19747,26 +19352,25 @@ openAPIV3Schema: format: type: string enum: - - DECIMAL_EXPONENT - - DECIMAL_SI - - BINARY_SI + - DECIMAL_EXPONENT + - DECIMAL_SI + - BINARY_SI resource: - description: 'Required: resource to - select' + description: 'Required: resource to select' type: string containerName: description: 'Container name: required - for volumes, optional for env vars' + for volumes, optional for env vars' type: string required: - - resource + - resource configMapKeyRef: description: Selects a key from a ConfigMap. type: object properties: name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap @@ -19776,43 +19380,43 @@ openAPIV3Schema: description: The key to select. type: string required: - - key + - key fieldRef: - description: ObjectFieldSelector selects - an APIVersioned field of an object. + description: ObjectFieldSelector selects an + APIVersioned field of an object. type: object properties: apiVersion: description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". + FieldPath is written in terms of, defaults + to "v1". type: string fieldPath: description: Path of the field to select in the specified API version. type: string required: - - fieldPath + - fieldPath required: - - name + - name ports: description: List of ports to expose from the container. - Exposing a port here gives the system additional - information about the network connections a container - uses, but is primarily informational. Not specifying - a port here DOES NOT prevent that port from being - exposed. Any port which is listening on the default - "0.0.0.0" address inside a container will be accessible - from the network. Cannot be updated. + Exposing a port here gives the system additional information + about the network connections a container uses, but + is primarily informational. Not specifying a port + here DOES NOT prevent that port from being exposed. + Any port which is listening on the default "0.0.0.0" + address inside a container will be accessible from + the network. Cannot be updated. type: array items: - description: ContainerPort represents a network - port in a single container. + description: ContainerPort represents a network port + in a single container. type: object properties: protocol: - description: Protocol for port. Must be UDP, - TCP, or SCTP. Defaults to "TCP". + description: Protocol for port. Must be UDP, TCP, + or SCTP. Defaults to "TCP". type: string hostIP: description: What host IP to bind the external @@ -19820,35 +19424,35 @@ openAPIV3Schema: type: string name: description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port - in a pod must have a unique name. Name for - the port that can be referred to by services. + and unique within the pod. Each named port in + a pod must have a unique name. Name for the + port that can be referred to by services. type: string containerPort: - description: Number of port to expose on the - pod's IP address. This must be a valid port - number, 0 < x < 65536. + description: Number of port to expose on the pod's + IP address. This must be a valid port number, + 0 < x < 65536. type: number hostPort: - description: Number of port to expose on the - host. If specified, this must be a valid port - number, 0 < x < 65536. If HostNetwork is specified, + description: Number of port to expose on the host. + If specified, this must be a valid port number, + 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. type: number required: - - containerPort + - containerPort command: description: 'Entrypoint array. Not executed within - a shell. The docker image''s ENTRYPOINT is used - if this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. - If a variable cannot be resolved, the reference - in the input string will be unchanged. The $(VAR_NAME) - syntax can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, regardless - of whether the variable exists or not. Cannot be - updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + a shell. The docker image''s ENTRYPOINT is used if + this is not provided. Variable references $(VAR_NAME) + are expanded using the container''s environment. If + a variable cannot be resolved, the reference in the + input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). + Escaped references will never be expanded, regardless + of whether the variable exists or not. Cannot be updated. + More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string @@ -19857,8 +19461,8 @@ openAPIV3Schema: filesystem. Cannot be updated. type: array items: - description: VolumeMount describes a mounting of - a Volume within a container. + description: VolumeMount describes a mounting of a + Volume within a container. type: object properties: mountPath: @@ -19867,9 +19471,9 @@ openAPIV3Schema: ':'. type: string mountPropagation: - description: mountPropagation determines how - mounts are propagated from the host to container - and the other way around. When not set, MountPropagationNone + description: mountPropagation determines how mounts + are propagated from the host to container and + the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. type: string name: @@ -19877,68 +19481,66 @@ openAPIV3Schema: type: string readOnly: description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults - to false. + otherwise (false or unspecified). Defaults to + false. type: boolean subPath: description: Path within the volume from which - the container's volume should be mounted. - Defaults to "" (volume's root). + the container's volume should be mounted. Defaults + to "" (volume's root). type: string subPathExpr: - description: Expanded path within the volume - from which the container's volume should be - mounted. Behaves similarly to SubPath but - environment variable references $(VAR_NAME) - are expanded using the container's environment. - Defaults to "" (volume's root). SubPathExpr - and SubPath are mutually exclusive. This field - is beta in 1.15. + description: Expanded path within the volume from + which the container's volume should be mounted. + Behaves similarly to SubPath but environment + variable references $(VAR_NAME) are expanded + using the container's environment. Defaults + to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in + 1.15. type: string required: - - mountPath - - name + - mountPath + - name args: description: 'Arguments to the entrypoint. The docker - image''s CMD is used if this is not provided. Variable - references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the - reference in the input string will be unchanged. - The $(VAR_NAME) syntax can be escaped with a double - $$, ie: $$(VAR_NAME). Escaped references will never - be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + image''s CMD is used if this is not provided. Variable + references $(VAR_NAME) are expanded using the container''s + environment. If a variable cannot be resolved, the + reference in the input string will be unchanged. The + $(VAR_NAME) syntax can be escaped with a double $$, + ie: $$(VAR_NAME). Escaped references will never be + expanded, regardless of whether the variable exists + or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' type: array items: type: string lifecycle: - description: Lifecycle describes actions that the - management system should take in response to container - lifecycle events. For the PostStart and PreStop - lifecycle handlers, management of the container - blocks until the action is complete, unless the - container process fails, in which case the handler - is aborted. + description: Lifecycle describes actions that the management + system should take in response to container lifecycle + events. For the PostStart and PreStop lifecycle handlers, + management of the container blocks until the action + is complete, unless the container process fails, in + which case the handler is aborted. type: object properties: postStart: - description: Handler defines a specific action - that should be taken + description: Handler defines a specific action that + should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket + description: TCPSocketAction describes an action + based on opening a socket type: object properties: port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -19948,13 +19550,13 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -19962,16 +19564,15 @@ openAPIV3Schema: properties: command: description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. type: array items: type: string @@ -19990,12 +19591,11 @@ openAPIV3Schema: type: string port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -20005,19 +19605,19 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. + description: Custom headers to set in the + request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a - custom header to be used in HTTP probes + description: HTTPHeader describes a custom + header to be used in HTTP probes type: object properties: name: @@ -20027,28 +19627,27 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port preStop: - description: Handler defines a specific action - that should be taken + description: Handler defines a specific action that + should be taken type: object properties: tcpSocket: - description: TCPSocketAction describes an - action based on opening a socket + description: TCPSocketAction describes an action + based on opening a socket type: object properties: port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -20058,13 +19657,13 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port exec: description: ExecAction describes a "run in container" action. @@ -20072,16 +19671,15 @@ openAPIV3Schema: properties: command: description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. + to execute inside the container, the working + directory for the command is root ('/') + in the container's filesystem. The command + is simply exec'd, it is not run inside + a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, + you need to explicitly call out to that + shell. Exit status of 0 is treated as + live/healthy and non-zero is unhealthy. type: array items: type: string @@ -20100,12 +19698,11 @@ openAPIV3Schema: type: string port: description: IntOrString is a type that - can hold an int32 or a string. When - used in JSON or YAML marshalling and - unmarshalling, it produces or consumes - the inner type. This allows you to - have, for example, a JSON field that - can accept a name or number. + can hold an int32 or a string. When used + in JSON or YAML marshalling and unmarshalling, + it produces or consumes the inner type. This + allows you to have, for example, a JSON + field that can accept a name or number. type: object properties: intValue: @@ -20115,19 +19712,19 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. + description: Host name to connect to, defaults + to the pod IP. You probably want to set + "Host" in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. + description: Custom headers to set in the + request. HTTP allows repeated headers. type: array items: - description: HTTPHeader describes a - custom header to be used in HTTP probes + description: HTTPHeader describes a custom + header to be used in HTTP probes type: object properties: name: @@ -20137,14 +19734,14 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port name: - description: Name of the container specified as a - DNS_LABEL. Each container in a pod must have a unique - name (DNS_LABEL). Cannot be updated. + description: Name of the container specified as a DNS_LABEL. + Each container in a pod must have a unique name (DNS_LABEL). + Cannot be updated. type: string tty: description: Whether this container should allocate @@ -20152,20 +19749,20 @@ openAPIV3Schema: Default is false. type: boolean readinessProbe: - description: Probe describes a health check to be - performed against a container to determine whether - it is alive or ready to receive traffic. + description: Probe describes a health check to be performed + against a container to determine whether it is alive + or ready to receive traffic. type: object properties: failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. type: number periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is + 1. type: number tcpSocket: description: TCPSocketAction describes an action @@ -20174,11 +19771,11 @@ openAPIV3Schema: properties: port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -20188,28 +19785,28 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: 'Optional: Host name to connect - to, defaults to the pod IP.' + to, defaults to the pod IP.' type: string required: - - port + - port timeoutSeconds: description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + probe times out. Defaults to 1 second. Minimum + value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. + description: Minimum consecutive successes for the + probe to be considered successful after having + failed. Defaults to 1. Must be 1 for liveness + and startup. Minimum value is 1. type: number initialDelaySeconds: description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: number exec: description: ExecAction describes a "run in container" @@ -20219,36 +19816,35 @@ openAPIV3Schema: command: description: Command is the command line to execute inside the container, the working - directory for the command is root ('/') - in the container's filesystem. The command - is simply exec'd, it is not run inside a - shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you - need to explicitly call out to that shell. - Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. + directory for the command is root ('/') in + the container's filesystem. The command is + simply exec'd, it is not run inside a shell, + so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is + treated as live/healthy and non-zero is unhealthy. type: array items: type: string httpGet: - description: HTTPGetAction describes an action - based on HTTP Get requests. + description: HTTPGetAction describes an action based + on HTTP Get requests. type: object properties: path: description: Path to access on the HTTP server. type: string scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. + description: Scheme to use for connecting to + the host. Defaults to HTTP. type: string port: description: IntOrString is a type that can - hold an int32 or a string. When used in - JSON or YAML marshalling and unmarshalling, - it produces or consumes the inner type. This - allows you to have, for example, a JSON - field that can accept a name or number. + hold an int32 or a string. When used in JSON + or YAML marshalling and unmarshalling, it + produces or consumes the inner type. This + allows you to have, for example, a JSON field + that can accept a name or number. type: object properties: intValue: @@ -20258,15 +19854,15 @@ openAPIV3Schema: strValue: type: string required: - - isInt + - isInt host: description: Host name to connect to, defaults - to the pod IP. You probably want to set - "Host" in httpHeaders instead. + to the pod IP. You probably want to set "Host" + in httpHeaders instead. type: string httpHeaders: - description: Custom headers to set in the - request. HTTP allows repeated headers. + description: Custom headers to set in the request. + HTTP allows repeated headers. type: array items: description: HTTPHeader describes a custom @@ -20280,37 +19876,36 @@ openAPIV3Schema: description: The header field value type: string required: - - name - - value + - name + - value required: - - port + - port stdinOnce: - description: Whether the container runtime should - close the stdin channel after it has been opened - by a single attach. When stdin is true the stdin - stream will remain open across multiple attach sessions. - If stdinOnce is set to true, stdin is opened on - container start, is empty until the first client - attaches to stdin, and then remains open and accepts - data until the client disconnects, at which time - stdin is closed and remains closed until the container - is restarted. If this flag is false, a container - processes that reads from stdin will never receive - an EOF. Default is false + description: Whether the container runtime should close + the stdin channel after it has been opened by a single + attach. When stdin is true the stdin stream will remain + open across multiple attach sessions. If stdinOnce + is set to true, stdin is opened on container start, + is empty until the first client attaches to stdin, + and then remains open and accepts data until the client + disconnects, at which time stdin is closed and remains + closed until the container is restarted. If this flag + is false, a container processes that reads from stdin + will never receive an EOF. Default is false type: boolean envFrom: description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container - is starting. When a key exists in multiple sources, - the value associated with the last source will take - precedence. Values defined by an Env with a duplicate - key will take precedence. Cannot be updated. + will be reported as an event when the container is + starting. When a key exists in multiple sources, the + value associated with the last source will take precedence. + Values defined by an Env with a duplicate key will + take precedence. Cannot be updated. type: array items: - description: EnvFromSource represents the source - of a set of ConfigMaps + description: EnvFromSource represents the source of + a set of ConfigMaps type: object properties: configMapRef: @@ -20322,8 +19917,8 @@ openAPIV3Schema: type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: description: Specify whether the ConfigMap @@ -20336,38 +19931,38 @@ openAPIV3Schema: secretRef: description: SecretEnvSource selects a Secret to populate the environment variables with. The - contents of the target Secret's Data field - will represent the key-value pairs as environment + contents of the target Secret's Data field will + represent the key-value pairs as environment variables. type: object properties: name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' type: string optional: - description: Specify whether the Secret - must be defined + description: Specify whether the Secret must + be defined type: boolean required: - - name + - name shutdown: - description: Configures how the operator should shutdown - the server instance. + description: Configures how the operator should shutdown the + server instance. type: object properties: ignoreSessions: description: For graceful shutdown only, indicates to - ignore pending HTTP sessions during in-flight work - handling. Not required. Defaults to false. + ignore pending HTTP sessions during in-flight work handling. + Not required. Defaults to false. type: boolean shutdownType: description: Tells the operator how to shutdown server instances. Not required. Defaults to graceful shutdown. type: string enum: - - Graceful - - Forced + - Graceful + - Forced timeoutSeconds: description: For graceful shutdown only, number of seconds to wait before aborting in-flight work and shutting @@ -20385,9 +19980,8 @@ openAPIV3Schema: requiredDuringSchedulingIgnoredDuringExecution: description: A node selector represents the union of the results of one or more label queries over - a set of nodes; that is, it represents the OR - of the selectors represented by the node selector - terms. + a set of nodes; that is, it represents the OR of + the selectors represented by the node selector terms. type: object properties: nodeSelectorTerms: @@ -20395,10 +19989,10 @@ openAPIV3Schema: terms. The terms are ORed. type: array items: - description: A null or empty node selector - term matches no objects. The requirements - of them are ANDed. The TopologySelectorTerm - type implements a subset of the NodeSelectorTerm. + description: A null or empty node selector term + matches no objects. The requirements of them + are ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. type: object properties: matchExpressions: @@ -20413,13 +20007,12 @@ openAPIV3Schema: type: object properties: values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced @@ -20428,19 +20021,18 @@ openAPIV3Schema: items: type: string key: - description: The label key that - the selector applies to. + description: The label key that the + selector applies to. type: string operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. @@ -20453,13 +20045,12 @@ openAPIV3Schema: type: object properties: values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced @@ -20468,35 +20059,33 @@ openAPIV3Schema: items: type: string key: - description: The label key that - the selector applies to. + description: The label key that the + selector applies to. type: string operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. type: string required: - - key - - operator + - key + - operator required: - - nodeSelectorTerms + - nodeSelectorTerms preferredDuringSchedulingIgnoredDuringExecution: description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node - that violates one or more of the expressions. - The node that is most preferred is the one with - the greatest sum of weights, i.e. for each node - that meets all of the scheduling requirements - (resource request, requiredDuringScheduling affinity - expressions, etc.), compute a sum by iterating - through the elements of this field and adding - "weight" to the sum if the node matches the corresponding - matchExpressions; the node(s) with the highest - sum are the most preferred. + that violates one or more of the expressions. The + node that is most preferred is the one with the + greatest sum of weights, i.e. for each node that + meets all of the scheduling requirements (resource + request, requiredDuringScheduling affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if + the node matches the corresponding matchExpressions; + the node(s) with the highest sum are the most preferred. type: array items: description: An empty preferred scheduling term @@ -20506,10 +20095,10 @@ openAPIV3Schema: type: object properties: preference: - description: A null or empty node selector - term matches no objects. The requirements - of them are ANDed. The TopologySelectorTerm - type implements a subset of the NodeSelectorTerm. + description: A null or empty node selector term + matches no objects. The requirements of them + are ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. type: object properties: matchExpressions: @@ -20524,13 +20113,12 @@ openAPIV3Schema: type: object properties: values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced @@ -20539,19 +20127,18 @@ openAPIV3Schema: items: type: string key: - description: The label key that - the selector applies to. + description: The label key that the + selector applies to. type: string operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. type: string required: - - key - - operator + - key + - operator matchFields: description: A list of node selector requirements by node's fields. @@ -20564,13 +20151,12 @@ openAPIV3Schema: type: object properties: values: - description: An array of string - values. If the operator is In - or NotIn, the values array must - be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. If - the operator is Gt or Lt, the + description: An array of string values. + If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced @@ -20579,27 +20165,26 @@ openAPIV3Schema: items: type: string key: - description: The label key that - the selector applies to. + description: The label key that the + selector applies to. type: string operator: - description: Represents a key's - relationship to a set of values. - Valid operators are In, NotIn, - Exists, DoesNotExist. Gt, and - Lt. + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. type: string required: - - key - - operator + - key + - operator weight: description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. type: number required: - - preference - - weight + - preference + - weight podAffinity: description: Pod affinity is a group of inter pod affinity scheduling rules. @@ -20607,39 +20192,39 @@ openAPIV3Schema: properties: requiredDuringSchedulingIgnoredDuringExecution: description: If the affinity requirements specified - by this field are not met at scheduling time, - the pod will not be scheduled onto the node. If - the affinity requirements specified by this field - cease to be met at some point during pod execution - (e.g. due to a pod label update), the system may - or may not try to eventually evict the pod from - its node. When there are multiple elements, the - lists of nodes corresponding to each podAffinityTerm - are intersected, i.e. all terms must be satisfied. + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the + affinity requirements specified by this field cease + to be met at some point during pod execution (e.g. + due to a pod label update), the system may or may + not try to eventually evict the pod from its node. + When there are multiple elements, the lists of nodes + corresponding to each podAffinityTerm are intersected, + i.e. all terms must be satisfied. type: array items: description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which - a pod of the set of pods is running + (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node + whose value of the label with key + matches that of any node on which a pod of the + set of pods is running type: object properties: labelSelector: description: A label selector is a label query over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty - label selector matches all objects. A null - label selector matches no objects. + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label + selector matches no objects. type: object properties: matchExpressions: description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. + of label selector requirements. The requirements + are ANDed. type: array items: description: A label selector requirement @@ -20649,14 +20234,14 @@ openAPIV3Schema: type: object properties: values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. This - array is replaced during a strategic - merge patch. + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. This array + is replaced during a strategic merge + patch. type: array items: type: string @@ -20665,14 +20250,14 @@ openAPIV3Schema: that the selector applies to. type: string operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -20684,15 +20269,14 @@ openAPIV3Schema: type: string type: object topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose value - of the label with key topologyKey matches - that of any node on which any of the selected - pods is running. Empty topologyKey is not - allowed. + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the + pods matching the labelSelector in the specified + namespaces, where co-located is defined as + running on a node whose value of the label + with key topologyKey matches that of any node + on which any of the selected pods is running. + Empty topologyKey is not allowed. type: string namespaces: description: namespaces specifies which namespaces @@ -20702,53 +20286,52 @@ openAPIV3Schema: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node - that violates one or more of the expressions. - The node that is most preferred is the one with - the greatest sum of weights, i.e. for each node - that meets all of the scheduling requirements - (resource request, requiredDuringScheduling affinity - expressions, etc.), compute a sum by iterating - through the elements of this field and adding - "weight" to the sum if the node has pods which - matches the corresponding podAffinityTerm; the - node(s) with the highest sum are the most preferred. + that violates one or more of the expressions. The + node that is most preferred is the one with the + greatest sum of weights, i.e. for each node that + meets all of the scheduling requirements (resource + request, requiredDuringScheduling affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if + the node has pods which matches the corresponding + podAffinityTerm; the node(s) with the highest sum + are the most preferred. type: array items: - description: The weights of all of the matched - WeightedPodAffinityTerm fields are added per-node - to find the most preferred node(s) + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) type: object properties: podAffinityTerm: - description: Defines a set of pods (namely - those matching the labelSelector relative - to the given namespace(s)) that this pod - should be co-located (affinity) or not co-located - (anti-affinity) with, where co-located is - defined as running on a node whose value - of the label with key matches - that of any node on which a pod of the set - of pods is running + description: Defines a set of pods (namely those + matching the labelSelector relative to the + given namespace(s)) that this pod should be + co-located (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on + which a pod of the set of pods is running type: object properties: labelSelector: description: A label selector is a label query over a set of resources. The result - of matchLabels and matchExpressions - are ANDed. An empty label selector matches + of matchLabels and matchExpressions are + ANDed. An empty label selector matches all objects. A null label selector matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a - list of label selector requirements. - The requirements are ANDed. + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. type: array items: description: A label selector requirement @@ -20760,13 +20343,12 @@ openAPIV3Schema: values: description: values is an array of string values. If the operator - is In or NotIn, the values - array must be non-empty. If - the operator is Exists or - DoesNotExist, the values array - must be empty. This array - is replaced during a strategic - merge patch. + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. type: array items: type: string @@ -20777,17 +20359,16 @@ openAPIV3Schema: type: string operator: description: operator represents - a key's relationship to a - set of values. Valid operators - are In, NotIn, Exists and - DoesNotExist. + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: - description: matchLabels is a map - of {key,value} pairs. A single {key,value} + description: matchLabels is a map of + {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator @@ -20810,22 +20391,22 @@ openAPIV3Schema: type: string namespaces: description: namespaces specifies which - namespaces the labelSelector applies - to (matches against); null or empty - list means "this pod's namespace" + namespaces the labelSelector applies to + (matches against); null or empty list + means "this pod's namespace" type: array items: type: string required: - - topologyKey + - topologyKey weight: description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight podAntiAffinity: description: Pod anti affinity is a group of inter pod anti affinity scheduling rules. @@ -20833,40 +20414,39 @@ openAPIV3Schema: properties: requiredDuringSchedulingIgnoredDuringExecution: description: If the anti-affinity requirements specified - by this field are not met at scheduling time, - the pod will not be scheduled onto the node. If - the anti-affinity requirements specified by this - field cease to be met at some point during pod - execution (e.g. due to a pod label update), the - system may or may not try to eventually evict - the pod from its node. When there are multiple - elements, the lists of nodes corresponding to - each podAffinityTerm are intersected, i.e. all - terms must be satisfied. + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the + anti-affinity requirements specified by this field + cease to be met at some point during pod execution + (e.g. due to a pod label update), the system may + or may not try to eventually evict the pod from + its node. When there are multiple elements, the + lists of nodes corresponding to each podAffinityTerm + are intersected, i.e. all terms must be satisfied. type: array items: description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located - (affinity) or not co-located (anti-affinity) - with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which - a pod of the set of pods is running + (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node + whose value of the label with key + matches that of any node on which a pod of the + set of pods is running type: object properties: labelSelector: description: A label selector is a label query over a set of resources. The result of matchLabels - and matchExpressions are ANDed. An empty - label selector matches all objects. A null - label selector matches no objects. + and matchExpressions are ANDed. An empty label + selector matches all objects. A null label + selector matches no objects. type: object properties: matchExpressions: description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. + of label selector requirements. The requirements + are ANDed. type: array items: description: A label selector requirement @@ -20876,14 +20456,14 @@ openAPIV3Schema: type: object properties: values: - description: values is an array - of string values. If the operator - is In or NotIn, the values array - must be non-empty. If the operator - is Exists or DoesNotExist, the - values array must be empty. This - array is replaced during a strategic - merge patch. + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. This array + is replaced during a strategic merge + patch. type: array items: type: string @@ -20892,14 +20472,14 @@ openAPIV3Schema: that the selector applies to. type: string operator: - description: operator represents - a key's relationship to a set - of values. Valid operators are - In, NotIn, Exists and DoesNotExist. + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels @@ -20911,15 +20491,14 @@ openAPIV3Schema: type: string type: object topologyKey: - description: This pod should be co-located - (affinity) or not co-located (anti-affinity) - with the pods matching the labelSelector - in the specified namespaces, where co-located - is defined as running on a node whose value - of the label with key topologyKey matches - that of any node on which any of the selected - pods is running. Empty topologyKey is not - allowed. + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the + pods matching the labelSelector in the specified + namespaces, where co-located is defined as + running on a node whose value of the label + with key topologyKey matches that of any node + on which any of the selected pods is running. + Empty topologyKey is not allowed. type: string namespaces: description: namespaces specifies which namespaces @@ -20929,53 +20508,52 @@ openAPIV3Schema: items: type: string required: - - topologyKey + - topologyKey preferredDuringSchedulingIgnoredDuringExecution: description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node - that violates one or more of the expressions. - The node that is most preferred is the one with - the greatest sum of weights, i.e. for each node - that meets all of the scheduling requirements - (resource request, requiredDuringScheduling anti-affinity - expressions, etc.), compute a sum by iterating - through the elements of this field and adding - "weight" to the sum if the node has pods which - matches the corresponding podAffinityTerm; the - node(s) with the highest sum are the most preferred. + that violates one or more of the expressions. The + node that is most preferred is the one with the + greatest sum of weights, i.e. for each node that + meets all of the scheduling requirements (resource + request, requiredDuringScheduling anti-affinity + expressions, etc.), compute a sum by iterating through + the elements of this field and adding "weight" to + the sum if the node has pods which matches the corresponding + podAffinityTerm; the node(s) with the highest sum + are the most preferred. type: array items: - description: The weights of all of the matched - WeightedPodAffinityTerm fields are added per-node - to find the most preferred node(s) + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) type: object properties: podAffinityTerm: - description: Defines a set of pods (namely - those matching the labelSelector relative - to the given namespace(s)) that this pod - should be co-located (affinity) or not co-located - (anti-affinity) with, where co-located is - defined as running on a node whose value - of the label with key matches - that of any node on which a pod of the set - of pods is running + description: Defines a set of pods (namely those + matching the labelSelector relative to the + given namespace(s)) that this pod should be + co-located (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on + which a pod of the set of pods is running type: object properties: labelSelector: description: A label selector is a label query over a set of resources. The result - of matchLabels and matchExpressions - are ANDed. An empty label selector matches + of matchLabels and matchExpressions are + ANDed. An empty label selector matches all objects. A null label selector matches no objects. type: object properties: matchExpressions: - description: matchExpressions is a - list of label selector requirements. - The requirements are ANDed. + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. type: array items: description: A label selector requirement @@ -20987,13 +20565,12 @@ openAPIV3Schema: values: description: values is an array of string values. If the operator - is In or NotIn, the values - array must be non-empty. If - the operator is Exists or - DoesNotExist, the values array - must be empty. This array - is replaced during a strategic - merge patch. + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. type: array items: type: string @@ -21004,17 +20581,16 @@ openAPIV3Schema: type: string operator: description: operator represents - a key's relationship to a - set of values. Valid operators - are In, NotIn, Exists and - DoesNotExist. + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. type: string required: - - key - - operator + - key + - operator matchLabels: - description: matchLabels is a map - of {key,value} pairs. A single {key,value} + description: matchLabels is a map of + {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator @@ -21037,30 +20613,29 @@ openAPIV3Schema: type: string namespaces: description: namespaces specifies which - namespaces the labelSelector applies - to (matches against); null or empty - list means "this pod's namespace" + namespaces the labelSelector applies to + (matches against); null or empty list + means "this pod's namespace" type: array items: type: string required: - - topologyKey + - topologyKey weight: description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. type: number required: - - podAffinityTerm - - weight + - podAffinityTerm + - weight clusterService: description: Customization affecting ClusterIP Kubernetes services for the WebLogic cluster. type: object properties: annotations: - description: The annotations to be attached to generated - resources. + description: The annotations to be attached to generated resources. additionalProperties: type: string type: object @@ -21075,18 +20650,18 @@ openAPIV3Schema: Legal values are NEVER, or IF_NEEDED. type: string enum: - - NEVER - - IF_NEEDED + - NEVER + - IF_NEEDED restartVersion: description: If present, every time this value is updated the operator will restart the required servers. type: string required: - - clusterName + - clusterName status: type: object - description: DomainStatus represents information about the status of a - domain. Status may trail the actual state of a system. + description: DomainStatus represents information about the status of a domain. + Status may trail the actual state of a system. properties: reason: type: string @@ -21099,16 +20674,16 @@ openAPIV3Schema: type: object properties: nodeName: - description: Name of node that is hosting the Pod containing - this WebLogic Server. + description: Name of node that is hosting the Pod containing this + WebLogic Server. type: string desiredState: description: Desired state of this WebLogic Server. Values are RUNNING, ADMIN, or SHUTDOWN. type: string clusterName: - description: WebLogic cluster name, if the server is part of - a cluster. + description: WebLogic cluster name, if the server is part of a + cluster. type: string serverName: description: WebLogic Server name. Required. @@ -21127,8 +20702,7 @@ openAPIV3Schema: type: string activationTime: format: date-time - description: RFC 3339 date and time at which the server - started. + description: RFC 3339 date and time at which the server started. type: string subsystems: description: Status of unhealthy subsystems, if any. @@ -21154,16 +20728,15 @@ openAPIV3Schema: type: string replicas: type: number - description: The number of running Managed Servers in the WebLogic - cluster if there is only one cluster in the domain and where the - cluster does not explicitly configure its replicas in a cluster - specification. + description: The number of running Managed Servers in the WebLogic cluster + if there is only one cluster in the domain and where the cluster does + not explicitly configure its replicas in a cluster specification. minimum: 0.0 startTime: type: string - description: RFC 3339 date and time at which the operator started - the domain. This will be when the operator begins processing and - will precede when the various servers or clusters are available. + description: RFC 3339 date and time at which the operator started the + domain. This will be when the operator begins processing and will + precede when the various servers or clusters are available. format: date-time conditions: type: array @@ -21180,17 +20753,17 @@ openAPIV3Schema: Available, and Failed. Required. type: string enum: - - Progressing - - Available - - Failed + - Progressing + - Available + - Failed lastTransitionTime: format: date-time description: Last time the condition transitioned from one status to another. type: string message: - description: Human-readable message indicating details about - last transition. + description: Human-readable message indicating details about last + transition. type: string lastProbeTime: format: date-time @@ -21202,8 +20775,8 @@ openAPIV3Schema: type: string message: type: string - description: A human readable message indicating details about why - the domain is in this condition. + description: A human readable message indicating details about why the + domain is in this condition. clusters: type: array description: Status of WebLogic clusters in this domain. diff --git a/operator/src/main/resources/scripts/encryption_util.py b/operator/src/main/resources/scripts/encryption_util.py new file mode 100644 index 00000000000..1eb2d3568e3 --- /dev/null +++ b/operator/src/main/resources/scripts/encryption_util.py @@ -0,0 +1,67 @@ +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# ------------ +# Description: +# ------------ +# +# This code uses WDT encryption utility class EncryptionUtils +# for encrypting and decryption the domain secret SerializedSystemIni.dat +# +# This script is invoked by jython. See modelInImage.sh encrypt_decrypt_domain_secret +# It's the user responsibility to save off the original file if needed +# + +from oracle.weblogic.deploy.encrypt import EncryptionUtils +from oracle.weblogic.deploy.encrypt import EncryptionException +from java.lang import String +import sys, os, traceback +from java.lang import System +from utils import trace + +def decrypt_file(cipher_text, password, outputfile): + try: + pwd = String(password) + x = EncryptionUtils.decryptString(cipher_text, pwd.toCharArray()) + restored_text = String(x) + fh = open(outputfile, "w") + fh.write(str(restored_text)) + fh.close() + System.exit(0) + except EncryptionException, e: + # Catch the exact exception to get the real cause + trace("SEVERE", "Error in decrypting file: %s" % e.getCause()) + System.exit(-1) + except: + exc_type, exc_obj, exc_tb = sys.exc_info() + eeString = traceback.format_exception(exc_type, exc_obj, exc_tb) + trace("SEVERE", "Error in decrypting file: %s" % eeString) + System.exit(-1) + +def encrypt_file(clear_text, password, outputfile): + try: + pwd = String(password) + x = EncryptionUtils.encryptString(clear_text, pwd.toCharArray()) + encrypted_text = String(x) + fh = open(outputfile, "w") + fh.write(str(encrypted_text)) + fh.close() + System.exit(0) + except EncryptionException, e: + # Catch the exact exception to get the real cause + trace("SEVERE", "Error in encrypting file: %s" % e.getCause()) + System.exit(-1) + except: + exc_type, exc_obj, exc_tb = sys.exc_info() + eeString = traceback.format_exception(exc_type, exc_obj, exc_tb) + trace("SEVERE", "Error in encrypting file: %s" % eeString) + System.exit(-1) + +if __name__ == "__main__": + if sys.argv[1] == 'encrypt': + encrypt_file(sys.argv[2], sys.argv[3], sys.argv[4]) + else: + if sys.argv[1] == 'decrypt': + decrypt_file(sys.argv[2], sys.argv[3], sys.argv[4]) + + diff --git a/operator/src/main/resources/scripts/introspectDomain.py b/operator/src/main/resources/scripts/introspectDomain.py index 5b9059a3a20..72c6a4d6587 100644 --- a/operator/src/main/resources/scripts/introspectDomain.py +++ b/operator/src/main/resources/scripts/introspectDomain.py @@ -123,8 +123,24 @@ def open(self): self.BOOT_FILE = self.INTROSPECT_HOME + '/boot.properties' self.USERCONFIG_FILE = self.INTROSPECT_HOME + '/userConfigNodeManager.secure' self.USERKEY_FILE = self.INTROSPECT_HOME + '/userKeyNodeManager.secure' - self.DOMAIN_SECRET_MD5_FILE = '/tmp/DomainSecret.md5' + # Model in image attributes + + self.DOMAIN_SECRET_MD5_FILE = '/tmp/DomainSecret.md5' + self.DOMAIN_ZIP = self.INTROSPECT_HOME + '/domainzip.secure' + self.PRIMORDIAL_DOMAIN_ZIP = self.INTROSPECT_HOME + '/primordial_domainzip.secure' + + self.INVENTORY_IMAGE_MD5 = self.INTROSPECT_HOME + '/inventory_image.md5' + self.INVENTORY_CM_MD5 = self.INTROSPECT_HOME + '/inventory_cm.md5' + self.INVENTORY_PASSPHRASE_MD5 = self.INTROSPECT_HOME + '/inventory_passphrase.md5' + self.MERGED_MODEL_FILE = self.INTROSPECT_HOME + '/merged_model.json' + self.EWALLET = self.INTROSPECT_HOME + '/ewallet.p12' + self.WLS_VERSION = self.INTROSPECT_HOME + "/wls.version" + self.JDK_PATH = self.INTROSPECT_HOME + "/jdk.path" + self.SECRETS_AND_ENV_MD5 = self.INTROSPECT_HOME + "/secrets_and_env.md5" + self.DOMAINZIP_HASH = self.INTROSPECT_HOME + "/domainzip_hash" + self.WDT_CONFIGMAP_PATH = self.getEnvOrDef('WDT_CONFIGMAP_PATH', + '/weblogic-operator/wdt-config-map') self.DOMAIN_SOURCE_TYPE = self.getEnvOrDef("DOMAIN_SOURCE_TYPE", None) # The following 4 env vars are for unit testing, their defaults are correct for production. @@ -149,7 +165,7 @@ def open(self): self.generatedFiles = [] - # create tmp directory (mkpath == 'mkdir -p') + # create tmp directory (mkpath == 'mkdir -p') distutils.dir_util.mkpath(self.INTROSPECT_HOME) @@ -166,6 +182,35 @@ def open(self): self.domain = cmo self.DOMAIN_NAME = self.getDomain().getName() + # this should only be done for model in image case + if self.DOMAIN_SOURCE_TYPE == "FromModel": + self.handle_ModelInImageDomain() + + def handle_ModelInImageDomain(self): + self.WDT_DOMAIN_TYPE = self.getEnvOrDef('WDT_DOMAIN_TYPE', 'WLS') + + try: + # find the em ear source path + cd('Application/em') + em_attrs = ls(returnMap='true', returnType='a') + self.empath = em_attrs['SourcePath'] + except: + self.empath = None + pass + + if self.WDT_DOMAIN_TYPE == 'JRF': + try: + # Only export if it is not there already (i.e. have not been copied from the secrets + if not os.path.exists('/tmp/opsswallet/ewallet.p12'): + opss_passphrase = self.getEnv('OPSS_PASSPHRASE') + os.mkdir('/tmp/opsswallet') + exportEncryptionKey(jpsConfigFile=self.getDomainHome() + '/config/fmwconfig/jps-config.xml', \ + keyFilePath='/tmp/opsswallet', keyFilePassword=opss_passphrase) + except: + trace("SEVERE","Error in exporting OPSS key ") + dumpStack() + sys.exit(1) + def getEmPath(self): return self.empath @@ -412,13 +457,13 @@ def getServerClusterPortPropertyValue(self, server, clusterListenPortProperty): if ssl is not None: sslListenPortEnabled = ssl.isEnabled() return { - LISTEN_PORT: server.getListenPort(), - LISTEN_PORT_ENABLED: server.isListenPortEnabled(), - SSL_LISTEN_PORT: sslListenPort, - SSL_LISTEN_PORT_ENABLED: sslListenPortEnabled, - ADMIN_LISTEN_PORT: server.getAdministrationPort(), - ADMIN_LISTEN_PORT_ENABLED: server.isAdministrationPortEnabled() - }[clusterListenPortProperty] + LISTEN_PORT: server.getListenPort(), + LISTEN_PORT_ENABLED: server.isListenPortEnabled(), + SSL_LISTEN_PORT: sslListenPort, + SSL_LISTEN_PORT_ENABLED: sslListenPortEnabled, + ADMIN_LISTEN_PORT: server.getAdministrationPort(), + ADMIN_LISTEN_PORT_ENABLED: server.isAdministrationPortEnabled() + }[clusterListenPortProperty] def validateNonDynamicClusterServersHaveSameListenPort(self, cluster): firstServer = None @@ -436,8 +481,8 @@ def validateNonDynamicClusterServersHaveSameListenPort(self, cluster): sslListenPort = None sslListenPortEnabled = None if ssl is not None: - sslListenPort = ssl.getListenPort() - sslListenPortEnabled = ssl.isEnabled() + sslListenPort = ssl.getListenPort() + sslListenPortEnabled = ssl.isEnabled() adminPort = server.getAdministrationPort() adminPortEnabled = server.isAdministrationPortEnabled() if firstServer is None: @@ -454,7 +499,7 @@ def validateNonDynamicClusterServersHaveSameListenPort(self, cluster): if listenPortEnabled != firstListenPortEnabled: self.addError("The WebLogic configured cluster " + self.name(cluster) + "'s server " + self.name(firstServer) + " has listen port enabled: " + self.booleanToString(firstListenPortEnabled) + " but its server " + self.name(server) + "'s listen port enabled: " + self.booleanToString(listenPortEnabled) + ". Channels in a cluster must be either all enabled or disabled.") if sslListenPort != firstSslListenPort: - self.addError("The WebLogic configured cluster " + self.name(cluster) + "'s server " + self.name(firstServer) + "'s ssl listen port is " + str(firstSslListenPort) + " but its server " + self.name(server) + "'s ssl listen port is " + str(sslListenPort) + ". All ports for the same channel in a cluster must be the same.") + self.addError("The WebLogic configured cluster " + self.name(cluster) + "'s server " + self.name(firstServer) + "'s ssl listen port is " + str(firstSslListenPort) + " but its server " + self.name(server) + "'s ssl listen port is " + str(sslListenPort) + ". All ports for the same channel in a cluster must be the same.") if sslListenPortEnabled != firstSslListenPortEnabled: self.addError("The WebLogic configured cluster " + self.name(cluster) + "'s server " + self.name(firstServer) + " has ssl listen port enabled: " + self.booleanToString(firstSslListenPortEnabled) + " but its server " + self.name(server) + "'s ssl listen port enabled: " + self.booleanToString(sslListenPortEnabled) + ". Channels in a cluster must be either all enabled or disabled.") if adminPort != firstAdminPort: @@ -477,28 +522,28 @@ def validateClusterServersListenPortProperty(self, cluster, errorMsg, clusterLis return def validateNonDynamicClusterServerHaveSameCustomChannels(self, cluster): - firstServer = None - serverNap = {} - for server in self.env.getDomain().getServers(): - if cluster is self.env.getClusterOrNone(server): - if firstServer is None: - for nap in server.getNetworkAccessPoints(): - serverNap[nap.getName()] = nap.getProtocol() + "~" + str(nap.getListenPort()); - firstServer = server - else: - naps = server.getNetworkAccessPoints() - if len(naps) != len(serverNap): - self.addError("The WebLogic configured cluster " + self.name(cluster) + " has mismatched number of network access points in servers " + self.name(firstServer) + " and " + self.name(server) + ". All network access points in a cluster must be the same.") - return - else: - for nap in naps: - if nap.getName() in serverNap: - if serverNap[nap.getName()] != nap.getProtocol() + "~" + str(nap.getListenPort()): - self.addError("The WebLogic configured cluster " + self.name(cluster) + " has mismatched network access point " + self.name(nap) + " in servers " + self.name(firstServer) + " and " + self.name(server) + ". All network access points in a cluster must be the same.") - return - else: - self.addError("The WebLogic configured cluster " + self.name(cluster) + " has mismatched network access point " + self.name(nap) + " in servers " + self.name(firstServer) + " and " + self.name(server) + ". All network access points in a cluster must be the same.") - return + firstServer = None + serverNap = {} + for server in self.env.getDomain().getServers(): + if cluster is self.env.getClusterOrNone(server): + if firstServer is None: + for nap in server.getNetworkAccessPoints(): + serverNap[nap.getName()] = nap.getProtocol() + "~" + str(nap.getListenPort()); + firstServer = server + else: + naps = server.getNetworkAccessPoints() + if len(naps) != len(serverNap): + self.addError("The WebLogic configured cluster " + self.name(cluster) + " has mismatched number of network access points in servers " + self.name(firstServer) + " and " + self.name(server) + ". All network access points in a cluster must be the same.") + return + else: + for nap in naps: + if nap.getName() in serverNap: + if serverNap[nap.getName()] != nap.getProtocol() + "~" + str(nap.getListenPort()): + self.addError("The WebLogic configured cluster " + self.name(cluster) + " has mismatched network access point " + self.name(nap) + " in servers " + self.name(firstServer) + " and " + self.name(server) + ". All network access points in a cluster must be the same.") + return + else: + self.addError("The WebLogic configured cluster " + self.name(cluster) + " has mismatched network access point " + self.name(nap) + " in servers " + self.name(firstServer) + " and " + self.name(server) + ". All network access points in a cluster must be the same.") + return def validateDynamicCluster(self, cluster): @@ -571,7 +616,7 @@ def addConfiguredClusters(self): for cluster in clusters: self.addConfiguredCluster(cluster) self.undent() - + def getConfiguredClusters(self): rtn = [] for cluster in self.env.getDomain().getClusters(): @@ -662,7 +707,7 @@ def addDynamicClusters(self): for cluster in clusters: self.addDynamicCluster(cluster) self.undent() - + def getDynamicClusters(self): rtn = [] for cluster in self.env.getDomain().getClusters(): @@ -830,7 +875,7 @@ def addUserConfigAndKey(self): username = self.readCredentialsSecret("username") password = self.readCredentialsSecret("password") nm_host = 'localhost' - nm_port = '5556' + nm_port = '5556' domain_name = self.env.getDomain().getName() domain_home = self.env.getDomainHome() isNodeManager = "true" @@ -855,6 +900,120 @@ def addUserConfigAndKey(self): finally: nmDisconnect() +class MII_DomainConfigGenerator(Generator): + + def __init__(self, env): + Generator.__init__(self, env, env.DOMAIN_ZIP) + self.env = env + self.domain_home = self.env.getDomainHome() + def generate(self): + self.open() + try: + self.addDomainConfig() + self.close() + self.addGeneratedFile() + finally: + self.close() + + def addDomainConfig(self): + em_ear_path = self.env.getEmPath() + empath = '' + if em_ear_path is not None and os.path.exists(em_ear_path): + empath = em_ear_path + # Note: only config type is needed fmwconfig, security is excluded because it's in the primordial and contain + # all the many policies files + packcmd = "tar -pczf /tmp/domain.tar.gz %s/config/config.xml %s/config/jdbc/ %s/config/jms %s/config/coherence " \ + "%s/config/diagnostics %s/config/startup %s/config/configCache %s/config/nodemanager " \ + "%s/config/security %s" % ( + self.domain_home, self.domain_home, self.domain_home, self.domain_home, self.domain_home, + self.domain_home, self.domain_home, self.domain_home, self.domain_home, empath) + os.system(packcmd) + domain_data = self.env.readBinaryFile("/tmp/domain.tar.gz") + b64 = "" + for s in base64.encodestring(domain_data).splitlines(): + b64 = b64 + s + self.writeln(b64) + domainzip_hash = md5.new(domain_data).hexdigest() + fh = open("/tmp/domainzip_hash", "w") + fh.write(domainzip_hash) + fh.close() + trace('done zipping up domain ') + + +class MII_OpssWalletFileGenerator(Generator): + + def __init__(self, env): + Generator.__init__(self, env, env.EWALLET) + self.env = env + self.domain_home = self.env.getDomainHome() + def generate(self): + self.open() + try: + self.addWallet() + self.close() + self.addGeneratedFile() + finally: + self.close() + + def addWallet(self): + wallet_data = self.env.readBinaryFile("/tmp/opsswallet/ewallet.p12") + b64 = "" + for s in base64.encodestring(wallet_data).splitlines(): + b64 = b64 + s + self.writeln(b64) + trace("done writing opss key") + + +class MII_PrimordialDomainGenerator(Generator): + + def __init__(self, env): + Generator.__init__(self, env, env.PRIMORDIAL_DOMAIN_ZIP) + self.env = env + self.domain_home = self.env.getDomainHome() + def generate(self): + self.open() + try: + self.addPrimordialDomain() + self.close() + self.addGeneratedFile() + finally: + self.close() + + def addPrimordialDomain(self): + primordial_domain_data = self.env.readBinaryFile("/tmp/prim_domain.tar.gz") + b64 = "" + for s in base64.encodestring(primordial_domain_data).splitlines(): + b64 = b64 + s + self.writeln(b64) + trace("done writing primordial domain") + + +class MII_IntrospectCMFileGenerator(Generator): + + def __init__(self, env, inventory, fromfile): + Generator.__init__(self, env, inventory) + self.env = env + self.fromfile = fromfile + + def generate(self): + self.open() + try: + rc = self.addFile() + self.close() + if rc is not None: + self.addGeneratedFile() + finally: + self.close() + + def addFile(self): + if os.path.exists(self.fromfile): + file_str = self.env.readFile(self.fromfile) + self.writeln(file_str) + return "hasfile" + else: + return None + + class SitConfigGenerator(Generator): def __init__(self, env): @@ -954,7 +1113,7 @@ def customizeNetworkAccessPoints(self, server, listen_address): def customizeNetworkAccessPoint(self, nap, listen_address): # Don't bother 'add' a nap listen-address, only do a 'replace'. - # If we try 'add' this appears to mess up an attempt to + # If we try 'add' this appears to mess up an attempt to # 'add' PublicAddress/Port via custom sit-cfg. # FWIW there's theoretically no need to 'add' or 'replace' when empty # since the runtime default is the server listen-address. @@ -962,19 +1121,17 @@ def customizeNetworkAccessPoint(self, nap, listen_address): istio_enabled = self.env.getEnvOrDef("ISTIO_ENABLED", "false") nap_name=nap.getName() - if not (nap.getListenAddress() is None) and len(nap.getListenAddress()) > 0 and not (nap_name.startswith('istio-')): - self.writeln("") - self.indent() - self.writeln("" + nap_name + "") - if istio_enabled == 'true': - self.writeListenAddress("force a replace", '127.0.0.1') - replace_action = 'f:combine-mode="replace"' - self.writeln('%s' % (replace_action, listen_address)) - else: - self.writeListenAddress("force a replace",listen_address) + if not (nap.getListenAddress() is None) and len(nap.getListenAddress()) > 0: + self.writeln("") + self.indent() + self.writeln("" + nap_name + "") + if istio_enabled == 'true': + self.writeListenAddress("force a replace", '127.0.0.1') + else: + self.writeListenAddress("force a replace",listen_address) - self.undent() - self.writeln("") + self.undent() + self.writeln("") def _getNapConfigOverrideAction(self, svr, testname): replace_action = 'f:combine-mode="replace"' @@ -1010,7 +1167,8 @@ def _writeIstioNAP(self, name, server, listen_address, listen_port, protocol, ht self.writeln('%s' % (action, protocol)) self.writeln('127.0.0.1' % action) - self.writeln('%s' % (action, listen_address)) + self.writeln('%s.%s' % (action, listen_address, + self.env.getEnvOrDef("ISTIO_POD_NAMESPACE", "default"))) self.writeln('%s' % (action, listen_port)) self.writeln('%s' % (action, http_enabled)) @@ -1057,7 +1215,7 @@ def customizeServerIstioNetworkAccessPoint(self, listen_address, server): if ssl is not None and ssl.isEnabled(): ssl_listen_port = ssl.getListenPort() self._writeIstioNAP(name='https-secure', server=server, listen_address=listen_address, - listen_port=ssl_listen_port, protocol='https', http_enabled="true") + listen_port=ssl_listen_port, protocol='https', http_enabled="true") self._writeIstioNAP(name='tls-ldaps', server=server, listen_address=listen_address, listen_port=ssl_listen_port, protocol='ldaps') @@ -1242,7 +1400,7 @@ def __init__(self, env): secret_path = os.path.join(self.env.CUSTOM_SECRET_ROOT, secret_name) self.addSecretsFromDirectory(secret_path, secret_name) - self.addSecretsFromDirectory(self.env.CREDENTIALS_SECRET_PATH, + self.addSecretsFromDirectory(self.env.CREDENTIALS_SECRET_PATH, self.env.CREDENTIALS_SECRET_NAME) self.macroMap['env:DOMAIN_UID'] = self.env.DOMAIN_UID @@ -1263,19 +1421,19 @@ def __init__(self, env): # Populate module maps with known module files and names, log them self.jdbcModuleStr = self.buildModuleTable( - 'jdbc', - self.env.getDomain().getJDBCSystemResources(), - self.env.CUSTOM_PREFIX_JDBC) + 'jdbc', + self.env.getDomain().getJDBCSystemResources(), + self.env.CUSTOM_PREFIX_JDBC) self.jmsModuleStr = self.buildModuleTable( - 'jms', - self.env.getDomain().getJMSSystemResources(), - self.env.CUSTOM_PREFIX_JMS) + 'jms', + self.env.getDomain().getJMSSystemResources(), + self.env.CUSTOM_PREFIX_JMS) self.wldfModuleStr = self.buildModuleTable( - 'diagnostics', - self.env.getDomain().getWLDFSystemResources(), - self.env.CUSTOM_PREFIX_WLDF) + 'diagnostics', + self.env.getDomain().getWLDFSystemResources(), + self.env.CUSTOM_PREFIX_WLDF) trace('Available modules: ' + self.moduleStr) @@ -1284,7 +1442,7 @@ def addSecretsFromDirectory(self, secret_path, secret_name): if not os.path.isdir(secret_path): # The operator pod somehow put a file where we # only expected to find a directory mount. - self.env.addError("Internal Error: Secret path'" + self.env.addError("Internal Error: Secret path'" + secret_path + "'" + + " is not a directory.") return @@ -1320,14 +1478,14 @@ def buildModuleTable(self, moduleTypeStr, moduleResourceBeans, customPrefix): "Error, the operator expects module files of type '" + moduleTypeStr + "'" + " to be located in directory '" + moduleTypeStr + "/'" + ", but the " + moduleTypeStr + " system resource module '" + mname + "'" - + " is configured with DescriptorFileName='" + mfile + "'.") + + " is configured with DescriptorFileName='" + mfile + "'.") if mfile.count(".xml") != 1 or mfile.find(".xml") + 4 != len(mfile): self.env.addError( "Error, the operator expects system resource module files" + " to end in '.xml'" + ", but the " + moduleTypeStr + " system resource module '" + mname + "'" - + " is configured with DescriptorFileName='" + mfile + "'.") + + " is configured with DescriptorFileName='" + mfile + "'.") if not firstModule: self.moduleStr += ", " @@ -1342,7 +1500,7 @@ def buildModuleTable(self, moduleTypeStr, moduleResourceBeans, customPrefix): # end of for loop - self.moduleStr += ')' + self.moduleStr += ')' def validateUnresolvedMacros(self, file, filestr): @@ -1363,7 +1521,7 @@ def validateUnresolvedMacros(self, file, filestr): errstr += "," errstr += unknown_macro if errstr: - self.env.addError("Error, unresolvable macro(s) '" + errstr + "'" + self.env.addError("Error, unresolvable macro(s) '" + errstr + "'" + " in custom sit config file '" + file + "'." + " Known macros are '" + self.macroStr + "'.") @@ -1384,20 +1542,20 @@ def generateAndValidate(self): # versionPath=os.path.join(self.env.CUSTOM_SITCFG_PATH,"version.txt") if not os.path.exists(versionPath): - self.env.addError("Error, Required file, '"+versionPath+"', does not exist") + self.env.addError("Error, Required file, '"+versionPath+"', does not exist") else: - version=self.env.readFile(versionPath).strip() - if not version == "2.0": - # truncate and ellipsify at 75 characters - version = version[:75] + (version[75:] and '...') - self.env.addError("Error, "+versionPath+" does not have the value of" - + " '2.0'. The current content: '" + version - + "' is not valid.") + version=self.env.readFile(versionPath).strip() + if not version == "2.0": + # truncate and ellipsify at 75 characters + version = version[:75] + (version[75:] and '...') + self.env.addError("Error, "+versionPath+" does not have the value of" + + " '2.0'. The current content: '" + version + + "' is not valid.") for the_file in os.listdir(self.env.CUSTOM_SITCFG_PATH): if the_file == "version.txt": - continue + continue the_file_path = os.path.join(self.env.CUSTOM_SITCFG_PATH, the_file) @@ -1409,11 +1567,11 @@ def generateAndValidate(self): # check if file name corresponds with config.xml or a module if not self.moduleMap.has_key(the_file) and the_file != "config.xml": - self.env.addError("Error, custom sit config override file '" + the_file + "'" - + " is not named 'config.xml' or has no matching system resource" - + " module. Custom sit config files must be named 'config.xml'" - + " to override config.xml or 'moduletype-modulename.xml' to override" - + " a module. Known module names for each type: " + self.moduleStr + ".") + self.env.addError("Error, custom sit config override file '" + the_file + "'" + + " is not named 'config.xml' or has no matching system resource" + + " module. Custom sit config files must be named 'config.xml'" + + " to override config.xml or 'moduletype-modulename.xml' to override" + + " a module. Known module names for each type: " + self.moduleStr + ".") continue # substitute macros and validate unresolved macros @@ -1432,7 +1590,7 @@ def generateAndValidate(self): genfile = self.env.INTROSPECT_HOME + '/'; if the_file == 'config.xml': - genfile += self.env.CUSTOM_PREFIX_CFG + 'custom-situational-config.xml' + genfile += self.env.CUSTOM_PREFIX_CFG + 'custom-situational-config.xml' else: genfile += self.moduleMap[the_file] @@ -1457,12 +1615,39 @@ def introspect(self): UserConfigAndKeyGenerator(self.env).generate() DOMAIN_SOURCE_TYPE = self.env.getEnvOrDef("DOMAIN_SOURCE_TYPE", None) + if DOMAIN_SOURCE_TYPE == "FromModel": + trace("cfgmap write primordial_domain") + MII_PrimordialDomainGenerator(self.env).generate() + trace("cfgmap write domain zip") + MII_DomainConfigGenerator(self.env).generate() + trace("cfgmap write merged model") + MII_IntrospectCMFileGenerator(self.env, self.env.MERGED_MODEL_FILE, + self.env.DOMAIN_HOME +"/wlsdeploy/domain_model.json").generate() + trace("cfgmap write md5 image") + MII_IntrospectCMFileGenerator(self.env, self.env.INVENTORY_IMAGE_MD5, '/tmp/inventory_image.md5').generate() + trace("cfgmap write md5 cm") + MII_IntrospectCMFileGenerator(self.env, self.env.INVENTORY_CM_MD5, '/tmp/inventory_cm.md5').generate() + trace("cfgmap write wls version") + MII_IntrospectCMFileGenerator(self.env, self.env.WLS_VERSION, '/tmp/wls_version').generate() + trace("cfgmap write jdk_path") + MII_IntrospectCMFileGenerator(self.env, self.env.JDK_PATH, '/tmp/jdk_path').generate() + trace("cfgmap write md5 secrets") + MII_IntrospectCMFileGenerator(self.env, self.env.SECRETS_AND_ENV_MD5, '/tmp/secrets_and_env.md5').generate() + trace("cfgmap write model hash") + # Must be called after MII_PrimordialDomainGenerator + MII_IntrospectCMFileGenerator(self.env, self.env.DOMAINZIP_HASH, '/tmp/domainzip_hash').generate() + + if self.env.WDT_DOMAIN_TYPE == 'JRF': + trace("cfgmap write JRF wallet") + MII_OpssWalletFileGenerator(self.env).generate() + + CustomSitConfigIntrospector(self.env).generateAndValidate() # If the topology is invalid, the generated topology # file contains a list of one or more validation errors # instead of a topology. - + tg.generate() # Work-around bugs in off-line WLST when accessing an SSL mbean @@ -1505,4 +1690,4 @@ def main(env): dumpStack() exit(exitcode=1) -main(OfflineWlstEnv()) \ No newline at end of file +main(OfflineWlstEnv()) diff --git a/operator/src/main/resources/scripts/introspectDomain.sh b/operator/src/main/resources/scripts/introspectDomain.sh index 17bdc51944b..dd5ebc44253 100644 --- a/operator/src/main/resources/scripts/introspectDomain.sh +++ b/operator/src/main/resources/scripts/introspectDomain.sh @@ -83,10 +83,12 @@ checkEnv -q \ NODEMGR_HOME \ WL_HOME \ MW_HOME \ + OPERATOR_ENVVAR_NAMES \ || exit 1 for script_file in "${SCRIPTPATH}/wlst.sh" \ "${SCRIPTPATH}/startNodeManager.sh" \ + "${SCRIPTPATH}/modelInImage.sh" \ "${SCRIPTPATH}/introspectDomain.py"; do [ ! -f "$script_file" ] && trace SEVERE "Missing file '${script_file}'." && exit 1 done @@ -103,6 +105,50 @@ if [ ! -z "${DATA_HOME}" ] && [ ! -d "${DATA_HOME}" ]; then createFolder ${DATA_HOME} fi + +traceTiming "INTROSPECTOR '${DOMAIN_UID}' MII CREATE DOMAIN START" + +source ${SCRIPTPATH}/modelInImage.sh +if [ $? -ne 0 ]; then + trace SEVERE "Error sourcing modelInImage.sh" && exit 1 +fi + +# Add another env/attribute in domain yaml for model in image +# log error if dir exists and attribute set +DOMAIN_CREATED=0 +if [ ${DOMAIN_SOURCE_TYPE} == "FromModel" ]; then + trace "Beginning Model In Image" + command -v gzip + if [ $? -ne 0 ] ; then + trace SEVERE "DomainSourceType is 'FromModel', 'gzip' is missing in the image. Please use an image with 'gzip' installed" && exit 1 + fi + command -v tar + if [ $? -ne 0 ] ; then + trace SEVERE "DomainSourceType is 'FromModel', 'tar' is missing in the image. Please use an image with 'tar' installed" && exit 1 + fi + command -v unzip + if [ $? -ne 0 ] ; then + trace SEVERE "DomainSourceType is 'FromModel', 'unzip' is missing in the image. Please use an image with 'unzip' installed" && exit 1 + fi + mkdir -p ${DOMAIN_HOME} + if [ $? -ne 0 ] ; then + trace SEVERE "DomainSourceType is 'FromModel', cannot create domain home directory '${DOMAIN_HOME}'" && exit 1 + fi + touch ${DOMAIN_HOME}/testaccess.tmp + if [ $? -ne 0 ]; then + trace SEVERE "DomainSourceType is 'FromModel', cannot write to domain home directory '${DOMAIN_HOME}'" && exit 1 + fi + rm -f ${DOMAIN_HOME}/testaccess.tmp + createWLDomain || exit 1 + created_domain=$DOMAIN_CREATED + trace "Create domain return code = " ${created_domain} +else + created_domain=1 +fi + +traceTiming "INTROSPECTOR '${DOMAIN_UID}' MII CREATE DOMAIN END" + + # check DOMAIN_HOME for a config/config.xml, reset DOMAIN_HOME if needed exportEffectiveDomainHome || exit 1 @@ -119,28 +165,35 @@ checkWebLogicVersion || exit 1 # start node manager # run instrospector wlst script -traceTiming "INTROSPECTOR '${DOMAIN_UID}' NM START" +if [ ${created_domain} -ne 0 ]; then + + traceTiming "INTROSPECTOR '${DOMAIN_UID}' MII NM START" -# start node manager -why ?? -trace "Starting node manager" -${SCRIPTPATH}/startNodeManager.sh || exit 1 + # start node manager -why ?? + trace "Starting node manager" + ${SCRIPTPATH}/startNodeManager.sh || exit 1 -traceTiming "INTROSPECTOR '${DOMAIN_UID}' NM END" + traceTiming "INTROSPECTOR '${DOMAIN_UID}' MII NM END" -traceTiming "INTROSPECTOR '${DOMAIN_UID}' MD5 START" + traceTiming "INTROSPECTOR '${DOMAIN_UID}' MII MD5 START" -# put domain secret's md5 cksum in file '/tmp/DomainSecret.md5' -# the introspector wlst script and WL server pods will use this value -generateDomainSecretMD5File '/tmp/DomainSecret.md5' || exit 1 + traceTiming "INTROSPECTOR '${DOMAIN_UID}' MII NM END" -traceTiming "INTROSPECTOR '${DOMAIN_UID}' MD5 END" + traceTiming "INTROSPECTOR '${DOMAIN_UID}' MII MD5 START" -traceTiming "INTROSPECTOR '${DOMAIN_UID}' INTROSPECT START" + # put domain secret's md5 cksum in file '/tmp/DomainSecret.md5' + # the introspector wlst script and WL server pods will use this value + generateDomainSecretMD5File '/tmp/DomainSecret.md5' || exit 1 -trace "Running introspector WLST script ${SCRIPTPATH}/introspectDomain.py" -${SCRIPTPATH}/wlst.sh ${SCRIPTPATH}/introspectDomain.py || exit 1 + traceTiming "INTROSPECTOR '${DOMAIN_UID}' MII MD5 END" -traceTiming "INTROSPECTOR '${DOMAIN_UID}' INTROSPECT END" + traceTiming "INTROSPECTOR '${DOMAIN_UID}' INTROSPECT START" + + trace "Running introspector WLST script ${SCRIPTPATH}/introspectDomain.py" + ${SCRIPTPATH}/wlst.sh ${SCRIPTPATH}/introspectDomain.py || exit 1 + + traceTiming "INTROSPECTOR '${DOMAIN_UID}' INTROSPECT END" +fi trace "Domain introspection complete" exit 0 diff --git a/operator/src/main/resources/scripts/livenessProbe.sh b/operator/src/main/resources/scripts/livenessProbe.sh index 3e8e285bbfe..e742495ed04 100755 --- a/operator/src/main/resources/scripts/livenessProbe.sh +++ b/operator/src/main/resources/scripts/livenessProbe.sh @@ -7,6 +7,49 @@ # the pod should be restarted. The script checks a WebLogic Server state file which # is updated by the node manager. +function copySitCfgWhileRunning() { + # Helper fn to copy sit cfg xml files to the WL server's domain home. + # - params $1/$2/$3 == 'src_dir tgt_dir fil_prefix' + # - $src_dir files are assumed to start with $fil_prefix and end with .xml + # - copied $tgt_dir files are stripped of their $fil_prefix + # - any .xml files in $tgt_dir that are not in $src_dir/$fil_prefix+FILE are deleted + # + # This method is called while the server is already running, see + # 'copySitCfgWhileBooting' in 'startServer.sh' for a similar method that + # is called just before the server boots. + # + # It will do nothing unless the environment variable DYNAMIC_CONFIG_OVERRIDE is set. + +if [ ! "${DYNAMIC_CONFIG_OVERRIDE:-notset}" = notset ]; then + ( + shopt -s nullglob # force file matching 'glob' for loops below to run 0 times if 0 matches + local src_dir=${1?} + local tgt_dir=${2?} + local fil_prefix=${3?} + local local_fname + local tgt_file + mkdir -p $tgt_dir # TBD ignore any error? + for local_fname in ${src_dir}/${fil_prefix}*.xml ; do + tgt_file=${local_fname/$fil_prefix//} # strip out file prefix from source file + tgt_file=$(basename $tgt_file) # strip out dir path since it's the source file path + tgt_file=$tgt_dir/$tgt_file # add back in tgt dir path + [ -f "$tgt_file" ] && [ -z "$(diff $local_fname $tgt_file 2>&1)" ] && continue # nothing changed + trace "Copying file '$local_fname' to '$tgt_file'." + cp $local_fname $tgt_file # TBD ignore any error? + chmod 750 $tgt_file # TBD ignore any error? + done + for local_fname in ${tgt_dir}/*.xml ; do + if [ -f "$src_dir/${fil_prefix}$(basename ${local_fname})" ]; then + continue + fi + trace "Deleting '$local_fname' since it has no corresponding '$src_dir' file." + rm -f $local_fname # TBD ignore any error? + done + ) + fi +} + + # if the livenessProbeSuccessOverride file is available, treat failures as success: RETVAL=$(test -f /weblogic-operator/debug/livenessProbeSuccessOverride ; echo $?) @@ -36,4 +79,10 @@ if [ -f ${STATEFILE} ] && [ `grep -c "FAILED_NOT_RESTARTABLE" ${STATEFILE}` -eq trace SEVERE "WebLogic Server state is FAILED_NOT_RESTARTABLE." exit $RETVAL fi + +copySitCfgWhileRunning /weblogic-operator/introspector ${DOMAIN_HOME}/optconfig 'Sit-Cfg-CFG--' +copySitCfgWhileRunning /weblogic-operator/introspector ${DOMAIN_HOME}/optconfig/jms 'Sit-Cfg-JMS--' +copySitCfgWhileRunning /weblogic-operator/introspector ${DOMAIN_HOME}/optconfig/jdbc 'Sit-Cfg-JDBC--' +copySitCfgWhileRunning /weblogic-operator/introspector ${DOMAIN_HOME}/optconfig/diagnostics 'Sit-Cfg-WLDF--' + exit 0 diff --git a/operator/src/main/resources/scripts/modelInImage.sh b/operator/src/main/resources/scripts/modelInImage.sh new file mode 100755 index 00000000000..9620c487608 --- /dev/null +++ b/operator/src/main/resources/scripts/modelInImage.sh @@ -0,0 +1,869 @@ +#!/usr/bin/env bash +# Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# This script contains the all the function of model in image +# It is used by introspectDomain.sh job and starServer.sh + +source ${SCRIPTPATH}/utils.sh + +WDT_MINIMUM_VERSION="1.7.3" +INTROSPECTCM_IMAGE_MD5="/weblogic-operator/introspectormii/inventory_image.md5" +INTROSPECTCM_CM_MD5="/weblogic-operator/introspectormii/inventory_cm.md5" +INTROSPECTCM_PASSPHRASE_MD5="/weblogic-operator/introspectormii/inventory_passphrase.md5" +INTROSPECTCM_MERGED_MODEL="/weblogic-operator/introspectormii/merged_model.json" +INTROSPECTCM_WLS_VERSION="/weblogic-operator/introspectormii/wls.version" +INTROSPECTCM_JDK_PATH="/weblogic-operator/introspectormii/jdk.path" +INTROSPECTCM_SECRETS_AND_ENV_MD5="/weblogic-operator/introspectormii/secrets_and_env.md5" +DOMAIN_ZIPPED="/weblogic-operator/introspectormii/domainzip.secure" +PRIMORDIAL_DOMAIN_ZIPPED="/weblogic-operator/introspectormii/primordial_domainzip.secure" +INTROSPECTJOB_IMAGE_MD5="/tmp/inventory_image.md5" +INTROSPECTJOB_CM_MD5="/tmp/inventory_cm.md5" +INTROSPECTJOB_PASSPHRASE_MD5="/tmp/inventory_passphrase.md5" +LOCAL_PRIM_DOMAIN_ZIP="/tmp/prim_domain.tar.gz" +LOCAL_PRIM_DOMAIN_TAR="/tmp/prim_domain.tar" +NEW_MERGED_MODEL="/tmp/new_merged_model.json" +WDT_CONFIGMAP_ROOT="/weblogic-operator/wdt-config-map" +RUNTIME_ENCRYPTION_SECRET_PASSWORD="/weblogic-operator/model-runtime-secret/password" +OPSS_KEY_PASSPHRASE="/weblogic-operator/opss-walletkey-secret/walletPassword" +OPSS_KEY_B64EWALLET="/weblogic-operator/opss-walletfile-secret/walletFile" +IMG_MODELS_HOME="/u01/wdt/models" +IMG_MODELS_ROOTDIR="${IMG_MODELS_HOME}" +IMG_ARCHIVES_ROOTDIR="${IMG_MODELS_HOME}" +IMG_VARIABLE_FILES_ROOTDIR="${IMG_MODELS_HOME}" +WDT_ROOT="/u01/wdt/weblogic-deploy" +WDT_OUTPUT="/tmp/wdt_output.log" +WDT_BINDIR="${WDT_ROOT}/bin" +WDT_FILTER_JSON="/weblogic-operator/scripts/model_filters.json" +WDT_CREATE_FILTER="/weblogic-operator/scripts/wdt_create_filter.py" +UPDATE_RCUPWD_FLAG="" +WLSDEPLOY_PROPERTIES="${WLSDEPLOY_PROPERTIES} -Djava.security.egd=file:/dev/./urandom" +ARCHIVE_ZIP_CHANGED=0 +WDT_ARTIFACTS_CHANGED=0 +ROLLBACK_ERROR=3 + +# return codes for model_diff +UNSAFE_ONLINE_UPDATE=0 +SAFE_ONLINE_UPDATE=1 +FATAL_MODEL_CHANGES=2 +MODELS_SAME=3 +SECURITY_INFO_UPDATED=4 +RCU_PASSWORD_CHANGED=5 + +SCRIPT_ERROR=255 + +export WDT_MODEL_SECRETS_DIRS="/weblogic-operator/config-overrides-secrets" +[ ! -d ${WDT_MODEL_SECRETS_DIRS} ] && unset WDT_MODEL_SECRETS_DIRS + +#TBD: CREDENTIALS_SECRET_NAME is unexpectedly empty. Maybe that's a regression? +# export WDT_MODEL_SECRETS_NAME_DIR_PAIRS="__weblogic-credentials__=/weblogic-operator/secrets,__WEBLOGIC-CREDENTIALS__=/weblogic-operator/secrets,${CREDENTIALS_SECRET_NAME}=/weblogic-operator/secret" +#For now: +export WDT_MODEL_SECRETS_NAME_DIR_PAIRS="__weblogic-credentials__=/weblogic-operator/secrets,__WEBLOGIC-CREDENTIALS__=/weblogic-operator/secrets" + + +# sort_files sort the files according to the names and naming conventions and write the result to stdout +# $1 directory +# $2 extension +# + +function sort_files() { + shopt -s nullglob + root_dir=$1 + ext=$2 + declare -A sequence_array + for file in ${root_dir}/*${ext} ; + do + actual_filename=$(basename $file) + base_filename=$(basename ${file%.*}) + sequence="${base_filename##*.}" + sequence_array[${actual_filename}]=${sequence} + done + for k in "${!sequence_array[@]}" ; + do + # MUST use echo , caller depends on stdout + echo $k ' - ' ${sequence_array["$k"]} + done | + sort -n -k3 | cut -d' ' -f 1 + shopt -u nullglob +} + +# +# compareArtifactsMD5 checks the WDT artifacts MD5s in the introspect config map against the current introspect job +# WDT artifacts MD5s +# +# If there are any differences, set WDT_ARTIFACTS_CHANGED=1 +# If there are any WDT archives changed set ARCHIVE_ZIP_CHANGED=1 (for online update) (TODO) +# + +function compareArtifactsMD5() { + + local has_md5=0 + + trace "Entering checkExistInventory" + + trace "Checking wdt artifacts in image" + if [ -f ${INTROSPECTCM_IMAGE_MD5} ] ; then + has_md5=1 + # introspectorDomain py put two blank lines in the configmap, use -B to ignore blank lines + diff -wB ${INTROSPECTCM_IMAGE_MD5} ${INTROSPECTJOB_IMAGE_MD5} > /tmp/imgmd5diff + if [ $? -ne 0 ] ; then + trace "WDT artifacts in image changed: create domain again" + WDT_ARTIFACTS_CHANGED=1 + echoFilesDifferences ${INTROSPECTCM_IMAGE_MD5} ${INTROSPECTJOB_IMAGE_MD5} + fi + fi + + trace "Checking wdt artifacts in config map" + if [ -f ${INTROSPECTCM_CM_MD5} ] ; then + has_md5=1 + diff -wB ${INTROSPECTCM_CM_MD5} ${INTROSPECTJOB_CM_MD5} + if [ $? -ne 0 ] ; then + trace "WDT artifacts in wdt config map changed: create domain again" + WDT_ARTIFACTS_CHANGED=1 + echoFilesDifferences ${INTROSPECTCM_CM_MD5} ${INTROSPECTJOB_CM_MD5} + fi + else + # if no config map before but adding one now + if [ -f ${INTROSPECTJOB_CM_MD5} ]; then + trace "New inventory in cm: create domain" + WDT_ARTIFACTS_CHANGED=1 + fi + fi + + if [ $has_md5 -eq 0 ]; then + # Initial deployment + trace "no md5 found: create domain" + WDT_ARTIFACTS_CHANGED=1 + fi + + trace "Exiting checkExistInventory" +} + +# echo file contents + +function echoFilesDifferences() { + trace "------- from introspector cm -----------------" + cat $1 + trace "------- from introspector job pod ------------" + cat $2 + trace "----------------------------------------------" +} + +# get_opss_key_wallet returns opss key wallet ewallet.p12 location +# +# if there is one from the user config map, use it first +# otherwise use the one in the introspect job config map +# + +function get_opss_key_wallet() { + if [ -f ${OPSS_KEY_B64EWALLET} ]; then + echo ${OPSS_KEY_B64EWALLET} + else + echo "/weblogic-operator/introspectormii/ewallet.p12" + fi +} + +# +# buildWDTParams_MD5 Setup the WDT artifacts MD5 for comparison between updates +# Also setup the wdt parameters +# + +function buildWDTParams_MD5() { + trace "Entering setupInventoryList" + + model_list="" + archive_list="" + variable_list="${IMG_MODELS_HOME}/_k8s_generated_props.properties" + + # + # First build the command line parameters for WDT + # based on the file listing in the image or config map + # + + for file in $(sort_files $IMG_MODELS_ROOTDIR ".yaml") ; + do + md5sum ${IMG_MODELS_ROOTDIR}/${file} >> ${INTROSPECTJOB_IMAGE_MD5} + if [ "$model_list" != "" ]; then + model_list="${model_list}," + fi + model_list="${model_list}${IMG_MODELS_ROOTDIR}/${file}" + done + + for file in $(sort_files $WDT_CONFIGMAP_ROOT ".yaml") ; + do + md5sum ${WDT_CONFIGMAP_ROOT}/$file >> ${INTROSPECTJOB_CM_MD5} + if [ "$model_list" != "" ]; then + model_list="${model_list}," + fi + model_list="${model_list}${WDT_CONFIGMAP_ROOT}/${file}" + done + + for file in $(sort_files ${IMG_ARCHIVES_ROOTDIR} "*.zip") ; + do + md5sum ${IMG_ARCHIVES_ROOTDIR}/$file >> ${INTROSPECTJOB_IMAGE_MD5} + if [ "$archive_list" != "" ]; then + archive_list="${archive_list}," + fi + archive_list="${archive_list}${IMG_ARCHIVES_ROOTDIR}/${file}" + done + + # Merge all properties together + local SPACE_BLANK_LINE=" " + for file in $(sort_files ${IMG_VARIABLE_FILES_ROOTDIR} ".properties") ; + do + md5sum ${IMG_VARIABLE_FILES_ROOTDIR}/$file >> ${INTROSPECTJOB_IMAGE_MD5} + cat ${IMG_VARIABLE_FILES_ROOTDIR}/${file} >> ${variable_list} + # Make sure there is an extra line + echo $SPACE_BLANK_LINE >> ${variable_list} + done + + for file in $(sort_files ${WDT_CONFIGMAP_ROOT} ".properties") ; + do + md5sum ${WDT_CONFIGMAP_ROOT}/$file >> ${INTROSPECTJOB_CM_MD5} + echo $SPACE_BLANK_LINE >> ${variable_list} + cat ${WDT_CONFIGMAP_ROOT}/${file} >> ${variable_list} + done + + if [ -f ${variable_list} ]; then + variable_list="-variable_file ${variable_list}" + else + variable_list="" + fi + + if [ "$archive_list" != "" ]; then + archive_list="-archive_file ${archive_list}" + fi + + if [ "$model_list" != "" ]; then + model_list="-model_file ${model_list}" + fi + + if [ "${WDT_DOMAIN_TYPE}" == "JRF" ] ; then + if [ ! -f "${OPSS_KEY_PASSPHRASE}" ] ; then + trace SEVERE "Domain Source Type is 'FromModel' and domain type JRF which requires specifying a " \ + "walletPasswordSecret in your domain resource and deploying this secret with a 'walletPassword' key, " \ + " but the secret does not have this key." + exit 1 + else + # TBD code review comment: pass credentials via filename instead of risking putting them in an env var + # Set it for introspectDomain.py to use + export OPSS_PASSPHRASE=$(cat ${OPSS_KEY_PASSPHRASE}) + fi + fi + + # We cannot strictly run create domain for JRF type because it's tied to a database schema + # We shouldn't require user to drop the db first since it may have data in it + # + opss_wallet=$(get_opss_key_wallet) + if [ -f "${opss_wallet}" ] ; then + trace "keeping rcu schema" + mkdir -p /tmp/opsswallet + base64 -d ${opss_wallet} > /tmp/opsswallet/ewallet.p12 + OPSS_FLAGS="-opss_wallet /tmp/opsswallet -opss_wallet_passphrase ${OPSS_PASSPHRASE}" + else + OPSS_FLAGS="" + fi + + trace "Exiting setupInventoryList" +} + +# createWLDomain +# + +function createWLDomain() { + start_trap + trace "Entering createWLDomain" + + if [ ! -f ${RUNTIME_ENCRYPTION_SECRET_PASSWORD} ] ; then + trace SEVERE "Domain Source Type is 'FromModel' which requires specifying a runtimeEncryptionSecret " \ + "in your domain resource and deploying this secret with a 'password' key, but the secret does not have this key." + exitOrLoop + fi + # Check if /u01/wdt/models and /u01/wdt/weblogic-deploy exists + + checkDirNotExistsOrEmpty ${IMG_MODELS_HOME} + checkDirNotExistsOrEmpty ${WDT_BINDIR} + + checkModelDirectoryExtensions + if [ "true" != "${WDT_BYPASS_WDT_VERSION_CHECK}" ] ; then + checkWDTVersion + fi + + # copy the filter related files to the wdt lib + + cp ${WDT_FILTER_JSON} ${WDT_ROOT}/lib + cp ${WDT_CREATE_FILTER} ${WDT_ROOT}/lib + + # check to see if any model including changed (or first model in image deploy) + # if yes. then run create domain again + + + local current_version=$(getWebLogicVersion) + local current_jdkpath=$(readlink -f $JAVA_HOME) + # check for version: can only be rolling + + local version_changed=0 + local jdk_changed=0 + local secrets_and_env_changed=0 + trace "current version "${current_version} + + getSecretsAndEnvMD5 + local current_secrets_and_env_md5=$(cat /tmp/secrets_and_env.md5) + + trace "Checking changes in secrets and jdk path" + + if [ -f ${INTROSPECTCM_SECRETS_AND_ENV_MD5} ] ; then + previous_secrets_and_env_md5=$(cat ${INTROSPECTCM_SECRETS_AND_ENV_MD5}) + if [ "${current_secrets_and_env_md5}" != "${previous_secrets_and_env_md5}" ]; then + trace "Secrets and env different: old_md5=${previous_secrets_and_env_md5} new_md5=${current_secrets_and_env_md5}" + secrets_and_env_changed=1 + fi + fi + + # If No WDT artifacts changed but WLS version changed +# if [ -f ${INTROSPECTCM_WLS_VERSION} ] ; then +# previous_version=$(cat ${INTROSPECTCM_WLS_VERSION}) +# if [ "${current_version}" != "${previous_version}" ]; then +# trace "version different: before: ${previous_version} current: ${current_version}" +# version_changed=1 +# fi +# fi + + if [ -f ${INTROSPECTCM_JDK_PATH} ] ; then + previous_jdkpath=$(cat ${INTROSPECTCM_JDK_PATH}) + if [ "${current_jdkpath}" != "${previous_jdkpath}" ]; then + trace "jdkpath different: before: ${previous_jdkpath} current: ${current_jdkpath}" + jdk_changed=1 + fi + fi + + # write out version, introspectDomain.py will write it to the configmap + + echo ${current_version} > /tmp/wls_version + echo $(readlink -f $JAVA_HOME) > /tmp/jdk_path + + # setup wdt parameters and also associative array before calling comparing md5 in checkExistInventory + # + trace "Building WDT parameters and MD5s" + + buildWDTParams_MD5 + + compareArtifactsMD5 + + # Set this so that the introspectDomain.sh can decidde to call the python script of not + DOMAIN_CREATED=0 + + # something changed in the wdt artifacts or wls version changed + # create domain again + + if [ ${WDT_ARTIFACTS_CHANGED} -ne 0 ] || [ ${jdk_changed} -eq 1 ] \ + || [ ${secrets_and_env_changed} -ne 0 ] ; then + + trace "Need to create domain ${WDT_DOMAIN_TYPE}" + createModelDomain + DOMAIN_CREATED=1 + else + trace "Nothing changed no op" + fi + trace "Exiting createWLDomain" + stop_trap +} + +# checkDirNotExistsOrEmpty +# Test directory exists or empty + +function checkDirNotExistsOrEmpty() { + trace "Entering checkDirNotExistsOrEmpty" + + if [ $# -eq 1 ] ; then + if [ ! -d $1 ] ; then + trace SEVERE "Directory $1 does not exists" + exitOrLoop + else + if [ -z "$(ls -A $1)" ] ; then + trace SEVERE "Directory $1 is empty" + exitOrLoop + fi + fi + fi + + trace "Exiting checkDirNotExistsOrEmpty" +} + +# limit the file extensions in the model directories + +function checkModelDirectoryExtensions() { + trace "Entering checkModelDirectoryExtensions" + + cd ${IMG_MODELS_HOME} + counter=$(ls -I "*.yaml" -I "*.zip" -I "*.properties" | wc -l) + if [ $counter -ne 0 ] ; then + trace SEVERE "Model image directory ${IMG_MODELS_HOME} contains files with unsupported extensions. " \ + "Expected extensions: .yaml, .properties, or .zip" + trace SEVERE "Model image directory files with unsupported extensions: " \ + "'$(ls -I "*.yaml" -I "*.zip" -I "*.properties")'" + exitOrLoop + fi + if [ -d ${WDT_CONFIGMAP_ROOT} ] ; then + cd ${WDT_CONFIGMAP_ROOT} + counter=$(ls -I "*.yaml" -I "*.properties" | wc -l) + if [ $counter -ne 0 ] ; then + trace SEVERE "Model configmap directory ${WDT_CONFIGMAP_ROOT} contains files with unsupported extensions. " \ + "Expected extensions: .yaml or .properties" + trace SEVERE "Model configmap directory files with unsupported extensions: " \ + "'$(ls -I "*.yaml" -I "*.properties")'" + exitOrLoop + fi + fi + + trace "Exiting checkModelDirectoryExtensions" +} + +# Check for WDT version + +function checkWDTVersion() { + trace "Entering checkWDTVersion" + unzip -c ${WDT_ROOT}/lib/weblogic-deploy-core.jar META-INF/MANIFEST.MF > /tmp/wdtversion.txt || exitOrLoop + local wdt_version="$(grep "Implementation-Version" /tmp/wdtversion.txt | cut -f2 -d' ' | tr -d '\r' )" || exitOrLoop + if [ ! -z ${wdt_version} ]; then + versionGE ${wdt_version} ${WDT_MINIMUM_VERSION} + if [ $? != "0" ] ; then + trace SEVERE "Domain Source Type is 'FromModel' and it requires WebLogic Deploy Tool with a minimum " \ + "version of ${WDT_MINIMUM_VERSION} installed in the image. The version of the WebLogic Deploy Tool installed " \ + "in the image is ${wdt_version}, you can create another image with an updated version of the WebLogic Deploy " \ + "Tool and redeploy the domain again. To bypass this check, set environment variable " \ + "'WDT_BYPASS_WDT_VERSION_CHECK' to 'true'" + exitOrLoop + fi + else + trace SEVERE "Domain Source Type is 'FromModel' and it requires WebLogic Deploy Tool with a minimum " \ + "version of ${WDT_MINIMUM_VERSION} installed in the image. The version of the WebLogic Deploy Tool installed " \ + "in the image cannot be determined, you can create another image with an updated version of the WebLogic Deploy" \ + " Tool and redeploy the domain again. To bypass this check, set environment variable " \ + "'WDT_BYPASS_WDT_VERSION_CHECK' to 'true'" + exitOrLoop + fi + + trace "Exiting checkWDTVersion" +} + +# getSecretsAndEnvMD5 +# +# concatenate all the secrets and env, calculate the md5 and delete the file. +# The md5 is used to determine whether the domain needs to be recreated +# Note: the secrets are two levels indirections, so use find and filter out the ..data +# output: /tmp/secrets_and_env.md5 + +function getSecretsAndEnvMD5() { + trace "Entering getSecretsAndEnvMD5" + + local secrets_and_env_text="/tmp/secrets.txt" + local override_secrets="/weblogic-operator/config-overrides-secrets/" + local weblogic_secrets="/weblogic-operator/secrets/" + local env_var + + rm -f ${secrets_and_env_text} + + for env_var in ${OPERATOR_ENVVAR_NAMES//,/ }; do + echo "$env_var='${!env_var}'" + done | sort >> ${secrets_and_env_text} + + if [ -d "${override_secrets}" ] ; then + # find the link and exclude ..data so that the normalized file name will be found + # otherwise it will return ../data/xxx ..etc. Note: the actual file is in a timestamp linked directory + find ${override_secrets} -type l -not -name "..data" -print | sort | xargs cat >> ${secrets_and_env_text} + fi + + if [ -d "${weblogic_secrets}" ] ; then + find ${weblogic_secrets} -type l -not -name "..data" -print | sort | xargs cat >> ${secrets_and_env_text} + fi + + if [ ! -f "${secrets_and_env_text}" ] ; then + echo "0" > ${secrets_and_env_text} + fi + local secrets_and_env_md5=$(md5sum ${secrets_and_env_text} | cut -d' ' -f1) + echo ${secrets_and_env_md5} > /tmp/secrets_and_env.md5 + trace "Found secrets and env: md5=${secrets_and_env_md5}" + rm ${secrets_and_env_text} + trace "Exiting getSecretsAndEnvMD5" +} + + +# +# createModelDomain call WDT to create the domain +# + +function createModelDomain() { + + trace "Entering createModelDomain" + createPrimordialDomain + + # if there is a new primordial domain created then use newly created primordial domain otherwise + # if the primordial domain already in the configmap, restore it + # + + if [ -f "${LOCAL_PRIM_DOMAIN_ZIP}" ] ; then + trace "Using newly created domain" + elif [ -f ${PRIMORDIAL_DOMAIN_ZIPPED} ] ; then + trace "Using existing primordial domain" + cd / && base64 -d ${PRIMORDIAL_DOMAIN_ZIPPED} > ${LOCAL_PRIM_DOMAIN_ZIP} && tar -xzf ${LOCAL_PRIM_DOMAIN_ZIP} + + # Since the SerializedSystem ini is encrypted, restore it first + local MII_PASSPHRASE=$(cat ${RUNTIME_ENCRYPTION_SECRET_PASSWORD}) + encrypt_decrypt_domain_secret "decrypt" ${DOMAIN_HOME} ${MII_PASSPHRASE} + fi + + wdtUpdateModelDomain + + trace "Exiting createModelDomain" +} + +function diff_model() { + trace "Entering diff_model" + + # + local ORACLE_SERVER_DIR=${ORACLE_HOME}/wlserver + local JAVA_PROPS="-Dpython.cachedir.skip=true ${JAVA_PROPS}" + local JAVA_PROPS="-Dpython.path=${ORACLE_SERVER_DIR}/common/wlst/modules/jython-modules.jar/Lib ${JAVA_PROPS}" + local JAVA_PROPS="-Dpython.console= ${JAVA_PROPS} -Djava.security.egd=file:/dev/./urandom" + local CP=${ORACLE_SERVER_DIR}/server/lib/weblogic.jar + ${JAVA_HOME}/bin/java -cp ${CP} \ + ${JAVA_PROPS} \ + org.python.util.jython \ + ${SCRIPTPATH}/model_diff.py $1 $2 > ${WDT_OUTPUT} 2>&1 + if [ $? -ne 0 ] ; then + trace SEVERE "Failed to compare models. Check logs for error." + trace SEVERE "$(cat ${WDT_OUTPUT})" + exitOrLoop + fi + trace "Exiting diff_model" + return ${rc} +} + +# +# createPrimordialDomain will create the primordial domain +# + +function createPrimordialDomain() { + trace "Entering createPrimordialDomain" + local create_primordial_tgz=0 + local recreate_domain=0 + + if [ -f ${PRIMORDIAL_DOMAIN_ZIPPED} ] ; then + # If there is an existing domain in the cm - this is update in the lifecycle + # Call WDT validateModel.sh to generate the new merged mdoel + trace "Checking if security info has been changed" + + generateMergedModel + + # decrypt the merged model from introspect cm + local DECRYPTED_MERGED_MODEL="/tmp/decrypted_merged_model.json" + local MII_PASSPHRASE=$(cat ${RUNTIME_ENCRYPTION_SECRET_PASSWORD}) + encrypt_decrypt_model "decrypt" ${INTROSPECTCM_MERGED_MODEL} ${MII_PASSPHRASE} \ + ${DECRYPTED_MERGED_MODEL} + + diff_model ${NEW_MERGED_MODEL} ${DECRYPTED_MERGED_MODEL} + + diff_rc=$(cat /tmp/model_diff_rc) + rm ${DECRYPTED_MERGED_MODEL} + trace "createPrimordialDomain: model diff returns "${diff_rc} + + + local security_info_updated="false" + security_info_updated=$(contain_returncode ${diff_rc} ${SECURITY_INFO_UPDATED}) + # recreate the domain if there is an unsafe security update such as admin password update or security roles + + # Always use the schema password in RCUDbInfo. Since once the password is updated by the DBA. The + # RCU cache table SCHEMA_COMPONENT_INFO stored password will never be correct, and subsequenetly any + # other updates such as admin credenitals or security roles that caused the re-create of the primordial + # domain will fail since without this flag set, defaults is to use the RCU cached info. (aka. wlst + # getDatabaseDefaults). + # + if [ ${security_info_updated} == "true" ]; then + recreate_domain=1 + if [ ${WDT_DOMAIN_TYPE} == "JRF" ] ; then + UPDATE_RCUPWD_FLAG="-updateRCUSchemaPassword" + fi + fi + + # if the domain is JRF and the schema password has been changed. Set this so that updateDomain will also update + # the RCU password using the RCUDnbinfo + + local rcu_password_updated="false" + rcu_password_updated=$(contain_returncode ${diff_rc} ${RCU_PASSWORD_CHANGED}) + if [ ${WDT_DOMAIN_TYPE} == "JRF" ] && [ ${rcu_password_updated} == "true" ] ; then + UPDATE_RCUPWD_FLAG="-updateRCUSchemaPassword" + fi + + fi + + # If there is no primordial domain or needs to recreate one due to password changes + + if [ ! -f ${PRIMORDIAL_DOMAIN_ZIPPED} ] || [ ${recreate_domain} -eq 1 ]; then + trace "No primordial domain or need to recreate again" + wdtCreatePrimordialDomain + create_primordial_tgz=1 + fi + + # tar up primodial domain with em.ear if it is there. The zip will be added to the introspect config map by the + # introspectDomain.py + + if [ ${create_primordial_tgz} -eq 1 ]; then + empath="" + if [ "${WDT_DOMAIN_TYPE}" != "WLS" ] ; then + empath=$(grep "/em.ear" ${DOMAIN_HOME}/config/config.xml | grep -oPm1 "(?<=)[^<]+") + fi + + # Before targz it, we encrypt the SerializedSystemIni.dat, first save the original + + cp ${DOMAIN_HOME}/security/SerializedSystemIni.dat /tmp/sii.dat.saved + + local MII_PASSPHRASE=$(cat ${RUNTIME_ENCRYPTION_SECRET_PASSWORD}) + encrypt_decrypt_domain_secret "encrypt" ${DOMAIN_HOME} ${MII_PASSPHRASE} + + tar -pczf ${LOCAL_PRIM_DOMAIN_ZIP} --exclude ${DOMAIN_HOME}/wlsdeploy --exclude ${DOMAIN_HOME}/lib ${empath} \ + ${DOMAIN_HOME}/* + + # Put back the original one so that update can continue + mv /tmp/sii.dat.saved ${DOMAIN_HOME}/security/SerializedSystemIni.dat + + fi + + trace "Exiting createPrimordialDomain" + +} + +# +# Generate model from wdt artifacts +# +function generateMergedModel() { + # wdt shell script may return non-zero code if trap is on, then it will go to trap instead + # temporarily disable it + trace "Entering generateMergedModel" + stop_trap + + export __WLSDEPLOY_STORE_MODEL__="${NEW_MERGED_MODEL}" + + ${WDT_BINDIR}/validateModel.sh -oracle_home ${ORACLE_HOME} ${model_list} \ + ${archive_list} ${variable_list} -domain_type ${WDT_DOMAIN_TYPE} > ${WDT_OUTPUT} + ret=$? + if [ $ret -ne 0 ]; then + trace SEVERE "WDT Failed: Validate Model Failed " + if [ -d ${LOG_HOME} ] && [ ! -z ${LOG_HOME} ] ; then + cp ${WDT_OUTPUT} ${LOG_HOME}/introspectJob_validateDomain.log + fi + trace SEVERE "$(cat ${WDT_OUTPUT})" + exitOrLoop + fi + + # restore trap + start_trap + trace "Exiting generateMergedModel" +} + + +# wdtCreatePrimordialDomain +# Create the actual primordial domain using WDT +# + +function wdtCreatePrimordialDomain() { + # wdt shell script may return non-zero code if trap is on, then it will go to trap instead + # temporarily disable it + trace "Entering wdtCreatePrimordialDomain" + stop_trap + + export __WLSDEPLOY_STORE_MODEL__=1 + + ${WDT_BINDIR}/createDomain.sh -oracle_home ${ORACLE_HOME} -domain_home ${DOMAIN_HOME} $model_list \ + ${archive_list} ${variable_list} -domain_type ${WDT_DOMAIN_TYPE} ${OPSS_FLAGS} ${UPDATE_RCUPWD_FLAG} \ + > ${WDT_OUTPUT} + ret=$? + if [ $ret -ne 0 ]; then + trace SEVERE "WDT Create Domain Failed ${ret}" + if [ -d ${LOG_HOME} ] && [ ! -z ${LOG_HOME} ] ; then + cp ${WDT_OUTPUT} ${LOG_HOME}/introspectJob_createDomain.log + fi + trace SEVERE "$(cat ${WDT_OUTPUT})" + exitOrLoop + fi + + # restore trap + start_trap + trace "Exiting wdtCreatePrimordialDomain" + +} + +# +# wdtUpdateModelDomain use WDT to update the model domain over the primordial domain +# + +function wdtUpdateModelDomain() { + + trace "Entering wdtUpdateModelDomain" + # wdt shell script may return non-zero code if trap is on, then it will go to trap instead + # temporarily disable it + + stop_trap + # make sure wdt create write out the merged model to a file in the root of the domain + export __WLSDEPLOY_STORE_MODEL__=1 + + ${WDT_BINDIR}/updateDomain.sh -oracle_home ${ORACLE_HOME} -domain_home ${DOMAIN_HOME} $model_list \ + ${archive_list} ${variable_list} -domain_type ${WDT_DOMAIN_TYPE} ${UPDATE_RCUPWD_FLAG} > ${WDT_OUTPUT} + ret=$? + + if [ $ret -ne 0 ]; then + trace SEVERE "WDT Update Domain Failed " + if [ -d ${LOG_HOME} ] && [ ! -z ${LOG_HOME} ] ; then + cp ${WDT_OUTPUT} ${LOG_HOME}/introspectJob_updateDomain.log + fi + trace SEVERE "$(cat ${WDT_OUTPUT})" + exitOrLoop + fi + + # update the wallet + if [ ! -z ${UPDATE_RCUPWD_FLAG} ]; then + trace "Updating wallet because schema password changed" + gunzip ${LOCAL_PRIM_DOMAIN_ZIP} + if [ $? -ne 0 ] ; then + trace SEVERE "wdtUpdateModelDomain: failed to upzip primordial domain" + exitOrLoop + fi + tar uf ${LOCAL_PRIM_DOMAIN_TAR} ${DOMAIN_HOME}/config/fmwconfig/bootstrap/cwallet.sso + if [ $? -ne 0 ] ; then + trace SEVERE "wdtUpdateModelDomain: failed to tar update wallet file" + exitOrLoop + fi + gzip ${LOCAL_PRIM_DOMAIN_TAR} + if [ $? -ne 0 ] ; then + trace SEVERE "wdtUpdateModelDomain: failed to zip up primordial domain" + exitOrLoop + fi + fi + + # This is the complete model and used for life-cycle comparision, encrypt this before storing in + # config map by the operator + # + local MII_PASSPHRASE=$(cat ${RUNTIME_ENCRYPTION_SECRET_PASSWORD}) + + encrypt_decrypt_model "encrypt" ${DOMAIN_HOME}/wlsdeploy/domain_model.json ${MII_PASSPHRASE} \ + ${DOMAIN_HOME}/wlsdeploy/domain_model.json + + # restore trap + start_trap + trace "Exiting wdtUpdateModelDomain" +} + +function contain_returncode() { + if echo ",$1," | grep -q ",$2," + then + echo "true" + else + echo "false" + fi +} + +# +# Encrypt WDT model (Full encryption) +# +# parameter: +# 1 - action (encrypt| decrypt) +# 2 - input file +# 3 - password +# 4 - output file +# +function encrypt_decrypt_model() { + trace "Entering encrypt_wdtmodel $1" + + local ORACLE_SERVER_DIR=${ORACLE_HOME}/wlserver + local JAVA_PROPS="-Dpython.cachedir.skip=true ${JAVA_PROPS}" + local JAVA_PROPS="-Dpython.path=${ORACLE_SERVER_DIR}/common/wlst/modules/jython-modules.jar/Lib ${JAVA_PROPS}" + local JAVA_PROPS="-Dpython.console= ${JAVA_PROPS} -Djava.security.egd=file:/dev/./urandom" + local CP=${ORACLE_SERVER_DIR}/server/lib/weblogic.jar:${WDT_BINDIR}/../lib/weblogic-deploy-core.jar + ${JAVA_HOME}/bin/java -cp ${CP} \ + ${JAVA_PROPS} \ + org.python.util.jython \ + ${SCRIPTPATH}/encryption_util.py $1 "$(cat $2)" $3 $4 > ${WDT_OUTPUT} 2>&1 + rc=$? + if [ $rc -ne 0 ]; then + trace SEVERE "Fatal Error: Failed to $1 domain model. This error is irrecoverable. Check to see if the secret " \ + "described in the configuration.model.runtimeEncryptionSecret domain resource field has been changed since the " \ + "creation of the domain. You can either reset the password to the original one and try again or delete "\ + "and recreate the domain." + trace SEVERE "$(cat ${WDT_OUTPUT})" + exitOrLoop + fi + + trace "Exiting encrypt_wdtmodel $1" +} + +# encrypt_decrypt_domain_secret +# parameter: +# 1 - action (encrypt|decrypt) +# 2 - domain home +# 3 - password +# 4 - output file + +function encrypt_decrypt_domain_secret() { + trace "Entering encrypt_decrypt_domain_secret $1" + # Do not use trap for this startServer.sh fail for some not zero function call + + local tmp_output="/tmp/tmp_encrypt_decrypt_output.file" + if [ "$1" == "encrypt" ] ; then + base64 $2/security/SerializedSystemIni.dat > /tmp/secure.ini + else + cp $2/security/SerializedSystemIni.dat /tmp/secure.ini + fi + + # + local ORACLE_SERVER_DIR=${ORACLE_HOME}/wlserver + local JAVA_PROPS="-Dpython.cachedir.skip=true ${JAVA_PROPS}" + local JAVA_PROPS="-Dpython.path=${ORACLE_SERVER_DIR}/common/wlst/modules/jython-modules.jar/Lib ${JAVA_PROPS}" + local JAVA_PROPS="-Dpython.console= ${JAVA_PROPS} -Djava.security.egd=file:/dev/./urandom" + local CP=${ORACLE_SERVER_DIR}/server/lib/weblogic.jar:${WDT_BINDIR}/../lib/weblogic-deploy-core.jar + ${JAVA_HOME}/bin/java -cp ${CP} \ + ${JAVA_PROPS} \ + org.python.util.jython \ + ${SCRIPTPATH}/encryption_util.py $1 "$(cat /tmp/secure.ini)" $3 ${tmp_output} > ${WDT_OUTPUT} 2>&1 + rc=$? + if [ $rc -ne 0 ]; then + trace SEVERE "Fatal Error: Failed to $1 domain secret. This error is irrecoverable. Check to see if the secret " \ + "described in the configuration.model.runtimeEncryptionSecret domain resource field has been changed since the " \ + "creation of the domain. You can either reset the password to the original one and try again or delete "\ + "and recreate the domain." + trace SEVERE "$(cat ${WDT_OUTPUT})" + exitOrLoop + fi + + if [ "$1" == "decrypt" ] ; then + base64 -d ${tmp_output} > $2/security/SerializedSystemIni.dat + else + cp ${tmp_output} $2/security/SerializedSystemIni.dat + fi + rm ${tmp_output} + trace "Exiting encrypt_decrypt_domain_secret" +} + +# +# Generic error handler +# +function error_handler() { + if [ $1 -ne 0 ]; then + trace SEVERE "Script Error: There was an error at line: ${2} command: ${@:3:20}" + stop_trap + exitOrLoop + fi +} + +function start_trap() { + set -eE + trap 'error_handler $? $BASH_LINENO $BASH_COMMAND ' ERR EXIT SIGHUP SIGINT SIGTERM SIGQUIT +} + +function stop_trap() { + trap - ERR EXIT SIGHUP SIGINT SIGTERM SIGQUIT + set +eE +} + +function cleanup_mii() { + rm -f /tmp/*.md5 /tmp/*.gz /tmp/*.ini /tmp/*.json +} diff --git a/operator/src/main/resources/scripts/model_diff.py b/operator/src/main/resources/scripts/model_diff.py new file mode 100644 index 00000000000..b84878e1aed --- /dev/null +++ b/operator/src/main/resources/scripts/model_diff.py @@ -0,0 +1,515 @@ +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# ------------ +# Description: +# ------------ +# +# This code compares python dictionaries. It is used to compare the new vs the old version. +# output is written as csv file /tmp/model_diff_rc containing the return codes that represent the differences. +# also the actual difference in model as yaml and json /tmp/diffed_model.json /tmp/diffed_model.yaml +# +# This script is invoked by jython. See modelInImage.sh diff_model +# +import re +import sets +import sys, os, traceback +from java.lang import System +UNSAFE_ONLINE_UPDATE=0 +SAFE_ONLINE_UPDATE=1 +FATAL_MODEL_CHANGES=2 +MODELS_SAME=3 +SECURITY_INFO_UPDATED=4 +RCU_PASSWORD_CHANGED=5 + +# The following class is borrowed directly from the WDT project's yaml_tranlator.py +class PythonToYaml: + """ + A class that converts a Python dictionary into Yaml and writes the output to a file. + """ + # 4 spaces + _indent_unit = ' ' + _requires_quotes_chars_regex = '[:{}\[\],&*#?|<>=!%@`-]' + + def __init__(self): + return + + def _write_dictionary_to_yaml_file(self, dictionary, writer, indent=''): + """ + Do the actual heavy lifting of converting a dictionary and writing it to the file. This method is + called recursively when a value of the dictionary entry is itself a dictionary. + :param dictionary: the Python dictionary to convert + :param writer: the java.io.PrintWriter for the output file + :param indent: the amount of indent to use (based on the level of recursion) + :raises: IOException: if an error occurs while writing the output + """ + if dictionary is None: + return + + for key, value in dictionary.iteritems(): + quoted_key = self._quotify_string(key) + if isinstance(value, dict): + writer.write(indent + quoted_key + ':' + '\n') + self._write_dictionary_to_yaml_file(value, writer, indent + self._indent_unit) + else: + writer.write(indent + quoted_key + ': ' + self._get_value_string(value) + '\n') + + return + + def _get_value_string(self, value): + """ + Convert the Python value into the proper Yaml value + :param value: the Python value + :return: the Yaml value + """ + if value is None: + result = 'null' + elif type(value) is int or type(value) is long or type(value) is float: + result = str(value) + elif type(value) is list: + new_value = '[' + for element in value: + new_value += ' ' + self._get_value_string(element) + ',' + if len(new_value) > 1: + new_value = new_value[:-1] + new_value += ' ]' + result = str(new_value) + else: + result = self._quotify_string(str(value)) + return result + + def _quotify_string(self, text): + """ + Insert quotes around the string value if it contains Yaml special characters that require it. + :param text: the input string + :return: the quoted string, or the original string if no quoting was required + """ + if bool(re.search(self._requires_quotes_chars_regex, text)): + result = '\'' + self._quote_embedded_quotes(text) + '\'' + else: + result = self._quote_embedded_quotes(text) + return result + + def _quote_embedded_quotes(self, text): + """ + Replace any embedded quotes with two quotes. + :param text: the text to quote + :return: the quoted text + """ + result = text + if '\'' in text: + result = result.replace('\'', '\'\'') + if '"' in text: + result = result.replace('"', '""') + return result + + +class ModelDiffer: + + def __init__(self, current_dict, past_dict): + + self.final_changed_model=dict() + self.current_dict = current_dict + self.past_dict = past_dict + self.set_current = sets.Set() + self.set_past = sets.Set() + for item in self.current_dict.keys(): + self.set_current.add(item) + for item in self.past_dict.keys(): + self.set_past.add(item) + self.intersect = self.set_current.intersection(self.set_past) + + def added(self): + return self.set_current - self.intersect + + def removed(self): + return self.set_past - self.intersect + + def changed(self): + result = sets.Set() + for o in self.intersect: + if self.past_dict[o] != self.current_dict[o]: + result.add(o) + return result + + def unchanged(self): + result = sets.Set() + for o in self.intersect: + if self.past_dict[o] == self.current_dict[o]: + result.add(o) + return result + + def print_diff(self,s, category): + print category + if len(s) > 0: + print s + + def recursive_changed_detail(self, key, token, root): + debug("DEBUG: Entering recursive_changed_detail key=%s token=%s root=%s", key, token, root) + a=ModelDiffer(self.current_dict[key], self.past_dict[key]) + diff=a.changed() + added=a.added() + removed=a.removed() + saved_token=token + debug('DEBUG: In recursive changed detail %s', diff) + debug('DEBUG: In recursive added detail %s', added) + if len(diff) > 0: + for o in diff: + token=saved_token + # The token is a | separated string that is used to parse and rebuilt the structure later + debug('DEBUG: in recursive changed detail walking down 1 %s', o) + token=token+'|'+o + if a.is_dict(o): + debug('DEBUG: in recursive changed detail walking down 2 %s', token) + a.recursive_changed_detail(o,token, root) + last=token.rfind('|') + token=root + else: + all_changes.append(token) + last=token.rfind('|') + token=root + + + # already out of recursive calls, add all entries from current dictionary + # resources.JDBCSubsystemResources.* (note it may not have the lower level nodes + added_token=token + debug('DEBUG: current added token %s' , added_token) + if len(added) > 0: + for item in added: + token=saved_token + debug('DEBUG: recursive added token %s item %s ', token, item) + all_added.append(token + '|' + item) + + # We don't really care about this, just put something here is enough + + if len(removed) > 0: + for item in removed: + debug('DEBUG: removed %s', item) + all_removed.append(token + '|' + item) + debug('DEBUG: Exiting recursive_changed_detail') + + def is_dict(self,key): + if isinstance(self.current_dict[key],dict): + return 1 + else: + return 0 + + def calculate_changed_model(self): + """ + Calculate the changed model. + """ + result = dict() + changed=self.changed() + + for s in changed: + token=s + self.recursive_changed_detail(s, token, s) + self._add_results(all_changes) + self._add_results(all_added) + # TODO: delete needs more work, not simply added to the results + #self._add_results(all_removed) + + + def _add_results(self, ar_changes): + + # The ar_changes is the keys of changes in the dotted format + # 'resources|JDBCSystemResource|Generic2|JdbcResource|JDBCConnectionPoolParams|TestConnectionsOnReserve + # + # Now change it to python dictionrary + for item in ar_changes: + debug('DEBUG: add_results %s', item) + + splitted=item.split('|',1) + n=len(splitted) + result=dict() + walked=[] + + while n > 1: + tmp=dict() + tmp[splitted[0]]=dict() + if len(result) > 0: + # traverse to the leaf + leaf=result + for k in walked: + leaf = leaf[k] + leaf[splitted[0]]=dict() + walked.append(splitted[0]) + else: + result=tmp + walked.append(splitted[0]) + splitted=splitted[1].split('|',1) + n=len(splitted) + # + # result is the dictionary format + # + leaf=result + value_tree=self.current_dict + for k in walked: + leaf = leaf[k] + value_tree=value_tree[k] + + # walk the current dictionary and set the value + # doesn't work in delete case + # + leaf[splitted[0]] = value_tree[splitted[0]] + self.merge_dictionaries(self.final_changed_model, result) + + + def merge_dictionaries(self, dictionary, new_dictionary): + """ + Merge the values from the new dictionary to the existing one. + :param dictionary: the existing dictionary + :param new_dictionary: the new dictionary to be merged + """ + for key in new_dictionary: + new_value = new_dictionary[key] + if key not in dictionary: + dictionary[key] = new_value + else: + value = dictionary[key] + if isinstance(value, dict) and isinstance(new_value, dict): + self.merge_dictionaries(value, new_value) + else: + dictionary[key] = new_value + + def is_safe_diff(self, model): + """ + Is it a safe difference for update. + :param model: diffed model + return 0 - always return 0 for V1 + """ + + # check for phase 1 any security changes in the domainInfo intersection + + if model.has_key('domainInfo'): + domain_info = model['domainInfo'] + if domain_info.has_key('AdminUserName') or domain_info.has_key('AdminPassword') \ + or domain_info.has_key('WLSRoles'): + changed_items.append(SECURITY_INFO_UPDATED) + + if domain_info.has_key('RCUDbInfo'): + rcu_db_info = domain_info['RCUDbInfo'] + if rcu_db_info.has_key('rcu_schema_password'): + changed_items.append(RCU_PASSWORD_CHANGED) + + if rcu_db_info.has_key('rcu_db_conn_string') \ + or rcu_db_info.has_key('rcu_prefix'): + changed_items.append(SECURITY_INFO_UPDATED) + + return 0 + + def _is_safe_addition(self, items): + """ + check the items in all_added to see if can be used for online update + return 0 false ; + 1 true ; + 2 for fatal + """ + # allows add attribute to existing entity + + found_in_past_dictionary = 1 + has_topology=0 + for itm in items: + if itm.find('topology.') == 0: + has_topology = 1 + + debug('DEBUG: is_safe_addition %s', itm) + found_in_past_dictionary = self._in_model(self.past_dict, itm) + debug('DBUEG: found_in_past_dictionary %s', found_in_past_dictionary) + if not found_in_past_dictionary: + break + else: + # check whether it is in the forbidden list + if self.in_forbidden_list(itm): + print 'Found changes not supported for update: %s. Exiting' % (itm) + return FATAL_MODEL_CHANGES + + + # if there is a shape change + # return 2 ? + if has_topology and not found_in_past_dictionary: + print 'Found changes not supported for update: %s. Exiting' % (itm) + return FATAL_MODEL_CHANGES + + if found_in_past_dictionary: + return SAFE_ONLINE_UPDATE + + # allow new additions for anything ?? + return SAFE_ONLINE_UPDATE + + def _in_model(self, dictionary, keylist): + """ + check whether the keys is in the dictionary + :param dictionary dictonary to check + :param keylist dot separted key list + + return 1 if it is in model + 0 if it is not in model + """ + debug('DBEUG: in model keylist=%s dictionary %s', keylist, dictionary) + + splitted=keylist.split('|') + n=len(splitted) + i=0 + root_key = splitted[0] + + # loop through the keys and use it to walk the dictionary + # if it can walk down 3 levels, safely assume it is in the + # dictionary, otherwise it is a total new addition + + for i in range(0, n): + if dictionary.has_key(splitted[i]): + if isinstance(dictionary[splitted[i]], dict): + dictionary = dictionary[splitted[i]] + continue + else: + break + + if i > 2: + return 1 + + return 0 + + def in_forbidden_list(self, itm): + forbidden_list = [ '.ListenPort', '.ListenAddress' ] + for forbidden in forbidden_list: + if itm.endswith(forbidden): + return 1 + return 0 + + def get_final_changed_model(self): + """ + Return the changed model. + """ + return self.final_changed_model + + + +class ModelFileDiffer: + + def __init__(self, current_dict, past_dict): + + self.current_dict_file = current_dict + self.past_dict_file = past_dict + + def eval_file(self, file): + true = True + false = False + fh = open(file, 'r') + content = fh.read() + return eval(content) + + + def write_dictionary_to_json_file(self, dictionary, writer, indent=''): + """ + Write the python dictionary in json syntax using the provided writer stream. + :param dictionary: python dictionary to convert to json syntax + :param writer: where to write the dictionary into json syntax + :param indent: current string indention of the json syntax. If not provided, indent is an empty string + """ + _start_dict = "{\n" + _end_dict = "}\n" + + if dictionary is None: + return + end_line = '' + writer.write(_start_dict) + end_indent = indent + + indent += ' ' + for key, value in dictionary.iteritems(): + writer.write(end_line) + end_line = ",\n" + writer.write(indent + '"' + self.quote_embedded_quotes(key) + '" : ') + if isinstance(value, dict): + self.write_dictionary_to_json_file(value, writer, indent) + else: + writer.write(self.format_json_value(value)) + writer.write(str(end_indent + _end_dict)) + + return + + def quote_embedded_quotes(self, text): + """ + Quote all embedded double quotes in a string with a backslash. + :param text: the text to quote + :return: the quotes result + """ + result = text + if type(text) is str and '"' in text: + result = text.replace('"', '\\"') + return result + + def format_json_value(self, value): + """ + Format the value as a JSON snippet. + :param value: the value + :return: the JSON snippet + """ + import java.lang.StringBuilder as StringBuilder + builder = StringBuilder() + debug("DEBUG: value %s TYPE %s", value, type(value)) + if type(value) == bool or (type(value) == str and (value == 'true' or value == 'false')): + if value: + v = "true" + else: + v = "false" + builder.append(v) + elif type(value) == str: + builder.append('"').append(self.quote_embedded_quotes(value)).append('"') + elif type(value) == list: + builder.append("[ ") + ind = 0 + for list_item in value: + if ind > 0: + builder.append(", ") + builder.append('"').append(list_item).append('"') + ind = ind+1 + + builder.append(" ]") + else: + builder.append(value) + return builder.toString() + + def compare(self): + current_dict = self.eval_file(sys.argv[1]) + past_dict = self.eval_file(sys.argv[2]) + obj = ModelDiffer(current_dict, past_dict) + obj.calculate_changed_model() + net_diff = obj.get_final_changed_model() + fh = open('/tmp/diffed_model.json', 'w') + self.write_dictionary_to_json_file(net_diff, fh) + #print all_added + fh.close() + fh = open('/tmp/diffed_model.yaml', 'w') + pty = PythonToYaml() + pty._write_dictionary_to_yaml_file(net_diff, fh) + fh.close() + return obj.is_safe_diff(net_diff) + +def debug(format_string, *arguments): + if os.environ.has_key('DEBUG_INTROSPECT_JOB'): + print format_string % (arguments) + return + +def main(): + try: + obj = ModelFileDiffer(sys.argv[1], sys.argv[2]) + rc=obj.compare() + rcfh = open('/tmp/model_diff_rc', 'w') + rcfh.write(",".join(map(str,changed_items))) + rcfh.close() + System.exit(0) + except: + exc_type, exc_obj, exc_tb = sys.exc_info() + eeString = traceback.format_exception(exc_type, exc_obj, exc_tb) + print eeString + System.exit(-1) +if __name__ == "__main__": + all_changes = [] + all_added = [] + all_removed = [] + changed_items = [] + main() + + diff --git a/operator/src/main/resources/scripts/model_filters.json b/operator/src/main/resources/scripts/model_filters.json new file mode 100644 index 00000000000..849659d8402 --- /dev/null +++ b/operator/src/main/resources/scripts/model_filters.json @@ -0,0 +1,11 @@ +{ + "create": [ + { "name": "primordial_filter", "path": "/u01/wdt/weblogic-deploy/lib/wdt_create_filter.py" } + ], + "deploy": [ + ], + "discover": [ + ], + "update": [ + ] + } \ No newline at end of file diff --git a/operator/src/main/resources/scripts/startServer.sh b/operator/src/main/resources/scripts/startServer.sh index 574d3421669..1c60660ee67 100755 --- a/operator/src/main/resources/scripts/startServer.sh +++ b/operator/src/main/resources/scripts/startServer.sh @@ -16,6 +16,12 @@ traceTiming "POD '${SERVICE_NAME}' MAIN START" trace "Starting WebLogic Server '${SERVER_NAME}'." +source ${SCRIPTPATH}/modelInImage.sh + +if [ $? -ne 0 ]; then + trace SEVERE "Error sourcing modelInImage.sh" && exit 1 +fi + exportInstallHomes # @@ -65,7 +71,7 @@ function startWLS() { traceTiming "POD '${SERVICE_NAME}' MD5 END" # - # We "tail" the future WL Server .out file to stdout in background _before_ starting + # We "tail" the future WL Server .out file to stdout in background _before_ starting # the WLS Server because we use WLST 'nmStart()' to start the server and nmStart doesn't return # control until WLS reaches the RUNNING state. # @@ -111,8 +117,20 @@ function mockWLS() { # Copied $tgt_dir files are stripped of their $fil_prefix # Any .xml files in $tgt_dir that are not in $src_dir/$fil_prefix+FILE are deleted # +# This method is called during boot, see 'copySitCfgWhileRunning' in 'livenessProbe.sh' +# for the similar method that is periodically called while the server is running. + +function copySitCfgWhileBooting() { + # Helper fn to copy sit cfg xml files to the WL server's domain home. + # - params $1/$2/$3 == 'src_dir tgt_dir fil_prefix' + # - $src_dir files are assumed to start with $fil_prefix and end with .xml + # - copied $tgt_dir files are stripped of their $fil_prefix + # - any .xml files in $tgt_dir that are not in $src_dir/$fil_prefix+FILE are deleted + # + # This method is called before the server boots, see + # 'copySitCfgWhileRunning' in 'livenessProbe.sh' for a similar method that + # is called periodically while the server is running. -function copySitCfg() { src_dir=${1?} tgt_dir=${2?} fil_prefix=${3?} @@ -142,11 +160,103 @@ function copySitCfg() { fi } +# prepare mii server + +function prepareMIIServer() { + + trace "Model-in-Image: Creating domain home." + + # primordial domain contain the basic structures, security and other fmwconfig templated info + # domainzip only contains the domain configuration (config.xml jdbc/ jms/) + # Both are needed for the complete domain reconstruction + + if [ ! -f /weblogic-operator/introspector/primordial_domainzip.secure ] ; then + trace SEVERE "Domain Source Type is FromModel, the primordial model archive is missing, cannot start server" + return 1 + fi + + if [ ! -f /weblogic-operator/introspector/domainzip.secure ] ; then + trace SEVERE "Domain type is FromModel, the domain configuration archive is missing, cannot start server" + return 1 + fi + + trace "Model-in-Image: Restoring primordial domain" + cd / || return 1 + base64 -d /weblogic-operator/introspector/primordial_domainzip.secure > /tmp/domain.tar.gz || return 1 + tar -xzf /tmp/domain.tar.gz || return 1 + + trace "Model-in-Image: Restore domain secret" + # decrypt the SerializedSystemIni first + if [ -f ${RUNTIME_ENCRYPTION_SECRET_PASSWORD} ] ; then + MII_PASSPHRASE=$(cat ${RUNTIME_ENCRYPTION_SECRET_PASSWORD}) + else + trace SEVERE "Domain Source Type is 'FromModel' which requires specifying a runtimeEncryptionSecret " \ + "in your domain resource and deploying this secret with a 'password' key, but the secret does not have this key." + return 1 + fi + encrypt_decrypt_domain_secret "decrypt" ${DOMAIN_HOME} ${MII_PASSPHRASE} + + # restore the config zip + # + trace "Model-in-Image: Restore domain config" + cd / || return 1 + base64 -d /weblogic-operator/introspector/domainzip.secure > /tmp/domain.tar.gz || return 1 + tar -xzf /tmp/domain.tar.gz || return 1 + chmod +x ${DOMAIN_HOME}/bin/*.sh ${DOMAIN_HOME}/*.sh || return 1 + + # restore the archive apps and libraries + # + trace "Model-in-Image: Restoring apps and libraries" + + mkdir -p ${DOMAIN_HOME}/lib + if [ $? -ne 0 ] ; then + trace SEVERE "Domain Source Type is FromModel, cannot create ${DOMAIN_HOME}/lib " + return 1 + fi + + for file in $(sort_files ${IMG_ARCHIVES_ROOTDIR} "*.zip") + do + # expand the archive domain libraries to the domain lib + cd ${DOMAIN_HOME}/lib || return 1 + ${JAVA_HOME}/bin/jar xf ${IMG_ARCHIVES_ROOTDIR}/${file} wlsdeploy/domainLibraries/ + + if [ $? -ne 0 ] ; then + trace SEVERE "Domain Source Type is FromModel, error in extracting domain libs ${IMG_ARCHIVES_ROOTDIR}/${file}" + return 1 + fi + + # expand the archive apps and shared lib to the wlsdeploy/* directories + # the config.xml is referencing them from that path + + cd ${DOMAIN_HOME} || return 1 + ${JAVA_HOME}/bin/jar xf ${IMG_ARCHIVES_ROOTDIR}/${file} wlsdeploy/ + + if [ $? -ne 0 ] ; then + trace SEVERE "Domain Source Type is FromModel, error in extracting application archive ${IMG_ARCHIVES_ROOTDIR}/${file}" + return 1 + fi + done + return 0 +} + # trace env vars and dirs before export.*Home calls traceEnv before traceDirs before +traceTiming "POD '${SERVICE_NAME}' MII UNZIP START" + +if [ -f /weblogic-operator/introspector/domainzip.secure ]; then + prepareMIIServer + if [ $? -ne 0 ] ; then + trace SEVERE "Domain Source Type is FromModel, unable to start the server, check other error messages in the log" + exitOrLoop + fi + +fi + +traceTiming "POD '${SERVICE_NAME}' MII UNZIP COMPLETE" + # # Configure startup mode # @@ -243,10 +353,10 @@ createFolder ${DOMAIN_HOME}/servers/${SERVER_NAME}/security copyIfChanged /weblogic-operator/introspector/boot.properties \ ${DOMAIN_HOME}/servers/${SERVER_NAME}/security/boot.properties -copySitCfg /weblogic-operator/introspector ${DOMAIN_HOME}/optconfig 'Sit-Cfg-CFG--' -copySitCfg /weblogic-operator/introspector ${DOMAIN_HOME}/optconfig/jms 'Sit-Cfg-JMS--' -copySitCfg /weblogic-operator/introspector ${DOMAIN_HOME}/optconfig/jdbc 'Sit-Cfg-JDBC--' -copySitCfg /weblogic-operator/introspector ${DOMAIN_HOME}/optconfig/diagnostics 'Sit-Cfg-WLDF--' +copySitCfgWhileBooting /weblogic-operator/introspector ${DOMAIN_HOME}/optconfig 'Sit-Cfg-CFG--' +copySitCfgWhileBooting /weblogic-operator/introspector ${DOMAIN_HOME}/optconfig/jms 'Sit-Cfg-JMS--' +copySitCfgWhileBooting /weblogic-operator/introspector ${DOMAIN_HOME}/optconfig/jdbc 'Sit-Cfg-JDBC--' +copySitCfgWhileBooting /weblogic-operator/introspector ${DOMAIN_HOME}/optconfig/diagnostics 'Sit-Cfg-WLDF--' # # Start WLS diff --git a/operator/src/main/resources/scripts/stopServer.sh b/operator/src/main/resources/scripts/stopServer.sh index 45892930418..d5767109881 100755 --- a/operator/src/main/resources/scripts/stopServer.sh +++ b/operator/src/main/resources/scripts/stopServer.sh @@ -50,6 +50,10 @@ function check_for_shutdown() { if [ -e /tmp/diefast ]; then trace "Found '/tmp/diefast' file; skipping clean shutdown" &>> ${STOP_OUT_FILE} + + # Adjust PATH if necessary before calling jps + adjustPath + kill -9 `jps -v | grep " NodeManager " | awk '{ print $1 }'` kill -9 `jps -v | grep " -Dweblogic.Name=${SERVER_NAME} " | awk '{ print $1 }'` touch ${SHUTDOWN_MARKER_FILE} diff --git a/operator/src/main/resources/scripts/tailLog.sh b/operator/src/main/resources/scripts/tailLog.sh old mode 100755 new mode 100644 index 1f7a2a0d37e..ac429090b3d --- a/operator/src/main/resources/scripts/tailLog.sh +++ b/operator/src/main/resources/scripts/tailLog.sh @@ -22,7 +22,7 @@ done # Work around note: # # The forever loop and '[ -f $1 ]' check above work around an -# unexpected behavior from 'tail -F'. The '-F' expected +# unexpected behavior from 'tail -F'. The '-F' expected # behavior is meant to handle 'rolling' files by both: # # A- Waiting until the file appears instead of exiting @@ -36,3 +36,4 @@ done # But 'A' is not working on WL pods and thus the work around. # (Strangely and thankfully 'B' works fine.) # + diff --git a/operator/src/main/resources/scripts/utils.sh b/operator/src/main/resources/scripts/utils.sh index 41f4fb991b6..3d1e96fe257 100755 --- a/operator/src/main/resources/scripts/utils.sh +++ b/operator/src/main/resources/scripts/utils.sh @@ -153,7 +153,9 @@ function trace() { ;; esac - logPrefix="@[`timestamp`][$logLoc][$logLevel]" + function logPrefix() { + echo "@[`timestamp`][$logLoc][$logLevel]" + } case $logMode in -pipe) @@ -162,15 +164,15 @@ function trace() { # -r cause read to treat backslashes as-is, e.g. '\n' --> '\n' IFS='' while read -r line; do - echo "$logPrefix" "$@" "$line" + echo "$(logPrefix)" "$@" "$line" done ) ;; -n) - echo -n "$logPrefix" "$@" + echo -n "$(logPrefix)" "$@" ;; *) - echo "$logPrefix" "$@" + echo "$(logPrefix)" "$@" ;; esac ) @@ -276,7 +278,8 @@ function traceEnv() { NODEMGR_HOME \ INTROSPECT_HOME \ PATH \ - TRACE_TIMING + TRACE_TIMING \ + OPERATOR_ENVVAR_NAMES do echo " ${env_var}='${!env_var}'" done diff --git a/operator/src/main/resources/scripts/wdt_create_filter.py b/operator/src/main/resources/scripts/wdt_create_filter.py new file mode 100644 index 00000000000..cbec99d9094 --- /dev/null +++ b/operator/src/main/resources/scripts/wdt_create_filter.py @@ -0,0 +1,34 @@ +# Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# ------------ +# Description: +# ------------ +# This is a WDT filter for primordial domain creation. It filters out all resources and +# apps deployments, leaving only the domainInfo and admin server in topology. +# +def filter_model(model): + if model and 'topology' in model: + topology = model['topology'] + if model['topology']['AdminServerName'] != None: + admin_server = topology['AdminServerName'] + model['topology'] = {} + model['topology']['AdminServerName'] = admin_server + model['topology']['Server'] = {} + model['topology']['Server'][admin_server] = topology['Server'][admin_server] + else: + model['topology'] = {} + + if 'Name' in topology: + model['topology']['Name'] = topology['Name'] + + if 'Security' in topology: + model['topology']['Security'] = topology['Security'] + + + if model and 'appDeployments' in model: + model['appDeployments'] = {} + + if model and 'resources' in model: + model['resources'] = {} + diff --git a/operator/src/test/java/oracle/kubernetes/operator/ConfigMapWatcherTest.java b/operator/src/test/java/oracle/kubernetes/operator/ConfigMapWatcherTest.java index 9f1f2cfacc6..b949be22ee6 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/ConfigMapWatcherTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/ConfigMapWatcherTest.java @@ -3,6 +3,7 @@ package oracle.kubernetes.operator; +import java.math.BigInteger; import java.util.concurrent.atomic.AtomicBoolean; import io.kubernetes.client.openapi.models.V1ConfigMap; @@ -19,7 +20,7 @@ /** This test class verifies the behavior of the ConfigMapWatcher. */ public class ConfigMapWatcherTest extends WatcherTestBase implements WatchListener { - private static final int INITIAL_RESOURCE_VERSION = 456; + private static final BigInteger INITIAL_RESOURCE_VERSION = new BigInteger("456"); @Override public void receivedResponse(Watch.Response response) { @@ -32,7 +33,7 @@ public void initialRequest_specifiesStartingResourceVersionAndStandardLabelSelec assertThat( StubWatchFactory.getRequestParameters().get(0), - both(hasEntry("resourceVersion", Integer.toString(INITIAL_RESOURCE_VERSION))) + both(hasEntry("resourceVersion", INITIAL_RESOURCE_VERSION.toString())) .and(hasEntry("labelSelector", LabelConstants.CREATEDBYOPERATOR_LABEL))); } @@ -43,7 +44,7 @@ protected T createObjectWithMetaData(V1ObjectMeta metaData) { } @Override - protected ConfigMapWatcher createWatcher(String ns, AtomicBoolean stopping, int rv) { - return ConfigMapWatcher.create(this, ns, Integer.toString(rv), tuning, this, stopping); + protected ConfigMapWatcher createWatcher(String ns, AtomicBoolean stopping, BigInteger rv) { + return ConfigMapWatcher.create(this, ns, rv.toString(), tuning, this, stopping); } } diff --git a/operator/src/test/java/oracle/kubernetes/operator/DomainPresenceTest.java b/operator/src/test/java/oracle/kubernetes/operator/DomainPresenceTest.java index fbadce1b0a5..cf8be829a41 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/DomainPresenceTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/DomainPresenceTest.java @@ -13,7 +13,6 @@ import com.meterware.simplestub.Memento; import com.meterware.simplestub.StaticStubSupport; -import com.meterware.simplestub.Stub; import io.kubernetes.client.openapi.models.V1Event; import io.kubernetes.client.openapi.models.V1ObjectMeta; import io.kubernetes.client.openapi.models.V1ObjectReference; @@ -35,8 +34,9 @@ import org.junit.Before; import org.junit.Test; +import static com.meterware.simplestub.Stub.createStrictStub; +import static com.meterware.simplestub.Stub.createStub; import static oracle.kubernetes.operator.LabelConstants.SERVERNAME_LABEL; -import static oracle.kubernetes.operator.VersionConstants.DEFAULT_DOMAIN_VERSION; import static org.hamcrest.Matchers.anEmptyMap; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; @@ -50,8 +50,8 @@ public class DomainPresenceTest extends ThreadFactoryTestBase { private static final String NS = "default"; private static final String UID = "UID1"; - private List mementos = new ArrayList<>(); - private KubernetesTestSupport testSupport = new KubernetesTestSupport(); + private final List mementos = new ArrayList<>(); + private final KubernetesTestSupport testSupport = new KubernetesTestSupport(); private Map namespaceStoppingMap; private static Memento installStub(Class containingClass, String fieldName, Object newValue) @@ -90,17 +90,13 @@ private Map getStoppingVariable() throws NoSuchFieldExcep public void tearDown() throws Exception { namespaceStoppingMap.computeIfAbsent(NS, k -> new AtomicBoolean(true)).set(true); shutDownThreads(); - - for (Memento memento : mementos) { - memento.revert(); - } - + mementos.forEach(Memento::revert); testSupport.throwOnCompletionFailure(); } @Test public void whenNoPreexistingDomains_createEmptyDomainPresenceInfoMap() { - DomainProcessorStub dp = Stub.createStub(DomainProcessorStub.class); + DomainProcessorStub dp = createStub(DomainProcessorStub.class); testSupport.addComponent("DP", DomainProcessor.class, dp); readExistingResources(); @@ -150,7 +146,6 @@ private V1ObjectMeta createNamespacedMetadata(String uid, String namespace) { private V1ObjectMeta createMetadata(String uid) { return new V1ObjectMeta() - .putLabelsItem(LabelConstants.RESOURCE_VERSION_LABEL, DEFAULT_DOMAIN_VERSION) .putLabelsItem(LabelConstants.DOMAINUID_LABEL, uid) .putLabelsItem(LabelConstants.CREATEDBYOPERATOR_LABEL, "true"); } @@ -169,7 +164,7 @@ public void whenK8sHasOneDomain_recordAdminServerService() { V1Service service = createServerService(UID, NS, "admin"); testSupport.defineResources(service); - DomainProcessorStub dp = Stub.createStub(DomainProcessorStub.class); + DomainProcessorStub dp = createStub(DomainProcessorStub.class); testSupport.addComponent("DP", DomainProcessor.class, dp); readExistingResources(); @@ -183,7 +178,7 @@ public void whenK8sHasOneDomainWithPod_recordPodPresence() { V1Pod pod = createPodResource(UID, NS, "admin"); testSupport.defineResources(pod); - DomainProcessorStub dp = Stub.createStub(DomainProcessorStub.class); + DomainProcessorStub dp = createStub(DomainProcessorStub.class); testSupport.addComponent("DP", DomainProcessor.class, dp); readExistingResources(); @@ -205,7 +200,7 @@ public void whenK8sHasOneDomainWithOtherEvent_ignoreIt() { addPodResource(UID, NS, "admin"); addEventResource(UID, "admin", "ignore this event"); - DomainProcessorStub dp = Stub.createStub(DomainProcessorStub.class); + DomainProcessorStub dp = createStub(DomainProcessorStub.class); testSupport.addComponent("DP", DomainProcessor.class, dp); readExistingResources(); @@ -247,13 +242,35 @@ Map getDomainPresenceInfos() { return dpis; } + @Override - public void makeRightDomainPresence( - DomainPresenceInfo info, - boolean explicitRecheck, - boolean isDeleting, - boolean isWillInterrupt) { - dpis.put(info.getDomainUid(), info); + public MakeRightDomainOperation createMakeRightOperation(DomainPresenceInfo liveInfo) { + return createStrictStub(MakeRightDomainOperationImpl.class, liveInfo, dpis); + } + + abstract static class MakeRightDomainOperationImpl implements MakeRightDomainOperation { + private final DomainPresenceInfo info; + private final Map dpis; + + MakeRightDomainOperationImpl(DomainPresenceInfo info, Map dpis) { + this.info = info; + this.dpis = dpis; + } + + @Override + public MakeRightDomainOperation withExplicitRecheck() { + return this; + } + + @Override + public MakeRightDomainOperation forDeletion() { + return this; + } + + @Override + public void execute() { + dpis.put(info.getDomainUid(), info); + } } } } diff --git a/operator/src/test/java/oracle/kubernetes/operator/DomainProcessorTest.java b/operator/src/test/java/oracle/kubernetes/operator/DomainProcessorTest.java index c2dfe1a2cb5..29cb97f0434 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/DomainProcessorTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/DomainProcessorTest.java @@ -9,22 +9,32 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.function.Consumer; +import java.util.logging.Level; +import java.util.logging.LogRecord; import java.util.stream.IntStream; import java.util.stream.Stream; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import com.fasterxml.jackson.core.JsonProcessingException; import com.meterware.simplestub.Memento; import com.meterware.simplestub.StaticStubSupport; +import io.kubernetes.client.openapi.models.V1ConfigMap; +import io.kubernetes.client.openapi.models.V1Job; import io.kubernetes.client.openapi.models.V1ObjectMeta; import io.kubernetes.client.openapi.models.V1Pod; -import io.kubernetes.client.openapi.models.V1PodSpec; +import io.kubernetes.client.openapi.models.V1Secret; import io.kubernetes.client.openapi.models.V1Service; import io.kubernetes.client.openapi.models.V1ServicePort; import io.kubernetes.client.openapi.models.V1ServiceSpec; import oracle.kubernetes.operator.helpers.AnnotationHelper; +import oracle.kubernetes.operator.helpers.ConfigMapHelper; import oracle.kubernetes.operator.helpers.DomainPresenceInfo; import oracle.kubernetes.operator.helpers.KubernetesTestSupport; import oracle.kubernetes.operator.helpers.KubernetesUtils; import oracle.kubernetes.operator.helpers.LegalNames; +import oracle.kubernetes.operator.helpers.PodHelper; import oracle.kubernetes.operator.helpers.ServiceHelper; import oracle.kubernetes.operator.helpers.TuningParametersStub; import oracle.kubernetes.operator.helpers.UnitTestHash; @@ -33,6 +43,8 @@ import oracle.kubernetes.operator.wlsconfig.WlsClusterConfig; import oracle.kubernetes.operator.wlsconfig.WlsDomainConfig; import oracle.kubernetes.operator.wlsconfig.WlsServerConfig; +import oracle.kubernetes.operator.work.Component; +import oracle.kubernetes.operator.work.Packet; import oracle.kubernetes.utils.TestUtils; import oracle.kubernetes.weblogic.domain.DomainConfigurator; import oracle.kubernetes.weblogic.domain.DomainConfiguratorFactory; @@ -44,19 +56,30 @@ import org.junit.Before; import org.junit.Test; +import static oracle.kubernetes.operator.DomainProcessorTestSetup.NS; import static oracle.kubernetes.operator.DomainProcessorTestSetup.UID; +import static oracle.kubernetes.operator.DomainSourceType.FromModel; +import static oracle.kubernetes.operator.DomainSourceType.Image; +import static oracle.kubernetes.operator.DomainSourceType.PersistentVolume; import static oracle.kubernetes.operator.LabelConstants.CREATEDBYOPERATOR_LABEL; import static oracle.kubernetes.operator.LabelConstants.DOMAINNAME_LABEL; import static oracle.kubernetes.operator.LabelConstants.DOMAINUID_LABEL; -import static oracle.kubernetes.operator.LabelConstants.RESOURCE_VERSION_LABEL; +import static oracle.kubernetes.operator.LabelConstants.INTROSPECTION_STATE_LABEL; import static oracle.kubernetes.operator.LabelConstants.SERVERNAME_LABEL; -import static oracle.kubernetes.operator.VersionConstants.DEFAULT_DOMAIN_VERSION; import static oracle.kubernetes.operator.WebLogicConstants.RUNNING_STATE; import static oracle.kubernetes.operator.WebLogicConstants.SHUTDOWN_STATE; +import static oracle.kubernetes.operator.helpers.KubernetesTestSupport.CONFIG_MAP; import static oracle.kubernetes.operator.helpers.KubernetesTestSupport.DOMAIN; +import static oracle.kubernetes.operator.helpers.KubernetesTestSupport.POD; +import static oracle.kubernetes.operator.logging.MessageKeys.NOT_STARTING_DOMAINUID_THREAD; +import static oracle.kubernetes.utils.LogMatcher.containsFine; +import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasEntry; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.Matchers.stringContainsInOrder; @@ -71,15 +94,24 @@ public class DomainProcessorTest { private static final int NUM_ADMIN_SERVERS = 1; private static final int NUM_JOB_PODS = 1; private static final String[] MANAGED_SERVER_NAMES = - IntStream.rangeClosed(1, MAX_SERVERS).mapToObj(n -> MS_PREFIX + n).toArray(String[]::new); + IntStream.rangeClosed(1, MAX_SERVERS).mapToObj(DomainProcessorTest::getManagedServerName).toArray(String[]::new); - private List mementos = new ArrayList<>(); - private KubernetesTestSupport testSupport = new KubernetesTestSupport(); - private DomainConfigurator domainConfigurator; - private Map presenceInfoMap = new HashMap<>(); - private DomainProcessorImpl processor = + @Nonnull + private static String getManagedServerName(int n) { + return MS_PREFIX + n; + } + + private final List mementos = new ArrayList<>(); + private final List logRecords = new ArrayList<>(); + private final KubernetesTestSupport testSupport = new KubernetesTestSupport(); + private final Map> presenceInfoMap = new HashMap<>(); + private final DomainProcessorImpl processor = new DomainProcessorImpl(DomainProcessorDelegateStub.createDelegate(testSupport)); - private Domain domain = DomainProcessorTestSetup.createTestDomain(); + private final Domain domain = DomainProcessorTestSetup.createTestDomain(); + private final Domain newDomain = DomainProcessorTestSetup.createTestDomain(); + private final DomainConfigurator domainConfigurator = configureDomain(newDomain); + private final MakeRightDomainOperation makeRightOperation = processor.createMakeRightOperation(newDomain); + private final WlsDomainConfig domainConfig = createDomainConfig(); private static WlsDomainConfig createDomainConfig() { WlsClusterConfig clusterConfig = new WlsClusterConfig(CLUSTER); @@ -97,7 +129,8 @@ private static WlsDomainConfig createDomainConfig() { */ @Before public void setUp() throws Exception { - mementos.add(TestUtils.silenceOperatorLogger()); + mementos.add(TestUtils.silenceOperatorLogger() + .collectLogMessages(logRecords, NOT_STARTING_DOMAINUID_THREAD).withLogLevel(Level.FINE)); mementos.add(testSupport.install()); mementos.add(StaticStubSupport.install(DomainProcessorImpl.class, "DOMAINS", presenceInfoMap)); mementos.add(TuningParametersStub.install()); @@ -105,8 +138,7 @@ public void setUp() throws Exception { mementos.add(UnitTestHash.install()); mementos.add(ScanCacheStub.install()); - domainConfigurator = DomainConfiguratorFactory.forDomain(domain); - testSupport.defineResources(domain); + testSupport.defineResources(newDomain); new DomainProcessorTestSetup(testSupport).defineKubernetesResources(createDomainConfig()); DomainProcessorTestSetup.defineRequiredResources(testSupport); } @@ -121,12 +153,30 @@ public void tearDown() { } } + @Test + public void whenDomainSpecNotChanged_dontRunUpdateThread() { + DomainProcessorImpl.registerDomainPresenceInfo(new DomainPresenceInfo(domain)); + + makeRightOperation.execute(); + + assertThat(logRecords, containsFine(NOT_STARTING_DOMAINUID_THREAD)); + } + + @Test + public void whenDomainExplicitSet_runUpdateThread() { + DomainProcessorImpl.registerDomainPresenceInfo(new DomainPresenceInfo(domain)); + + processor.createMakeRightOperation(new DomainPresenceInfo(domain)).withExplicitRecheck().execute(); + + assertThat(logRecords, not(containsFine(NOT_STARTING_DOMAINUID_THREAD))); + } + @Test public void whenDomainConfiguredForMaxServers_establishMatchingPresence() { domainConfigurator.configureCluster(CLUSTER).withReplicas(MAX_SERVERS); DomainPresenceInfo info = new DomainPresenceInfo(domain); - processor.makeRightDomainPresence(info, true, false, false); + processor.createMakeRightOperation(info).execute(); assertServerPodAndServicePresent(info, ADMIN_NAME); for (String serverName : MANAGED_SERVER_NAMES) { @@ -137,15 +187,12 @@ public void whenDomainConfiguredForMaxServers_establishMatchingPresence() { } @Test - public void verifyThat_serverStatusUpdated_byMakeRightDomainPresence() { + public void whenMakeRightRun_updateSDomainStatus() { domainConfigurator.configureCluster(CLUSTER).withReplicas(MIN_REPLICAS); - DomainPresenceInfo info = new DomainPresenceInfo(domain); - - processor.makeRightDomainPresence(info, true, false, false); + processor.createMakeRightOperation(new DomainPresenceInfo(domain)).execute(); Domain updatedDomain = testSupport.getResourceWithName(DOMAIN, UID); - DomainStatus domainStatus = updatedDomain.getStatus(); assertThat(getDesiredState(updatedDomain, MANAGED_SERVER_NAMES[0]), equalTo(RUNNING_STATE)); assertThat(getDesiredState(updatedDomain, MANAGED_SERVER_NAMES[1]), equalTo(RUNNING_STATE)); @@ -160,8 +207,7 @@ public void whenDomainScaledDown_removeExcessPodsAndServices() { Arrays.stream(MANAGED_SERVER_NAMES).forEach(this::defineServerResources); domainConfigurator.configureCluster(CLUSTER).withReplicas(MIN_REPLICAS); - DomainPresenceInfo info = new DomainPresenceInfo(domain); - processor.makeRightDomainPresence(info, true, false, false); + processor.createMakeRightOperation(new DomainPresenceInfo(domain)).withExplicitRecheck().execute(); assertThat((int) getServerServices().count(), equalTo(MIN_REPLICAS + NUM_ADMIN_SERVERS)); assertThat(getRunningPods().size(), equalTo(MIN_REPLICAS + NUM_ADMIN_SERVERS + NUM_JOB_PODS)); @@ -174,8 +220,7 @@ public void whenDomainScaledDown_withPreCreateServerService_doesNotRemoveService domainConfigurator.configureCluster(CLUSTER).withReplicas(MIN_REPLICAS).withPrecreateServerService(true); - DomainPresenceInfo info = new DomainPresenceInfo(domain); - processor.makeRightDomainPresence(info, true, false, false); + processor.createMakeRightOperation(new DomainPresenceInfo(newDomain)).withExplicitRecheck().execute(); assertThat((int) getServerServices().count(), equalTo(MAX_SERVERS + NUM_ADMIN_SERVERS)); assertThat(getRunningPods().size(), equalTo(MIN_REPLICAS + NUM_ADMIN_SERVERS + NUM_JOB_PODS)); @@ -187,7 +232,7 @@ public void whenDomainShutDown_removeAllPodsAndServices() { Arrays.stream(MANAGED_SERVER_NAMES).forEach(this::defineServerResources); DomainPresenceInfo info = new DomainPresenceInfo(domain); - processor.makeRightDomainPresence(info, true, true, true); + processor.createMakeRightOperation(info).interrupt().forDeletion().withExplicitRecheck().execute(); assertThat(getRunningServices(), empty()); assertThat(getRunningPods(), empty()); @@ -200,7 +245,7 @@ public void whenDomainShutDown_ignoreNonOperatorServices() { testSupport.defineResources(createNonOperatorService()); DomainPresenceInfo info = new DomainPresenceInfo(domain); - processor.makeRightDomainPresence(info, true, true, true); + processor.createMakeRightOperation(info).interrupt().forDeletion().withExplicitRecheck().execute(); assertThat(getRunningServices(), contains(createNonOperatorService())); assertThat(getRunningPods(), empty()); @@ -211,12 +256,11 @@ private V1Service createNonOperatorService() { .metadata( new V1ObjectMeta() .name("do-not-delete-service") - .namespace(DomainProcessorTestSetup.NS) + .namespace(NS) .putLabelsItem("serviceType", "SERVER") .putLabelsItem(CREATEDBYOPERATOR_LABEL, "false") .putLabelsItem(DOMAINNAME_LABEL, DomainProcessorTestSetup.UID) .putLabelsItem(DOMAINUID_LABEL, DomainProcessorTestSetup.UID) - .putLabelsItem(RESOURCE_VERSION_LABEL, DEFAULT_DOMAIN_VERSION) .putLabelsItem(SERVERNAME_LABEL, ADMIN_NAME)) .spec(new V1ServiceSpec().type(ServiceHelper.CLUSTER_IP_TYPE)); } @@ -228,11 +272,255 @@ public void onUpgradeFromV20_updateExternalService() { domainConfigurator.configureCluster(CLUSTER).withReplicas(MAX_SERVERS); DomainPresenceInfo info = new DomainPresenceInfo(domain); - processor.makeRightDomainPresence(info, true, false, false); + processor.createMakeRightOperation(info).withExplicitRecheck().execute(); assertThat(info.getExternalService(ADMIN_NAME), notNullValue()); } + private static final String OLD_INTROSPECTION_STATE = "123"; + private static final String NEW_INTROSPECTION_STATE = "124"; + private static final String INTROSPECTOR_MAP_NAME = UID + KubernetesConstants.INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX; + + @Test + public void whenDomainHasRunningServersAndExistingTopology_dontRunIntrospectionJob() throws JsonProcessingException { + establishPreviousIntrospection(null); + + domainConfigurator.withIntrospectVersion(OLD_INTROSPECTION_STATE); + makeRightOperation.execute(); + + assertThat(makeRightOperation.wasInspectionRun(), is(false)); + } + + @Test + public void whenDomainHasIntrospectVersionDifferentFromOldDomain_runIntrospectionJob() throws Exception { + establishPreviousIntrospection(null); + + domainConfigurator.withIntrospectVersion(NEW_INTROSPECTION_STATE); + processor.createMakeRightOperation(new DomainPresenceInfo(newDomain)).interrupt().execute(); + + assertThat(job, notNullValue()); + } + + @Test + public void whenIntrospectionJobRun_recordIt() throws Exception { + establishPreviousIntrospection(null); + + domainConfigurator.withIntrospectVersion(NEW_INTROSPECTION_STATE); + MakeRightDomainOperation makeRight = this.processor.createMakeRightOperation( + new DomainPresenceInfo(newDomain)).interrupt(); + makeRight.execute(); + + assertThat(makeRight.wasInspectionRun(), is(true)); + } + + private void establishPreviousIntrospection(Consumer domainSetup) throws JsonProcessingException { + if (domainSetup != null) { + domainSetup.accept(domain); + domainSetup.accept(newDomain); + } + domainConfigurator.configureCluster(CLUSTER).withReplicas(MIN_REPLICAS); + defineServerResources(ADMIN_NAME); + defineServerResources(getManagedServerName(1)); + defineServerResources(getManagedServerName(2)); + DomainProcessorImpl.registerDomainPresenceInfo(new DomainPresenceInfo(domain)); + testSupport.defineResources(createIntrospectorConfigMap(OLD_INTROSPECTION_STATE)); + testSupport.doOnCreate(KubernetesTestSupport.JOB, j -> recordJob((V1Job) j)); + domainConfigurator.withIntrospectVersion(OLD_INTROSPECTION_STATE); + } + + private String getCurrentImageSpecHash() { + return String.valueOf(ConfigMapHelper.getModelInImageSpecHash(newDomain.getSpec().getImage())); + } + + // define a config map with a topology to avoid the no-topology condition that always runs the introspector + @SuppressWarnings("SameParameterValue") + private V1ConfigMap createIntrospectorConfigMap(String introspectionDoneValue) throws JsonProcessingException { + return new V1ConfigMap() + .metadata(createIntrospectorConfigMapMeta(introspectionDoneValue)) + .data(new HashMap<>(Map.of(IntrospectorConfigMapKeys.TOPOLOGY_YAML, defineTopology(), + IntrospectorConfigMapKeys.DOMAIN_INPUTS_HASH, getCurrentImageSpecHash()))); + } + + private V1ObjectMeta createIntrospectorConfigMapMeta(@Nullable String introspectionDoneValue) { + final V1ObjectMeta meta = new V1ObjectMeta() + .namespace(NS) + .name(ConfigMapHelper.getIntrospectorConfigMapName(UID)); + Optional.ofNullable(introspectionDoneValue).ifPresent(v -> meta.putLabelsItem(INTROSPECTION_STATE_LABEL, v)); + return meta; + } + + private String defineTopology() throws JsonProcessingException { + return DomainProcessorTestSetup.createTopologyYaml(createDomainConfig()); + } + + @Test + public void afterIntrospection_introspectorConfigMapHasUpToDateLabel() throws Exception { + establishPreviousIntrospection(null); + + domainConfigurator.withIntrospectVersion(NEW_INTROSPECTION_STATE); + processor.createMakeRightOperation(new DomainPresenceInfo(newDomain)).interrupt().execute(); + + assertThat(getIntrospectorConfigMapIntrospectionVersion(), equalTo(NEW_INTROSPECTION_STATE)); + } + + private String getIntrospectorConfigMapIntrospectionVersion() { + return getConfigMaps() + .map(V1ConfigMap::getMetadata) + .filter(this::isIntrospectorMeta) + .findFirst() + .map(V1ObjectMeta::getLabels) + .map(m -> m.get(INTROSPECTION_STATE_LABEL)) + .orElse(null); + } + + private Stream getConfigMaps() { + return testSupport.getResources(CONFIG_MAP).stream(); + } + + private boolean isIntrospectorMeta(@Nullable V1ObjectMeta meta) { + return meta != null && NS.equals(meta.getNamespace()) && INTROSPECTOR_MAP_NAME.equals(meta.getName()); + } + + @Test + public void whenDomainTypeIsDomainInPV_dontRerunIntrospectionJob() throws Exception { + establishPreviousIntrospection(this::configureForDomainInPV); + + makeRightOperation.execute(); + + assertThat(makeRightOperation.wasInspectionRun(), is(false)); + } + + public void configureForDomainInPV(Domain d) { + configureDomain(d).withDomainHomeSourceType(PersistentVolume); + } + + private V1Job job; + + private void recordJob(V1Job job) { + this.job = job; + } + + @Test + public void whenDomainTypeIsDomainInImage_dontRerunIntrospectionJob() throws Exception { + establishPreviousIntrospection(d -> configureDomain(d).withDomainHomeSourceType(Image)); + + makeRightOperation.execute(); + + assertThat(makeRightOperation.wasInspectionRun(), is(false)); + } + + @Test + public void whenDomainTypeIsFromModelDomainAndNoChanges_dontRerunIntrospectionJob() throws Exception { + establishPreviousIntrospection(this::configureForModelInImage); + testSupport.defineResources(new V1Secret().metadata(new V1ObjectMeta().name("wdt-cm-secret").namespace(NS))); + + makeRightOperation.execute(); + + assertThat(makeRightOperation.wasInspectionRun(), is(false)); + } + + void configureForModelInImage(Domain domain) { + configureDomain(domain).withDomainHomeSourceType(FromModel).withRuntimeEncryptionSecret("wdt-cm-secret"); + } + + private DomainConfigurator configureDomain(Domain domain) { + return DomainConfiguratorFactory.forDomain(domain); + } + + @Test + public void whenDomainTypeIsFromModelDomainAndImageHashChanged_runIntrospectionJob() throws Exception { + establishPreviousIntrospection(this::configureForModelInImage); + testSupport.defineResources(new V1Secret().metadata(new V1ObjectMeta().name("wdt-cm-secret").namespace(NS))); + cacheChangedDomainInputsHash(); + + makeRightOperation.execute(); + + assertThat(makeRightOperation.wasInspectionRun(), is(true)); + } + + private void cacheChangedDomainInputsHash() { + getConfigMaps() + .filter(this::isIntrospectorConfigMap) + .findFirst() + .map(V1ConfigMap::getData) + .ifPresent(data -> data.put(IntrospectorConfigMapKeys.DOMAIN_INPUTS_HASH, "changedHash")); + } + + private boolean isIntrospectorConfigMap(V1ConfigMap map) { + return isIntrospectorMeta(map.getMetadata()); + } + + @Test + public void whenDomainTypeIsFromModelDomainAndManagedServerModified_runIntrospectionJobThenRoll() throws Exception { + establishPreviousIntrospection(this::configureForModelInImage); + testSupport.defineResources(new V1Secret().metadata(new V1ObjectMeta().name("wdt-cm-secret").namespace(NS))); + testSupport.doOnCreate(POD, p -> recordPodCreation((V1Pod) p)); + domainConfigurator.configureServer(getManagedServerName(1)).withAdditionalVolume("vol1", "/path"); + domainConfigurator.configureServer(getManagedServerName(2)).withAdditionalVolume("vol2", "/path"); + + makeRightOperation.execute(); + + assertThat(introspectionRunBeforeUpdates, + allOf(hasEntry(getManagedPodName(1), true), hasEntry(getManagedPodName(2), true))); + } + + @Nonnull + public String getManagedPodName(int i) { + return LegalNames.toPodName(UID, getManagedServerName(i)); + } + + @Nonnull + public String getAdminPodName() { + return LegalNames.toPodName(UID, ADMIN_NAME); + } + + private void recordPodCreation(V1Pod pod) { + Optional.of(pod) + .map(V1Pod::getMetadata) + .map(V1ObjectMeta::getName) + .ifPresent(name -> introspectionRunBeforeUpdates.put(name, makeRightOperation.wasInspectionRun())); + } + + private final Map introspectionRunBeforeUpdates = new HashMap<>(); + + @Test + public void whenDomainTypeIsFromModelDomainAndNewServerCreated_dontRunIntrospectionJobFirst() throws Exception { + establishPreviousIntrospection(this::configureForModelInImage); + testSupport.defineResources(new V1Secret().metadata(new V1ObjectMeta().name("wdt-cm-secret").namespace(NS))); + testSupport.doOnCreate(POD, p -> recordPodCreation((V1Pod) p)); + configureDomain(newDomain).configureCluster(CLUSTER).withReplicas(3); + + makeRightOperation.execute(); + + assertThat(introspectionRunBeforeUpdates, hasEntry(getManagedPodName(3), false)); + } + + @Test + public void whenDomainTypeIsFromModelDomainAndAdminServerModified_runIntrospectionJobFirst() throws Exception { + establishPreviousIntrospection(this::configureForModelInImage); + testSupport.defineResources(new V1Secret().metadata(new V1ObjectMeta().name("wdt-cm-secret").namespace(NS))); + testSupport.doOnCreate(POD, p -> recordPodCreation((V1Pod) p)); + configureDomain(newDomain).configureAdminServer().withAdditionalVolume("newVol", "/path"); + + makeRightOperation.execute(); + + assertThat(introspectionRunBeforeUpdates, hasEntry(getAdminPodName(), true)); + } + + @Test + public void afterChangeTriggersIntrospection_doesNotRunIntrospectionOnNextExplicitMakeRight() throws Exception { + establishPreviousIntrospection(this::configureForModelInImage); + testSupport.defineResources(new V1Secret().metadata(new V1ObjectMeta().name("wdt-cm-secret").namespace(NS))); + testSupport.doOnCreate(POD, p -> recordPodCreation((V1Pod) p)); + configureDomain(newDomain).configureAdminServer().withAdditionalVolume("newVol", "/path"); + makeRightOperation.execute(); + job = null; + + processor.createMakeRightOperation(new DomainPresenceInfo(newDomain)).withExplicitRecheck().execute(); + + assertThat(job, nullValue()); + } + // todo after external service created, if adminService deleted, delete service // problem - ServiceType doesn't know what this is, so does not @@ -242,11 +530,10 @@ private V1Service createV20ExternalService() { .metadata( new V1ObjectMeta() .name(LegalNames.toExternalServiceName(DomainProcessorTestSetup.UID, ADMIN_NAME)) - .namespace(DomainProcessorTestSetup.NS) + .namespace(NS) .putLabelsItem(CREATEDBYOPERATOR_LABEL, "true") .putLabelsItem(DOMAINNAME_LABEL, DomainProcessorTestSetup.UID) .putLabelsItem(DOMAINUID_LABEL, DomainProcessorTestSetup.UID) - .putLabelsItem(RESOURCE_VERSION_LABEL, DEFAULT_DOMAIN_VERSION) .putLabelsItem(SERVERNAME_LABEL, ADMIN_NAME)) .spec( new V1ServiceSpec() @@ -270,23 +557,37 @@ private void defineServerResources(String serverName) { testSupport.defineResources(createServerPod(serverName), createServerService(serverName)); } + /**/ private V1Pod createServerPod(String serverName) { - return AnnotationHelper.withSha256Hash( - new V1Pod() - .metadata( - withServerLabels( - new V1ObjectMeta() - .name(LegalNames.toPodName(DomainProcessorTestSetup.UID, serverName)) - .namespace(DomainProcessorTestSetup.NS), - serverName)) - .spec(new V1PodSpec())); + Packet packet = new Packet(); + packet + .getComponents() + .put(ProcessingConstants.DOMAIN_COMPONENT_NAME, Component.createFor(new DomainPresenceInfo(domain))); + packet.put(ProcessingConstants.DOMAIN_TOPOLOGY, domainConfig); + + if (ADMIN_NAME.equals(serverName)) { + packet.put(ProcessingConstants.SERVER_SCAN, domainConfig.getServerConfig(serverName)); + return PodHelper.createAdminServerPodModel(packet); + } else { + packet.put(ProcessingConstants.CLUSTER_NAME, CLUSTER); + packet.put(ProcessingConstants.SERVER_SCAN, getClusteredServerConfig(serverName)); + return PodHelper.createManagedServerPodModel(packet); + } + } + + private WlsServerConfig getClusteredServerConfig(String serverName) { + return domainConfig.getClusterConfig(CLUSTER).getServerConfigs() + .stream() + .filter(c -> serverName.equals(c.getName())).findFirst() + .orElseThrow(); } + private V1ObjectMeta withServerLabels(V1ObjectMeta meta, String serverName) { return KubernetesUtils.withOperatorLabels(DomainProcessorTestSetup.UID, meta) .putLabelsItem(SERVERNAME_LABEL, serverName); } - + private V1Service createServerService(String serverName) { return AnnotationHelper.withSha256Hash( new V1Service() @@ -296,7 +597,7 @@ private V1Service createServerService(String serverName) { .name( LegalNames.toServerServiceName( DomainProcessorTestSetup.UID, serverName)) - .namespace(DomainProcessorTestSetup.NS), + .namespace(NS), serverName))); } @@ -310,7 +611,7 @@ public void whenDomainIsNotValid_dontBringUpServers() { defineDuplicateServerNames(); DomainPresenceInfo info = new DomainPresenceInfo(domain); - processor.makeRightDomainPresence(info, true, false, false); + processor.createMakeRightOperation(info).withExplicitRecheck().execute(); assertServerPodAndServiceNotPresent(info, ADMIN_NAME); for (String serverName : MANAGED_SERVER_NAMES) { @@ -327,8 +628,7 @@ private void assertServerPodAndServiceNotPresent(DomainPresenceInfo info, String public void whenDomainIsNotValid_updateStatus() { defineDuplicateServerNames(); - DomainPresenceInfo info = new DomainPresenceInfo(domain); - processor.makeRightDomainPresence(info, true, false, false); + processor.createMakeRightOperation(new DomainPresenceInfo(domain)).withExplicitRecheck().execute(); Domain updatedDomain = testSupport.getResourceWithName(DOMAIN, UID); assertThat(getStatusReason(updatedDomain), equalTo("ErrBadDomain")); @@ -344,7 +644,7 @@ private String getStatusMessage(Domain updatedDomain) { } private String getDesiredState(Domain domain, String serverName) { - return getServerStatus(domain, serverName).getDesiredState(); + return Optional.ofNullable(getServerStatus(domain, serverName)).map(ServerStatus::getDesiredState).orElse(""); } private ServerStatus getServerStatus(Domain domain, String serverName) { diff --git a/operator/src/test/java/oracle/kubernetes/operator/DomainProcessorTestSetup.java b/operator/src/test/java/oracle/kubernetes/operator/DomainProcessorTestSetup.java index 46ae78c33fb..9a00221c80b 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/DomainProcessorTestSetup.java +++ b/operator/src/test/java/oracle/kubernetes/operator/DomainProcessorTestSetup.java @@ -13,7 +13,6 @@ import io.kubernetes.client.openapi.models.V1Pod; import io.kubernetes.client.openapi.models.V1Secret; import io.kubernetes.client.openapi.models.V1SecretReference; -import oracle.kubernetes.operator.helpers.DomainPresenceInfo; import oracle.kubernetes.operator.helpers.KubernetesTestSupport; import oracle.kubernetes.operator.helpers.LegalNames; import oracle.kubernetes.operator.wlsconfig.WlsDomainConfig; @@ -25,13 +24,14 @@ /** * Setup for tests that will involve running the main domain processor functionality. Such tests - * should run this in their setup, before trying to invoke {@link - * DomainProcessorImpl#makeRightDomainPresence(DomainPresenceInfo, boolean, boolean, boolean)} + * should run this in their setup, before trying to create and execute + * a {@link DomainProcessorImpl.MakeRightDomainOperationImpl}. */ public class DomainProcessorTestSetup { public static final String UID = "test-domain"; public static final String NS = "namespace"; public static final String SECRET_NAME = "secret-name"; + public static final String KUBERNETES_UID = "12345"; private static final String INTROSPECTION_JOB = LegalNames.toJobIntrospectorName(UID); private static final String INTROSPECT_RESULT = @@ -58,7 +58,7 @@ public class DomainProcessorTestSetup { + "%s\n" + ">>> EOF"; - private KubernetesTestSupport testSupport; + private final KubernetesTestSupport testSupport; public DomainProcessorTestSetup(KubernetesTestSupport testSupport) { this.testSupport = testSupport; @@ -89,7 +89,9 @@ private static V1ObjectMeta withTimestamps(V1ObjectMeta meta) { */ public static Domain createTestDomain() { return new Domain() - .withMetadata(withTimestamps(new V1ObjectMeta().name(UID).namespace(NS))) + .withApiVersion(KubernetesConstants.DOMAIN_GROUP + "/" + KubernetesConstants.DOMAIN_VERSION) + .withKind(KubernetesConstants.DOMAIN) + .withMetadata(withTimestamps(new V1ObjectMeta().name(UID).namespace(NS).uid(KUBERNETES_UID))) .withSpec( new DomainSpec() .withWebLogicCredentialsSecret(new V1SecretReference().name(SECRET_NAME).namespace(NS))); @@ -136,7 +138,12 @@ private String getIntrospectResult(WlsDomainConfig domainConfig) throws JsonProc return String.format(INTROSPECT_RESULT, createTopologyYaml(domainConfig)); } - private String createTopologyYaml(WlsDomainConfig domainConfig) throws JsonProcessingException { + /** + * Create a topologyYaml similar to that produced by the introspector. + * @param domainConfig the domain configuration used as a basis for the produced YAML.. + * @throws JsonProcessingException if unable to convert the configuration to YAML. + */ + public static String createTopologyYaml(WlsDomainConfig domainConfig) throws JsonProcessingException { ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory()); return yamlMapper .writerWithDefaultPrettyPrinter() diff --git a/operator/src/test/java/oracle/kubernetes/operator/DomainStatusUpdaterTest.java b/operator/src/test/java/oracle/kubernetes/operator/DomainStatusUpdaterTest.java index b12f7a9c38b..d8cc3830c93 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/DomainStatusUpdaterTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/DomainStatusUpdaterTest.java @@ -513,6 +513,9 @@ public void whenAllDesiredServersRunning_establishAvailableCondition() { assertThat( getRecordedDomain(), hasCondition(Available).withStatus("True").withReason(SERVERS_READY_REASON)); + assertThat( + getRecordedDomain().getApiVersion(), + equalTo(KubernetesConstants.API_VERSION_WEBLOGIC_ORACLE)); } private void setAllDesiredServersRunning() { diff --git a/operator/src/test/java/oracle/kubernetes/operator/DomainUpPlanTest.java b/operator/src/test/java/oracle/kubernetes/operator/DomainUpPlanTest.java index 8ff872d4031..0cf38d4c7b0 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/DomainUpPlanTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/DomainUpPlanTest.java @@ -9,13 +9,14 @@ import java.util.Optional; import com.meterware.simplestub.Memento; +import io.kubernetes.client.openapi.models.V1Container; import io.kubernetes.client.openapi.models.V1ContainerPort; -import io.kubernetes.client.openapi.models.V1ObjectMeta; import io.kubernetes.client.openapi.models.V1Pod; -import io.kubernetes.client.openapi.models.V1SecretReference; +import io.kubernetes.client.openapi.models.V1PodSpec; import io.kubernetes.client.openapi.models.V1SubjectRulesReviewStatus; import oracle.kubernetes.operator.helpers.DomainPresenceInfo; import oracle.kubernetes.operator.helpers.KubernetesTestSupport; +import oracle.kubernetes.operator.helpers.TuningParametersStub; import oracle.kubernetes.operator.helpers.UnitTestHash; import oracle.kubernetes.operator.steps.DomainPresenceStep; import oracle.kubernetes.operator.utils.InMemoryCertificates; @@ -26,13 +27,13 @@ import oracle.kubernetes.weblogic.domain.DomainConfigurator; import oracle.kubernetes.weblogic.domain.DomainConfiguratorFactory; import oracle.kubernetes.weblogic.domain.model.Domain; -import oracle.kubernetes.weblogic.domain.model.DomainSpec; import org.hamcrest.Description; import org.junit.After; import org.junit.Before; import org.junit.Test; import static com.meterware.simplestub.Stub.createStrictStub; +import static oracle.kubernetes.operator.DomainProcessorTestSetup.NS; import static oracle.kubernetes.operator.DomainUpPlanTest.ContainerPortMatcher.hasContainerPort; import static oracle.kubernetes.operator.DomainUpPlanTest.StepChainMatcher.hasChainWithStep; import static oracle.kubernetes.operator.DomainUpPlanTest.StepChainMatcher.hasChainWithStepsInOrder; @@ -44,20 +45,16 @@ import static org.hamcrest.Matchers.not; public class DomainUpPlanTest { - private static final String NS = "namespace"; - private static final String UID = "test-uid"; - private static final V1SecretReference SECRET = new V1SecretReference().name("secret"); + private final TerminalStep adminStep = new TerminalStep(); private final TerminalStep managedServersStep = new TerminalStep(); - private KubernetesTestSupport testSupport = new KubernetesTestSupport(); - private List mementos = new ArrayList<>(); - private Domain domain = - new Domain() - .withMetadata(new V1ObjectMeta().namespace(NS)) - .withSpec(new DomainSpec().withDomainUid(UID).withWebLogicCredentialsSecret(SECRET)); - private DomainConfigurator configurator = DomainConfiguratorFactory.forDomain(domain); - private DomainPresenceInfo domainPresenceInfo = new DomainPresenceInfo(domain); - private DomainProcessorImpl processor = + private final KubernetesTestSupport testSupport = new KubernetesTestSupport(); + private final List mementos = new ArrayList<>(); + private final Domain domain = DomainProcessorTestSetup.createTestDomain(); + private final DomainConfigurator configurator = DomainConfiguratorFactory.forDomain(domain) + .withWebLogicCredentialsSecret("secret", NS); + private final DomainPresenceInfo domainPresenceInfo = new DomainPresenceInfo(domain); + private final DomainProcessorImpl processor = new DomainProcessorImpl(createStrictStub(DomainProcessorDelegateStub.class)); private DomainPresenceStep getDomainPresenceStep() { @@ -73,6 +70,7 @@ public void setUp() throws NoSuchFieldException { mementos.add(TestUtils.silenceOperatorLogger()); mementos.add(testSupport.install()); mementos.add(InMemoryCertificates.install()); + mementos.add(TuningParametersStub.install()); testSupport.addDomainPresenceInfo(domainPresenceInfo); } @@ -147,12 +145,7 @@ public void useSequenceBeforeAdminServerStep() { plan, hasChainWithStepsInOrder( "DomainPresenceStep", - // "DeleteIntrospectorJobStep", "DomainIntrospectorJobStep", - // "WatchDomainIntrospectorJobReadyStep", - // "ReadDomainIntrospectorPodStep", - // "ReadDomainIntrospectorPodLogStep", - // "SitConfigMapStep", "BeforeAdminServiceStep", "AdminPodStep", "ForServerStep", @@ -170,7 +163,7 @@ public void whenAdminPodCreated_hasListenPort() throws NoSuchFieldException { configSupport.setAdminServerName("admin"); Step plan = DomainProcessorImpl.bringAdminServerUp( - new DomainPresenceInfo(domain), new NullPodWaiter(), null); + new DomainPresenceInfo(domain), new NullPodWaiter()); testSupport.addToPacket(DOMAIN_TOPOLOGY, configSupport.createDomainConfig()); testSupport.runSteps(plan); @@ -193,7 +186,7 @@ public Step waitForDelete(V1Pod pod, Step next) { @SuppressWarnings("unused") static class ContainerPortMatcher extends org.hamcrest.TypeSafeDiagnosingMatcher { - private int expectedPort; + private final int expectedPort; private ContainerPortMatcher(int expectedPort) { this.expectedPort = expectedPort; @@ -214,8 +207,11 @@ protected boolean matchesSafely(V1Pod item, Description mismatchDescription) { } private List getContainerPorts(V1Pod item) { - return Optional.ofNullable(item.getSpec().getContainers().get(0).getPorts()) - .orElse(Collections.emptyList()); + return Optional.ofNullable(item.getSpec()) + .map(V1PodSpec::getContainers) + .map(c -> c.get(0)) + .map(V1Container::getPorts) + .orElse(Collections.emptyList()); } @Override @@ -227,7 +223,7 @@ public void describeTo(Description description) { @SuppressWarnings("unused") static class StepChainMatcher extends org.hamcrest.TypeSafeDiagnosingMatcher { - private String[] expectedSteps; + private final String[] expectedSteps; private StepChainMatcher(String[] expectedSteps) { this.expectedSteps = expectedSteps; diff --git a/operator/src/test/java/oracle/kubernetes/operator/DomainWatcherTest.java b/operator/src/test/java/oracle/kubernetes/operator/DomainWatcherTest.java index da7e5c25acf..75f4e2d9213 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/DomainWatcherTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/DomainWatcherTest.java @@ -3,6 +3,7 @@ package oracle.kubernetes.operator; +import java.math.BigInteger; import java.util.concurrent.atomic.AtomicBoolean; import io.kubernetes.client.openapi.models.V1ObjectMeta; @@ -19,7 +20,7 @@ /** This test class verifies the behavior of the DomainWatcher. */ public class DomainWatcherTest extends WatcherTestBase implements WatchListener { - private static final int INITIAL_RESOURCE_VERSION = 456; + private static final BigInteger INITIAL_RESOURCE_VERSION = new BigInteger("456"); private static final String UID = "uid"; private Domain domain = createDomain(); @@ -39,7 +40,7 @@ public void initialRequest_specifiesStartingResourceVersion() { assertThat( StubWatchFactory.getRequestParameters().get(0), - hasEntry("resourceVersion", Integer.toString(INITIAL_RESOURCE_VERSION))); + hasEntry("resourceVersion", INITIAL_RESOURCE_VERSION.toString())); } @Test @@ -54,7 +55,7 @@ protected T createObjectWithMetaData(V1ObjectMeta metaData) { } @Override - protected DomainWatcher createWatcher(String ns, AtomicBoolean stopping, int rv) { - return DomainWatcher.create(this, ns, Integer.toString(rv), tuning, this, stopping); + protected DomainWatcher createWatcher(String ns, AtomicBoolean stopping, BigInteger rv) { + return DomainWatcher.create(this, ns, rv.toString(), tuning, this, stopping); } } diff --git a/operator/src/test/java/oracle/kubernetes/operator/JobWatcherTest.java b/operator/src/test/java/oracle/kubernetes/operator/JobWatcherTest.java index 9d752c6ceeb..bab1c2709eb 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/JobWatcherTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/JobWatcherTest.java @@ -3,6 +3,7 @@ package oracle.kubernetes.operator; +import java.math.BigInteger; import java.util.Collections; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; @@ -36,7 +37,7 @@ /** This test class verifies the behavior of the JobWatcher. */ public class JobWatcherTest extends WatcherTestBase implements WatchListener { - private static final int INITIAL_RESOURCE_VERSION = 234; + private static final BigInteger INITIAL_RESOURCE_VERSION = new BigInteger("234"); private static final String NS = "ns1"; private static final String VERSION = "123"; private V1Job cachedJob = createJob(); @@ -78,7 +79,7 @@ public void initialRequest_specifiesStartingResourceVersionAndStandardLabelSelec assertThat( StubWatchFactory.getRequestParameters().get(0), - both(hasEntry("resourceVersion", Integer.toString(INITIAL_RESOURCE_VERSION))) + both(hasEntry("resourceVersion", INITIAL_RESOURCE_VERSION.toString())) .and(hasEntry("labelSelector", asList(DOMAINUID_LABEL, CREATEDBYOPERATOR_LABEL)))); } @@ -93,12 +94,12 @@ protected T createObjectWithMetaData(V1ObjectMeta metaData) { } @Override - protected JobWatcher createWatcher(String ns, AtomicBoolean stopping, int rv) { - return JobWatcher.create(this, ns, Integer.toString(rv), tuning, stopping); + protected JobWatcher createWatcher(String ns, AtomicBoolean stopping, BigInteger rv) { + return JobWatcher.create(this, ns, rv.toString(), tuning, stopping); } private JobWatcher createWatcher(AtomicBoolean stopping) { - return JobWatcher.create(this, "ns", Integer.toString(INITIAL_RESOURCE_VERSION), tuning, stopping); + return JobWatcher.create(this, "ns", INITIAL_RESOURCE_VERSION.toString(), tuning, stopping); } @Test diff --git a/operator/src/test/java/oracle/kubernetes/operator/NamespaceTest.java b/operator/src/test/java/oracle/kubernetes/operator/NamespaceTest.java index 590281b5566..62452ca7da3 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/NamespaceTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/NamespaceTest.java @@ -47,7 +47,8 @@ public class NamespaceTest { public static final String NAMESPACE_STOPPING_MAP = "namespaceStoppingMap"; private Domain domain = DomainProcessorTestSetup.createTestDomain(); - private final TuningParameters.WatchTuning tuning = new TuningParameters.WatchTuning(30, 0); + private final TuningParameters.WatchTuning tuning + = new TuningParameters.WatchTuning(30, 0, 5); private List mementos = new ArrayList<>(); private Set currentNamespaces = new HashSet<>(); private Map helmValues = new HashMap<>(); @@ -217,7 +218,7 @@ abstract static class TuningParametersStub implements TuningParameters { public static Memento install(int newValue) throws NoSuchFieldException { return StaticStubSupport.install( - TuningParametersImpl.class, "INSTANCE", createStrictStub(TuningParametersStub.class, newValue)); + TuningParametersImpl.class, "INSTANCE", createStrictStub(TuningParametersStub.class, newValue)); } TuningParametersStub(int domainPresenceRecheckIntervalSeconds) { @@ -238,4 +239,4 @@ public void stopNamespace(String ns) { Optional.ofNullable(ns).ifPresent(nspace -> nameSpaces.add(nspace)); } } -} \ No newline at end of file +} diff --git a/operator/src/test/java/oracle/kubernetes/operator/NamespaceWatcherTest.java b/operator/src/test/java/oracle/kubernetes/operator/NamespaceWatcherTest.java index efa6b818690..70516c06227 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/NamespaceWatcherTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/NamespaceWatcherTest.java @@ -3,6 +3,7 @@ package oracle.kubernetes.operator; +import java.math.BigInteger; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicBoolean; @@ -20,7 +21,7 @@ public class NamespaceWatcherTest extends WatcherTestBase implements WatchListener { - private static final int INITIAL_RESOURCE_VERSION = 456; + private static final BigInteger INITIAL_RESOURCE_VERSION = new BigInteger("456"); @Override public void receivedResponse(Watch.Response response) { @@ -33,7 +34,7 @@ public void initialRequest_specifiesStartingResourceVersionAndStandardLabelSelec assertThat( StubWatchFactory.getRequestParameters().get(0), - hasEntry("resourceVersion", Integer.toString(INITIAL_RESOURCE_VERSION))); + hasEntry("resourceVersion", INITIAL_RESOURCE_VERSION.toString())); } @SuppressWarnings("unchecked") @@ -43,8 +44,8 @@ protected T createObjectWithMetaData(V1ObjectMeta metaData) { } @Override - protected NamespaceWatcher createWatcher(String ns, AtomicBoolean stopping, int rv) { - return NamespaceWatcher.create((ThreadFactory)this, Integer.toString(rv), + protected NamespaceWatcher createWatcher(String ns, AtomicBoolean stopping, BigInteger rv) { + return NamespaceWatcher.create((ThreadFactory)this, rv.toString(), tuning, (WatchListener)this, stopping); } } diff --git a/operator/src/test/java/oracle/kubernetes/operator/PodWatcherTest.java b/operator/src/test/java/oracle/kubernetes/operator/PodWatcherTest.java index f19ffd17b90..33fc8f5a63e 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/PodWatcherTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/PodWatcherTest.java @@ -3,9 +3,17 @@ package oracle.kubernetes.operator; +import java.math.BigInteger; +import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1ContainerState; +import io.kubernetes.client.openapi.models.V1ContainerStateTerminated; +import io.kubernetes.client.openapi.models.V1ContainerStateWaiting; +import io.kubernetes.client.openapi.models.V1ContainerStatus; import io.kubernetes.client.openapi.models.V1ObjectMeta; import io.kubernetes.client.openapi.models.V1Pod; import io.kubernetes.client.openapi.models.V1PodCondition; @@ -23,6 +31,9 @@ import static oracle.kubernetes.operator.LabelConstants.CREATEDBYOPERATOR_LABEL; import static oracle.kubernetes.operator.LabelConstants.DOMAINUID_LABEL; +import static oracle.kubernetes.operator.helpers.LegalNames.DOMAIN_INTROSPECTOR_JOB_SUFFIX; +import static oracle.kubernetes.operator.logging.MessageKeys.INTROSPECTOR_POD_FAILED; +import static oracle.kubernetes.utils.LogMatcher.containsInfo; import static org.hamcrest.Matchers.both; import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.is; @@ -31,17 +42,36 @@ /** This test class verifies the behavior of the PodWatcher. */ public class PodWatcherTest extends WatcherTestBase implements WatchListener { - private static final int INITIAL_RESOURCE_VERSION = 234; + private static final BigInteger INITIAL_RESOURCE_VERSION = new BigInteger("234"); private static final String NS = "ns"; private static final String NAME = "test"; + private static final int RECHECK_SECONDS = 10; private KubernetesTestSupport testSupport = new KubernetesTestSupport(); private final TerminalStep terminalStep = new TerminalStep(); + private java.util.List mementos = new java.util.ArrayList<>(); + private java.util.List logRecords = new java.util.ArrayList<>(); @Override @Before public void setUp() throws Exception { - super.setUp(); + mementos.add(StubWatchFactory.install()); + StubWatchFactory.setListener(this); addMemento(testSupport.install()); + mementos.add( + oracle.kubernetes.utils.TestUtils.silenceOperatorLogger() + .collectLogMessages(logRecords, getMessageKeys()) + .withLogLevel(java.util.logging.Level.FINE) + .ignoringLoggedExceptions(ApiException.class)); + } + + private String[] getMessageKeys() { + return new String[] { + getPodFailedMessageKey() + }; + } + + private String getPodFailedMessageKey() { + return INTROSPECTOR_POD_FAILED; } @Override @@ -55,7 +85,7 @@ public void initialRequest_specifiesStartingResourceVersionAndStandardLabelSelec assertThat( StubWatchFactory.getRequestParameters().get(0), - both(hasEntry("resourceVersion", Integer.toString(INITIAL_RESOURCE_VERSION))) + both(hasEntry("resourceVersion", INITIAL_RESOURCE_VERSION.toString())) .and(hasEntry("labelSelector", asList(DOMAINUID_LABEL, CREATEDBYOPERATOR_LABEL)))); } @@ -70,12 +100,12 @@ protected T createObjectWithMetaData(V1ObjectMeta metaData) { } @Override - protected PodWatcher createWatcher(String ns, AtomicBoolean stopping, int rv) { - return PodWatcher.create(this, ns, Integer.toString(rv), tuning, this, stopping); + protected PodWatcher createWatcher(String ns, AtomicBoolean stopping, BigInteger rv) { + return PodWatcher.create(this, ns, rv.toString(), tuning, this, stopping); } private PodWatcher createWatcher(AtomicBoolean stopping) { - return PodWatcher.create(this, NS, Integer.toString(INITIAL_RESOURCE_VERSION), tuning, this, stopping); + return PodWatcher.create(this, NS, INITIAL_RESOURCE_VERSION.toString(), tuning, this, stopping); } @Test @@ -90,6 +120,10 @@ private V1Pod createPod() { return new V1Pod().metadata(new V1ObjectMeta().namespace(NS).name(NAME)); } + private V1Pod createIntrospectorPod() { + return new V1Pod().metadata(new V1ObjectMeta().namespace(NS).name(NAME + DOMAIN_INTROSPECTOR_JOB_SUFFIX)); + } + @Test public void whenPodInitiallyReady_waitForReadyProceedsImmediately() { AtomicBoolean stopping = new AtomicBoolean(false); @@ -115,6 +149,24 @@ private V1Pod markPodReady(V1Pod pod) { return pod.status(new V1PodStatus().phase("Running").addConditionsItem(createCondition("Ready"))); } + private V1Pod addContainerStateWaitingMessage(V1Pod pod) { + return pod.status(new V1PodStatus() + .containerStatuses(java.util.Collections.singletonList( + new V1ContainerStatus() + .ready(false) + .state(new V1ContainerState().waiting( + new V1ContainerStateWaiting().message("Error")))))); + } + + private V1Pod addContainerStateTerminatedReason(V1Pod pod) { + return pod.status(new V1PodStatus() + .containerStatuses(java.util.Collections.singletonList( + new V1ContainerStatus() + .ready(false) + .state(new V1ContainerState().terminated( + new V1ContainerStateTerminated().reason("Error")))))); + } + @SuppressWarnings("SameParameterValue") private V1PodCondition createCondition(String type) { return new V1PodCondition().type(type).status("True"); @@ -197,6 +249,31 @@ public void whenPodNotReadyLaterAndThenReady_runNextStep() { assertThat(terminalStep.wasRun(), is(true)); } + @Test + public void whenPodNotReadyLaterAndThenReadyButNoWatchEvent_runNextStep() { + makeModifiedPodReadyWithNoWatchEvent(this::markPodReady); + + testSupport.setTime(RECHECK_SECONDS, TimeUnit.SECONDS); + + assertThat(terminalStep.wasRun(), is(true)); + } + + @Test + public void whenIntrospectPodNotReadyWithTerminatedReason_logPodStatus() { + sendIntrospectorPodModifiedWatchAfterWaitForReady(this::addContainerStateTerminatedReason); + + assertThat(terminalStep.wasRun(), is(false)); + assertThat(logRecords, containsInfo(getPodFailedMessageKey())); + } + + @Test + public void whenIntrospectPodNotReadyWithWaitingMessage_logPodStatus() { + sendIntrospectorPodModifiedWatchAfterWaitForReady(this::addContainerStateWaitingMessage); + + assertThat(terminalStep.wasRun(), is(false)); + assertThat(logRecords, containsInfo(getPodFailedMessageKey())); + } + // Starts the waitForReady step with an incomplete pod and sends a watch indicating that the pod has changed @SafeVarargs private void sendPodModifiedWatchAfterWaitForReady(Function... modifiers) { @@ -214,6 +291,41 @@ private void sendPodModifiedWatchAfterWaitForReady(Function... modi } } + // Simulates a pod that is ready but where Kubernetes has failed to send the watch event + @SafeVarargs + private void makeModifiedPodReadyWithNoWatchEvent(Function... modifiers) { + AtomicBoolean stopping = new AtomicBoolean(false); + PodWatcher watcher = createWatcher(stopping); + V1Pod pod = createPod(); + testSupport.defineResources(pod); + + try { + testSupport.runSteps(watcher.waitForReady(createPod(), terminalStep)); + for (Function modifier : modifiers) { + modifier.apply(pod); + } + } finally { + stopping.set(true); + } + } + + // Starts the waitForReady step with an incomplete pod and sends a watch indicating that the pod has changed + @SafeVarargs + private void sendIntrospectorPodModifiedWatchAfterWaitForReady(Function... modifiers) { + AtomicBoolean stopping = new AtomicBoolean(false); + PodWatcher watcher = createWatcher(stopping); + testSupport.defineResources(createIntrospectorPod()); + + try { + testSupport.runSteps(watcher.waitForReady(createIntrospectorPod(), terminalStep)); + for (Function modifier : modifiers) { + watcher.receivedResponse(new Watch.Response<>("MODIFIED", modifier.apply(createIntrospectorPod()))); + } + } finally { + stopping.set(true); + } + } + @Test public void whenPodDeletedOnFirstRead_runNextStep() { AtomicBoolean stopping = new AtomicBoolean(false); diff --git a/operator/src/test/java/oracle/kubernetes/operator/ServiceWatcherTest.java b/operator/src/test/java/oracle/kubernetes/operator/ServiceWatcherTest.java index 6a5cfd417f3..339676c1e05 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/ServiceWatcherTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/ServiceWatcherTest.java @@ -3,6 +3,7 @@ package oracle.kubernetes.operator; +import java.math.BigInteger; import java.util.concurrent.atomic.AtomicBoolean; import io.kubernetes.client.openapi.models.V1ObjectMeta; @@ -21,7 +22,7 @@ /** This test class verifies the behavior of the ServiceWatcher. */ public class ServiceWatcherTest extends WatcherTestBase implements WatchListener { - private static final int INITIAL_RESOURCE_VERSION = 987; + private static final BigInteger INITIAL_RESOURCE_VERSION = new BigInteger("987"); @Override public void receivedResponse(Watch.Response response) { @@ -34,7 +35,7 @@ public void initialRequest_specifiesStartingResourceVersionAndLabelSelector() { assertThat( StubWatchFactory.getRequestParameters().get(0), - both(hasEntry("resourceVersion", Integer.toString(INITIAL_RESOURCE_VERSION))) + both(hasEntry("resourceVersion", INITIAL_RESOURCE_VERSION.toString())) .and(hasEntry("labelSelector", asList(DOMAINUID_LABEL, CREATEDBYOPERATOR_LABEL)))); } @@ -49,7 +50,7 @@ protected T createObjectWithMetaData(V1ObjectMeta metaData) { } @Override - protected ServiceWatcher createWatcher(String ns, AtomicBoolean stopping, int rv) { - return ServiceWatcher.create(this, ns, Integer.toString(rv), tuning, this, stopping); + protected ServiceWatcher createWatcher(String ns, AtomicBoolean stopping, BigInteger rv) { + return ServiceWatcher.create(this, ns, rv.toString(), tuning, this, stopping); } } diff --git a/operator/src/test/java/oracle/kubernetes/operator/WatcherTestBase.java b/operator/src/test/java/oracle/kubernetes/operator/WatcherTestBase.java index 77190550d7e..fd7ab67d1c5 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/WatcherTestBase.java +++ b/operator/src/test/java/oracle/kubernetes/operator/WatcherTestBase.java @@ -3,6 +3,7 @@ package oracle.kubernetes.operator; +import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -30,14 +31,14 @@ /** Tests behavior of the Watcher class. */ @SuppressWarnings("SameParameterValue") public abstract class WatcherTestBase extends ThreadFactoryTestBase implements AllWatchesClosedListener { - private static final int NEXT_RESOURCE_VERSION = 123456; - private static final int INITIAL_RESOURCE_VERSION = 123; + private static final BigInteger NEXT_RESOURCE_VERSION = new BigInteger("214748364705"); + private static final BigInteger INITIAL_RESOURCE_VERSION = new BigInteger("214748364700"); private static final String NAMESPACE = "testspace"; private final RuntimeException hasNextException = new RuntimeException(Watcher.HAS_NEXT_EXCEPTION_MESSAGE); - final WatchTuning tuning = new WatchTuning(30, 0); + final WatchTuning tuning = new WatchTuning(30, 0, 5); private List mementos = new ArrayList<>(); private List> callBacks = new ArrayList<>(); - private int resourceVersion = INITIAL_RESOURCE_VERSION; + private BigInteger resourceVersion = INITIAL_RESOURCE_VERSION; private AtomicBoolean stopping = new AtomicBoolean(false); private V1ObjectMeta createMetaData() { @@ -88,7 +89,7 @@ public void tearDown() throws Exception { } } - void sendInitialRequest(int initialResourceVersion) { + void sendInitialRequest(BigInteger initialResourceVersion) { scheduleAddResponse(createObjectWithMetaData()); createAndRunWatcher(NAMESPACE, stopping, initialResourceVersion); @@ -119,7 +120,7 @@ private Watch.Response createDeleteResponse(T object) { return WatchEvent.createDeleteEvent(object).toWatchResponse(); } - private Watch.Response createHttpGoneErrorResponse(int nextResourceVersion) { + private Watch.Response createHttpGoneErrorResponse(BigInteger nextResourceVersion) { return WatchEvent.createErrorEvent(HTTP_GONE, nextResourceVersion).toWatchResponse(); } @@ -155,7 +156,7 @@ public void afterFirstSetOfEvents_nextRequestSendsLastResourceVersion() { assertThat( StubWatchFactory.getRequestParameters().get(1), - hasEntry("resourceVersion", String.valueOf(resourceVersion - 2))); + hasEntry("resourceVersion", resourceVersion.subtract(BigInteger.TWO).toString())); } @Test @@ -167,7 +168,7 @@ public void afterHttpGoneError_nextRequestSendsIncludedResourceVersion() { assertThat( StubWatchFactory.getRequestParameters().get(1), - hasEntry("resourceVersion", Integer.toString(NEXT_RESOURCE_VERSION))); + hasEntry("resourceVersion", NEXT_RESOURCE_VERSION.toString())); } @Test @@ -200,7 +201,7 @@ public void afterDelete_nextRequestSendsIncrementedResourceVersion() { assertThat( StubWatchFactory.getRequestParameters().get(1), - hasEntry("resourceVersion", Integer.toString(INITIAL_RESOURCE_VERSION + 1))); + hasEntry("resourceVersion", INITIAL_RESOURCE_VERSION.add(BigInteger.ONE).toString())); } @Test @@ -222,13 +223,15 @@ private void scheduleDeleteResponse(Object object) { } private String getNextResourceVersion() { - return Integer.toString(resourceVersion++); + String res = resourceVersion.toString(); + resourceVersion = resourceVersion.add(BigInteger.ONE); + return res; } - private void createAndRunWatcher(String nameSpace, AtomicBoolean stopping, int resourceVersion) { + private void createAndRunWatcher(String nameSpace, AtomicBoolean stopping, BigInteger resourceVersion) { Watcher watcher = createWatcher(nameSpace, stopping, resourceVersion); watcher.waitForExit(); } - protected abstract Watcher createWatcher(String ns, AtomicBoolean stopping, int rv); + protected abstract Watcher createWatcher(String ns, AtomicBoolean stopping, BigInteger rv); } diff --git a/operator/src/test/java/oracle/kubernetes/operator/builders/WatchEvent.java b/operator/src/test/java/oracle/kubernetes/operator/builders/WatchEvent.java index c126d20f0dd..fbd7f7b2583 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/builders/WatchEvent.java +++ b/operator/src/test/java/oracle/kubernetes/operator/builders/WatchEvent.java @@ -5,6 +5,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.math.BigInteger; import com.google.gson.GsonBuilder; import com.google.gson.annotations.SerializedName; @@ -56,12 +57,12 @@ public static WatchEvent createErrorEvent(int statusCode) { return new WatchEvent<>(new V1Status().code(statusCode).message("Oops")); } - public static WatchEvent createErrorEvent(int statusCode, int resourceVersion) { + public static WatchEvent createErrorEvent(int statusCode, BigInteger resourceVersion) { return new WatchEvent<>( new V1Status().code(statusCode).message(createMessageWithResourceVersion(resourceVersion))); } - private static String createMessageWithResourceVersion(int resourceVersion) { + private static String createMessageWithResourceVersion(BigInteger resourceVersion) { return String.format("Something wrong: continue from (%d)", resourceVersion); } diff --git a/operator/src/test/java/oracle/kubernetes/operator/calls/AsyncRequestStepTest.java b/operator/src/test/java/oracle/kubernetes/operator/calls/AsyncRequestStepTest.java index bc21c33983f..ab191aab400 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/calls/AsyncRequestStepTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/calls/AsyncRequestStepTest.java @@ -134,12 +134,54 @@ public void afterFailedCallback_retrySentAfterDelay() { assertTrue(callFactory.invokedWith(requestParams)); } + @Test + public void afterMultipleRetriesAndSuccessfulCallback_nextStepAppliedWithValue() { + sendMultipleFailedCallback(0, 2); + testSupport.schedule(() -> callFactory.sendSuccessfulCallback(17)); + assertThat(nextStep.result, equalTo(17)); + } + + private void sendMultipleFailedCallback(int statusCode, int maxRetries) { + for (int retryCount = 0; retryCount < maxRetries; retryCount++) { + testSupport.schedule( + () -> callFactory.sendFailedCallback(new ApiException("test failure"), statusCode)); + } + } + + @Test + public void afterRetriesExhausted_fiberTerminatesWithException() { + sendMultipleFailedCallback(0, 3); + + testSupport.verifyCompletionThrowable(FailureStatusSourceException.class); + } + + @Test + public void afterMultipleTimeoutsAndSuccessfulCallback_nextStepAppliedWithValue() { + sendMultipleFailedCallbackWithSetTime(504, 2); + testSupport.schedule(() -> callFactory.sendSuccessfulCallback(17)); + assertThat(nextStep.result, equalTo(17)); + } + + private void sendMultipleFailedCallbackWithSetTime(int statusCode, int maxRetries) { + for (int retryCount = 0; retryCount < maxRetries; retryCount++) { + testSupport.schedule( + () -> callFactory.sendFailedCallback(new ApiException("test failure"), statusCode)); + testSupport.setTime(10 + retryCount * 10, TimeUnit.SECONDS); + } + } + + @Test + public void afterMultipleTimeoutsAndRetriesExhausted_fiberTerminatesWithException() { + sendMultipleFailedCallbackWithSetTime(504, 3); + + testSupport.verifyCompletionThrowable(FailureStatusSourceException.class); + } + // todo tests // can new request clear timeout action? // what is accessContinue? // test CONFLICT (409) status // no retry if status not handled - // test exceeded retry count static class TestStep extends ResponseStep { private Integer result; diff --git a/operator/src/test/java/oracle/kubernetes/operator/calls/unprocessable/UnprocessableEntityTest.java b/operator/src/test/java/oracle/kubernetes/operator/calls/unprocessable/UnprocessableEntityTest.java index f61e9d5b55c..b356af6190b 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/calls/unprocessable/UnprocessableEntityTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/calls/unprocessable/UnprocessableEntityTest.java @@ -7,14 +7,11 @@ import io.kubernetes.client.openapi.ApiException; import oracle.kubernetes.operator.calls.CallResponse; +import oracle.kubernetes.operator.calls.FailureStatusSource; import oracle.kubernetes.operator.calls.RequestParams; import org.junit.Test; -import static java.net.HttpURLConnection.HTTP_FORBIDDEN; -import static oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder.HTTP_UNPROCESSABLE_ENTITY; -import static oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder.isUnprocessableEntity; import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; import static org.hamcrest.junit.MatcherAssert.assertThat; public class UnprocessableEntityTest { @@ -45,21 +42,11 @@ private static String quoted(String s) { return '"' + escape(s) + '"'; } - @Test - public void whenErrorIsNotUnprocessableEntity_returnFalse() { - assertThat(isUnprocessableEntity(new ApiException(HTTP_FORBIDDEN, "")), is(false)); - } - - @Test - public void whenErrorIsUnprocessableEntity_returnTrue() { - assertThat(isUnprocessableEntity(new ApiException(HTTP_UNPROCESSABLE_ENTITY, "")), is(true)); - } - @Test public void extractReasonFromException() { - ApiException exception = new ApiException(HTTP_UNPROCESSABLE_ENTITY, Collections.emptyMap(), SAMPLE_MESSAGE_BODY); + ApiException exception = new ApiException(422, Collections.emptyMap(), SAMPLE_MESSAGE_BODY); - UnprocessableEntityBuilder builder = UnprocessableEntityBuilder.fromFailedCall( + FailureStatusSource builder = UnrecoverableErrorBuilderImpl.fromFailedCall( CallResponse.createFailure(REQUEST_PARAMS, exception, 422)); assertThat(builder.getReason(), equalTo("FieldValueNotFound")); @@ -67,9 +54,9 @@ public void extractReasonFromException() { @Test public void extractMessageFromException() { - ApiException exception = new ApiException(HTTP_UNPROCESSABLE_ENTITY, Collections.emptyMap(), SAMPLE_MESSAGE_BODY); + ApiException exception = new ApiException(422, Collections.emptyMap(), SAMPLE_MESSAGE_BODY); - UnprocessableEntityBuilder builder = UnprocessableEntityBuilder.fromFailedCall( + FailureStatusSource builder = UnrecoverableErrorBuilderImpl.fromFailedCall( CallResponse.createFailure(REQUEST_PARAMS, exception, 422)); assertThat(builder.getMessage(), equalTo("testcall in namespace junit, for testName: " + MESSAGE_1)); @@ -77,12 +64,12 @@ public void extractMessageFromException() { @Test public void constructTestException() { - ApiException exception = new UnprocessableEntityBuilder() + ApiException exception = new UnrecoverableErrorBuilderImpl() .withReason("SomethingWrong") .withMessage("This explanation") .build(); - UnprocessableEntityBuilder builder = UnprocessableEntityBuilder.fromFailedCall( + FailureStatusSource builder = UnrecoverableErrorBuilderImpl.fromFailedCall( CallResponse.createFailure(REQUEST_PARAMS, exception, 422)); assertThat(builder.getReason(), equalTo("SomethingWrong")); diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/AdminPodHelperTest.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/AdminPodHelperTest.java index 98f4fd4a35f..c6938ff6369 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/AdminPodHelperTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/AdminPodHelperTest.java @@ -7,15 +7,16 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Objects; import io.kubernetes.client.openapi.models.V1Container; import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1ObjectMeta; import io.kubernetes.client.openapi.models.V1Pod; import io.kubernetes.client.openapi.models.V1PodSpec; import oracle.kubernetes.operator.LabelConstants; import oracle.kubernetes.operator.PodAwaiterStepFactory; import oracle.kubernetes.operator.ProcessingConstants; -import oracle.kubernetes.operator.VersionConstants; import oracle.kubernetes.operator.calls.FailureStatusSourceException; import oracle.kubernetes.operator.utils.InMemoryCertificates; import oracle.kubernetes.operator.work.FiberTestSupport; @@ -27,6 +28,7 @@ import static oracle.kubernetes.operator.WebLogicConstants.ADMIN_STATE; import static oracle.kubernetes.operator.WebLogicConstants.RUNNING_STATE; +import static oracle.kubernetes.operator.helpers.DomainStatusMatcher.hasStatus; import static oracle.kubernetes.operator.helpers.Matchers.hasContainer; import static oracle.kubernetes.operator.helpers.Matchers.hasEnvVar; import static oracle.kubernetes.operator.helpers.Matchers.hasPvClaimVolume; @@ -158,7 +160,7 @@ public void whenDeleteReportsNotFound_replaceAdminPod() { private V1Pod getIncompatiblePod() { V1Pod existingPod = createTestPodModel(); - existingPod.getSpec().setContainers(null); + Objects.requireNonNull(existingPod.getSpec()).setContainers(null); return existingPod; } @@ -185,12 +187,17 @@ public void whenAdminPodReplacementFails() { Step initialStep = stepFactory.createStepList(terminalStep); testSupport.runSteps(initialStep); - testSupport.verifyCompletionThrowable(FailureStatusSourceException.class); + assertThat(getDomain(), hasStatus("ServerError", + "testcall in namespace junit, for testName: failure reported in test")); } @Test public void whenAdminPodCreated_specHasPodNameAsHostName() { - assertThat(getCreatedPod().getSpec().getHostname(), equalTo(getPodName())); + assertThat(getCreatedPodSpec().getHostname(), equalTo(getPodName())); + } + + private V1PodSpec getCreatedPodSpec() { + return getCreatedPod().getSpec(); } @Test @@ -352,8 +359,8 @@ public void whenDomainHasAdditionalPvClaimVolumesWitVariables_createManagedPodWi .withAdditionalPvClaimVolume("volume-$(SERVER_NAME)", "$(SERVER_NAME)-claim"); assertThat( - getCreatedPod().getSpec().getVolumes(), - allOf(hasPvClaimVolume("volume-admin-server", "admin-server-claim"))); + getCreatedPodSpec().getVolumes(), + hasPvClaimVolume("volume-admin-server", "admin-server-claim")); } @Test @@ -363,7 +370,7 @@ public void whenServerHasAdditionalVolumes_createAdminPodWithThem() { .withAdditionalVolume("volume2", "/source-path2"); assertThat( - getCreatedPod().getSpec().getVolumes(), + getCreatedPodSpec().getVolumes(), allOf(hasVolume("volume1", "/source-path1"), hasVolume("volume2", "/source-path2"))); } @@ -389,7 +396,7 @@ public void whenPodHasDuplicateVolumes_createAdminPodWithCombination() { .withAdditionalVolume("volume2", "/server-path"); assertThat( - getCreatedPod().getSpec().getVolumes(), + getCreatedPodSpec().getVolumes(), allOf(hasVolume("volume1", "/domain-path1"), hasVolume("volume2", "/server-path"))); } @@ -540,17 +547,21 @@ public void whenDomainHasLabels_createAdminPodWithThem() { getConfigurator() .withPodLabel("label1", "domain-label-value1") .withPodLabel("label2", "domain-label-value2"); - Map podLabels = getCreatedPod().getMetadata().getLabels(); + Map podLabels = getCreatedPodMetadata().getLabels(); assertThat(podLabels, hasEntry("label1", "domain-label-value1")); assertThat(podLabels, hasEntry("label2", "domain-label-value2")); } + private V1ObjectMeta getCreatedPodMetadata() { + return getCreatedPod().getMetadata(); + } + @Test public void whenDomainHasAnnotations_createAdminPodWithThem() { getConfigurator() .withPodAnnotation("annotation1", "domain-annotation-value1") .withPodAnnotation("annotation2", "domain-annotation-value2"); - Map podAnnotations = getCreatedPod().getMetadata().getAnnotations(); + Map podAnnotations = getCreatedPodMetadata().getAnnotations(); assertThat(podAnnotations, hasEntry("annotation1", "domain-annotation-value1")); assertThat(podAnnotations, hasEntry("annotation2", "domain-annotation-value2")); @@ -562,7 +573,7 @@ public void whenServerHasLabels_createAdminPodWithThem() { .withPodLabel("label1", "server-label-value1") .withPodLabel("label2", "server-label-value2"); - Map podLabels = getCreatedPod().getMetadata().getLabels(); + Map podLabels = getCreatedPodMetadata().getLabels(); assertThat(podLabels, hasEntry("label1", "server-label-value1")); assertThat(podLabels, hasEntry("label2", "server-label-value2")); } @@ -573,7 +584,7 @@ public void whenServerHasAnnotations_createAdminPodWithThem() { .withPodAnnotation("annotation1", "server-annotation-value1") .withPodAnnotation("annotation2", "server-annotation-value2"); - Map podAnnotations = getCreatedPod().getMetadata().getAnnotations(); + Map podAnnotations = getCreatedPodMetadata().getAnnotations(); assertThat(podAnnotations, hasEntry("annotation1", "server-annotation-value1")); assertThat(podAnnotations, hasEntry("annotation2", "server-annotation-value2")); } @@ -586,7 +597,7 @@ public void whenPodHasDuplicateLabels_createAdminPodWithCombination() { .configureAdminServer() .withPodLabel("label2", "server-label-value1"); - Map podLabels = getCreatedPod().getMetadata().getLabels(); + Map podLabels = getCreatedPodMetadata().getLabels(); assertThat(podLabels, hasEntry("label1", "domain-label-value1")); assertThat(podLabels, hasEntry("label2", "server-label-value1")); } @@ -599,7 +610,7 @@ public void whenPodHasDuplicateAnnotations_createAdminPodWithCombination() { .configureAdminServer() .withPodAnnotation("annotation2", "server-annotation-value1"); - Map podAnnotations = getCreatedPod().getMetadata().getAnnotations(); + Map podAnnotations = getCreatedPodMetadata().getAnnotations(); assertThat(podAnnotations, hasEntry("annotation1", "domain-annotation-value1")); assertThat(podAnnotations, hasEntry("annotation2", "server-annotation-value1")); } @@ -607,15 +618,11 @@ public void whenPodHasDuplicateAnnotations_createAdminPodWithCombination() { @Test public void whenPodHasCustomLabelConflictWithInternal_createAdminPodWithInternal() { getConfigurator() - .withPodLabel(LabelConstants.RESOURCE_VERSION_LABEL, "domain-label-value1") .configureAdminServer() .withPodLabel(LabelConstants.CREATEDBYOPERATOR_LABEL, "server-label-value1") .withPodLabel("label1", "server-label-value1"); - Map podLabels = getCreatedPod().getMetadata().getLabels(); - assertThat( - podLabels, - hasEntry(LabelConstants.RESOURCE_VERSION_LABEL, VersionConstants.DEFAULT_DOMAIN_VERSION)); + Map podLabels = getCreatedPodMetadata().getLabels(); assertThat(podLabels, hasEntry(LabelConstants.CREATEDBYOPERATOR_LABEL, "true")); assertThat(podLabels, hasEntry("label1", "server-label-value1")); } @@ -627,7 +634,7 @@ public void whenDomainAndAdminHasRestartVersion_createAdminPodWithRestartVersion .configureAdminServer() .withRestartVersion("adminRestartV1"); - Map podLabels = getCreatedPod().getMetadata().getLabels(); + Map podLabels = getCreatedPodMetadata().getLabels(); assertThat(podLabels, hasEntry(LabelConstants.DOMAINRESTARTVERSION_LABEL, "domainRestartV1")); assertThat(podLabels, hasEntry(LabelConstants.SERVERRESTARTVERSION_LABEL, "adminRestartV1")); assertThat(podLabels, hasKey(not(LabelConstants.CLUSTERRESTARTVERSION_LABEL))); diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/AsyncCallTestSupport.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/AsyncCallTestSupport.java deleted file mode 100644 index e349bec1bcb..00000000000 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/AsyncCallTestSupport.java +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. -// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. - -package oracle.kubernetes.operator.helpers; - -import java.net.HttpURLConnection; - -import com.meterware.simplestub.Memento; -import io.kubernetes.client.openapi.ApiException; -import oracle.kubernetes.operator.calls.CallFactory; -import oracle.kubernetes.operator.calls.CallResponse; -import oracle.kubernetes.operator.calls.RequestParams; -import oracle.kubernetes.operator.work.Component; -import oracle.kubernetes.operator.work.FiberTestSupport; -import oracle.kubernetes.operator.work.NextAction; -import oracle.kubernetes.operator.work.Packet; -import oracle.kubernetes.operator.work.Step; - -import static oracle.kubernetes.operator.calls.AsyncRequestStep.RESPONSE_COMPONENT_NAME; - -/** - * Support for writing unit tests that use CallBuilder to send requests that expect asynchronous - * responses. - * - *

    The setUp should invoke #installRequestStepFactory to modify CallBuilder for unit testing, - * while capturing the memento to clean up during tearDown. - * - *

    The test must define the simulated responses to the calls it will test, by invoking - * #createCannedResponse, any qualifiers, and the result of the call. For example: - * - *

    testSupport.createCannedResponse("deleteIngress") .withNamespace(namespace).withName(name) - * .failingWith(HttpURLConnection.HTTP_CONFLICT); - * - *

    will report a conflict failure on an attempt to delete an Ingress with the specified name and - * namespace. - * - *

    testSupport.createCannedResponse("listPod") .withNamespace(namespace) .returning(new - * V1PodList().items(Arrays.asList(pod1, pod2, pod3); - * - *

    will return a list of pods after a query with the specified namespace. - */ -@SuppressWarnings("unused") -public class AsyncCallTestSupport extends FiberTestSupport { - - private static RequestParams REQUEST_PARAMS - = new RequestParams("testcall", "junit", "testName", "body"); - - private CallTestSupport callTestSupport = new CallTestSupport(); - - /** - * Installs a factory into CallBuilder to use canned responses. - * - * @return a memento which can be used to restore the production factory - */ - public Memento installRequestStepFactory() { - return new StepFactoryMemento(new RequestStepFactory()); - } - - /** - * Primes CallBuilder to expect a request for the specified method. - * - * @param forMethod the name of the method - * @return a canned response which may be qualified by parameters and defines how CallBuilder - * should react. - */ - public CallTestSupport.CannedResponse createCannedResponse(String forMethod) { - return callTestSupport.createCannedResponse(forMethod); - } - - /** - * Primes CallBuilder to expect a request for the specified method but not complain if none is - * made. - * - * @param forMethod the name of the method - * @return a canned response which may be qualified by parameters and defines how CallBuilder - * should react. - */ - public CallTestSupport.CannedResponse createOptionalCannedResponse(String forMethod) { - return callTestSupport.createOptionalCannedResponse(forMethod); - } - - /** - * Throws an exception if any of the defined responses were not invoked during the test. This - * should generally be called during tearDown(). - */ - void verifyAllDefinedResponsesInvoked() { - callTestSupport.verifyAllDefinedResponsesInvoked(); - } - - private static class StepFactoryMemento implements Memento { - private AsyncRequestStepFactory oldFactory; - - StepFactoryMemento(AsyncRequestStepFactory newFactory) { - oldFactory = CallBuilder.setStepFactory(newFactory); - } - - @Override - public void revert() { - CallBuilder.resetStepFactory(); - } - - @SuppressWarnings("unchecked") - @Override - public T getOriginalValue() { - return (T) oldFactory; - } - } - - private static class CannedResponseStep extends Step { - private CallTestSupport.CannedResponse cannedResponse; - - CannedResponseStep(Step next, CallTestSupport.CannedResponse cannedResponse) { - super(next); - this.cannedResponse = cannedResponse; - } - - @Override - public NextAction apply(Packet packet) { - CallTestSupport.CannedResponse cannedResponse = this.cannedResponse; - CallResponse callResponse = cannedResponse.getCallResponse(); - packet.getComponents().put(RESPONSE_COMPONENT_NAME, Component.createFor(callResponse)); - - return doNext(packet); - } - } - - private static class SuccessStep extends Step { - private final T result; - - SuccessStep(T result, Step next) { - super(next); - this.result = result; - } - - @Override - public NextAction apply(Packet packet) { - packet - .getComponents() - .put( - RESPONSE_COMPONENT_NAME, - Component.createFor(CallResponse.createSuccess(REQUEST_PARAMS, result, HttpURLConnection.HTTP_OK))); - - return doNext(packet); - } - } - - private static class FailureStep extends Step { - private final int status; - - FailureStep(int status, Step next) { - super(next); - this.status = status; - } - - @Override - public NextAction apply(Packet packet) { - packet - .getComponents() - .put( - RESPONSE_COMPONENT_NAME, - Component.createFor(CallResponse.createFailure(REQUEST_PARAMS, new ApiException(), status))); - - return doNext(packet); - } - } - - private class RequestStepFactory implements AsyncRequestStepFactory { - - @Override - public Step createRequestAsync( - ResponseStep next, - RequestParams requestParams, - CallFactory factory, - ClientPool helper, - int timeoutSeconds, - int maxRetryCount, - String fieldSelector, - String labelSelector, - String resourceVersion) { - return new CannedResponseStep( - next, callTestSupport.getMatchingResponse(requestParams, fieldSelector, labelSelector)); - } - } -} diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/ConfigMapHelperTest.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/ConfigMapHelperTest.java index d807c2e3253..cca6c342809 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/ConfigMapHelperTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/ConfigMapHelperTest.java @@ -3,50 +3,46 @@ package oracle.kubernetes.operator.helpers; -import java.net.HttpURLConnection; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.stream.Collectors; import java.util.stream.Stream; +import javax.annotation.Nonnull; import com.meterware.simplestub.Memento; import com.meterware.simplestub.StaticStubSupport; -import io.kubernetes.client.openapi.ApiException; import io.kubernetes.client.openapi.models.V1ConfigMap; import io.kubernetes.client.openapi.models.V1ObjectMeta; -import oracle.kubernetes.operator.KubernetesConstants; import oracle.kubernetes.operator.LabelConstants; -import oracle.kubernetes.operator.VersionConstants; -import oracle.kubernetes.operator.wlsconfig.NetworkAccessPoint; -import oracle.kubernetes.operator.wlsconfig.WlsClusterConfig; -import oracle.kubernetes.operator.wlsconfig.WlsDomainConfig; -import oracle.kubernetes.operator.wlsconfig.WlsDynamicServersConfig; -import oracle.kubernetes.operator.wlsconfig.WlsServerConfig; +import oracle.kubernetes.operator.calls.FailureStatusSourceException; import oracle.kubernetes.operator.work.Packet; import oracle.kubernetes.operator.work.Step; import oracle.kubernetes.utils.TestUtils; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import static com.meterware.simplestub.Stub.createStrictStub; -import static junit.framework.TestCase.assertEquals; -import static junit.framework.TestCase.assertTrue; +import static oracle.kubernetes.operator.KubernetesConstants.SCRIPT_CONFIG_MAP_NAME; import static oracle.kubernetes.operator.ProcessingConstants.SCRIPT_CONFIG_MAP; +import static oracle.kubernetes.operator.helpers.KubernetesTestSupport.CONFIG_MAP; import static oracle.kubernetes.operator.logging.MessageKeys.CM_CREATED; import static oracle.kubernetes.operator.logging.MessageKeys.CM_EXISTS; import static oracle.kubernetes.operator.logging.MessageKeys.CM_REPLACED; import static oracle.kubernetes.utils.LogMatcher.containsFine; import static oracle.kubernetes.utils.LogMatcher.containsInfo; +import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.hasEntry; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.sameInstance; import static org.hamcrest.junit.MatcherAssert.assertThat; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; public class ConfigMapHelperTest { static final String[] SCRIPT_NAMES = { @@ -63,171 +59,25 @@ public class ConfigMapHelperTest { "utils.sh", "wlst.sh", "tailLog.sh", - "monitorLog.sh" + "monitorLog.sh", + "model_diff.py", + "modelInImage.sh", + "wdt_create_filter.py", + "model_filters.json", + "encryption_util.py" }; private static final String DOMAIN_NS = "namespace"; private static final String OPERATOR_NS = "operator"; - private static final String DOMAIN_UID = "domainUID1"; - private static final String introspectResult = - ">>> /u01/introspect/domain1/userConfigNodeManager.secure\n" - + "#WebLogic User Configuration File; 2\n" - + "#Thu Oct 04 21:07:06 GMT 2018\n" - + "weblogic.management.username={AES}fq11xKVoE927O07IUKhQ00d4A8QY598Dvd+KSnHNTEA\\=\n" - + "weblogic.management.password={AES}LIxVY+aqI8KBkmlBTwkvAnQYQs4PS0FX3Ili4uLBggo\\=\n" - + "\n" - + ">>> EOF\n" - + "\n" - + "@[2018-10-04T21:07:06.864 UTC][introspectDomain.py:105] Printing file " - + "/u01/introspect/domain1/userKeyNodeManager.secure\n" - + "\n" - + ">>> /u01/introspect/domain1/userKeyNodeManager.secure\n" - + "BPtNabkCIIc2IJp/TzZ9TzbUHG7O3xboteDytDO3XnwNhumdSpaUGKmcbusdmbOUY+4J2kteu6xJPWTzmNRAtg==\n" - + "\n" - + ">>> EOF\n" - + "\n" - + "@[2018-10-04T21:07:06.867 UTC][introspectDomain.py:105] Printing file " - + "/u01/introspect/domain1/topology.yaml\n" - + "\n" - + ">>> /u01/introspect/domain1/topology.yaml\n" - + "domainValid: true\n" - + "domain:\n" - + " name: \"base_domain\"\n" - + " adminServerName: \"admin-server\"\n" - + " configuredClusters:\n" - + " \"mycluster\":\n" - + " port: 8001\n" - + " servers:\n" - + " \"managed-server1\": {}\n" - + " \"managed-server2\": {}\n" - + " dynamicClusters: {}\n" - + " servers:\n" - + " \"admin-server\":\n" - + " port: 7001\n" - + "\n" - + ">>> EOF"; - - private static final String[] PARTIAL_SCRIPT_NAMES = {"livenessProbe.sh", "additional.sh"}; + + private static final String ADDITIONAL_NAME = "additional.sh"; + private static final String[] PARTIAL_SCRIPT_NAMES = {"livenessProbe.sh", ADDITIONAL_NAME}; private static final String[] COMBINED_SCRIPT_NAMES = combine(SCRIPT_NAMES, PARTIAL_SCRIPT_NAMES); - private static final String DOMAIN_TOPOLOGY = - "domainValid: true\n" - + "domain:\n" - + " name: \"base_domain\"\n" - + " adminServerName: \"admin-server\"\n" - + " configuredClusters:\n" - + " - name: \"cluster-1\"\n" - + " servers:\n" - + " - name: \"managed-server1\"\n" - + " listenPort: 7003\n" - + " listenAddress: \"domain1-managed-server1\"\n" - + " sslListenPort: 7103\n" - + " machineName: \"machine-managed-server1\"\n" - + " - name: \"managed-server2\"\n" - + " listenPort: 7004\n" - + " listenAddress: \"domain1-managed-server2\"\n" - + " sslListenPort: 7104\n" - + " networkAccessPoints:\n" - + " - name: \"nap2\"\n" - + " protocol: \"t3\"\n" - + " listenPort: 7105\n" - + " publicPort: 7105\n" - + " servers:\n" - + " - name: \"admin-server\"\n" - + " listenPort: 7001\n" - + " listenAddress: \"domain1-admin-server\"\n" - + " adminPort: 7099\n" - + " - name: \"server1\"\n" - + " listenPort: 9003\n" - + " listenAddress: \"domain1-managed-server1\"\n" - + " sslListenPort: 8003\n" - + " machineName: \"machine-managed-server1\"\n" - + " - name: \"server2\"\n" - + " listenPort: 9004\n" - + " listenAddress: \"domain1-managed-server2\"\n" - + " sslListenPort: 8004\n" - + " networkAccessPoints:\n" - + " - name: \"nap2\"\n" - + " protocol: \"t3\"\n" - + " listenPort: 8005\n" - + " publicPort: 8005\n"; - private static final String DYNAMIC_SERVER_TOPOLOGY = - "domainValid: true\n" - + "domain:\n" - + " name: \"base_domain\"\n" - + " adminServerName: \"admin-server\"\n" - + " configuredClusters:\n" - + " - name: \"cluster-1\"\n" - + " dynamicServersConfig:\n" - + " name: \"cluster-1\"\n" - + " serverTemplateName: \"cluster-1-template\"\n" - + " calculatedListenPorts: false\n" - + " serverNamePrefix: \"managed-server\"\n" - + " dynamicClusterSize: 4\n" - + " maxDynamicClusterSize: 8\n" - + " minDynamicClusterSize: 2\n" - + " serverTemplates:\n" - + " - name: \"cluster-1-template\"\n" - + " listenPort: 8001\n" - + " clusterName: \"cluster-1\"\n" - + " listenAddress: \"domain1-managed-server${id}\"\n" - + " servers:\n" - + " - name: \"admin-server\"\n" - + " listenPort: 7001\n" - + " listenAddress: \"domain1-admin-server\"\n"; - private static final String MIXED_CLUSTER_TOPOLOGY = - "domainValid: true\n" - + "domain:\n" - + " name: \"base_domain\"\n" - + " adminServerName: \"admin-server\"\n" - + " configuredClusters:\n" - + " - name: \"cluster-1\"\n" - + " dynamicServersConfig:\n" - + " name: \"cluster-1\"\n" - + " serverTemplateName: \"cluster-1-template\"\n" - + " calculatedListenPorts: false\n" - + " serverNamePrefix: \"managed-server\"\n" - + " dynamicClusterSize: 3\n" - + " maxDynamicClusterSize: 8\n" - + " servers:\n" - + " - name: \"ms1\"\n" - + " listenPort: 7003\n" - + " listenAddress: \"domain1-managed-server1\"\n" - + " sslListenPort: 7103\n" - + " machineName: \"machine-managed-server1\"\n" - + " - name: \"ms2\"\n" - + " listenPort: 7004\n" - + " listenAddress: \"domain1-managed-server2\"\n" - + " sslListenPort: 7104\n" - + " networkAccessPoints:\n" - + " - name: \"nap2\"\n" - + " protocol: \"t3\"\n" - + " listenPort: 7105\n" - + " publicPort: 7105\n" - + " serverTemplates:\n" - + " - name: \"cluster-1-template\"\n" - + " listenPort: 8001\n" - + " clusterName: \"cluster-1\"\n" - + " listenAddress: \"domain1-managed-server${id}\"\n" - + " sslListenPort: 7204\n" - + " networkAccessPoints:\n" - + " - name: \"nap3\"\n" - + " protocol: \"t3\"\n" - + " listenPort: 7205\n" - + " publicPort: 7205\n" - + " servers:\n" - + " - name: \"admin-server\"\n" - + " listenPort: 7001\n" - + " listenAddress: \"domain1-admin-server\"\n"; - private static final String INVALID_TOPOLOGY = - "domainValid: false\n" - + "validationErrors:\n" - + " - \"The dynamic cluster \\\"mycluster\\\"'s dynamic servers use calculated listen ports.\""; - private static final String DOMAIN_INVALID_NO_ERRORS = - "domainValid: false\n" + "validationErrors:\n"; private final V1ConfigMap defaultConfigMap = defineDefaultConfigMap(); - private RetryStrategyStub retryStrategy = createStrictStub(RetryStrategyStub.class); - private AsyncCallTestSupport testSupport = new AsyncCallTestSupport(); - private List mementos = new ArrayList<>(); - private List logRecords = new ArrayList<>(); + private final RetryStrategyStub retryStrategy = createStrictStub(RetryStrategyStub.class); + private final KubernetesTestSupport testSupport = new KubernetesTestSupport(); + private final List mementos = new ArrayList<>(); + private final List logRecords = new ArrayList<>(); + @SuppressWarnings("SameParameterValue") private static String[] combine(String[] first, String[] second) { @@ -252,10 +102,8 @@ private V1ConfigMap defineConfigMap(String... scriptNames) { private V1ObjectMeta createMetadata() { return new V1ObjectMeta() - .name(KubernetesConstants.DOMAIN_CONFIG_MAP_NAME) + .name(SCRIPT_CONFIG_MAP_NAME) .namespace(DOMAIN_NS) - .putLabelsItem( - LabelConstants.RESOURCE_VERSION_LABEL, VersionConstants.DEFAULT_DOMAIN_VERSION) .putLabelsItem(LabelConstants.OPERATORNAME_LABEL, OPERATOR_NS) .putLabelsItem(LabelConstants.CREATEDBYOPERATOR_LABEL, "true"); } @@ -270,7 +118,7 @@ public void setUp() throws Exception { TestUtils.silenceOperatorLogger() .collectLogMessages(logRecords, CM_CREATED, CM_EXISTS, CM_REPLACED) .withLogLevel(Level.FINE)); - mementos.add(testSupport.installRequestStepFactory()); + mementos.add(testSupport.install()); mementos.add(TestComparator.install()); } @@ -285,349 +133,98 @@ public void tearDown() throws Exception { } testSupport.throwOnCompletionFailure(); - testSupport.verifyAllDefinedResponsesInvoked(); } @Test - @Ignore("TBD Fails on introspector branch, passes intermittently on develop branch.") public void whenUnableToReadConfigMap_reportFailure() { - testSupport.addRetryStrategy(retryStrategy); - expectReadConfigMap().failingWithStatus(401); + testSupport.failOnResource(CONFIG_MAP, SCRIPT_CONFIG_MAP_NAME, DOMAIN_NS, 401); Step scriptConfigMapStep = ConfigMapHelper.createScriptConfigMapStep(OPERATOR_NS, DOMAIN_NS); testSupport.runSteps(scriptConfigMapStep); - testSupport.verifyCompletionThrowable(ApiException.class); + testSupport.verifyCompletionThrowable(FailureStatusSourceException.class); } @Test - @Ignore("TBD Fails on introspector branch, passes intermittently on develop branch.") public void whenNoConfigMap_createIt() { - expectReadConfigMap().failingWithStatus(HttpURLConnection.HTTP_NOT_FOUND); - expectSuccessfulCreateConfigMap(defaultConfigMap); - testSupport.runSteps(ConfigMapHelper.createScriptConfigMapStep(OPERATOR_NS, DOMAIN_NS)); + assertThat(testSupport.getResources(CONFIG_MAP), notNullValue()); assertThat(logRecords, containsInfo(CM_CREATED)); } @Test - @Ignore("TBD Fails on introspector branch, passes intermittently on develop branch.") public void whenNoConfigMap_retryOnFailure() { testSupport.addRetryStrategy(retryStrategy); - expectReadConfigMap().failingWithStatus(HttpURLConnection.HTTP_NOT_FOUND); - expectCreateConfigMap(defaultConfigMap).failingWithStatus(401); + testSupport.failOnCreate(CONFIG_MAP, SCRIPT_CONFIG_MAP_NAME, DOMAIN_NS, 401); Step scriptConfigMapStep = ConfigMapHelper.createScriptConfigMapStep(OPERATOR_NS, DOMAIN_NS); testSupport.runSteps(scriptConfigMapStep); - testSupport.verifyCompletionThrowable(ApiException.class); + testSupport.verifyCompletionThrowable(FailureStatusSourceException.class); assertThat(retryStrategy.getConflictStep(), sameInstance(scriptConfigMapStep)); } - @SuppressWarnings("unchecked") @Test - @Ignore("TBD Fails on introspector branch, passes intermittently on develop branch.") public void whenMatchingConfigMapExists_addToPacket() { - expectReadConfigMap().returning(defaultConfigMap); + testSupport.defineResources(defaultConfigMap); - Packet packet = - testSupport.runSteps(ConfigMapHelper.createScriptConfigMapStep(OPERATOR_NS, DOMAIN_NS)); + Packet packet = testSupport.runSteps(ConfigMapHelper.createScriptConfigMapStep(OPERATOR_NS, DOMAIN_NS)); - assertThat(packet, hasEntry(SCRIPT_CONFIG_MAP, defaultConfigMap)); assertThat(logRecords, containsFine(CM_EXISTS)); + assertThat(packet, hasEntry(SCRIPT_CONFIG_MAP, defaultConfigMap)); } - @SuppressWarnings("unchecked") @Test - @Ignore("TBD Fails on introspector branch, passes intermittently on develop branch.") public void whenExistingConfigMapIsMissingData_replaceIt() { - expectReadConfigMap().returning(defineConfigMap(PARTIAL_SCRIPT_NAMES)); - expectSuccessfulReplaceConfigMap(defineConfigMap(COMBINED_SCRIPT_NAMES)); + testSupport.defineResources(defineConfigMap(PARTIAL_SCRIPT_NAMES)); testSupport.runSteps(ConfigMapHelper.createScriptConfigMapStep(OPERATOR_NS, DOMAIN_NS)); assertThat(logRecords, containsInfo(CM_REPLACED)); + assertThat(getScriptConfigKeys(), containsInAnyOrder(COMBINED_SCRIPT_NAMES)); } - @SuppressWarnings("unchecked") - @Test - @Ignore("TBD Fails on introspector branch, passes intermittently on develop branch.") - public void whenReplaceFails_scheduleRetry() { - testSupport.addRetryStrategy(retryStrategy); - expectReadConfigMap().returning(defineConfigMap(PARTIAL_SCRIPT_NAMES)); - expectReplaceConfigMap(defineConfigMap(COMBINED_SCRIPT_NAMES)).failingWithStatus(401); - - Step scriptConfigMapStep = ConfigMapHelper.createScriptConfigMapStep(OPERATOR_NS, DOMAIN_NS); - testSupport.runSteps(scriptConfigMapStep); - - testSupport.verifyCompletionThrowable(ApiException.class); - assertThat(retryStrategy.getConflictStep(), sameInstance(scriptConfigMapStep)); - } - - private CallTestSupport.CannedResponse expectReadConfigMap() { - return testSupport - .createCannedResponse("readConfigMap") - .withNamespace(DOMAIN_NS) - .withName(KubernetesConstants.DOMAIN_CONFIG_MAP_NAME); - } - - @SuppressWarnings("unchecked") - private void expectSuccessfulCreateConfigMap(V1ConfigMap expectedConfig) { - expectCreateConfigMap(expectedConfig).returning(expectedConfig); + private Collection getScriptConfigKeys() { + return Optional.ofNullable(getScriptConfigMap()) + .map(V1ConfigMap::getData) + .map(Map::keySet) + .orElseGet(Collections::emptySet); } - private CallTestSupport.CannedResponse expectCreateConfigMap(V1ConfigMap expectedConfig) { - return testSupport - .createCannedResponse("createConfigMap") - .withNamespace(DOMAIN_NS) - .withBody(new V1ConfigMapMatcher(expectedConfig)); + private V1ConfigMap getScriptConfigMap() { + final List configMaps = testSupport.getResources(CONFIG_MAP); + return configMaps.stream().filter(this::isScriptConfigMap).findFirst().orElse(null); } - @SuppressWarnings("unchecked") - private void expectSuccessfulReplaceConfigMap(V1ConfigMap expectedConfig) { - expectReplaceConfigMap(expectedConfig).returning(expectedConfig); - } - - private CallTestSupport.CannedResponse expectReplaceConfigMap(V1ConfigMap expectedConfig) { - return testSupport - .createCannedResponse("replaceConfigMap") - .withNamespace(DOMAIN_NS) - .withName(KubernetesConstants.DOMAIN_CONFIG_MAP_NAME) - .withBody(new V1ConfigMapMatcher(expectedConfig)); - } - - @Test - public void parseDomainTopologyYaml() { - ConfigMapHelper.DomainTopology domainTopology = - ConfigMapHelper.parseDomainTopologyYaml(DOMAIN_TOPOLOGY); - - assertNotNull(domainTopology); - assertTrue(domainTopology.getDomainValid()); - - WlsDomainConfig wlsDomainConfig = domainTopology.getDomain(); - assertNotNull(wlsDomainConfig); - - assertEquals("base_domain", wlsDomainConfig.getName()); - assertEquals("admin-server", wlsDomainConfig.getAdminServerName()); - - Map wlsClusterConfigs = wlsDomainConfig.getClusterConfigs(); - assertEquals(1, wlsClusterConfigs.size()); - - WlsClusterConfig wlsClusterConfig = wlsClusterConfigs.get("cluster-1"); - assertNotNull(wlsClusterConfig); - - List wlsServerConfigs = wlsClusterConfig.getServers(); - assertEquals(2, wlsServerConfigs.size()); - - Map serverConfigMap = wlsDomainConfig.getServerConfigs(); - assertEquals(3, serverConfigMap.size()); - - assertTrue(serverConfigMap.containsKey("admin-server")); - assertTrue(serverConfigMap.containsKey("server1")); - assertTrue(serverConfigMap.containsKey("server2")); - WlsServerConfig adminServerConfig = serverConfigMap.get("admin-server"); - assertEquals(7099, adminServerConfig.getAdminPort().intValue()); - assertTrue(adminServerConfig.isAdminPortEnabled()); - - WlsServerConfig server2Config = serverConfigMap.get("server2"); - assertEquals("domain1-managed-server2", server2Config.getListenAddress()); - assertEquals(9004, server2Config.getListenPort().intValue()); - assertEquals(8004, server2Config.getSslListenPort().intValue()); - assertTrue(server2Config.isSslPortEnabled()); - List server2ConfigNaps = server2Config.getNetworkAccessPoints(); - assertEquals(1, server2ConfigNaps.size()); - - NetworkAccessPoint server2ConfigNap = server2ConfigNaps.get(0); - assertEquals("nap2", server2ConfigNap.getName()); - assertEquals("t3", server2ConfigNap.getProtocol()); - assertEquals(8005, server2ConfigNap.getListenPort().intValue()); - assertEquals(8005, server2ConfigNap.getPublicPort().intValue()); - } - - @Test - public void parseDynamicServerTopologyYaml() { - ConfigMapHelper.DomainTopology domainTopology = - ConfigMapHelper.parseDomainTopologyYaml(DYNAMIC_SERVER_TOPOLOGY); - - assertNotNull(domainTopology); - assertTrue(domainTopology.getDomainValid()); - - WlsDomainConfig wlsDomainConfig = domainTopology.getDomain(); - assertNotNull(wlsDomainConfig); - - assertEquals("base_domain", wlsDomainConfig.getName()); - assertEquals("admin-server", wlsDomainConfig.getAdminServerName()); - - wlsDomainConfig.processDynamicClusters(); - - Map wlsClusterConfigs = wlsDomainConfig.getClusterConfigs(); - assertEquals(1, wlsClusterConfigs.size()); - - WlsClusterConfig wlsClusterConfig = wlsClusterConfigs.get("cluster-1"); - assertNotNull(wlsClusterConfig); - - WlsDynamicServersConfig wlsDynamicServersConfig = wlsClusterConfig.getDynamicServersConfig(); - assertNotNull(wlsDynamicServersConfig); - assertEquals("cluster-1", wlsDynamicServersConfig.getName()); - assertEquals("cluster-1-template", wlsDynamicServersConfig.getServerTemplateName()); - assertFalse( - "Expected calculatedListenPorts false", wlsDynamicServersConfig.getCalculatedListenPorts()); - assertEquals("managed-server", wlsDynamicServersConfig.getServerNamePrefix()); - assertEquals(4, wlsDynamicServersConfig.getDynamicClusterSize().intValue()); - assertEquals(8, wlsDynamicServersConfig.getMaxDynamicClusterSize().intValue()); - assertEquals(2, wlsDynamicServersConfig.getMinDynamicClusterSize().intValue()); - - List serverTemplates = wlsDomainConfig.getServerTemplates(); - assertEquals(1, serverTemplates.size()); - assertEquals("cluster-1-template", serverTemplates.get(0).getName()); - assertEquals("domain1-managed-server${id}", serverTemplates.get(0).getListenAddress()); - assertEquals("cluster-1", serverTemplates.get(0).getClusterName()); - - Map serverConfigMap = wlsDomainConfig.getServerConfigs(); - assertEquals(1, serverConfigMap.size()); - - assertTrue(serverConfigMap.containsKey("admin-server")); + private boolean isScriptConfigMap(@Nonnull V1ConfigMap map) { + return Optional.ofNullable(map.getMetadata()).map(this::isScriptConfigMapMetaData).orElse(false); } - @Test - public void parseMixedClusterTopologyYaml() { - ConfigMapHelper.DomainTopology domainTopology = - ConfigMapHelper.parseDomainTopologyYaml(MIXED_CLUSTER_TOPOLOGY); - - assertNotNull(domainTopology); - assertTrue(domainTopology.getDomainValid()); - - WlsDomainConfig wlsDomainConfig = domainTopology.getDomain(); - assertNotNull(wlsDomainConfig); - - assertEquals("base_domain", wlsDomainConfig.getName()); - assertEquals("admin-server", wlsDomainConfig.getAdminServerName()); - - wlsDomainConfig.processDynamicClusters(); - - Map wlsClusterConfigs = wlsDomainConfig.getClusterConfigs(); - assertEquals(1, wlsClusterConfigs.size()); - - WlsClusterConfig wlsClusterConfig = wlsClusterConfigs.get("cluster-1"); - assertNotNull(wlsClusterConfig); - - assertTrue(wlsClusterConfig.hasDynamicServers()); - assertTrue(wlsClusterConfig.hasStaticServers()); - assertEquals(2, wlsClusterConfig.getClusterSize()); - assertEquals(3, wlsClusterConfig.getDynamicClusterSize()); - assertEquals(5, wlsClusterConfig.getServerConfigs().size()); - assertEquals(2, wlsClusterConfig.getServers().size()); - - assertNotNull(wlsDomainConfig.getServerTemplates()); - assertEquals(1, wlsDomainConfig.getServerTemplates().size()); - assertNotNull(wlsDomainConfig.getServerTemplates().get(0)); - assertEquals("cluster-1-template", wlsDomainConfig.getServerTemplates().get(0).getName()); - assertEquals( - "domain1-managed-server${id}", - wlsDomainConfig.getServerTemplates().get(0).getListenAddress()); - assertEquals(8001, wlsDomainConfig.getServerTemplates().get(0).getListenPort().intValue()); - - List serverTemplates = wlsDomainConfig.getServerTemplates(); - assertEquals(1, serverTemplates.size()); - assertEquals("cluster-1-template", serverTemplates.get(0).getName()); - assertEquals("domain1-managed-server${id}", serverTemplates.get(0).getListenAddress()); - assertEquals("cluster-1", serverTemplates.get(0).getClusterName()); - - WlsDynamicServersConfig dynamicServerConfig = wlsClusterConfig.getDynamicServersConfig(); - assertNotNull(dynamicServerConfig.getServerTemplateName()); - assertEquals("cluster-1-template", dynamicServerConfig.getServerTemplateName()); - - List dynamicServerConfigs = dynamicServerConfig.getServerConfigs(); - assertEquals(3, dynamicServerConfigs.size()); - - assertEquals(true, dynamicServerConfigs.get(0).isDynamicServer()); - assertEquals("domain1-managed-server1", dynamicServerConfigs.get(0).getListenAddress()); - assertEquals(8001, dynamicServerConfigs.get(0).getListenPort().intValue()); - assertEquals(7204, dynamicServerConfigs.get(0).getSslListenPort().intValue()); - assertEquals(1, dynamicServerConfigs.get(0).getNetworkAccessPoints().size()); - assertEquals( - 7205, - dynamicServerConfigs.get(0).getNetworkAccessPoints().get(0).getListenPort().intValue()); - - assertEquals(true, dynamicServerConfigs.get(1).isDynamicServer()); - assertEquals("domain1-managed-server2", dynamicServerConfigs.get(1).getListenAddress()); - assertEquals(8001, dynamicServerConfigs.get(1).getListenPort().intValue()); - assertEquals(7204, dynamicServerConfigs.get(1).getSslListenPort().intValue()); - assertEquals(1, dynamicServerConfigs.get(1).getNetworkAccessPoints().size()); - assertEquals( - 7205, - dynamicServerConfigs.get(1).getNetworkAccessPoints().get(0).getListenPort().intValue()); - - assertEquals(true, dynamicServerConfigs.get(1).isDynamicServer()); - assertEquals("domain1-managed-server3", dynamicServerConfigs.get(2).getListenAddress()); - assertEquals(8001, dynamicServerConfigs.get(2).getListenPort().intValue()); - assertEquals(7204, dynamicServerConfigs.get(2).getSslListenPort().intValue()); - assertEquals(1, dynamicServerConfigs.get(2).getNetworkAccessPoints().size()); - assertEquals( - 7205, - dynamicServerConfigs.get(2).getNetworkAccessPoints().get(0).getListenPort().intValue()); + private boolean isScriptConfigMapMetaData(V1ObjectMeta meta) { + return SCRIPT_CONFIG_MAP_NAME.equals(meta.getName()) && DOMAIN_NS.equals(meta.getNamespace()); } @Test - public void parseInvalidTopologyYamlWithValidationErrors() { - ConfigMapHelper.DomainTopology domainTopology = - ConfigMapHelper.parseDomainTopologyYaml(INVALID_TOPOLOGY); - - assertFalse(domainTopology.getValidationErrors().isEmpty()); - assertFalse(domainTopology.getDomainValid()); - assertEquals( - "The dynamic cluster \"mycluster\"'s dynamic servers use calculated listen ports.", - domainTopology.getValidationErrors().get(0)); - } + public void whenExistingConfigMapHasExtraData_dontRemoveIt() { + testSupport.defineResources(defineConfigMap(PARTIAL_SCRIPT_NAMES)); - @Test - public void parseInvalidTopologyYamlWithNoValidationErrors() { - ConfigMapHelper.DomainTopology domainTopology = - ConfigMapHelper.parseDomainTopologyYaml(DOMAIN_INVALID_NO_ERRORS); + testSupport.runSteps(ConfigMapHelper.createScriptConfigMapStep(OPERATOR_NS, DOMAIN_NS)); - assertFalse(domainTopology.getValidationErrors().isEmpty()); - assertFalse(domainTopology.getDomainValid()); + assertThat(logRecords, containsInfo(CM_REPLACED)); + assertThat(getScriptConfigKeys(), hasItem(ADDITIONAL_NAME)); } // An implementation of the comparator that tests only the keys in the maps - static class TestComparator implements ConfigMapHelper.ConfigMapComparator { + static class TestComparator extends ConfigMapHelper.ConfigMapComparator { static Memento install() throws NoSuchFieldException { return StaticStubSupport.install(ConfigMapHelper.class, "COMPARATOR", new TestComparator()); } @Override - public boolean containsAll(V1ConfigMap actual, V1ConfigMap expected) { - return actual.getData().keySet().containsAll(expected.getData().keySet()); + boolean containsAllData(Map actual, Map expected) { + return actual.keySet().containsAll(expected.keySet()); } } - class V1ConfigMapMatcher implements BodyMatcher { - private V1ConfigMap expected; - - V1ConfigMapMatcher(V1ConfigMap expected) { - this.expected = expected; - } - - @Override - public boolean matches(Object actualBody) { - return actualBody instanceof V1ConfigMap && matches((V1ConfigMap) actualBody); - } - - private boolean matches(V1ConfigMap actualBody) { - return hasExpectedKeys(actualBody) && adjustedBody(actualBody).equals(actualBody); - } - - private boolean hasExpectedKeys(V1ConfigMap actualBody) { - return expected.getData().keySet().equals(actualBody.getData().keySet()); - } - - private V1ConfigMap adjustedBody(V1ConfigMap actualBody) { - return new V1ConfigMap() - .apiVersion(expected.getApiVersion()) - .kind(expected.getKind()) - .metadata(expected.getMetadata()) - .data(actualBody.getData()); - } - } } diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/CrdHelperTest.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/CrdHelperTest.java index 839ae97479c..136cd462cb1 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/CrdHelperTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/CrdHelperTest.java @@ -3,15 +3,19 @@ package oracle.kubernetes.operator.helpers; -import java.net.HttpURLConnection; +import java.net.URI; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; import java.util.logging.Level; import java.util.logging.LogRecord; import com.meterware.simplestub.Memento; +import com.meterware.simplestub.StaticStubSupport; import io.kubernetes.client.openapi.models.V1CustomResourceDefinition; import io.kubernetes.client.openapi.models.V1CustomResourceDefinitionNames; import io.kubernetes.client.openapi.models.V1CustomResourceDefinitionSpec; @@ -26,6 +30,7 @@ import oracle.kubernetes.operator.KubernetesConstants; import oracle.kubernetes.operator.LabelConstants; import oracle.kubernetes.operator.calls.FailureStatusSourceException; +import oracle.kubernetes.operator.utils.InMemoryFileSystem; import oracle.kubernetes.operator.work.Step; import oracle.kubernetes.utils.TestUtils; import org.junit.After; @@ -34,33 +39,45 @@ import org.junit.Test; import static com.meterware.simplestub.Stub.createStrictStub; -import static oracle.kubernetes.operator.VersionConstants.OPERATOR_V1; +import static oracle.kubernetes.operator.helpers.KubernetesTestSupport.BETA_CRD; +import static oracle.kubernetes.operator.helpers.KubernetesTestSupport.CUSTOM_RESOURCE_DEFINITION; +import static oracle.kubernetes.operator.logging.MessageKeys.CREATE_CRD_FAILED; import static oracle.kubernetes.operator.logging.MessageKeys.CREATING_CRD; +import static oracle.kubernetes.operator.logging.MessageKeys.REPLACE_CRD_FAILED; import static oracle.kubernetes.utils.LogMatcher.containsInfo; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.sameInstance; import static org.hamcrest.junit.MatcherAssert.assertThat; +import static org.junit.Assert.assertNotNull; public class CrdHelperTest { private static final KubernetesVersion KUBERNETES_VERSION_15 = new KubernetesVersion(1, 15); private static final KubernetesVersion KUBERNETES_VERSION_16 = new KubernetesVersion(1, 16); - private final V1CustomResourceDefinition defaultCrd = defineDefaultCrd(); - private final V1beta1CustomResourceDefinition defaultBetaCrd = defineDefaultBetaCrd(); - private RetryStrategyStub retryStrategy = createStrictStub(RetryStrategyStub.class); + private static final SemanticVersion PRODUCT_VERSION = new SemanticVersion(3, 0, 0); + private static final SemanticVersion PRODUCT_VERSION_OLD = new SemanticVersion(2, 4, 0); + private static final SemanticVersion PRODUCT_VERSION_FUTURE = new SemanticVersion(3, 1, 0); - private AsyncCallTestSupport testSupport = new AsyncCallTestSupport(); - private List mementos = new ArrayList<>(); - private List logRecords = new ArrayList<>(); + private V1CustomResourceDefinition defaultCrd; + private V1beta1CustomResourceDefinition defaultBetaCrd; + private final RetryStrategyStub retryStrategy = createStrictStub(RetryStrategyStub.class); + + private final KubernetesTestSupport testSupport = new KubernetesTestSupport(); + private final List mementos = new ArrayList<>(); + private final List logRecords = new ArrayList<>(); + private final InMemoryFileSystem fileSystem = InMemoryFileSystem.createInstance(); + private final Function pathFunction = fileSystem::getPath; private V1CustomResourceDefinition defineDefaultCrd() { - return CrdHelper.CrdContext.createModel(KUBERNETES_VERSION_16); + return CrdHelper.CrdContext.createModel(KUBERNETES_VERSION_16, PRODUCT_VERSION); } private V1beta1CustomResourceDefinition defineDefaultBetaCrd() { - return CrdHelper.CrdContext.createBetaModel(KUBERNETES_VERSION_15); + return CrdHelper.CrdContext.createBetaModel(KUBERNETES_VERSION_15, PRODUCT_VERSION); } - private V1CustomResourceDefinition defineCrd(String version, String operatorVersion) { + private V1CustomResourceDefinition defineCrd(String version, SemanticVersion operatorVersion) { return new V1CustomResourceDefinition() .apiVersion("apiextensions.k8s.io/v1") .kind("CustomResourceDefinition") @@ -68,7 +85,8 @@ private V1CustomResourceDefinition defineCrd(String version, String operatorVers .spec(createSpec(version)); } - private V1beta1CustomResourceDefinition defineBetaCrd(String version, String operatorVersion) { + @SuppressWarnings("SameParameterValue") + private V1beta1CustomResourceDefinition defineBetaCrd(String version, SemanticVersion operatorVersion) { return new V1beta1CustomResourceDefinition() .apiVersion("apiextensions.k8s.io/v1beta1") .kind("CustomResourceDefinition") @@ -76,10 +94,10 @@ private V1beta1CustomResourceDefinition defineBetaCrd(String version, String ope .spec(createBetaSpec(version)); } - private V1ObjectMeta createMetadata(String operatorVersion) { + private V1ObjectMeta createMetadata(SemanticVersion operatorVersion) { return new V1ObjectMeta() .name(KubernetesConstants.CRD_NAME) - .putLabelsItem(LabelConstants.RESOURCE_VERSION_LABEL, operatorVersion); + .putLabelsItem(LabelConstants.OPERATOR_VERISON, operatorVersion.toString()); } private V1CustomResourceDefinitionSpec createSpec(String version) { @@ -106,39 +124,32 @@ private V1beta1CustomResourceDefinitionSpec createBetaSpec(String version) { .shortNames(Collections.singletonList(KubernetesConstants.DOMAIN_SHORT))); } - /** - * Setup test. - * @throws Exception on failure - */ @Before public void setUp() throws Exception { mementos.add( TestUtils.silenceOperatorLogger() - .collectLogMessages(logRecords, CREATING_CRD) + .collectLogMessages(logRecords, CREATING_CRD, REPLACE_CRD_FAILED, CREATE_CRD_FAILED) .withLogLevel(Level.FINE)); - mementos.add(testSupport.installRequestStepFactory()); + mementos.add(testSupport.install()); + mementos.add(StaticStubSupport.install(FileGroupReader.class, "uriToPath", pathFunction)); + + defaultCrd = defineDefaultCrd(); + defaultBetaCrd = defineDefaultBetaCrd(); } - /** - * Tear down test. - * @throws Exception on failure - */ @After public void tearDown() throws Exception { - for (Memento memento : mementos) { - memento.revert(); - } + mementos.forEach(Memento::revert); testSupport.throwOnCompletionFailure(); - testSupport.verifyAllDefinedResponsesInvoked(); } @Test public void whenUnableToReadBetaCrd_reportFailure() { testSupport.addRetryStrategy(retryStrategy); - expectReadBetaCrd().failingWithStatus(422); + testSupport.failOnResource(BETA_CRD, KubernetesConstants.CRD_NAME, 422); - Step scriptCrdStep = CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_15, null); + Step scriptCrdStep = CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_15, PRODUCT_VERSION, null); testSupport.runSteps(scriptCrdStep); testSupport.verifyCompletionThrowable(FailureStatusSourceException.class); @@ -146,165 +157,171 @@ public void whenUnableToReadBetaCrd_reportFailure() { @Test public void whenCrdV1SupportedAndNoCrd_createIt() { - expectReadCrd().failingWithStatus(HttpURLConnection.HTTP_NOT_FOUND); - expectReadBetaCrd().failingWithStatus(HttpURLConnection.HTTP_NOT_FOUND); - expectSuccessfulCreateCrd(defaultCrd); - - testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_16, null)); + testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_16, PRODUCT_VERSION, null)); assertThat(logRecords, containsInfo(CREATING_CRD)); } @Test public void whenCrdV1SupportedAndBetaCrd_upgradeIt() { - expectReadCrd().failingWithStatus(HttpURLConnection.HTTP_NOT_FOUND); - expectReadBetaCrd().returning(defaultBetaCrd); - expectSuccessfulReplaceCrd(defaultCrd); + testSupport.defineResources(defaultBetaCrd); - testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_16, null)); + testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_16, PRODUCT_VERSION, null)); assertThat(logRecords, containsInfo(CREATING_CRD)); + assertThat(testSupport.getResources(CUSTOM_RESOURCE_DEFINITION), hasItem(defaultCrd)); } @Test public void whenNoBetaCrd_createIt() { - expectReadBetaCrd().failingWithStatus(HttpURLConnection.HTTP_NOT_FOUND); - expectSuccessfulCreateBetaCrd(defaultBetaCrd); - - testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_15, null)); + testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_15, PRODUCT_VERSION, null)); assertThat(logRecords, containsInfo(CREATING_CRD)); + assertThat(testSupport.getResources(BETA_CRD), hasItem(defaultBetaCrd)); } @Test - public void whenNoCrd_retryOnFailure() { + public void whenNoBetaCrd_retryOnFailureAndLogFailedMessageInOnFailureNoRetry() { testSupport.addRetryStrategy(retryStrategy); - expectReadBetaCrd().failingWithStatus(HttpURLConnection.HTTP_NOT_FOUND); - expectCreateBetaCrd(defaultBetaCrd).failingWithStatus(401); + testSupport.failOnCreate(BETA_CRD, KubernetesConstants.CRD_NAME, null, 401); - Step scriptCrdStep = CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_15, null); + Step scriptCrdStep = CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_15, PRODUCT_VERSION, null); testSupport.runSteps(scriptCrdStep); + assertThat(logRecords, containsInfo(CREATE_CRD_FAILED)); + assertThat(retryStrategy.getConflictStep(), sameInstance(scriptCrdStep)); + } - testSupport.verifyCompletionThrowable(FailureStatusSourceException.class); + @Test + public void whenNoCrd_retryOnFailureAndLogFailedMessageInOnFailureNoRetry() { + testSupport.addRetryStrategy(retryStrategy); + testSupport.failOnCreate(CUSTOM_RESOURCE_DEFINITION, KubernetesConstants.CRD_NAME, null, 401); + + Step scriptCrdStep = CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_16,PRODUCT_VERSION, null); + testSupport.runSteps(scriptCrdStep); + assertThat(logRecords, containsInfo(CREATE_CRD_FAILED)); assertThat(retryStrategy.getConflictStep(), sameInstance(scriptCrdStep)); } @Test public void whenMatchingCrdExists_noop() { - expectReadBetaCrd().returning(defaultBetaCrd); + testSupport.defineResources(defaultBetaCrd); - testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_15, null)); + testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_15, PRODUCT_VERSION, null)); } @Test public void whenExistingCrdHasOldVersion_replaceIt() { - expectReadBetaCrd().returning(defineBetaCrd("v1", OPERATOR_V1)); - expectSuccessfulReplaceBetaCrd(defaultBetaCrd); + testSupport.defineResources(defineBetaCrd("v1", PRODUCT_VERSION_OLD)); + + testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_15, PRODUCT_VERSION, null)); + + assertThat(logRecords, containsInfo(CREATING_CRD)); + } - testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_15, null)); + @Test + public void whenExistingCrdHasCurrentApiVersionButOldProductVersion_replaceIt() { + testSupport.defineResources(defineCrd(KubernetesConstants.DOMAIN_VERSION, PRODUCT_VERSION)); + + testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_16, PRODUCT_VERSION_FUTURE, null)); assertThat(logRecords, containsInfo(CREATING_CRD)); + List crds = testSupport.getResources(CUSTOM_RESOURCE_DEFINITION); + V1CustomResourceDefinition crd = crds.stream().findFirst().orElse(null); + assertNotNull(crd); + assertThat(getProductVersionFromMetadata(crd.getMetadata()), equalTo(PRODUCT_VERSION_FUTURE)); + } + + private SemanticVersion getProductVersionFromMetadata(V1ObjectMeta metadata) { + return Optional.ofNullable(metadata) + .map(V1ObjectMeta::getLabels) + .map(labels -> labels.get(LabelConstants.OPERATOR_VERISON)) + .map(SemanticVersion::new) + .orElse(null); } @Test @Ignore public void whenExistingCrdHasFutureVersion_dontReplaceIt() { - V1CustomResourceDefinition existing = defineCrd("v500", "operator-v500"); + V1CustomResourceDefinition existing = defineCrd("v500", PRODUCT_VERSION_FUTURE); existing .getSpec() .addVersionsItem( new V1CustomResourceDefinitionVersion() .served(true) .name(KubernetesConstants.DOMAIN_VERSION)); - expectReadCrd().returning(existing); + testSupport.defineResources(existing); - testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_16, null)); + testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_16, PRODUCT_VERSION, null)); } @Test @Ignore public void whenExistingCrdHasFutureVersionButNotCurrentStorage_updateIt() { - expectReadCrd().returning(defineCrd("v500", "operator-v500")); + testSupport.defineResources(defineCrd("v500", PRODUCT_VERSION_FUTURE)); - V1CustomResourceDefinition replacement = defineCrd("v500", "operator-v500"); + V1CustomResourceDefinition replacement = defineCrd("v500", PRODUCT_VERSION_FUTURE); replacement .getSpec() .addVersionsItem( new V1CustomResourceDefinitionVersion() .served(true) .name(KubernetesConstants.DOMAIN_VERSION)); - expectSuccessfulReplaceCrd(replacement); - testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_16, null)); + testSupport.runSteps(CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_16, PRODUCT_VERSION, null)); assertThat(logRecords, containsInfo(CREATING_CRD)); } @Test - public void whenReplaceFails_scheduleRetry() { + public void whenReplaceFails_scheduleRetryAndLogFailedMessageInOnFailureNoRetry() { testSupport.addRetryStrategy(retryStrategy); - expectReadCrd().returning(defineCrd("v1", OPERATOR_V1)); - expectReplaceCrd(defaultCrd).failingWithStatus(401); + testSupport.defineResources(defineCrd("v1", PRODUCT_VERSION_OLD)); + testSupport.failOnReplace(CUSTOM_RESOURCE_DEFINITION, KubernetesConstants.CRD_NAME, null, 401); - Step scriptCrdStep = CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_16, null); + Step scriptCrdStep = CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_16, PRODUCT_VERSION, null); testSupport.runSteps(scriptCrdStep); - testSupport.verifyCompletionThrowable(FailureStatusSourceException.class); + assertThat(logRecords, containsInfo(REPLACE_CRD_FAILED)); assertThat(retryStrategy.getConflictStep(), sameInstance(scriptCrdStep)); } - private CallTestSupport.CannedResponse expectReadCrd() { - return testSupport.createCannedResponse("readCRD").withName(KubernetesConstants.CRD_NAME); - } - - private CallTestSupport.CannedResponse expectReadBetaCrd() { - return testSupport.createCannedResponse("readBetaCRD").withName(KubernetesConstants.CRD_NAME); - } + @Test + public void whenReplaceFailsThrowsStreamException_scheduleRetryAndLogFailedMessageInOnFailureNoRetry() { + testSupport.addRetryStrategy(retryStrategy); + testSupport.defineResources(defineCrd("v1", PRODUCT_VERSION_OLD)); + testSupport.failOnReplaceWithStreamResetException(CUSTOM_RESOURCE_DEFINITION, KubernetesConstants.CRD_NAME, null); - private void expectSuccessfulCreateCrd(V1CustomResourceDefinition expectedConfig) { - expectCreateCrd(expectedConfig).returning(expectedConfig); - } + Step scriptCrdStep = CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_16, PRODUCT_VERSION, null); + testSupport.runSteps(scriptCrdStep); - private void expectSuccessfulCreateBetaCrd(V1beta1CustomResourceDefinition expectedConfig) { - expectCreateBetaCrd(expectedConfig).returning(expectedConfig); + assertThat(logRecords, containsInfo(REPLACE_CRD_FAILED)); + assertThat(retryStrategy.getConflictStep(), sameInstance(scriptCrdStep)); } - private CallTestSupport.CannedResponse expectCreateCrd( - V1CustomResourceDefinition expectedConfig) { - return testSupport - .createCannedResponse("createCRD") - .withBody(new V1CustomResourceDefinitionMatcher(expectedConfig)); - } + @Test + public void whenBetaCrdReplaceFails_scheduleRetryAndLogFailedMessageInOnFailureNoRetry() { + testSupport.addRetryStrategy(retryStrategy); + testSupport.defineResources(defineBetaCrd("v1", PRODUCT_VERSION_OLD)); + testSupport.failOnReplace(BETA_CRD, KubernetesConstants.CRD_NAME, null, 401); - private CallTestSupport.CannedResponse expectCreateBetaCrd( - V1beta1CustomResourceDefinition expectedConfig) { - return testSupport - .createCannedResponse("createBetaCRD") - .withBody(new V1beta1CustomResourceDefinitionMatcher(expectedConfig)); - } + Step scriptCrdStep = CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_15, PRODUCT_VERSION, null); + testSupport.runSteps(scriptCrdStep); - private void expectSuccessfulReplaceCrd(V1CustomResourceDefinition expectedConfig) { - expectReplaceCrd(expectedConfig).returning(expectedConfig); + assertThat(logRecords, containsInfo(REPLACE_CRD_FAILED)); + assertThat(retryStrategy.getConflictStep(), sameInstance(scriptCrdStep)); } - private void expectSuccessfulReplaceBetaCrd(V1beta1CustomResourceDefinition expectedConfig) { - expectReplaceBetaCrd(expectedConfig).returning(expectedConfig); - } + @Test + public void whenBetaCrdReplaceThrowsStreamResetException_scheduleRetryAndLogFailedMessageInOnFailureNoRetry() { + testSupport.addRetryStrategy(retryStrategy); + testSupport.defineResources(defineBetaCrd("v1", PRODUCT_VERSION_OLD)); + testSupport.failOnReplaceWithStreamResetException(BETA_CRD, KubernetesConstants.CRD_NAME, null); - private CallTestSupport.CannedResponse expectReplaceCrd( - V1CustomResourceDefinition expectedConfig) { - return testSupport - .createCannedResponse("replaceCRD") - .withName(KubernetesConstants.CRD_NAME) - .withBody(new V1CustomResourceDefinitionMatcher(expectedConfig)); - } + Step scriptCrdStep = CrdHelper.createDomainCrdStep(KUBERNETES_VERSION_15, PRODUCT_VERSION, null); + testSupport.runSteps(scriptCrdStep); - private CallTestSupport.CannedResponse expectReplaceBetaCrd( - V1beta1CustomResourceDefinition expectedConfig) { - return testSupport - .createCannedResponse("replaceBetaCRD") - .withName(KubernetesConstants.CRD_NAME) - .withBody(new V1beta1CustomResourceDefinitionMatcher(expectedConfig)); + assertThat(logRecords, containsInfo(REPLACE_CRD_FAILED)); + assertThat(retryStrategy.getConflictStep(), sameInstance(scriptCrdStep)); } class V1CustomResourceDefinitionMatcher implements BodyMatcher { diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/DomainIntrospectorJobTest.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/DomainIntrospectorJobTest.java index d4b562f6a70..258c55bf327 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/DomainIntrospectorJobTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/DomainIntrospectorJobTest.java @@ -15,11 +15,11 @@ import io.kubernetes.client.openapi.models.V1ConfigMap; import io.kubernetes.client.openapi.models.V1Container; import io.kubernetes.client.openapi.models.V1Job; +import io.kubernetes.client.openapi.models.V1JobStatus; import io.kubernetes.client.openapi.models.V1ObjectMeta; import io.kubernetes.client.openapi.models.V1SecretReference; import oracle.kubernetes.operator.DomainProcessorTestSetup; -import oracle.kubernetes.operator.calls.FailureStatusSourceException; -import oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder; +import oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl; import oracle.kubernetes.operator.rest.ScanCacheStub; import oracle.kubernetes.operator.wlsconfig.WlsClusterConfig; import oracle.kubernetes.operator.wlsconfig.WlsDomainConfig; @@ -38,11 +38,15 @@ import static com.meterware.simplestub.Stub.createStrictStub; import static oracle.kubernetes.operator.DomainProcessorTestSetup.NS; import static oracle.kubernetes.operator.DomainProcessorTestSetup.UID; +import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_INTROSPECTOR_JOB; import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_TOPOLOGY; +import static oracle.kubernetes.operator.ProcessingConstants.JOB_POD_NAME; import static oracle.kubernetes.operator.helpers.DomainStatusMatcher.hasStatus; import static oracle.kubernetes.operator.helpers.KubernetesTestSupport.DOMAIN; import static oracle.kubernetes.operator.helpers.KubernetesTestSupport.JOB; import static oracle.kubernetes.operator.helpers.Matchers.hasEnvVar; +import static oracle.kubernetes.operator.logging.MessageKeys.INTROSPECTOR_JOB_FAILED; +import static oracle.kubernetes.operator.logging.MessageKeys.INTROSPECTOR_JOB_FAILED_DETAIL; import static oracle.kubernetes.operator.logging.MessageKeys.JOB_CREATED; import static oracle.kubernetes.operator.logging.MessageKeys.JOB_DELETED; import static oracle.kubernetes.operator.logging.MessageKeys.NO_CLUSTER_IN_DOMAIN; @@ -69,6 +73,8 @@ public class DomainIntrospectorJobTest { private static final String MS_PREFIX = "managed-server"; private static final String[] MANAGED_SERVER_NAMES = IntStream.rangeClosed(1, MAX_SERVERS).mapToObj(n -> MS_PREFIX + n).toArray(String[]::new); + private static final String SEVERE_PROBLEM_1 = "really bad"; + private static final String SEVERE_MESSAGE_1 = "@[SEVERE] " + SEVERE_PROBLEM_1; private final TerminalStep terminalStep = new TerminalStep(); private final Domain domain = createDomain(); @@ -77,6 +83,7 @@ public class DomainIntrospectorJobTest { protected List mementos = new ArrayList<>(); protected List logRecords = new ArrayList<>(); private RetryStrategyStub retryStrategy = createStrictStub(RetryStrategyStub.class); + private String jobPodName = LegalNames.toJobIntrospectorName(UID); public DomainIntrospectorJobTest() { } @@ -99,12 +106,19 @@ public void setUp() throws Exception { mementos.add(TuningParametersStub.install()); mementos.add(testSupport.install()); mementos.add(ScanCacheStub.install()); + testSupport.addToPacket(JOB_POD_NAME, jobPodName); testSupport.addDomainPresenceInfo(domainPresenceInfo); testSupport.defineResources(domain); } private String[] getMessageKeys() { - return new String[] {getJobCreatedMessageKey(), getJobDeletedMessageKey(), getNoClusterInDomainMessageKey()}; + return new String[] { + getJobCreatedMessageKey(), + getJobDeletedMessageKey(), + getNoClusterInDomainMessageKey(), + getJobFailedMessageKey(), + getJobFailedDetailMessageKey() + }; } /** @@ -158,6 +172,14 @@ private String getJobDeletedMessageKey() { return JOB_DELETED; } + private String getJobFailedMessageKey() { + return INTROSPECTOR_JOB_FAILED; + } + + private String getJobFailedDetailMessageKey() { + return INTROSPECTOR_JOB_FAILED_DETAIL; + } + private String getNoClusterInDomainMessageKey() { return NO_CLUSTER_IN_DOMAIN; } @@ -170,7 +192,7 @@ public void whenNoJob_createIt() throws JsonProcessingException { .metadata( new V1ObjectMeta() .namespace(NS) - .name(ConfigMapHelper.SitConfigMapContext.getConfigMapName(UID)))); + .name(ConfigMapHelper.getIntrospectorConfigMapName(UID)))); testSupport.runSteps(getStepFactory(), terminalStep); @@ -199,7 +221,8 @@ public void whenNoJob_onFiveHundred() { testSupport.runSteps(getStepFactory(), terminalStep); - testSupport.verifyCompletionThrowable(FailureStatusSourceException.class); + assertThat(getDomain(), hasStatus("ServerError", + "testcall in namespace junit, for testName: failure reported in test")); } @Test @@ -237,7 +260,7 @@ public void whenJobCreated_hasPredefinedEnvVariables() { @Test public void whenPodCreationFailsDueToUnprocessableEntityFailure_reportInDomainStatus() { - testSupport.failOnResource(JOB, getJobName(), NS, new UnprocessableEntityBuilder() + testSupport.failOnResource(JOB, getJobName(), NS, new UnrecoverableErrorBuilderImpl() .withReason("FieldValueNotFound") .withMessage("Test this failure") .build()); @@ -254,7 +277,7 @@ Domain getDomain() { @Test public void whenPodCreationFailsDueToUnprocessableEntityFailure_abortFiber() { - testSupport.failOnResource(JOB, getJobName(), NS, new UnprocessableEntityBuilder() + testSupport.failOnResource(JOB, getJobName(), NS, new UnrecoverableErrorBuilderImpl() .withReason("FieldValueNotFound") .withMessage("Test this failure") .build()); @@ -292,6 +315,33 @@ public void whenIntrospectorJobNotNeeded_validatesDomainTopology() throws JsonPr assertThat(logRecords, containsWarning(getNoClusterInDomainMessageKey())); } + @Test + public void whenJobLogContainsSevereError_logJobInfosOnDelete() { + testSupport.defineResources( + new V1Job().metadata(new V1ObjectMeta().name(getJobName()).namespace(NS)).status(new V1JobStatus())); + new DomainProcessorTestSetup(testSupport).defineKubernetesResources(SEVERE_MESSAGE_1); + testSupport.addToPacket(DOMAIN_INTROSPECTOR_JOB, testSupport.getResourceWithName(JOB, getJobName())); + + testSupport.runSteps(JobHelper.deleteDomainIntrospectorJobStep(terminalStep)); + + assertThat(logRecords, containsInfo(getJobFailedMessageKey())); + assertThat(logRecords, containsFine(getJobFailedDetailMessageKey())); + assertThat(logRecords, containsFine(getJobDeletedMessageKey())); + } + + @Test + public void whenJobLogContainsSevereError_logJobInfosOnReadPogLog() { + testSupport.defineResources( + new V1Job().metadata(new V1ObjectMeta().name(getJobName()).namespace(NS)).status(new V1JobStatus())); + new DomainProcessorTestSetup(testSupport).defineKubernetesResources(SEVERE_MESSAGE_1); + testSupport.addToPacket(DOMAIN_INTROSPECTOR_JOB, testSupport.getResourceWithName(JOB, getJobName())); + + testSupport.runSteps(JobHelper.readDomainIntrospectorPodLog(terminalStep)); + + assertThat(logRecords, containsInfo(getJobFailedMessageKey())); + assertThat(logRecords, containsFine(getJobFailedDetailMessageKey())); + } + private Cluster getCluster(String clusterName) { for (Cluster cluster: domain.getSpec().getClusters()) { if (clusterName.equals(cluster.getClusterName())) { diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/DomainTopologyTest.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/DomainTopologyTest.java new file mode 100644 index 00000000000..7d5270700d5 --- /dev/null +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/DomainTopologyTest.java @@ -0,0 +1,332 @@ +// Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.kubernetes.operator.helpers; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import oracle.kubernetes.operator.wlsconfig.NetworkAccessPoint; +import oracle.kubernetes.operator.wlsconfig.WlsClusterConfig; +import oracle.kubernetes.operator.wlsconfig.WlsDomainConfig; +import oracle.kubernetes.operator.wlsconfig.WlsDynamicServersConfig; +import oracle.kubernetes.operator.wlsconfig.WlsServerConfig; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class DomainTopologyTest { + + + private static final String DOMAIN_TOPOLOGY = + "domainValid: true\n" + + "domain:\n" + + " name: \"base_domain\"\n" + + " adminServerName: \"admin-server\"\n" + + " configuredClusters:\n" + + " - name: \"cluster-1\"\n" + + " servers:\n" + + " - name: \"managed-server1\"\n" + + " listenPort: 7003\n" + + " listenAddress: \"domain1-managed-server1\"\n" + + " sslListenPort: 7103\n" + + " machineName: \"machine-managed-server1\"\n" + + " - name: \"managed-server2\"\n" + + " listenPort: 7004\n" + + " listenAddress: \"domain1-managed-server2\"\n" + + " sslListenPort: 7104\n" + + " networkAccessPoints:\n" + + " - name: \"nap2\"\n" + + " protocol: \"t3\"\n" + + " listenPort: 7105\n" + + " publicPort: 7105\n" + + " servers:\n" + + " - name: \"admin-server\"\n" + + " listenPort: 7001\n" + + " listenAddress: \"domain1-admin-server\"\n" + + " adminPort: 7099\n" + + " - name: \"server1\"\n" + + " listenPort: 9003\n" + + " listenAddress: \"domain1-managed-server1\"\n" + + " sslListenPort: 8003\n" + + " machineName: \"machine-managed-server1\"\n" + + " - name: \"server2\"\n" + + " listenPort: 9004\n" + + " listenAddress: \"domain1-managed-server2\"\n" + + " sslListenPort: 8004\n" + + " networkAccessPoints:\n" + + " - name: \"nap2\"\n" + + " protocol: \"t3\"\n" + + " listenPort: 8005\n" + + " publicPort: 8005\n"; + private static final String DYNAMIC_SERVER_TOPOLOGY = + "domainValid: true\n" + + "domain:\n" + + " name: \"base_domain\"\n" + + " adminServerName: \"admin-server\"\n" + + " configuredClusters:\n" + + " - name: \"cluster-1\"\n" + + " dynamicServersConfig:\n" + + " name: \"cluster-1\"\n" + + " serverTemplateName: \"cluster-1-template\"\n" + + " calculatedListenPorts: false\n" + + " serverNamePrefix: \"managed-server\"\n" + + " dynamicClusterSize: 4\n" + + " maxDynamicClusterSize: 8\n" + + " minDynamicClusterSize: 2\n" + + " serverTemplates:\n" + + " - name: \"cluster-1-template\"\n" + + " listenPort: 8001\n" + + " clusterName: \"cluster-1\"\n" + + " listenAddress: \"domain1-managed-server${id}\"\n" + + " servers:\n" + + " - name: \"admin-server\"\n" + + " listenPort: 7001\n" + + " listenAddress: \"domain1-admin-server\"\n"; + private static final String MIXED_CLUSTER_TOPOLOGY = + "domainValid: true\n" + + "domain:\n" + + " name: \"base_domain\"\n" + + " adminServerName: \"admin-server\"\n" + + " configuredClusters:\n" + + " - name: \"cluster-1\"\n" + + " dynamicServersConfig:\n" + + " name: \"cluster-1\"\n" + + " serverTemplateName: \"cluster-1-template\"\n" + + " calculatedListenPorts: false\n" + + " serverNamePrefix: \"managed-server\"\n" + + " dynamicClusterSize: 3\n" + + " maxDynamicClusterSize: 8\n" + + " servers:\n" + + " - name: \"ms1\"\n" + + " listenPort: 7003\n" + + " listenAddress: \"domain1-managed-server1\"\n" + + " sslListenPort: 7103\n" + + " machineName: \"machine-managed-server1\"\n" + + " - name: \"ms2\"\n" + + " listenPort: 7004\n" + + " listenAddress: \"domain1-managed-server2\"\n" + + " sslListenPort: 7104\n" + + " networkAccessPoints:\n" + + " - name: \"nap2\"\n" + + " protocol: \"t3\"\n" + + " listenPort: 7105\n" + + " publicPort: 7105\n" + + " serverTemplates:\n" + + " - name: \"cluster-1-template\"\n" + + " listenPort: 8001\n" + + " clusterName: \"cluster-1\"\n" + + " listenAddress: \"domain1-managed-server${id}\"\n" + + " sslListenPort: 7204\n" + + " networkAccessPoints:\n" + + " - name: \"nap3\"\n" + + " protocol: \"t3\"\n" + + " listenPort: 7205\n" + + " publicPort: 7205\n" + + " servers:\n" + + " - name: \"admin-server\"\n" + + " listenPort: 7001\n" + + " listenAddress: \"domain1-admin-server\"\n"; + private static final String INVALID_TOPOLOGY = + "domainValid: false\n" + + "validationErrors:\n" + + " - \"The dynamic cluster \\\"mycluster\\\"'s dynamic servers use calculated listen ports.\""; + private static final String DOMAIN_INVALID_NO_ERRORS = + "domainValid: false\n" + "validationErrors:\n"; + + @Test + public void parseDomainTopologyYaml() { + DomainTopology domainTopology = + DomainTopology.parseDomainTopologyYaml(DOMAIN_TOPOLOGY); + + assertNotNull(domainTopology); + assertTrue(domainTopology.getDomainValid()); + + WlsDomainConfig wlsDomainConfig = domainTopology.getDomain(); + assertNotNull(wlsDomainConfig); + + assertEquals("base_domain", wlsDomainConfig.getName()); + assertEquals("admin-server", wlsDomainConfig.getAdminServerName()); + + Map wlsClusterConfigs = wlsDomainConfig.getClusterConfigs(); + assertEquals(1, wlsClusterConfigs.size()); + + WlsClusterConfig wlsClusterConfig = wlsClusterConfigs.get("cluster-1"); + assertNotNull(wlsClusterConfig); + + List wlsServerConfigs = wlsClusterConfig.getServers(); + assertEquals(2, wlsServerConfigs.size()); + + Map serverConfigMap = wlsDomainConfig.getServerConfigs(); + assertEquals(3, serverConfigMap.size()); + + assertTrue(serverConfigMap.containsKey("admin-server")); + assertTrue(serverConfigMap.containsKey("server1")); + assertTrue(serverConfigMap.containsKey("server2")); + WlsServerConfig adminServerConfig = serverConfigMap.get("admin-server"); + assertEquals(7099, adminServerConfig.getAdminPort().intValue()); + assertTrue(adminServerConfig.isAdminPortEnabled()); + + WlsServerConfig server2Config = serverConfigMap.get("server2"); + assertEquals("domain1-managed-server2", server2Config.getListenAddress()); + assertEquals(9004, server2Config.getListenPort().intValue()); + assertEquals(8004, server2Config.getSslListenPort().intValue()); + assertTrue(server2Config.isSslPortEnabled()); + List server2ConfigNaps = server2Config.getNetworkAccessPoints(); + assertEquals(1, server2ConfigNaps.size()); + + NetworkAccessPoint server2ConfigNap = server2ConfigNaps.get(0); + assertEquals("nap2", server2ConfigNap.getName()); + assertEquals("t3", server2ConfigNap.getProtocol()); + assertEquals(8005, server2ConfigNap.getListenPort().intValue()); + assertEquals(8005, server2ConfigNap.getPublicPort().intValue()); + } + + @Test + public void parseDynamicServerTopologyYaml() { + DomainTopology domainTopology = + DomainTopology.parseDomainTopologyYaml(DYNAMIC_SERVER_TOPOLOGY); + + assertNotNull(domainTopology); + assertTrue(domainTopology.getDomainValid()); + + WlsDomainConfig wlsDomainConfig = domainTopology.getDomain(); + assertNotNull(wlsDomainConfig); + + assertEquals("base_domain", wlsDomainConfig.getName()); + assertEquals("admin-server", wlsDomainConfig.getAdminServerName()); + + wlsDomainConfig.processDynamicClusters(); + + Map wlsClusterConfigs = wlsDomainConfig.getClusterConfigs(); + assertEquals(1, wlsClusterConfigs.size()); + + WlsClusterConfig wlsClusterConfig = wlsClusterConfigs.get("cluster-1"); + assertNotNull(wlsClusterConfig); + + WlsDynamicServersConfig wlsDynamicServersConfig = wlsClusterConfig.getDynamicServersConfig(); + assertNotNull(wlsDynamicServersConfig); + assertEquals("cluster-1", wlsDynamicServersConfig.getName()); + assertEquals("cluster-1-template", wlsDynamicServersConfig.getServerTemplateName()); + assertFalse( + "Expected calculatedListenPorts false", wlsDynamicServersConfig.getCalculatedListenPorts()); + assertEquals("managed-server", wlsDynamicServersConfig.getServerNamePrefix()); + assertEquals(4, wlsDynamicServersConfig.getDynamicClusterSize().intValue()); + assertEquals(8, wlsDynamicServersConfig.getMaxDynamicClusterSize().intValue()); + assertEquals(2, wlsDynamicServersConfig.getMinDynamicClusterSize().intValue()); + + List serverTemplates = wlsDomainConfig.getServerTemplates(); + assertEquals(1, serverTemplates.size()); + assertEquals("cluster-1-template", serverTemplates.get(0).getName()); + assertEquals("domain1-managed-server${id}", serverTemplates.get(0).getListenAddress()); + assertEquals("cluster-1", serverTemplates.get(0).getClusterName()); + + Map serverConfigMap = wlsDomainConfig.getServerConfigs(); + assertEquals(1, serverConfigMap.size()); + + assertTrue(serverConfigMap.containsKey("admin-server")); + } + + @Test + public void parseMixedClusterTopologyYaml() { + DomainTopology domainTopology = + DomainTopology.parseDomainTopologyYaml(MIXED_CLUSTER_TOPOLOGY); + + assertNotNull(domainTopology); + assertTrue(domainTopology.getDomainValid()); + + WlsDomainConfig wlsDomainConfig = domainTopology.getDomain(); + assertNotNull(wlsDomainConfig); + + assertEquals("base_domain", wlsDomainConfig.getName()); + assertEquals("admin-server", wlsDomainConfig.getAdminServerName()); + + wlsDomainConfig.processDynamicClusters(); + + Map wlsClusterConfigs = wlsDomainConfig.getClusterConfigs(); + assertEquals(1, wlsClusterConfigs.size()); + + WlsClusterConfig wlsClusterConfig = wlsClusterConfigs.get("cluster-1"); + assertNotNull(wlsClusterConfig); + + assertTrue(wlsClusterConfig.hasDynamicServers()); + assertTrue(wlsClusterConfig.hasStaticServers()); + assertEquals(2, wlsClusterConfig.getClusterSize()); + assertEquals(3, wlsClusterConfig.getDynamicClusterSize()); + assertEquals(5, wlsClusterConfig.getServerConfigs().size()); + assertEquals(2, wlsClusterConfig.getServers().size()); + + assertNotNull(wlsDomainConfig.getServerTemplates()); + assertEquals(1, wlsDomainConfig.getServerTemplates().size()); + assertNotNull(wlsDomainConfig.getServerTemplates().get(0)); + assertEquals("cluster-1-template", wlsDomainConfig.getServerTemplates().get(0).getName()); + assertEquals( + "domain1-managed-server${id}", + wlsDomainConfig.getServerTemplates().get(0).getListenAddress()); + assertEquals(8001, wlsDomainConfig.getServerTemplates().get(0).getListenPort().intValue()); + + List serverTemplates = wlsDomainConfig.getServerTemplates(); + assertEquals(1, serverTemplates.size()); + assertEquals("cluster-1-template", serverTemplates.get(0).getName()); + assertEquals("domain1-managed-server${id}", serverTemplates.get(0).getListenAddress()); + assertEquals("cluster-1", serverTemplates.get(0).getClusterName()); + + WlsDynamicServersConfig dynamicServerConfig = wlsClusterConfig.getDynamicServersConfig(); + assertNotNull(dynamicServerConfig.getServerTemplateName()); + assertEquals("cluster-1-template", dynamicServerConfig.getServerTemplateName()); + + List dynamicServerConfigs = dynamicServerConfig.getServerConfigs(); + assertEquals(3, dynamicServerConfigs.size()); + + assertTrue(dynamicServerConfigs.get(0).isDynamicServer()); + assertEquals("domain1-managed-server1", dynamicServerConfigs.get(0).getListenAddress()); + assertEquals(8001, dynamicServerConfigs.get(0).getListenPort().intValue()); + assertEquals(7204, dynamicServerConfigs.get(0).getSslListenPort().intValue()); + assertEquals(1, dynamicServerConfigs.get(0).getNetworkAccessPoints().size()); + assertEquals( + 7205, + dynamicServerConfigs.get(0).getNetworkAccessPoints().get(0).getListenPort().intValue()); + + assertTrue(dynamicServerConfigs.get(1).isDynamicServer()); + assertEquals("domain1-managed-server2", dynamicServerConfigs.get(1).getListenAddress()); + assertEquals(8001, dynamicServerConfigs.get(1).getListenPort().intValue()); + assertEquals(7204, dynamicServerConfigs.get(1).getSslListenPort().intValue()); + assertEquals(1, dynamicServerConfigs.get(1).getNetworkAccessPoints().size()); + assertEquals( + 7205, + dynamicServerConfigs.get(1).getNetworkAccessPoints().get(0).getListenPort().intValue()); + + assertTrue(dynamicServerConfigs.get(1).isDynamicServer()); + assertEquals("domain1-managed-server3", dynamicServerConfigs.get(2).getListenAddress()); + assertEquals(8001, dynamicServerConfigs.get(2).getListenPort().intValue()); + assertEquals(7204, dynamicServerConfigs.get(2).getSslListenPort().intValue()); + assertEquals(1, dynamicServerConfigs.get(2).getNetworkAccessPoints().size()); + assertEquals( + 7205, + dynamicServerConfigs.get(2).getNetworkAccessPoints().get(0).getListenPort().intValue()); + } + + @Test + public void parseInvalidTopologyYamlWithValidationErrors() { + DomainTopology domainTopology = Objects.requireNonNull(DomainTopology.parseDomainTopologyYaml(INVALID_TOPOLOGY)); + + assertFalse(domainTopology.getValidationErrors().isEmpty()); + assertFalse(domainTopology.getDomainValid()); + assertEquals( + "The dynamic cluster \"mycluster\"'s dynamic servers use calculated listen ports.", + domainTopology.getValidationErrors().get(0)); + } + + @Test + public void parseInvalidTopologyYamlWithNoValidationErrors() { + DomainTopology domainTopology + = Objects.requireNonNull(DomainTopology.parseDomainTopologyYaml(DOMAIN_INVALID_NO_ERRORS)); + + assertFalse(domainTopology.getValidationErrors().isEmpty()); + assertFalse(domainTopology.getDomainValid()); + } +} \ No newline at end of file diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/IntrospectorConfigMapTest.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/IntrospectorConfigMapTest.java new file mode 100644 index 00000000000..dfb78aca794 --- /dev/null +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/IntrospectorConfigMapTest.java @@ -0,0 +1,403 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.kubernetes.operator.helpers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import javax.annotation.Nonnull; + +import com.meterware.simplestub.Memento; +import io.kubernetes.client.openapi.models.V1ConfigMap; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import oracle.kubernetes.operator.DomainProcessorTestSetup; +import oracle.kubernetes.operator.DomainSourceType; +import oracle.kubernetes.operator.IntrospectorConfigMapKeys; +import oracle.kubernetes.operator.ProcessingConstants; +import oracle.kubernetes.operator.rest.ScanCacheStub; +import oracle.kubernetes.operator.wlsconfig.WlsDomainConfig; +import oracle.kubernetes.operator.work.Packet; +import oracle.kubernetes.operator.work.TerminalStep; +import oracle.kubernetes.utils.TestUtils; +import oracle.kubernetes.weblogic.domain.DomainConfigurator; +import oracle.kubernetes.weblogic.domain.model.Domain; +import org.jetbrains.annotations.NotNull; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static java.lang.System.lineSeparator; +import static oracle.kubernetes.operator.DomainProcessorTestSetup.NS; +import static oracle.kubernetes.operator.DomainProcessorTestSetup.UID; +import static oracle.kubernetes.operator.IntrospectorConfigMapKeys.DOMAINZIP_HASH; +import static oracle.kubernetes.operator.IntrospectorConfigMapKeys.DOMAIN_INPUTS_HASH; +import static oracle.kubernetes.operator.IntrospectorConfigMapKeys.DOMAIN_RESTART_VERSION; +import static oracle.kubernetes.operator.IntrospectorConfigMapKeys.SECRETS_MD_5; +import static oracle.kubernetes.operator.IntrospectorConfigMapKeys.TOPOLOGY_YAML; +import static oracle.kubernetes.operator.LabelConstants.INTROSPECTION_STATE_LABEL; +import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_TOPOLOGY; +import static oracle.kubernetes.operator.helpers.DomainStatusMatcher.hasStatus; +import static oracle.kubernetes.weblogic.domain.DomainConfiguratorFactory.forDomain; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasEntry; +import static org.hamcrest.Matchers.hasKey; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.junit.MatcherAssert.assertThat; + +public class IntrospectorConfigMapTest { + + private static final String TOPOLOGY_VALUE = "domainValid: true\ndomain:\n name: sample"; + private static final String DOMAIN_HASH_VALUE = "MII_domain_hash"; + private static final String INPUTS_HASH_VALUE = "MII_inputs_hash"; + private static final String MD5_SECRETS = "md5-secrets"; + private static final String RESTART_VERSION = "123"; + private static final String OVERRIDES_VALUE = "a[]"; + private final KubernetesTestSupport testSupport = new KubernetesTestSupport(); + private final List mementos = new ArrayList<>(); + private final TerminalStep terminalStep = new TerminalStep(); + private final IntrospectResult introspectResult = new IntrospectResult(); + private final Domain domain = DomainProcessorTestSetup.createTestDomain(); + private final DomainPresenceInfo info = new DomainPresenceInfo(domain); + + @Before + public void setUp() throws Exception { + mementos.add(TestUtils.silenceOperatorLogger()); + mementos.add(testSupport.install()); + mementos.add(ScanCacheStub.install()); + + testSupport.defineResources(domain); + testSupport.addDomainPresenceInfo(info); + testSupport.addToPacket(JobHelper.START_TIME, System.currentTimeMillis() - 10); + } + + @After + public void tearDown() { + mementos.forEach(Memento::revert); + } + + class IntrospectResult { + private final StringBuilder builder = new StringBuilder(); + + IntrospectResult defineFile(String fileName, String... contents) { + addLine(">>> /" + fileName); + Arrays.stream(contents).forEach(this::addLine); + addLine(">>> EOF"); + return this; + } + + private void addLine(String line) { + builder.append(line).append(System.lineSeparator()); + } + + void addToPacket() { + testSupport.addToPacket(ProcessingConstants.DOMAIN_INTROSPECTOR_LOG_RESULT, builder.toString()); + } + + } + + @Test + public void whenNoTopologySpecified_continueProcessing() { + testSupport.defineResources( + createIntrospectorConfigMap(Map.of(TOPOLOGY_YAML, TOPOLOGY_VALUE, SECRETS_MD_5, MD5_SECRETS))); + introspectResult.defineFile(SECRETS_MD_5, "not telling").addToPacket(); + + testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(terminalStep.wasRun(), is(true)); + } + + @Test + public void whenNoTopologySpecified_dontUpdateConfigMap() { + testSupport.defineResources( + createIntrospectorConfigMap(Map.of(TOPOLOGY_YAML, TOPOLOGY_VALUE, SECRETS_MD_5, MD5_SECRETS))); + introspectResult.defineFile(SECRETS_MD_5, "not telling").addToPacket(); + + testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(getIntrospectorConfigMapValue(SECRETS_MD_5), equalTo(MD5_SECRETS)); + } + + @Test + public void whenNoTopologySpecified_addIntrospectionVersionLabel() { + forDomain(domain).withIntrospectVersion("4"); + testSupport.defineResources( + createIntrospectorConfigMap(Map.of(TOPOLOGY_YAML, TOPOLOGY_VALUE, SECRETS_MD_5, MD5_SECRETS))); + introspectResult.defineFile(SECRETS_MD_5, "not telling").addToPacket(); + + testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(getIntrospectionVersion(), equalTo(domain.getIntrospectVersion())); + } + + @SuppressWarnings("SameParameterValue") + private String getIntrospectorConfigMapValue(String key) { + return getIntrospectionConfigMap() + .map(V1ConfigMap::getData) + .map(m -> m.get(key)) + .orElse(null); + } + + private String getIntrospectionVersion() { + return getIntrospectionConfigMap() + .map(V1ConfigMap::getMetadata) + .map(V1ObjectMeta::getLabels) + .map(m -> m.get(INTROSPECTION_STATE_LABEL)) + .orElse(null); + } + + @Nonnull + private Optional getIntrospectionConfigMap() { + return testSupport.getResources(KubernetesTestSupport.CONFIG_MAP) + .stream() + .filter(this::isInstrospectConfigMap) + .findFirst(); + } + + private boolean isInstrospectConfigMap(V1ConfigMap configMap) { + return Optional.ofNullable(configMap) + .map(V1ConfigMap::getMetadata) + .map(V1ObjectMeta::getName) + .filter(name -> name.equals(getIntrospectorConfigMapName())) + .isPresent(); + } + + private static String getIntrospectorConfigMapName() { + return ConfigMapHelper.getIntrospectorConfigMapName(UID); + } + + @Test + public void whenTopologyNotValid_reportInDomainStatus() { + introspectResult.defineFile(TOPOLOGY_YAML, + "domainValid: false", "validationErrors: [first problem, second problem]").addToPacket(); + + testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(getDomain(), hasStatus("BadTopology", perLine("first problem", "second problem"))); + } + + @NotNull + private String perLine(String... errors) { + return String.join(lineSeparator(), errors); + } + + @NotNull + private Domain getDomain() { + return testSupport.getResources(KubernetesTestSupport.DOMAIN) + .stream() + .findFirst() + .orElse(new Domain()); + } + + @Test + public void whenTopologyNotValid_abortProcessing() { + introspectResult.defineFile(TOPOLOGY_YAML, "domainValid: false", "validationErrors: []").addToPacket(); + + testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(terminalStep.wasRun(), is(false)); + } + + @Test + public void whenTopologyPresent_continueProcessing() { + introspectResult + .defineFile(TOPOLOGY_YAML, "domainValid: true", "domain:", " name: \"sample\"").addToPacket(); + + testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(terminalStep.wasRun(), is(true)); + } + + @Test + public void whenTopologyPresent_addToPacket() { + introspectResult + .defineFile(TOPOLOGY_YAML, "domainValid: true", "domain:", " name: \"sample\"").addToPacket(); + + Packet packet = testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(packet.get(DOMAIN_TOPOLOGY), instanceOf(WlsDomainConfig.class)); + } + + @Test + public void whenTopologyAndDomainZipHashPresent_addToPacket() { + introspectResult + .defineFile(TOPOLOGY_YAML, "domainValid: true", "domain:", " name: \"sample\"") + .defineFile(DOMAINZIP_HASH, DOMAIN_HASH_VALUE) + .addToPacket(); + + Packet packet = testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(packet.get(DOMAINZIP_HASH), equalTo(DOMAIN_HASH_VALUE)); + } + + @Test + public void whenTopologyAndDomainZipHashPresent_addToConfigMap() { + introspectResult + .defineFile(TOPOLOGY_YAML, "domainValid: true", "domain:", " name: \"sample\"") + .defineFile(DOMAINZIP_HASH, DOMAIN_HASH_VALUE) + .addToPacket(); + + testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(getIntrospectorConfigMapData(), hasEntry(DOMAINZIP_HASH, DOMAIN_HASH_VALUE)); + } + + public Map getIntrospectorConfigMapData() { + return getIntrospectorConfigMapData(testSupport); + } + + /** + * Returns the data portion of the introspector config map for the test domain. + * @param testSupport the instance of KubernetesTestSupport holding the data + */ + @Nonnull + public static Map getIntrospectorConfigMapData(KubernetesTestSupport testSupport) { + return testSupport.getResources(KubernetesTestSupport.CONFIG_MAP).stream() + .map(V1ConfigMap.class::cast) + .filter(IntrospectorConfigMapTest::isIntrospectorConfigMap) + .map(V1ConfigMap::getData) + .findFirst() + .orElseGet(Collections::emptyMap); + } + + private static boolean isIntrospectorConfigMap(V1ConfigMap configMap) { + return getIntrospectorConfigMapName().equals(getConfigMapName(configMap)); + } + + private static String getConfigMapName(V1ConfigMap configMap) { + return Optional.ofNullable(configMap.getMetadata()).map(V1ObjectMeta::getName).orElse(""); + } + + @Test + public void whenTopologyAndMIISecretsHashPresent_addToPacket() { + introspectResult + .defineFile(TOPOLOGY_YAML, "domainValid: true", "domain:", " name: \"sample\"") + .defineFile(SECRETS_MD_5, MD5_SECRETS) + .addToPacket(); + + Packet packet = testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(packet.get(SECRETS_MD_5), equalTo(MD5_SECRETS)); + } + + @Test + public void whenTopologyAndMIISecretsHashPresent_addToConfigMap() { + introspectResult + .defineFile(TOPOLOGY_YAML, "domainValid: true", "domain:", " name: \"sample\"") + .defineFile(SECRETS_MD_5, MD5_SECRETS) + .addToPacket(); + + testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(getIntrospectorConfigMapData(), hasEntry(SECRETS_MD_5, MD5_SECRETS)); + } + + @Test + public void whenDomainHasRestartVersion_addToPacket() { + configureDomain().withRestartVersion(RESTART_VERSION); + introspectResult + .defineFile(TOPOLOGY_YAML, "domainValid: true", "domain:", " name: \"sample\"") + .addToPacket(); + + Packet packet = testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(packet.get(IntrospectorConfigMapKeys.DOMAIN_RESTART_VERSION), equalTo(RESTART_VERSION)); + } + + private DomainConfigurator configureDomain() { + return forDomain(domain); + } + + @Test + public void whenDomainIsModelInImage_addImageSpecHashToPacket() { + configureDomain().withDomainHomeSourceType(DomainSourceType.FromModel); + introspectResult + .defineFile(TOPOLOGY_YAML, "domainValid: true", "domain:", " name: \"sample\"") + .addToPacket(); + + Packet packet = testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(packet.get(DOMAIN_INPUTS_HASH), notNullValue()); + } + + private V1ConfigMap createIntrospectorConfigMap(Map entries) { + return new V1ConfigMap() + .metadata(new V1ObjectMeta().name(getIntrospectorConfigMapName()).namespace(NS)) + .data(new HashMap<>(entries)); + } + + @Test + public void loadExistingEntriesFromIntrospectorConfigMap() { + testSupport.defineResources(createIntrospectorConfigMap(Map.of( + TOPOLOGY_YAML, TOPOLOGY_VALUE, + SECRETS_MD_5, MD5_SECRETS, + DOMAINZIP_HASH, DOMAIN_HASH_VALUE, + DOMAIN_RESTART_VERSION, RESTART_VERSION, + DOMAIN_INPUTS_HASH, INPUTS_HASH_VALUE))); + + Packet packet = testSupport.runSteps(ConfigMapHelper.readExistingIntrospectorConfigMap(NS, UID)); + + assertThat(packet.get(SECRETS_MD_5), equalTo(MD5_SECRETS)); + assertThat(packet.get(DOMAINZIP_HASH), equalTo(DOMAIN_HASH_VALUE)); + assertThat(packet.get(DOMAIN_RESTART_VERSION), equalTo(RESTART_VERSION)); + assertThat(packet.get(DOMAIN_INPUTS_HASH), equalTo(INPUTS_HASH_VALUE)); + assertThat(packet.get(DOMAIN_TOPOLOGY), equalTo(getParsedDomain(TOPOLOGY_VALUE))); + } + + @SuppressWarnings("SameParameterValue") + private WlsDomainConfig getParsedDomain(String topologyYaml) { + return Optional.ofNullable(topologyYaml) + .map(DomainTopology::parseDomainTopologyYaml) + .map(DomainTopology::getDomain) + .orElse(null); + } + + @Test + public void whenOrdinaryEntriesMissingFromIntrospectionResult_doNotRemoveFromConfigMap() { + testSupport.defineResources(createIntrospectorConfigMap(Map.of( + TOPOLOGY_YAML, TOPOLOGY_VALUE, + "oldEntry1", "value1", + "oldEntry2", "value2"))); + introspectResult + .defineFile(TOPOLOGY_YAML, "domainValid: true", "domain:", " name: \"sample\"") + .addToPacket(); + + testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(getIntrospectorConfigMapData(), allOf(hasEntry("oldEntry1", "value1"), hasEntry("oldEntry2", "value2"))); + } + + @Test + public void whenSitConfigEntriesMissingFromIntrospectionResult_removeFromConfigMap() { + testSupport.defineResources(createIntrospectorConfigMap(Map.of( + TOPOLOGY_YAML, TOPOLOGY_VALUE, + "Sit-Cfg-1", "value1", + "Sit-Cfg-2", "value2"))); + introspectResult + .defineFile(TOPOLOGY_YAML, "domainValid: true", "domain:", " name: \"sample\"") + .addToPacket(); + + testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(getIntrospectorConfigMapData(), allOf(not(hasKey("Sit-Cfg-1")), not(hasKey("Sit-Cfg-2")))); + } + + @Test + public void whenNoTopologySpecified_dontRemoveSitConfigEntries() { + testSupport.defineResources( + createIntrospectorConfigMap(Map.of(TOPOLOGY_YAML, TOPOLOGY_VALUE, "Sit-Cfg-1", "value1"))); + introspectResult.defineFile(SECRETS_MD_5, "not telling").addToPacket(); + + testSupport.runSteps(ConfigMapHelper.createIntrospectorConfigMapStep(terminalStep)); + + assertThat(getIntrospectorConfigMapValue("Sit-Cfg-1"), equalTo("value1")); + } +} diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/JobHelperTest.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/JobHelperTest.java index 356930799a1..021b94b97bf 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/JobHelperTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/JobHelperTest.java @@ -17,6 +17,7 @@ import io.kubernetes.client.openapi.models.V1Affinity; import io.kubernetes.client.openapi.models.V1Container; import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1Job; import io.kubernetes.client.openapi.models.V1JobSpec; import io.kubernetes.client.openapi.models.V1LocalObjectReference; import io.kubernetes.client.openapi.models.V1ObjectMeta; @@ -31,8 +32,10 @@ import oracle.kubernetes.operator.ProcessingConstants; import oracle.kubernetes.operator.TuningParameters; import oracle.kubernetes.operator.helpers.JobHelper.DomainIntrospectorJobStepContext; +import oracle.kubernetes.operator.utils.WlsDomainConfigSupport; import oracle.kubernetes.operator.work.Component; import oracle.kubernetes.operator.work.Packet; +import oracle.kubernetes.utils.TestUtils; import oracle.kubernetes.weblogic.domain.ClusterConfigurator; import oracle.kubernetes.weblogic.domain.DomainConfigurator; import oracle.kubernetes.weblogic.domain.DomainConfiguratorFactory; @@ -41,12 +44,15 @@ import oracle.kubernetes.weblogic.domain.model.Domain; import oracle.kubernetes.weblogic.domain.model.DomainSpec; import oracle.kubernetes.weblogic.domain.model.ServerEnvVars; +import org.hamcrest.Matcher; import org.junit.After; import org.junit.Before; import org.junit.Test; +import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_TOPOLOGY; import static oracle.kubernetes.operator.helpers.Matchers.hasContainer; import static oracle.kubernetes.operator.helpers.Matchers.hasEnvVar; +import static oracle.kubernetes.operator.helpers.Matchers.hasEnvVarRegEx; import static oracle.kubernetes.operator.helpers.PodHelperTestBase.createAffinity; import static oracle.kubernetes.operator.helpers.PodHelperTestBase.createConfigMapKeyRefEnvVar; import static oracle.kubernetes.operator.helpers.PodHelperTestBase.createContainer; @@ -64,6 +70,7 @@ import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.junit.MatcherAssert.assertThat; @@ -73,6 +80,12 @@ public class JobHelperTest { private static final String DOMAIN_UID = "JobHelperTestDomain"; private static final String RAW_VALUE_1 = "find uid1 at $(DOMAIN_HOME)"; private static final String END_VALUE_1 = "find uid1 at /u01/oracle/user_projects/domains"; + /** + * OEVN is the name of an env var that contains a comma-separated list of oper supplied env var names. + * It's used by the Model in Image introspector job to detect env var differences from the last + * time the job ran. + */ + private static final String OEVN = "OPERATOR_ENVVAR_NAMES"; private Method getDomainSpec; private final DomainPresenceInfo domainPresenceInfo = createDomainPresenceInfo(); private final V1PodSecurityContext podSecurityContext = createPodSecurityContext(123L); @@ -82,15 +95,20 @@ public class JobHelperTest { private final V1EnvVar configMapKeyRefEnvVar = createConfigMapKeyRefEnvVar("VARIABLE1", "my-env", "VAR1"); private final V1EnvVar secretKeyRefEnvVar = createSecretKeyRefEnvVar("VARIABLE2", "my-secret", "VAR2"); private final V1EnvVar fieldRefEnvVar = createFieldRefEnvVar("MY_NODE_IP", "status.hostIP"); - protected List mementos = new ArrayList<>(); + private List mementos = new ArrayList<>(); + private KubernetesTestSupport testSupport = new KubernetesTestSupport(); /** * Setup test environment. - * @throws Exception if TuningParameterStub fails to install + * @throws Exception if setup fails */ @Before public void setup() throws Exception { + mementos.add(TestUtils.silenceOperatorLogger()); mementos.add(TuningParametersStub.install()); + mementos.add(testSupport.install()); + + testSupport.addDomainPresenceInfo(domainPresenceInfo); } /** @@ -98,9 +116,7 @@ public void setup() throws Exception { */ @After public void tearDown() { - for (Memento memento : mementos) { - memento.revert(); - } + mementos.forEach(Memento::revert); } @Test @@ -204,6 +220,14 @@ public void whenDomainHasEnvironmentItems_introspectorPodStartupWithThem() { hasEnvVar("item2", "value2"), hasEnvVar("WL_HOME", "/u01/custom_wl_home/"), hasEnvVar("MW_HOME", "/u01/custom_mw_home/"))); + + assertThat( + getMatchingContainerEnv(domainPresenceInfo, jobSpec), + allOf( + envVarOEVNContains("item1"), + envVarOEVNContains("item2"), + envVarOEVNContains("WL_HOME"), + envVarOEVNContains("MW_HOME"))); } private V1JobSpec createJobSpec() { @@ -212,7 +236,7 @@ private V1JobSpec createJobSpec() { .getComponents() .put(ProcessingConstants.DOMAIN_COMPONENT_NAME, Component.createFor(domainPresenceInfo)); DomainIntrospectorJobStepContext domainIntrospectorJobStepContext = - new DomainIntrospectorJobStepContext(domainPresenceInfo, packet); + new DomainIntrospectorJobStepContext(packet); return domainIntrospectorJobStepContext.createJobSpec(TuningParameters.getInstance()); } @@ -234,6 +258,9 @@ public void whenDomainHasEmptyStringUser_Mem_Args_EnvironmentItem_introspectorPo assertThat( getMatchingContainerEnv(domainPresenceInfo, jobSpec), hasEnvVar("USER_MEM_ARGS", "")); + + assertThat( + getMatchingContainerEnv(domainPresenceInfo, jobSpec), envVarOEVNContains("USER_MEM_ARGS")); } @Test @@ -244,18 +271,26 @@ public void whenDomainHasEnvironmentItemsWithVariables_introspectorPodStartupWit assertThat( getMatchingContainerEnv(domainPresenceInfo, jobSpec), hasEnvVar("item1", END_VALUE_1)); + + assertThat( + getMatchingContainerEnv(domainPresenceInfo, jobSpec), envVarOEVNContains("item1")); + } private static final String EMPTY_DATA_HOME = ""; @Test public void whenDomainHasEnvironmentVars_introspectorPodStartupVerifyDataHomeEnvNotDefined() { - DomainConfigurator domainConfigurator = configureDomain(); - V1JobSpec jobSpec = createJobSpec(); assertThat(getMatchingContainerEnv(domainPresenceInfo, jobSpec), not(hasEnvVar(ServerEnvVars.DATA_HOME, EMPTY_DATA_HOME))); + + assertThat( + getMatchingContainerEnv(domainPresenceInfo, jobSpec), + allOf( + hasEnvVar(OEVN), + not(envVarOEVNContains(ServerEnvVars.DATA_HOME)))); } private static final String OVERRIDE_DATA_DIR = "/u01/data"; @@ -263,31 +298,37 @@ public void whenDomainHasEnvironmentVars_introspectorPodStartupVerifyDataHomeEnv @Test public void whenDomainHasEnvironmentVars_introspectorPodStartupVerifyDataHomeEnvDefined() { - DomainConfigurator domainConfigurator = configureDomain().withDataHome(OVERRIDE_DATA_DIR); + configureDomain().withDataHome(OVERRIDE_DATA_DIR); V1JobSpec jobSpec = createJobSpec(); assertThat(getMatchingContainerEnv(domainPresenceInfo, jobSpec), hasEnvVar(ServerEnvVars.DATA_HOME, OVERRIDE_DATA_HOME)); + + assertThat(getMatchingContainerEnv(domainPresenceInfo, jobSpec), + envVarOEVNContains(ServerEnvVars.DATA_HOME)); } @Test public void whenDomainHasEnvironmentVars_introspectorPodStartupVerifyEmptyDataHome() { - DomainConfigurator domainConfigurator = - configureDomain().withDataHome(EMPTY_DATA_HOME); + configureDomain().withDataHome(EMPTY_DATA_HOME); V1JobSpec jobSpec = createJobSpec(); assertThat(getMatchingContainerEnv(domainPresenceInfo, jobSpec), not(hasEnvVar(ServerEnvVars.DATA_HOME, EMPTY_DATA_HOME))); + + assertThat(getMatchingContainerEnv(domainPresenceInfo, jobSpec), + allOf( + hasEnvVar(OEVN), + not(envVarOEVNContains(ServerEnvVars.DATA_HOME)))); } private static final String NULL_DATA_HOME = null; @Test public void whenDomainHasEnvironmentVars_introspectorPodStartupVerifyNullDataHome() { - DomainConfigurator domainConfigurator = - configureDomain().withDataHome(NULL_DATA_HOME); + configureDomain().withDataHome(NULL_DATA_HOME); V1JobSpec jobSpec = createJobSpec(); @@ -312,6 +353,13 @@ public void whenAdminServerHasEnvironmentItems_introspectorPodStartupWithThem() hasEnvVar("item1", "domain-value1"), hasEnvVar("item2", "admin-value2"), hasEnvVar("item3", "admin-value3"))); + + assertThat( + getMatchingContainerEnv(domainPresenceInfo, jobSpec), + allOf( + envVarOEVNContains("item1"), + envVarOEVNContains("item2"), + envVarOEVNContains("item3"))); } @Test @@ -329,6 +377,13 @@ public void whenDomainHasValueFromEnvironmentItems_introspectorPodStartupWithThe hasItem(configMapKeyRefEnvVar), hasItem(secretKeyRefEnvVar), hasItem(fieldRefEnvVar))); + + assertThat( + getMatchingContainerEnv(domainPresenceInfo, jobSpec), + allOf( + envVarOEVNContains(configMapKeyRefEnvVar.getName()), + envVarOEVNContains(secretKeyRefEnvVar.getName()), + envVarOEVNContains(fieldRefEnvVar.getName()))); } @Test @@ -347,6 +402,13 @@ public void whenAdminServerHasValueFromEnvironmentItems_introspectorPodStartupWi hasItem(configMapKeyRefEnvVar), hasItem(secretKeyRefEnvVar), hasItem(fieldRefEnvVar))); + + assertThat( + getMatchingContainerEnv(domainPresenceInfo, jobSpec), + allOf( + envVarOEVNContains(configMapKeyRefEnvVar.getName()), + envVarOEVNContains(secretKeyRefEnvVar.getName()), + envVarOEVNContains(fieldRefEnvVar.getName()))); } @Test @@ -356,6 +418,12 @@ public void introspectorPodStartupWithNullAdminUsernamePasswordEnvVarValues() { assertThat( getMatchingContainerEnv(domainPresenceInfo, jobSpec), allOf(hasEnvVar("ADMIN_USERNAME", null), hasEnvVar("ADMIN_PASSWORD", null))); + + assertThat( + getMatchingContainerEnv(domainPresenceInfo, jobSpec), + allOf(hasEnvVar(OEVN), + not(envVarOEVNContains("ADMIN_USERNAME")), + not(envVarOEVNContains("ADMIN_PASSWORD")))); } @Test @@ -376,12 +444,20 @@ public void verify_introspectorPodSpec_activeDeadlineSeconds_initial_values() { V1JobSpec jobSpec = createJobSpec(); assertThat( - jobSpec.getTemplate().getSpec().getActiveDeadlineSeconds(), + getActiveDeadlineSeconds(jobSpec), is(TuningParametersStub.INTROSPECTOR_JOB_ACTIVE_DEADLINE_SECONDS)); assertThat( jobSpec.getActiveDeadlineSeconds(), is(TuningParametersStub.INTROSPECTOR_JOB_ACTIVE_DEADLINE_SECONDS)); } + private static Long getActiveDeadlineSeconds(V1JobSpec jobSpec) { + return getTemplateSpec(jobSpec).getActiveDeadlineSeconds(); + } + + private static V1PodSpec getTemplateSpec(V1JobSpec jobSpec) { + return jobSpec.getTemplate().getSpec(); + } + @Test public void verify_introspectorPodSpec_activeDeadlineSeconds_retry_values() { int failureCount = domainPresenceInfo.incrementAndGetFailureCount(); @@ -391,12 +467,20 @@ public void verify_introspectorPodSpec_activeDeadlineSeconds_retry_values() { long expectedActiveDeadlineSeconds = TuningParametersStub.INTROSPECTOR_JOB_ACTIVE_DEADLINE_SECONDS + (failureCount * JobStepContext.DEFAULT_ACTIVE_DEADLINE_INCREMENT_SECONDS); - assertThat( - jobSpec.getTemplate().getSpec().getActiveDeadlineSeconds(), - is(expectedActiveDeadlineSeconds)); + assertThat(getActiveDeadlineSeconds(jobSpec), is(expectedActiveDeadlineSeconds)); assertThat(jobSpec.getActiveDeadlineSeconds(), is(expectedActiveDeadlineSeconds)); } + @Test + public void verify_introspectorPodSpec_activeDeadlineSeconds_domain_overrides_values() { + configureDomain().withIntrospectorJobActiveDeadlineSeconds(600L); + + V1JobSpec jobSpec = createJobSpec(); + + assertThat(getActiveDeadlineSeconds(jobSpec), is(600L)); + assertThat(jobSpec.getActiveDeadlineSeconds(), is(600L)); + } + @Test public void podTemplate_hasCreateByOperatorLabel() { V1JobSpec jobSpec = createJobSpec(); @@ -484,7 +568,7 @@ public void introspectorPodContainerSpec_hasJobNameAsContainerName() { V1JobSpec jobSpec = createJobSpec(); assertThat( - getMatchingContainer(domainPresenceInfo, jobSpec).get().getName(), + getMatchingContainer(domainPresenceInfo, jobSpec).map(V1Container::getName).orElse(null), is(JobHelper.createJobName(DOMAIN_UID))); } @@ -674,6 +758,16 @@ public void whenNotConfigured_introspectorPodSpec_hasNullTolerations() { nullValue()); } + @Test + public void whenDomainHasHttpAccessLogInLogHomeConfigured_introspectorPodSpecStartupWithIt() { + configureDomain().withHttpAccessLogInLogHome(false); + V1JobSpec jobSpec = createJobSpec(); + + assertThat(getMatchingContainerEnv(domainPresenceInfo, jobSpec), + hasEnvVar(ServerEnvVars.ACCESS_LOG_IN_LOG_HOME, "false") + ); + } + @Test public void whenNotConfigured_introspectorPodSpec_hasTrueAccessLogInLogHomeEnvVar() { V1JobSpec jobSpec = createJobSpec(); @@ -683,6 +777,59 @@ public void whenNotConfigured_introspectorPodSpec_hasTrueAccessLogInLogHomeEnvVa ); } + @Test + public void whenNoExistingTopologyRunIntrospector() { + runCreateJob(); + + assertThat(job, notNullValue()); + } + + private void runCreateJob() { + testSupport.doOnCreate(KubernetesTestSupport.JOB, j -> recordJob((V1Job) j)); + testSupport.runSteps(JobHelper.createDomainIntrospectorJobStep(null)); + } + + @Test + public void whenTopologyExistsAndNothingChanged_dontRunIntrospector() { + defineTopology(); + + runCreateJob(); + + assertThat(job, nullValue()); + } + + @Test + public void whenIntrospectNotRequested_dontRunIntrospector() { + defineTopology(); + + runCreateJob(); + + assertThat(job, nullValue()); + } + + @Test + public void whenIntrospectRequestSet_runIntrospector() { + defineTopology(); + testSupport.addToPacket(ProcessingConstants.DOMAIN_INTROSPECT_REQUESTED, "123"); + + runCreateJob(); + + assertThat(job, notNullValue()); + } + + private V1Job job; + + private void recordJob(V1Job job) { + this.job = job; + } + + private void defineTopology() { + WlsDomainConfigSupport configSupport = new WlsDomainConfigSupport("domain"); + configSupport.addWlsServer("admin", 8045); + configSupport.setAdminServerName("admin"); + testSupport.addToPacket(DOMAIN_TOPOLOGY, configSupport.createDomainConfig()); + } + private DomainPresenceInfo createDomainPresenceInfo() { DomainPresenceInfo domainPresenceInfo = new DomainPresenceInfo( @@ -739,8 +886,10 @@ private boolean hasCreateJobName(V1Container container, String domainUid) { } private Stream getContainerStream(V1JobSpec jobSpec) { - return Optional.ofNullable(jobSpec.getTemplate().getSpec().getContainers()).stream() - .flatMap(Collection::stream); + return Optional.ofNullable(jobSpec.getTemplate().getSpec()) + .map(V1PodSpec::getContainers) + .stream() + .flatMap(Collection::stream); } private DomainSpec getConfiguredDomainSpec(DomainConfigurator domainConfigurator) @@ -752,6 +901,11 @@ private DomainSpec getConfiguredDomainSpec(DomainConfigurator domainConfigurator return (DomainSpec) getDomainSpec.invoke(domainConfigurator); } + private static Matcher> envVarOEVNContains(String val) { + // OEVN env var contains a comma separated list of env var names + return hasEnvVarRegEx(OEVN, "(^|.*,)" + val + "($|,.*)"); + } + // todo add domain uid and created by operator labels to pod template so that they can be watched // todo have pod processor able to recognize job-created pods to update domain status } diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/KubernetesTestSupport.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/KubernetesTestSupport.java index 4f24e243525..7ccf5ab8adc 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/KubernetesTestSupport.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/KubernetesTestSupport.java @@ -65,6 +65,9 @@ import io.kubernetes.client.openapi.models.V1SubjectAccessReview; import io.kubernetes.client.openapi.models.V1SubjectRulesReviewStatus; import io.kubernetes.client.openapi.models.V1TokenReview; +import io.kubernetes.client.openapi.models.V1beta1CustomResourceDefinition; +import okhttp3.internal.http2.ErrorCode; +import okhttp3.internal.http2.StreamResetException; import oracle.kubernetes.operator.calls.CallFactory; import oracle.kubernetes.operator.calls.CallResponse; import oracle.kubernetes.operator.calls.RequestParams; @@ -90,6 +93,7 @@ @SuppressWarnings("WeakerAccess") public class KubernetesTestSupport extends FiberTestSupport { + public static final String BETA_CRD = "BetaCRD"; public static final String CONFIG_MAP = "ConfigMap"; public static final String CUSTOM_RESOURCE_DEFINITION = "CRD"; public static final String DOMAIN = "Domain"; @@ -122,6 +126,7 @@ public class KubernetesTestSupport extends FiberTestSupport { * @return a memento which can be used to restore the production factory */ public Memento install() { + support(BETA_CRD, V1beta1CustomResourceDefinition.class); support(CUSTOM_RESOURCE_DEFINITION, V1CustomResourceDefinition.class); support(SELF_SUBJECT_ACCESS_REVIEW, V1SelfSubjectAccessReview.class); support(SELF_SUBJECT_RULES_REVIEW, V1SubjectRulesReviewStatus.class); @@ -296,6 +301,33 @@ public void failOnCreate(String resourceType, String name, String namespace, int failure = new Failure(Operation.create, resourceType, name, namespace, httpStatus); } + /** + * Specifies that a replace operation should fail if it matches the specified conditions. Applies to + * namespaced resources. + * + * @param resourceType the type of resource + * @param name the name of the resource + * @param namespace the namespace containing the resource + * @param httpStatus the status to associate with the failure + */ + public void failOnReplace(String resourceType, String name, String namespace, int httpStatus) { + failure = new Failure(Operation.replace, resourceType, name, namespace, httpStatus); + } + + /** + * Specifies that a replace operation should fail if it matches the specified conditions. Applies to + * namespaced resources. + * + * @param resourceType the type of resource + * @param name the name of the resource + * @param namespace the namespace containing the resource + */ + public void failOnReplaceWithStreamResetException(String resourceType, String name, String namespace) { + ApiException ae = new ApiException("StreamResetException: stream was reset: NO_ERROR", + new StreamResetException(ErrorCode.NO_ERROR), 0, null, null); + failure = new Failure(Operation.replace, resourceType, name, namespace, ae); + } + /** * Specifies that a delete operation should fail if it matches the specified conditions. Applies to * namespaced resources. @@ -433,6 +465,11 @@ public Failure(String resourceType, String name, String namespace, int httpStatu this.operation = operation; } + Failure(Operation operation, String resourceType, String name, String namespace, ApiException apiException) { + this(resourceType, name, namespace, apiException); + this.operation = operation; + } + boolean matches(String resourceType, RequestParams requestParams, Operation operation) { return this.resourceType.equals(resourceType) && (this.operation == null || this.operation == operation) diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/KubernetesUtilsTest.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/KubernetesUtilsTest.java index 7550150842d..4148c993c2c 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/KubernetesUtilsTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/KubernetesUtilsTest.java @@ -3,12 +3,14 @@ package oracle.kubernetes.operator.helpers; +import java.math.BigInteger; + import io.kubernetes.client.openapi.models.V1ObjectMeta; import org.joda.time.DateTime; import org.junit.Test; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.junit.MatcherAssert.assertThat; public class KubernetesUtilsTest { @@ -38,4 +40,53 @@ public void whenCreationTimesAndResourceVersionsMatch_neitherIsNewer() { assertThat(KubernetesUtils.isFirstNewer(meta2, meta1), is(false)); assertThat(KubernetesUtils.isFirstNewer(meta1, meta2), is(false)); } + + @Test + public void whenHaveLargeResourceVersionsAndSameTime_succeedIsFirstNewer() { + DateTime now = DateTime.now(); + + // This needs to be a value bigger than 2147483647 + String resVersion = "2733280673"; + String evenBiggerResVersion = "2733280673000"; + + V1ObjectMeta first = new V1ObjectMeta().creationTimestamp(now).resourceVersion(resVersion); + V1ObjectMeta second = new V1ObjectMeta().creationTimestamp(now).resourceVersion(evenBiggerResVersion); + + assertThat(KubernetesUtils.isFirstNewer(first, second), is(false)); + } + + @Test + public void whenHaveNonParsableResourceVersionsAndSameTime_succeedIsFirstNewer() { + DateTime now = DateTime.now(); + + String resVersion = "ThisIsNotANumber"; + String differentResVersion = "SomeOtherValueAlsoNotANumber"; + + V1ObjectMeta first = new V1ObjectMeta().creationTimestamp(now).resourceVersion(resVersion); + V1ObjectMeta second = new V1ObjectMeta().creationTimestamp(now).resourceVersion(differentResVersion); + + assertThat(KubernetesUtils.isFirstNewer(first, second), is(false)); + } + + @Test + public void whenHaveSmallResourceVersion_parseCorrectly() { + String resVersion = "1"; + + BigInteger bigInteger = KubernetesUtils.getResourceVersion(resVersion); + assertThat(bigInteger, is(BigInteger.ONE)); + } + + @Test + public void whenHaveNullResourceVersion_parseCorrectly() { + BigInteger bigInteger = KubernetesUtils.getResourceVersion((String) null); + assertThat(bigInteger, is(BigInteger.ZERO)); + } + + @Test + public void whenHaveOpaqueResourceVersion_parseCorrectly() { + String resVersion = "123NotANumber456"; + + BigInteger bigInteger = KubernetesUtils.getResourceVersion(resVersion); + assertThat(bigInteger, is(BigInteger.ZERO)); + } } diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/ManagedPodHelperTest.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/ManagedPodHelperTest.java index 64321a44af7..cc104f77ad9 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/ManagedPodHelperTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/ManagedPodHelperTest.java @@ -18,10 +18,10 @@ import io.kubernetes.client.openapi.models.V1Pod; import io.kubernetes.client.openapi.models.V1PodAffinityTerm; import io.kubernetes.client.openapi.models.V1PodAntiAffinity; +import io.kubernetes.client.openapi.models.V1PodSpec; import io.kubernetes.client.openapi.models.V1WeightedPodAffinityTerm; import oracle.kubernetes.operator.LabelConstants; import oracle.kubernetes.operator.ProcessingConstants; -import oracle.kubernetes.operator.VersionConstants; import oracle.kubernetes.operator.work.FiberTestSupport; import oracle.kubernetes.operator.work.Packet; import oracle.kubernetes.operator.work.Step.StepAndPacket; @@ -778,27 +778,19 @@ public void whenPodHasDuplicateAnnotations_createManagedPodWithCombination() { @Test public void whenPodHasCustomLabelConflictWithInternal_createManagedPodWithInternal() { getConfigurator() - .withPodLabel(LabelConstants.RESOURCE_VERSION_LABEL, "domain-label-value1") .configureServer((SERVER_NAME)) .withPodLabel(LabelConstants.CREATEDBYOPERATOR_LABEL, "server-label-value1"); Map podLabels = getCreatedPod().getMetadata().getLabels(); - assertThat( - podLabels, - hasEntry(LabelConstants.RESOURCE_VERSION_LABEL, VersionConstants.DEFAULT_DOMAIN_VERSION)); assertThat(podLabels, hasEntry(LabelConstants.CREATEDBYOPERATOR_LABEL, "true")); } @Test public void whenClusterHasAffinity_createPodWithIt() { - getConfigurator() - .configureCluster(CLUSTER_NAME) - .withAffinity(affinity); + getConfigurator().configureCluster(CLUSTER_NAME).withAffinity(affinity); testSupport.addToPacket(ProcessingConstants.CLUSTER_NAME, CLUSTER_NAME); - assertThat( - getCreatedPod().getSpec().getAffinity(), - is(affinity)); + assertThat(getCreatePodAffinity(), is(affinity)); } @Test @@ -920,29 +912,30 @@ public void whenClusterHasAffinityWithVariables_createManagedPodWithSubstitution .withAffinity( new V1Affinity().podAntiAffinity( new V1PodAntiAffinity().preferredDuringSchedulingIgnoredDuringExecution( - Collections.singletonList(new V1WeightedPodAffinityTerm().weight(100).podAffinityTerm( - new V1PodAffinityTerm().labelSelector( - new V1LabelSelector().matchExpressions( - Collections.singletonList(new V1LabelSelectorRequirement() - .key("weblogic.clusterName") - .operator("In") - .addValuesItem("$(CLUSTER_NAME)")))) - .topologyKey("kubernetes.io/hostname")))))); + Collections.singletonList( + createWeightedPodAffinityTerm("weblogic.clusterName", "$(CLUSTER_NAME)"))))); V1Affinity expectedValue = new V1Affinity().podAntiAffinity( new V1PodAntiAffinity().preferredDuringSchedulingIgnoredDuringExecution( - Collections.singletonList(new V1WeightedPodAffinityTerm().weight(100).podAffinityTerm( - new V1PodAffinityTerm().labelSelector( - new V1LabelSelector().matchExpressions( - Collections.singletonList(new V1LabelSelectorRequirement() - .key("weblogic.clusterName") - .operator("In") - .addValuesItem(CLUSTER_NAME)))) - .topologyKey("kubernetes.io/hostname"))))); + Collections.singletonList( + createWeightedPodAffinityTerm("weblogic.clusterName", CLUSTER_NAME)))); - assertThat( - getCreatedPod().getSpec().getAffinity(), - is(expectedValue)); + assertThat(getCreatePodAffinity(), is(expectedValue)); + } + + V1Affinity getCreatePodAffinity() { + return Optional.ofNullable(getCreatedPod().getSpec()).map(V1PodSpec::getAffinity).orElse(new V1Affinity()); + } + + V1WeightedPodAffinityTerm createWeightedPodAffinityTerm(String key, String valuesItem) { + return new V1WeightedPodAffinityTerm().weight(100).podAffinityTerm( + new V1PodAffinityTerm().labelSelector( + new V1LabelSelector().matchExpressions( + Collections.singletonList(new V1LabelSelectorRequirement() + .key(key) + .operator("In") + .addValuesItem(valuesItem)))) + .topologyKey("kubernetes.io/hostname")); } @Test @@ -952,50 +945,22 @@ public void whenDomainAndClusterBothHaveAffinityWithVariables_createManagedPodWi .withAffinity( new V1Affinity().podAntiAffinity( new V1PodAntiAffinity().preferredDuringSchedulingIgnoredDuringExecution( - Collections.singletonList(new V1WeightedPodAffinityTerm().weight(100).podAffinityTerm( - new V1PodAffinityTerm().labelSelector( - new V1LabelSelector().matchExpressions( - Collections.singletonList(new V1LabelSelectorRequirement() - .key("weblogic.domainUID") - .operator("In") - .addValuesItem("$(DOMAIN_UID)")))) - .topologyKey("kubernetes.io/hostname")))))) + Collections.singletonList( + createWeightedPodAffinityTerm("weblogic.domainUID", "$(DOMAIN_UID)"))))) .configureCluster(CLUSTER_NAME) .withAffinity( new V1Affinity().podAntiAffinity( new V1PodAntiAffinity().preferredDuringSchedulingIgnoredDuringExecution( - Collections.singletonList(new V1WeightedPodAffinityTerm().weight(100).podAffinityTerm( - new V1PodAffinityTerm().labelSelector( - new V1LabelSelector().matchExpressions( - Collections.singletonList(new V1LabelSelectorRequirement() - .key("weblogic.clusterName") - .operator("In") - .addValuesItem("$(CLUSTER_NAME)")))) - .topologyKey("kubernetes.io/hostname")))))); + Collections.singletonList( + createWeightedPodAffinityTerm("weblogic.clusterName", "$(CLUSTER_NAME)"))))); V1Affinity expectedValue = new V1Affinity().podAntiAffinity( new V1PodAntiAffinity().preferredDuringSchedulingIgnoredDuringExecution( Arrays.asList( - new V1WeightedPodAffinityTerm().weight(100).podAffinityTerm( - new V1PodAffinityTerm().labelSelector( - new V1LabelSelector().matchExpressions( - Collections.singletonList(new V1LabelSelectorRequirement() - .key("weblogic.clusterName") - .operator("In") - .addValuesItem(CLUSTER_NAME)))) - .topologyKey("kubernetes.io/hostname")), - new V1WeightedPodAffinityTerm().weight(100).podAffinityTerm( - new V1PodAffinityTerm().labelSelector( - new V1LabelSelector().matchExpressions( - Collections.singletonList(new V1LabelSelectorRequirement() - .key("weblogic.domainUID") - .operator("In") - .addValuesItem(UID)))) - .topologyKey("kubernetes.io/hostname"))))); + createWeightedPodAffinityTerm("weblogic.clusterName", CLUSTER_NAME), + createWeightedPodAffinityTerm("weblogic.domainUID", UID)))); - assertThat( - getCreatedPod().getSpec().getAffinity(), - is(expectedValue)); + assertThat(getCreatePodAffinity(), is(expectedValue)); } @Override @@ -1030,6 +995,10 @@ protected void verifyPodNotReplacedWhen(PodMutator mutator) { @Override V1Pod createPod(Packet packet) { + return createManagedServerPodModel(packet); + } + + private static V1Pod createManagedServerPodModel(Packet packet) { return new PodHelper.ManagedPodStepContext(null, packet).getPodModel(); } } diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/Matchers.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/Matchers.java index 3e1a2af84e0..a22e4bda80f 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/Matchers.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/Matchers.java @@ -6,6 +6,7 @@ import java.util.Arrays; import java.util.Map; import java.util.Objects; +import javax.annotation.Nonnull; import io.kubernetes.client.custom.Quantity; import io.kubernetes.client.openapi.models.V1Container; @@ -17,7 +18,10 @@ import io.kubernetes.client.openapi.models.V1VolumeMount; import org.hamcrest.Description; import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeDiagnosingMatcher; +import static oracle.kubernetes.operator.helpers.Matchers.EnvVarMatcher.envVarWithName; +import static oracle.kubernetes.operator.helpers.Matchers.EnvVarMatcher.envVarWithNameAndValue; import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.hasItem; @@ -32,6 +36,14 @@ public static Matcher> hasEnvVar(String name, String return hasItem(new V1EnvVar().name(name).value(value)); } + public static Matcher> hasEnvVar(String name) { + return hasItem(envVarWithName(name)); + } + + public static Matcher> hasEnvVarRegEx(String name, String regex) { + return hasItem(envVarWithNameAndValue(name,regex)); + } + static Matcher> hasResourceQuantity( String resource, String quantity) { return hasEntry(resource, Quantity.fromString(quantity)); @@ -57,9 +69,9 @@ private static V1Container createContainer(String name, String image, String... @SuppressWarnings("unused") public static class VolumeMountMatcher extends org.hamcrest.TypeSafeDiagnosingMatcher { - private String expectedName; - private String expectedPath; - private boolean readOnly; + private final String expectedName; + private final String expectedPath; + private final boolean readOnly; private VolumeMountMatcher(String expectedName, String expectedPath, boolean readOnly) { this.expectedName = expectedName; @@ -105,9 +117,9 @@ private String getReadable() { public static class ProbeMatcher extends org.hamcrest.TypeSafeDiagnosingMatcher { private static final Integer EXPECTED_FAILURE_THRESHOLD = 1; - private Integer expectedInitialDelay; - private Integer expectedTimeout; - private Integer expectedPeriod; + private final Integer expectedInitialDelay; + private final Integer expectedTimeout; + private final Integer expectedPeriod; private ProbeMatcher(int expectedInitialDelay, int expectedTimeout, int expectedPeriod) { this.expectedInitialDelay = expectedInitialDelay; @@ -156,4 +168,65 @@ public void describeTo(Description description) { .appendValue(EXPECTED_FAILURE_THRESHOLD); } } + + static class EnvVarMatcher extends TypeSafeDiagnosingMatcher { + private static final String DONTCARE = "SENTINEL_DONT_CARE"; + private final String expectedName; + private final String expectedValueRegEx; + + private EnvVarMatcher(String expectedName) { + this.expectedName = expectedName; + this.expectedValueRegEx = DONTCARE; + } + + private EnvVarMatcher(String expectedName, String expectedValueRegEx) { + this.expectedName = expectedName; + this.expectedValueRegEx = expectedValueRegEx; + } + + static EnvVarMatcher envVarWithName(@Nonnull String name) { + return new EnvVarMatcher(name); + } + + static EnvVarMatcher envVarWithNameAndValue(@Nonnull String name, String value) { + return new EnvVarMatcher(name, value); + } + + @Override + protected boolean matchesSafely(V1EnvVar item, Description mismatchDescription) { + if (expectedValueRegEx == DONTCARE) { + if (expectedName.equals(item.getName())) { + return true; + } + mismatchDescription.appendText("EnvVar with name ").appendValue(item.getName()); + return false; + } + if (expectedValueRegEx == null) { + if (expectedName.equals(item.getName()) && item.getValue() == null) { + return true; + } + mismatchDescription.appendText("EnvVar with name ").appendValue(item.getName()); + return false; + } + if (expectedName.equals(item.getName()) + && item.getValue() != null + && item.getValue().matches(expectedValueRegEx)) { + return true; + } + mismatchDescription + .appendText("EnvVar with name=") + .appendValue(item.getName()) + .appendText(" value=") + .appendValue(item.getValue()); + return false; + } + + @Override + public void describeTo(Description description) { + description.appendText("EnvVar with name=").appendValue(expectedName); + if (expectedValueRegEx != DONTCARE) { + description.appendText(" value=").appendValue(expectedValueRegEx); + } + } + } } diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/PodHelperTestBase.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/PodHelperTestBase.java index 0ead8f492c7..f8f431b22c6 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/PodHelperTestBase.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/PodHelperTestBase.java @@ -31,6 +31,7 @@ import io.kubernetes.client.openapi.models.V1LocalObjectReference; import io.kubernetes.client.openapi.models.V1ObjectFieldSelector; import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1OwnerReference; import io.kubernetes.client.openapi.models.V1Pod; import io.kubernetes.client.openapi.models.V1PodAffinity; import io.kubernetes.client.openapi.models.V1PodAffinityTerm; @@ -45,12 +46,15 @@ import io.kubernetes.client.openapi.models.V1Volume; import io.kubernetes.client.openapi.models.V1VolumeMount; import io.kubernetes.client.openapi.models.V1WeightedPodAffinityTerm; +import oracle.kubernetes.operator.DomainSourceType; +import oracle.kubernetes.operator.IntrospectorConfigMapKeys; +import oracle.kubernetes.operator.KubernetesConstants; import oracle.kubernetes.operator.LabelConstants; +import oracle.kubernetes.operator.MakeRightDomainOperation; +import oracle.kubernetes.operator.OverrideDistributionStrategy; import oracle.kubernetes.operator.PodAwaiterStepFactory; import oracle.kubernetes.operator.ProcessingConstants; -import oracle.kubernetes.operator.VersionConstants; -import oracle.kubernetes.operator.calls.FailureStatusSourceException; -import oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder; +import oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl; import oracle.kubernetes.operator.utils.InMemoryCertificates; import oracle.kubernetes.operator.utils.WlsDomainConfigSupport; import oracle.kubernetes.operator.wlsconfig.NetworkAccessPoint; @@ -73,12 +77,13 @@ import org.junit.Test; import static com.meterware.simplestub.Stub.createStrictStub; +import static com.meterware.simplestub.Stub.createStub; import static oracle.kubernetes.operator.KubernetesConstants.ALWAYS_IMAGEPULLPOLICY; import static oracle.kubernetes.operator.KubernetesConstants.CONTAINER_NAME; import static oracle.kubernetes.operator.KubernetesConstants.DEFAULT_IMAGE; -import static oracle.kubernetes.operator.KubernetesConstants.DOMAIN_CONFIG_MAP_NAME; import static oracle.kubernetes.operator.KubernetesConstants.IFNOTPRESENT_IMAGEPULLPOLICY; -import static oracle.kubernetes.operator.LabelConstants.RESOURCE_VERSION_LABEL; +import static oracle.kubernetes.operator.KubernetesConstants.SCRIPT_CONFIG_MAP_NAME; +import static oracle.kubernetes.operator.ProcessingConstants.MAKE_RIGHT_DOMAIN_OPERATION; import static oracle.kubernetes.operator.ProcessingConstants.SERVER_SCAN; import static oracle.kubernetes.operator.helpers.AnnotationHelper.SHA256_ANNOTATION; import static oracle.kubernetes.operator.helpers.DomainStatusMatcher.hasStatus; @@ -92,6 +97,8 @@ import static oracle.kubernetes.operator.helpers.Matchers.hasResourceQuantity; import static oracle.kubernetes.operator.helpers.Matchers.hasVolume; import static oracle.kubernetes.operator.helpers.Matchers.hasVolumeMount; +import static oracle.kubernetes.operator.helpers.StepContextConstants.RUNTIME_ENCRYPTION_SECRET_MOUNT_PATH; +import static oracle.kubernetes.operator.helpers.StepContextConstants.RUNTIME_ENCRYPTION_SECRET_VOLUME; import static oracle.kubernetes.operator.helpers.StepContextConstants.SIT_CONFIG_MAP_VOLUME; import static oracle.kubernetes.operator.helpers.TuningParametersStub.LIVENESS_INITIAL_DELAY; import static oracle.kubernetes.operator.helpers.TuningParametersStub.LIVENESS_PERIOD; @@ -123,6 +130,7 @@ public abstract class PodHelperTestBase { static final Integer ADMIN_PORT = 7001; protected static final String DOMAIN_NAME = "domain1"; protected static final String UID = "uid1"; + protected static final String KUBERNETES_UID = "12345"; private static final boolean INCLUDE_SERVER_OUT_IN_POD_LOG = true; private static final String CREDENTIALS_SECRET_NAME = "webLogicCredentialsSecretName"; @@ -134,7 +142,7 @@ public abstract class PodHelperTestBase { private static final int CONFIGURED_PERIOD = 35; private static final String LOG_HOME = "/shared/logs"; private static final String NODEMGR_HOME = "/u01/nodemanager"; - private static final String CONFIGMAP_VOLUME_NAME = "weblogic-domain-cm-volume"; + private static final String CONFIGMAP_VOLUME_NAME = "weblogic-scripts-cm-volume"; private static final int READ_AND_EXECUTE_MODE = 0555; final TerminalStep terminalStep = new TerminalStep(); @@ -145,9 +153,9 @@ public abstract class PodHelperTestBase { protected List logRecords = new ArrayList<>(); RetryStrategyStub retryStrategy = createStrictStub(RetryStrategyStub.class); private Method getDomainSpec; - private DomainConfigurator configurator = DomainConfiguratorFactory.forDomain(domain); - private String serverName; - private int listenPort; + private final DomainConfigurator configurator = DomainConfiguratorFactory.forDomain(domain); + private final String serverName; + private final int listenPort; private WlsDomainConfig domainTopology; protected final V1PodSecurityContext podSecurityContext = createPodSecurityContext(123L); protected final V1SecurityContext containerSecurityContext = createSecurityContext(222L); @@ -254,7 +262,11 @@ WlsServerConfig getServerTopology() { abstract void setServerPort(int port); private Domain createDomain() { - return new Domain().withMetadata(new V1ObjectMeta().namespace(NS).name(DOMAIN_NAME)).withSpec(createDomainSpec()); + return new Domain() + .withApiVersion(KubernetesConstants.DOMAIN_VERSION) + .withKind(KubernetesConstants.DOMAIN) + .withMetadata(new V1ObjectMeta().namespace(NS).name(DOMAIN_NAME).uid(KUBERNETES_UID)) + .withSpec(createDomainSpec()); } private DomainSpec createDomainSpec() { @@ -339,14 +351,45 @@ public void whenPodCreatedWithPullSecret_addToPod() { @Test public void whenPodCreated_withNoPvc_image_containerHasExpectedVolumeMounts() { - configurator.withDomainHomeInImage(true); + configurator.withDomainHomeSourceType(DomainSourceType.Image); assertThat( getCreatedPodSpecContainer().getVolumeMounts(), containsInAnyOrder( writableVolumeMount( SIT_CONFIG_MAP_VOLUME, "/weblogic-operator/introspector"), readOnlyVolumeMount("weblogic-domain-debug-cm-volume", "/weblogic-operator/debug"), - readOnlyVolumeMount("weblogic-domain-cm-volume", "/weblogic-operator/scripts"))); + readOnlyVolumeMount("weblogic-scripts-cm-volume", "/weblogic-operator/scripts"))); + } + + @Test + public void whenPodCreated_withNoPvc_fromModel_containerHasExpectedVolumeMounts() { + reportInspectionWasRun(); + configurator.withDomainHomeSourceType(DomainSourceType.FromModel) + .withRuntimeEncryptionSecret("my-runtime-encryption-secret"); + assertThat( + getCreatedPodSpecContainer().getVolumeMounts(), + containsInAnyOrder( + writableVolumeMount( + SIT_CONFIG_MAP_VOLUME, "/weblogic-operator/introspector"), + readOnlyVolumeMount("weblogic-domain-debug-cm-volume", "/weblogic-operator/debug"), + readOnlyVolumeMount("weblogic-scripts-cm-volume", "/weblogic-operator/scripts"), + readOnlyVolumeMount(RUNTIME_ENCRYPTION_SECRET_VOLUME, + RUNTIME_ENCRYPTION_SECRET_MOUNT_PATH))); + } + + public void reportInspectionWasRun() { + testSupport.addToPacket(MAKE_RIGHT_DOMAIN_OPERATION, reportIntrospectionRun()); + } + + private MakeRightDomainOperation reportIntrospectionRun() { + return createStub(InspectionWasRun.class); + } + + abstract static class InspectionWasRun implements MakeRightDomainOperation { + @Override + public boolean wasInspectionRun() { + return true; + } } @Test @@ -401,6 +444,29 @@ public void whenPodCreatedWithAdminPortEnabled_adminPortSecureEnvVarIsTrue() { assertThat(getCreatedPodSpecContainer().getEnv(), hasEnvVar("ADMIN_PORT_SECURE", "true")); } + @Test + public void whenPodCreatedWithOnRestartDistribution_dontAddDynamicUpdateEnvVar() { + configureDomain().withConfigOverrideDistributionStrategy(OverrideDistributionStrategy.ON_RESTART); + + assertThat(getCreatedPodSpecContainer().getEnv(), not(hasEnvVar("DYNAMIC_CONFIG_OVERRIDE"))); + } + + @Test + public void whenPodCreatedWithDynamicDistribution_addDynamicUpdateEnvVar() { + configureDomain().withConfigOverrideDistributionStrategy(OverrideDistributionStrategy.DYNAMIC); + + assertThat(getCreatedPodSpecContainer().getEnv(), hasEnvVar("DYNAMIC_CONFIG_OVERRIDE")); + } + + @Test + public void whenDistributionStrategyModified_dontReplacePod() { + configureDomain().withConfigOverrideDistributionStrategy(OverrideDistributionStrategy.DYNAMIC); + initializeExistingPod(); + + configureDomain().withConfigOverrideDistributionStrategy(OverrideDistributionStrategy.ON_RESTART); + verifyPodNotReplaced(); + } + @Test public void whenPodCreatedWithDomainV2Settings_livenessProbeHasConfiguredTuning() { configureServer() @@ -421,7 +487,7 @@ public void whenPodCreated_readinessProbeHasConfiguredTuning() { @Test public void whenPodCreationFailsDueToUnprocessableEntityFailure_reportInDomainStatus() { - testSupport.failOnResource(POD, getPodName(), NS, new UnprocessableEntityBuilder() + testSupport.failOnResource(POD, getPodName(), NS, new UnrecoverableErrorBuilderImpl() .withReason("FieldValueNotFound") .withMessage("Test this failure") .build()); @@ -434,7 +500,7 @@ public void whenPodCreationFailsDueToUnprocessableEntityFailure_reportInDomainSt @Test public void whenPodCreationFailsDueToUnprocessableEntityFailure_abortFiber() { - testSupport.failOnResource(POD, getPodName(), NS, new UnprocessableEntityBuilder() + testSupport.failOnResource(POD, getPodName(), NS, new UnrecoverableErrorBuilderImpl() .withReason("FieldValueNotFound") .withMessage("Test this failure") .build()); @@ -471,8 +537,20 @@ public void whenPodCreationFailsDueToQuotaExceeded_abortFiber() { assertThat(terminalStep.wasRun(), is(false)); } + // todo set property to indicate dynamic/on_restart copying protected abstract void verifyPodReplaced(); + protected void verifyPodNotReplaced() { + testSupport.addComponent( + ProcessingConstants.PODWATCHER_COMPONENT_NAME, + PodAwaiterStepFactory.class, + new NullPodAwaiterStepFactory(terminalStep)); + + testSupport.runSteps(getStepFactory(), terminalStep); + + assertThat(logRecords, containsFine(getExistsMessageKey())); + } + protected abstract void verifyPodNotReplacedWhen(PodMutator mutator); private void misconfigurePod(PodMutator mutator) { @@ -577,7 +655,7 @@ public void whenDomainPresenceLacksClaims_adminPodSpecHasNoDomainStorageVolume() public void createdPod_hasConfigMapVolume() { V1Volume credentialsVolume = getVolumeWithName(getCreatedPod(), CONFIGMAP_VOLUME_NAME); - assertThat(credentialsVolume.getConfigMap().getName(), equalTo(DOMAIN_CONFIG_MAP_NAME)); + assertThat(credentialsVolume.getConfigMap().getName(), equalTo(SCRIPT_CONFIG_MAP_NAME)); assertThat(credentialsVolume.getConfigMap().getDefaultMode(), equalTo(READ_AND_EXECUTE_MODE)); } @@ -595,8 +673,6 @@ public void whenPodCreated_hasExpectedLabels() { assertThat( getCreatedPod().getMetadata().getLabels(), allOf( - hasEntry( - LabelConstants.RESOURCE_VERSION_LABEL, VersionConstants.DEFAULT_DOMAIN_VERSION), hasEntry(LabelConstants.DOMAINUID_LABEL, UID), hasEntry(LabelConstants.DOMAINNAME_LABEL, DOMAIN_NAME), hasEntry(LabelConstants.SERVERNAME_LABEL, getServerName()), @@ -614,7 +690,7 @@ public void whenPodCreated_hasPrometheusAnnotations() { } @Test - @Ignore("Ignored: getCreatedPodSpecContainer is returing null because Pod is not yet created") + @Ignore("Ignored: getCreatedPodSpecContainer is returning null because Pod is not yet created") public void whenPodCreated_containerUsesListenPort() { V1Container v1Container = getCreatedPodSpecContainer(); @@ -870,6 +946,15 @@ public void whenServerConfigurationAddsRestartVersion_replacePod() { verifyPodReplaced(); } + @Test + public void whenServerConfigurationAddsIntrospectionVersion_dontReplacePod() { + initializeExistingPod(); + + configurator.withIntrospectVersion("123"); + + verifyPodNotReplaced(); + } + @Test public void whenServerListenPortChanged_replacePod() { initializeExistingPod(); @@ -888,6 +973,26 @@ public void whenServerAddsNap_replacePod() { verifyPodReplaced(); } + @Test + public void whenMiiSecretsHashChanged_replacePod() { + testSupport.addToPacket(IntrospectorConfigMapKeys.SECRETS_MD_5, "originalSecret"); + initializeExistingPod(); + + testSupport.addToPacket(IntrospectorConfigMapKeys.SECRETS_MD_5, "newSecret"); + + verifyPodReplaced(); + } + + @Test + public void whenMiiDomainZipHashChanged_replacePod() { + testSupport.addToPacket(IntrospectorConfigMapKeys.DOMAINZIP_HASH, "originalSecret"); + initializeExistingPod(); + + testSupport.addToPacket(IntrospectorConfigMapKeys.DOMAINZIP_HASH, "newSecret"); + + verifyPodReplaced(); + } + @Test public void whenNoPod_onFiveHundred() { testSupport.addRetryStrategy(retryStrategy); @@ -897,7 +1002,8 @@ public void whenNoPod_onFiveHundred() { Step initialStep = stepFactory.createStepList(terminalStep); testSupport.runSteps(initialStep); - testSupport.verifyCompletionThrowable(FailureStatusSourceException.class); + assertThat(getDomain(), hasStatus("ServerError", + "testcall in namespace junit, for testName: failure reported in test")); } @Test @@ -950,7 +1056,6 @@ private V1Probe createLivenessProbe() { V1ObjectMeta createPodMetadata() { V1ObjectMeta meta = new V1ObjectMeta() - .putLabelsItem(RESOURCE_VERSION_LABEL, VersionConstants.DEFAULT_DOMAIN_VERSION) .putLabelsItem(LabelConstants.DOMAINUID_LABEL, UID) .putLabelsItem(LabelConstants.DOMAINNAME_LABEL, DOMAIN_NAME) .putLabelsItem(LabelConstants.DOMAINHOME_LABEL, "/u01/oracle/user_projects/domains") @@ -1306,7 +1411,17 @@ public void whenDomainHasResources_createContainersWithThem() { containers.forEach(c -> assertThat(c.getResources().getRequests(), hasResourceQuantity("memory", "250m"))); } - // todo test that changing a label or annotation does not change the hash + @Test + public void whenPodCreated_createPodWithOwnerReference() { + V1OwnerReference expectedReference = new V1OwnerReference() + .apiVersion(KubernetesConstants.DOMAIN_GROUP + "/" + KubernetesConstants.DOMAIN_VERSION) + .kind(KubernetesConstants.DOMAIN) + .name(DOMAIN_NAME) + .uid(KUBERNETES_UID) + .controller(true); + + assertThat(getCreatedPod().getMetadata().getOwnerReferences(), contains(expectedReference)); + } interface PodMutator { void mutate(V1Pod pod); diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/SemanticVersionTest.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/SemanticVersionTest.java new file mode 100644 index 00000000000..83a57e49f26 --- /dev/null +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/SemanticVersionTest.java @@ -0,0 +1,78 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.kubernetes.operator.helpers; + +import org.junit.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.lessThan; + +public class SemanticVersionTest { + + @Test + public void whenVersionsSame_compareReportsZero() { + SemanticVersion first = new SemanticVersion("5.6.7"); + SemanticVersion second = new SemanticVersion("5.6.7"); + + assertThat(first.compareTo(second), equalTo(0)); + } + + @Test + public void whenVersionsSameWithDefaultRevisionZero_compareReportsZero() { + SemanticVersion first = new SemanticVersion("5.6"); + SemanticVersion second = new SemanticVersion("5.6.0"); + + assertThat(first.compareTo(second), equalTo(0)); + } + + @Test + public void whenMajorVersionIsLower_compareReportsLower() { + SemanticVersion first = new SemanticVersion("5.6.7"); + SemanticVersion second = new SemanticVersion("10.3.4"); + + assertThat(first.compareTo(second), lessThan(0)); + } + + @Test + public void whenMajorVersionIsGreater_compareReportsGreater() { + SemanticVersion first = new SemanticVersion("5.6.7"); + SemanticVersion second = new SemanticVersion("2.8.9"); + + assertThat(first.compareTo(second), greaterThan(0)); + } + + @Test + public void whenMinorVersionIsLower_compareReportsLower() { + SemanticVersion first = new SemanticVersion("5.6.7"); + SemanticVersion second = new SemanticVersion("5.7.2"); + + assertThat(first.compareTo(second), lessThan(0)); + } + + @Test + public void whenMinorVersionIsGreater_compareReportsGreater() { + SemanticVersion first = new SemanticVersion("5.6.7"); + SemanticVersion second = new SemanticVersion("5.5.9"); + + assertThat(first.compareTo(second), greaterThan(0)); + } + + @Test + public void whenRevisionVersionIsLower_compareReportsLower() { + SemanticVersion first = new SemanticVersion("5.6.7"); + SemanticVersion second = new SemanticVersion("5.6.8"); + + assertThat(first.compareTo(second), lessThan(0)); + } + + @Test + public void whenRevisionVersionIsGreater_compareReportsGreater() { + SemanticVersion first = new SemanticVersion("5.6.7"); + SemanticVersion second = new SemanticVersion("5.6.6"); + + assertThat(first.compareTo(second), greaterThan(0)); + } +} diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/ServiceHelperTest.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/ServiceHelperTest.java index 04420c0ad98..f1c1a7f0fb0 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/ServiceHelperTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/ServiceHelperTest.java @@ -19,11 +19,13 @@ import javax.annotation.Nonnull; import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1OwnerReference; import io.kubernetes.client.openapi.models.V1Service; import io.kubernetes.client.openapi.models.V1ServicePort; +import oracle.kubernetes.operator.KubernetesConstants; import oracle.kubernetes.operator.LabelConstants; import oracle.kubernetes.operator.calls.FailureStatusSourceException; -import oracle.kubernetes.operator.calls.unprocessable.UnprocessableEntityBuilder; +import oracle.kubernetes.operator.calls.unprocessable.UnrecoverableErrorBuilderImpl; import oracle.kubernetes.operator.utils.WlsDomainConfigSupport; import oracle.kubernetes.operator.wlsconfig.WlsDomainConfig; import oracle.kubernetes.operator.wlsconfig.WlsServerConfig; @@ -72,6 +74,7 @@ import static oracle.kubernetes.utils.LogMatcher.containsFine; import static oracle.kubernetes.utils.LogMatcher.containsInfo; import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasEntry; @@ -201,6 +204,19 @@ private DomainConfigurator configureDomain() { return DomainConfiguratorFactory.forDomain(domainPresenceInfo.getDomain()); } + @Test + public void whenCreated_createWithOwnerReference() { + V1OwnerReference expectedReference = new V1OwnerReference() + .apiVersion(KubernetesConstants.DOMAIN_GROUP + "/" + KubernetesConstants.DOMAIN_VERSION) + .kind(KubernetesConstants.DOMAIN) + .name(DOMAIN_NAME) + .uid(KUBERNETES_UID) + .controller(true); + + V1Service model = testFacade.createServiceModel(testSupport.getPacket()); + assertThat(model.getMetadata().getOwnerReferences(), contains(expectedReference)); + } + @Test public void whenCreated_modelHasServiceType() { V1Service model = testFacade.createServiceModel(testSupport.getPacket()); @@ -313,7 +329,7 @@ public void onFailedRun_reportFailure() { @Test public void whenServiceCreationFailsDueToUnprocessableEntityFailure_reportInDomainStatus() { testSupport.defineResources(domainPresenceInfo.getDomain()); - testSupport.failOnResource(SERVICE, testFacade.getServiceName(), NS, new UnprocessableEntityBuilder() + testSupport.failOnResource(SERVICE, testFacade.getServiceName(), NS, new UnrecoverableErrorBuilderImpl() .withReason("FieldValueNotFound") .withMessage("Test this failure") .build()); @@ -327,7 +343,7 @@ public void whenServiceCreationFailsDueToUnprocessableEntityFailure_reportInDoma @Test public void whenServiceCreationFailsDueToUnprocessableEntityFailure_abortFiber() { testSupport.defineResources(domainPresenceInfo.getDomain()); - testSupport.failOnResource(SERVICE, testFacade.getServiceName(), NS, new UnprocessableEntityBuilder() + testSupport.failOnResource(SERVICE, testFacade.getServiceName(), NS, new UnrecoverableErrorBuilderImpl() .withReason("FieldValueNotFound") .withMessage("Test this failure") .build()); diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/ServiceHelperTestBase.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/ServiceHelperTestBase.java index cdaf16ce970..a1d0d887b29 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/ServiceHelperTestBase.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/ServiceHelperTestBase.java @@ -8,6 +8,7 @@ import com.meterware.simplestub.Memento; import io.kubernetes.client.openapi.models.V1ObjectMeta; +import oracle.kubernetes.operator.KubernetesConstants; import oracle.kubernetes.weblogic.domain.model.Domain; import oracle.kubernetes.weblogic.domain.model.DomainSpec; import org.junit.After; @@ -16,6 +17,7 @@ public class ServiceHelperTestBase { static final String DOMAIN_NAME = "domain1"; static final String NS = "namespace"; static final String UID = "uid1"; + static final String KUBERNETES_UID = "12345"; List mementos = new ArrayList<>(); DomainPresenceInfo domainPresenceInfo = createPresenceInfo(); @@ -32,7 +34,9 @@ public void tearDown() { private DomainPresenceInfo createPresenceInfo() { return new DomainPresenceInfo( new Domain() - .withMetadata(new V1ObjectMeta().namespace(NS).name(DOMAIN_NAME)) + .withApiVersion(KubernetesConstants.DOMAIN_GROUP + "/" + KubernetesConstants.DOMAIN_VERSION) + .withKind(KubernetesConstants.DOMAIN) + .withMetadata(new V1ObjectMeta().namespace(NS).name(DOMAIN_NAME).uid(KUBERNETES_UID)) .withSpec(createDomainSpec())); } diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/TuningParametersStub.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/TuningParametersStub.java index cda553850ba..793d6d2bdd2 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/TuningParametersStub.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/TuningParametersStub.java @@ -56,6 +56,11 @@ public CallBuilderTuning getCallBuilderTuning() { return null; } + @Override + public WatchTuning getWatchTuning() { + return null; + } + @Override public String get(Object key) { return namedParameters.get(key); diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/VersionCheckTest.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/VersionCheckTest.java index 1d8c6fde5bf..9cee9696ff0 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/VersionCheckTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/VersionCheckTest.java @@ -89,11 +89,13 @@ public static Collection data() { {LOG_MSG_TEST, "1", "10", "1+cor.0", containsWarning(K8S_VERSION_TOO_LOW), noIgnores()}, {LOG_MSG_TEST, "1", "10", "11", containsWarning(K8S_VERSION_TOO_LOW), noIgnores()}, {LOG_MSG_TEST, "1", "11", "4", containsWarning(K8S_VERSION_TOO_LOW), noIgnores()}, - {LOG_MSG_TEST, "1", "13", "5", containsInfo(K8S_VERSION_CHECK), noIgnores()}, + {LOG_MSG_TEST, "1", "13", "5", containsWarning(K8S_VERSION_TOO_LOW), noIgnores()}, {LOG_MSG_TEST, "1", "12", "2", containsWarning(K8S_VERSION_TOO_LOW), noIgnores()}, {LOG_MSG_TEST, "1", "14", "8", containsInfo(K8S_VERSION_CHECK), noIgnores()}, {VERSION_TEST, "1", "15", "7", returnsVersion(1, 15), ignoring(K8S_VERSION_CHECK)}, - {LOG_MSG_TEST, "1", "13", "6", containsInfo(K8S_VERSION_CHECK), noIgnores()}, + {VERSION_TEST, "1", "16", "1", returnsVersion(1, 16), ignoring(K8S_VERSION_CHECK)}, + {VERSION_TEST, "1", "17", "2", returnsVersion(1, 17), ignoring(K8S_VERSION_CHECK)}, + {VERSION_TEST, "1", "18", "0", returnsVersion(1, 18), ignoring(K8S_VERSION_CHECK)}, {VERSION_TEST, "2", "7", "", returnsVersion(2, 7), ignoring(K8S_VERSION_CHECK)}, {LOG_MSG_TEST, "2", "", "", containsInfo(K8S_VERSION_CHECK), noIgnores()}, }); diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/VersionHelperTest.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/VersionHelperTest.java deleted file mode 100644 index aa54fadfc08..00000000000 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/VersionHelperTest.java +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. -// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. - -package oracle.kubernetes.operator.helpers; - -import io.kubernetes.client.openapi.models.V1ObjectMeta; -import org.junit.Test; - -import static oracle.kubernetes.operator.LabelConstants.RESOURCE_VERSION_LABEL; -import static oracle.kubernetes.operator.helpers.VersionHelper.matchesResourceVersion; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; - -public class VersionHelperTest { - - private static final String V1 = "v1"; - - private static V1ObjectMeta newObjectMeta() { - return new V1ObjectMeta(); - } - - @Test - public void null_metadata_returns_false() throws Exception { - assertThat(matchesResourceVersion(null, V1), equalTo(false)); - } - - @Test - public void null_labels_returns_false() throws Exception { - assertThat(matchesResourceVersion(newObjectMeta().labels(null), V1), equalTo(false)); - } - - @Test - public void null_version_returns_false() throws Exception { - assertThat( - matchesResourceVersion(newObjectMeta().putLabelsItem(RESOURCE_VERSION_LABEL, null), V1), - equalTo(false)); - } - - @Test - public void different_version_returns_false() throws Exception { - assertThat( - matchesResourceVersion(newObjectMeta().putLabelsItem(RESOURCE_VERSION_LABEL, "v2"), V1), - equalTo(false)); - } - - @Test - public void same_version_returns_true() throws Exception { - assertThat( - matchesResourceVersion(newObjectMeta().putLabelsItem(RESOURCE_VERSION_LABEL, V1), V1), - equalTo(true)); - } -} diff --git a/operator/src/test/java/oracle/kubernetes/operator/http/HttpAsyncRequestStepTest.java b/operator/src/test/java/oracle/kubernetes/operator/http/HttpAsyncRequestStepTest.java index 3a159e6dd5c..92b02d57fc6 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/http/HttpAsyncRequestStepTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/http/HttpAsyncRequestStepTest.java @@ -61,9 +61,9 @@ public class HttpAsyncRequestStepTest extends HttpUserAgentTest { @Before public void setUp() throws NoSuchFieldException { mementos.add(consoleMemento = TestUtils.silenceOperatorLogger() - .collectLogMessages(logRecords, HTTP_METHOD_FAILED, HTTP_REQUEST_TIMED_OUT) - .withLogLevel(Level.FINE) - .ignoringLoggedExceptions(HttpAsyncRequestStep.HttpTimeoutException.class)); + .collectLogMessages(logRecords, HTTP_METHOD_FAILED, HTTP_REQUEST_TIMED_OUT) + .withLogLevel(Level.FINE) + .ignoringLoggedExceptions(HttpAsyncRequestStep.HttpTimeoutException.class)); mementos.add(StaticStubSupport.install(HttpAsyncRequestStep.class, "factory", futureFactory)); requestStep = createStep(); @@ -216,3 +216,4 @@ public void scheduleOnce(long timeout, TimeUnit unit, Runnable runnable) { } } + diff --git a/operator/src/test/java/oracle/kubernetes/operator/http/HttpAsyncTestSupport.java b/operator/src/test/java/oracle/kubernetes/operator/http/HttpAsyncTestSupport.java index 8ac7f036396..00bd23b8ca3 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/http/HttpAsyncTestSupport.java +++ b/operator/src/test/java/oracle/kubernetes/operator/http/HttpAsyncTestSupport.java @@ -45,8 +45,8 @@ HttpResponse getResponse(HttpRequest request) { RequestHandler getHandler(HttpRequest request) { return Optional.ofNullable(cannedResponses.get(request.uri())) - .map(l -> getMatchingRequest(l, request)) - .orElse(NO_SUCH_HANDLER); + .map(l -> getMatchingRequest(l, request)) + .orElse(NO_SUCH_HANDLER); } private RequestHandler getMatchingRequest(List handlers, HttpRequest request) { @@ -85,4 +85,4 @@ private boolean isMatchingRequest(HttpRequest left, HttpRequest right) { public Memento install() throws NoSuchFieldException { return StaticStubSupport.install(HttpAsyncRequestStep.class, "factory", futureFactory); } -} \ No newline at end of file +} diff --git a/operator/src/test/java/oracle/kubernetes/operator/http/HttpAsyncTestSupportTest.java b/operator/src/test/java/oracle/kubernetes/operator/http/HttpAsyncTestSupportTest.java index f0703742eb1..f8aaaca5a88 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/http/HttpAsyncTestSupportTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/http/HttpAsyncTestSupportTest.java @@ -21,7 +21,7 @@ public class HttpAsyncTestSupportTest { @Test public void whenNoDefinedResponse_returnNotFoundResponse() { assertThat(support.getResponse(createGetRequest("http://nowhere")).statusCode(), - equalTo(HttpURLConnection.HTTP_NOT_FOUND)); + equalTo(HttpURLConnection.HTTP_NOT_FOUND)); } private HttpRequest createGetRequest(String urlString) { @@ -71,4 +71,4 @@ public void matchingFuture_markedComplete() { assertThat(support.getFuture(createGetRequest("http://known")).isDone(), is(true)); } -} \ No newline at end of file +} diff --git a/operator/src/test/java/oracle/kubernetes/operator/http/HttpResponseStepImpl.java b/operator/src/test/java/oracle/kubernetes/operator/http/HttpResponseStepImpl.java index 6ca8f1634fb..1bb957a63f8 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/http/HttpResponseStepImpl.java +++ b/operator/src/test/java/oracle/kubernetes/operator/http/HttpResponseStepImpl.java @@ -36,4 +36,4 @@ public NextAction onFailure(Packet packet, HttpResponse response) { failureResponse = response; return doNext(packet); } -} \ No newline at end of file +} diff --git a/operator/src/test/java/oracle/kubernetes/operator/http/HttpResponseStepTest.java b/operator/src/test/java/oracle/kubernetes/operator/http/HttpResponseStepTest.java index cfe00ad8749..abeb794154a 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/http/HttpResponseStepTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/http/HttpResponseStepTest.java @@ -44,15 +44,15 @@ public void constructorSetsNextStep() { @Test public void classHasOnSuccessMethod() throws NoSuchMethodException { assertThat( - HttpResponseStep.class.getDeclaredMethod("onSuccess", Packet.class, HttpResponse.class), - notNullValue()); + HttpResponseStep.class.getDeclaredMethod("onSuccess", Packet.class, HttpResponse.class), + notNullValue()); } @Test public void classHasOnFailureMethod() throws NoSuchMethodException { assertThat( - HttpResponseStep.class.getDeclaredMethod("onFailure", Packet.class, HttpResponse.class), - notNullValue()); + HttpResponseStep.class.getDeclaredMethod("onFailure", Packet.class, HttpResponse.class), + notNullValue()); } @Test @@ -87,4 +87,4 @@ public void whenNoResponseProvided_skipProcessing() { } // todo when response is failure, invoke onFailure -} \ No newline at end of file +} diff --git a/operator/src/test/java/oracle/kubernetes/operator/http/HttpResponseStub.java b/operator/src/test/java/oracle/kubernetes/operator/http/HttpResponseStub.java index 44efea16850..4e59e350372 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/http/HttpResponseStub.java +++ b/operator/src/test/java/oracle/kubernetes/operator/http/HttpResponseStub.java @@ -28,4 +28,4 @@ public int statusCode() { public String body() { return body; } -} \ No newline at end of file +} diff --git a/operator/src/test/java/oracle/kubernetes/operator/logging/LoggingFormatterTest.java b/operator/src/test/java/oracle/kubernetes/operator/logging/LoggingFormatterTest.java new file mode 100644 index 00000000000..ad7767fe1f3 --- /dev/null +++ b/operator/src/test/java/oracle/kubernetes/operator/logging/LoggingFormatterTest.java @@ -0,0 +1,166 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.kubernetes.operator.logging; + +import java.util.Collections; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.LogRecord; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.kubernetes.client.openapi.ApiException; +import oracle.kubernetes.operator.helpers.DomainPresenceInfo; +import oracle.kubernetes.operator.work.FiberTestSupport; +import oracle.kubernetes.operator.work.NextAction; +import oracle.kubernetes.operator.work.Packet; +import oracle.kubernetes.operator.work.Step; +import org.junit.Test; + +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasEntry; +import static org.hamcrest.junit.MatcherAssert.assertThat; + +public class LoggingFormatterTest { + + private final LogRecord logRecord = new LogRecord(Level.INFO, "A simple one"); + private final LoggingFormatter formatter = new LoggingFormatter(); + private final FiberTestSupport testSupport = new FiberTestSupport(); + + @Test + public void formatLogRecordWithParameters() throws JsonProcessingException { + logRecord.setMessage("Insert {0} and {1}"); + logRecord.setParameters(new Object[]{"here", "there"}); + + assertThat(getFormattedMessage().get("message"), equalTo("Insert here and there")); + } + + @SuppressWarnings("unchecked") + private Map getFormattedMessage() throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + return mapper.readValue(formatter.format(logRecord), Map.class); + } + + @Test + public void extractLogLevel() throws JsonProcessingException { + logRecord.setLevel(Level.FINER); + assertThat(getFormattedMessage().get("level"), equalTo("FINER")); + + logRecord.setLevel(Level.WARNING); + assertThat(getFormattedMessage().get("level"), equalTo("WARNING")); + } + + @Test + public void extractSourceIndicators() throws JsonProcessingException { + logRecord.setSourceClassName("theClass"); + logRecord.setSourceMethodName("itsMethod"); + + assertThat(getFormattedMessage().get("class"), equalTo("theClass")); + assertThat(getFormattedMessage().get("method"), equalTo("itsMethod")); + } + + @Test + public void whenThrowableNotApiException_extractItsName() throws JsonProcessingException { + logRecord.setThrown(new RuntimeException("in the test")); + + assertThat(getFormattedMessage().get("exception"), containsString("java.lang.RuntimeException: in the test")); + } + + @Test + public void whenThrowableIsApiException_extractAttributes() throws JsonProcessingException { + logRecord.setThrown(new ApiException(420, Collections.emptyMap(), "a response")); + + assertThat(getFormattedMessage(), allOf(hasEntry("code", "420"), hasEntry("body", "a response"))); + } + + @Test + public void whenPacketLacksDomainPresence_domainUidIsEmpty() { + assertThat(getFormattedMessageInFiber().get("domainUID"), equalTo("")); + } + + @Test + public void whenPacketContainsDomainPresence_retrieveDomainUid() { + testSupport.addDomainPresenceInfo(new DomainPresenceInfo("test-ns", "test-uid")); + + assertThat(getFormattedMessageInFiber().get("domainUID"), equalTo("test-uid")); + } + + + @Test + public void whenNotInFiber_retrieveDomainUidFromThread() throws JsonProcessingException { + try (LoggingContext stack = LoggingContext.setThreadContext().domainUid("test-uid")) { + assertThat(getFormattedMessage().get("domainUID"), equalTo("test-uid")); + } + } + + @Test + public void whenPacketLacksDomainPresence_domainNamespaceIsEmpty() { + assertThat(getFormattedMessageInFiber().get("namespace"), equalTo("")); + } + + @Test + public void whenPacketContainsDomainPresence_retrieveDomainNamespace() { + testSupport.addDomainPresenceInfo(new DomainPresenceInfo("test-ns", "test-uid")); + + assertThat(getFormattedMessageInFiber().get("namespace"), equalTo("test-ns")); + } + + @Test + public void whenPacketContainsDomainPresenceAndLoggingContext_retrieveDomainNamespaceFromDomainPresence() { + testSupport.addDomainPresenceInfo(new DomainPresenceInfo("test-ns", "test-uid")); + testSupport.addLoggingContext(new LoggingContext().namespace("test-lc-ns")); + + assertThat(getFormattedMessageInFiber().get("namespace"), equalTo("test-ns")); + } + + @Test + public void whenPacketContainsLoggingContext_retrieveDomainNamespace() { + testSupport.addLoggingContext(new LoggingContext().namespace("test-lc-ns")); + + assertThat(getFormattedMessageInFiber().get("namespace"), equalTo("test-lc-ns")); + } + + @Test + public void whenPacketContainsLoggingContextAndThreadLocalIsDefined_retrieveNamespaceFromLoggingContext() { + testSupport.addLoggingContext(new LoggingContext().namespace("test-lc-ns1")); + try (LoggingContext stack = LoggingContext.setThreadContext().namespace("test-lc-tl-ns")) { + assertThat(getFormattedMessageInFiber().get("namespace"), equalTo("test-lc-ns1")); + } + } + + @Test + public void whenThreadLocalDefinedAndPacketContainsNoDomainPresenceOrLoggingContext_retrieveNamespaceFromThread() { + try (LoggingContext stack = LoggingContext.setThreadContext().namespace("test-lc-tl-ns1")) { + assertThat(getFormattedMessageInFiber().get("namespace"), equalTo("test-lc-tl-ns1")); + } + } + + @Test + public void whenNotInFiber_retrieveNamespaceFromThread() throws JsonProcessingException { + try (LoggingContext stack = LoggingContext.setThreadContext().namespace("test-lc-tl-ns1")) { + assertThat(getFormattedMessage().get("namespace"), equalTo("test-lc-tl-ns1")); + } + } + + @SuppressWarnings("unchecked") + private Map getFormattedMessageInFiber() { + final Packet packet = testSupport.runSteps(new LoggingStep()); + return (Map) packet.get("MESSAGE"); + } + + class LoggingStep extends Step { + + @Override + public NextAction apply(Packet packet) { + try { + packet.put("MESSAGE", getFormattedMessage()); + return doNext(packet); + } catch (JsonProcessingException e) { + return doTerminate(e, packet); + } + } + } +} diff --git a/operator/src/test/java/oracle/kubernetes/operator/rest/RestBackendImplTest.java b/operator/src/test/java/oracle/kubernetes/operator/rest/RestBackendImplTest.java index f147670b8e0..ba3d09b0d04 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/rest/RestBackendImplTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/rest/RestBackendImplTest.java @@ -6,6 +6,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Optional; +import javax.annotation.Nonnull; import javax.ws.rs.WebApplicationException; import com.meterware.simplestub.Memento; @@ -19,6 +21,8 @@ import oracle.kubernetes.operator.helpers.KubernetesTestSupport; import oracle.kubernetes.operator.rest.RestBackendImpl.TopologyRetriever; import oracle.kubernetes.operator.rest.backend.RestBackend; +import oracle.kubernetes.operator.rest.model.DomainAction; +import oracle.kubernetes.operator.rest.model.DomainActionType; import oracle.kubernetes.operator.utils.WlsDomainConfigSupport; import oracle.kubernetes.operator.wlsconfig.WlsDomainConfig; import oracle.kubernetes.utils.TestUtils; @@ -36,7 +40,9 @@ import static oracle.kubernetes.operator.helpers.KubernetesTestSupport.DOMAIN; import static oracle.kubernetes.operator.helpers.KubernetesTestSupport.SUBJECT_ACCESS_REVIEW; import static oracle.kubernetes.operator.helpers.KubernetesTestSupport.TOKEN_REVIEW; +import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.junit.MatcherAssert.assertThat; @@ -48,15 +54,16 @@ public class RestBackendImplTest { private static final String NS = "namespace1"; private static final String NAME1 = "domain"; private static final String NAME2 = "domain2"; - private WlsDomainConfigSupport configSupport = new WlsDomainConfigSupport(NAME1); + public static final String INITIAL_VERSION = "1"; + private final WlsDomainConfigSupport configSupport = new WlsDomainConfigSupport(NAME1); - private List mementos = new ArrayList<>(); + private final List mementos = new ArrayList<>(); private RestBackend restBackend; - private Domain domain = createDomain(NS, NAME1); - private Domain domain2 = createDomain(NS, NAME2); + private final Domain domain = createDomain(NS, NAME1); + private final Domain domain2 = createDomain(NS, NAME2); private Domain updatedDomain; - private DomainConfigurator configurator = DomainConfiguratorFactory.forDomain(domain); - private KubernetesTestSupport testSupport = new KubernetesTestSupport(); + private final DomainConfigurator configurator = DomainConfiguratorFactory.forDomain(domain); + private final KubernetesTestSupport testSupport = new KubernetesTestSupport(); private WlsDomainConfig config; private static Domain createDomain(String namespace, String name) { @@ -94,16 +101,150 @@ private void allow(V1SubjectAccessReview subjectAccessReview) { subjectAccessReview.setStatus(new V1SubjectAccessReviewStatus().allowed(true)); } - /** - * Tear down test. - */ @After public void tearDown() { - for (Memento memento : mementos) { - memento.revert(); - } + mementos.forEach(Memento::revert); + } + + // functionality needed for Domains resource + + @Test + public void retrieveRegisteredDomainIds() { + assertThat(restBackend.getDomainUids(), containsInAnyOrder(NAME1, NAME2)); + } + + // functionality needed for Domain resource + + @Test + public void validateKnownUid() { + assertThat(restBackend.isDomainUid(NAME2), is(true)); + } + + @Test + public void rejectUnknownUid() { + assertThat(restBackend.isDomainUid("no_such_uid"), is(false)); + } + + @Test(expected = WebApplicationException.class) + public void whenUnknownDomain_throwException() { + restBackend.performDomainAction("no_such_uid", new DomainAction(DomainActionType.INTROSPECT)); + } + + @Test(expected = WebApplicationException.class) + public void whenUnknownDomainUpdateCommand_throwException() { + restBackend.performDomainAction(NAME1, new DomainAction(null)); } + @Test + public void whenIntrospectionRequestedWhileNoIntrospectVersionDefined_setIntrospectVersion() { + restBackend.performDomainAction(NAME1, createIntrospectRequest()); + + assertThat(getUpdatedIntrospectVersion(), equalTo(INITIAL_VERSION)); + } + + private DomainAction createIntrospectRequest() { + return new DomainAction(DomainActionType.INTROSPECT); + } + + private String getUpdatedIntrospectVersion() { + return getOptionalDomain1().map(Domain::getIntrospectVersion).orElse(null); + } + + @Nonnull + private Optional getOptionalDomain1() { + return testSupport.getResources(DOMAIN).stream().filter(this::isDomain1).findFirst(); + } + + private boolean isDomain1(Domain domain) { + return Optional.ofNullable(domain).map(Domain::getMetadata).filter(this::isDomain1Meta).isPresent(); + } + + private boolean isDomain1Meta(V1ObjectMeta meta) { + return meta != null && NS.equals(meta.getNamespace()) && NAME1.equals(meta.getName()); + } + + @Test + public void whenIntrospectionRequestedWhileIntrospectVersionNonNumeric_setNumericVersion() { + configurator.withIntrospectVersion("zork"); + + restBackend.performDomainAction(NAME1, createIntrospectRequest()); + + assertThat(getUpdatedIntrospectVersion(), equalTo(INITIAL_VERSION)); + } + + @Test + public void whenIntrospectionRequestedWhileIntrospectVersionDefined_incrementIntrospectVersion() { + configurator.withIntrospectVersion("17"); + + restBackend.performDomainAction(NAME1, createIntrospectRequest()); + + assertThat(getUpdatedIntrospectVersion(), equalTo("18")); + } + + @Test + public void whenClusterRestartRequestedWhileNoRestartVersionDefined_setRestartVersion() { + restBackend.performDomainAction(NAME1, createDomainRestartRequest()); + + assertThat(getUpdatedRestartVersion(), equalTo(INITIAL_VERSION)); + } + + private DomainAction createDomainRestartRequest() { + return new DomainAction(DomainActionType.RESTART); + } + + private String getUpdatedRestartVersion() { + return getOptionalDomain1().map(Domain::getRestartVersion).orElse(null); + } + + @Test + public void whenRestartRequestedWhileRestartVersionDefined_incrementIntrospectVersion() { + configurator.withRestartVersion("23"); + + restBackend.performDomainAction(NAME1, createDomainRestartRequest()); + + assertThat(getUpdatedRestartVersion(), equalTo("24")); + } + + // functionality needed for clusters resource + + @Test + public void retrieveDefinedClusters() { + configSupport.addWlsCluster("cluster1", "ms1", "ms2", "ms3"); + configSupport.addWlsCluster("cluster2", "ms4", "ms5", "ms6"); + setupScanCache(); + + assertThat(restBackend.getClusters(NAME1), containsInAnyOrder("cluster1", "cluster2")); + } + + // functionality needed for cluster resource + + @Test + public void acceptDefinedClusterName() { + configSupport.addWlsCluster("cluster1", "ms1", "ms2", "ms3"); + configSupport.addWlsCluster("cluster2", "ms4", "ms5", "ms6"); + setupScanCache(); + + assertThat(restBackend.isCluster(NAME1, "cluster1"), is(true)); + } + + @Test + public void rejectUndefinedClusterName() { + configSupport.addWlsCluster("cluster1", "ms1", "ms2", "ms3"); + configSupport.addWlsCluster("cluster2", "ms4", "ms5", "ms6"); + setupScanCache(); + + assertThat(restBackend.isCluster(NAME1, "cluster3"), is(false)); + } + + @Test + public void whenDomainRestartRequestedWhileNoRestartVersionDefined_setRestartVersion() { + restBackend.performDomainAction(NAME1, createDomainRestartRequest()); + + assertThat(getUpdatedRestartVersion(), equalTo(INITIAL_VERSION)); + } + + // functionality used for scale resource + @Test(expected = WebApplicationException.class) public void whenNegativeScaleSpecified_throwException() { restBackend.scaleCluster(NAME1, "cluster1", -1); diff --git a/operator/src/test/java/oracle/kubernetes/operator/steps/ManagedServerUpIteratorStepTest.java b/operator/src/test/java/oracle/kubernetes/operator/steps/ManagedServerUpIteratorStepTest.java new file mode 100644 index 00000000000..04deb857520 --- /dev/null +++ b/operator/src/test/java/oracle/kubernetes/operator/steps/ManagedServerUpIteratorStepTest.java @@ -0,0 +1,255 @@ +// Copyright (c) 2020, Oracle Corporation and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.kubernetes.operator.steps; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import com.meterware.simplestub.Memento; +import com.meterware.simplestub.StaticStubSupport; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import oracle.kubernetes.operator.ProcessingConstants; +import oracle.kubernetes.operator.helpers.DomainPresenceInfo; +import oracle.kubernetes.operator.helpers.DomainPresenceInfo.ServerStartupInfo; +import oracle.kubernetes.operator.steps.ManagedServerUpIteratorStep.StartClusteredServersStep; +import oracle.kubernetes.operator.steps.ManagedServerUpIteratorStep.StartManagedServersStep; +import oracle.kubernetes.operator.utils.WlsDomainConfigSupport; +import oracle.kubernetes.operator.work.FiberTestSupport; +import oracle.kubernetes.operator.work.Step; +import oracle.kubernetes.operator.work.Step.StepAndPacket; +import oracle.kubernetes.operator.work.TerminalStep; +import oracle.kubernetes.utils.TestUtils; +import oracle.kubernetes.weblogic.domain.ClusterConfigurator; +import oracle.kubernetes.weblogic.domain.DomainConfigurator; +import oracle.kubernetes.weblogic.domain.DomainConfiguratorFactory; +import oracle.kubernetes.weblogic.domain.model.Domain; +import oracle.kubernetes.weblogic.domain.model.DomainSpec; +import org.jetbrains.annotations.NotNull; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static oracle.kubernetes.operator.steps.ManagedServerUpIteratorStepTest.TestStepFactory.getServers; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.junit.MatcherAssert.assertThat; + +public class ManagedServerUpIteratorStepTest { + + private static final String DOMAIN = "domain"; + private static final String NS = "namespace"; + private static final String UID = "uid1"; + private static final String ADMIN = "asName"; + private static final String CLUSTER = "cluster1"; + private final Domain domain = createDomain(); + private final DomainConfigurator configurator = DomainConfiguratorFactory.forDomain(domain); + private WlsDomainConfigSupport configSupport = new WlsDomainConfigSupport(DOMAIN); + + private Step nextStep = new TerminalStep(); + private FiberTestSupport testSupport = new FiberTestSupport(); + private List mementos = new ArrayList<>(); + private DomainPresenceInfo domainPresenceInfo = createDomainPresenceInfo(); + private TestUtils.ConsoleHandlerMemento consoleHandlerMemento; + + private DomainPresenceInfo createDomainPresenceInfo() { + return new DomainPresenceInfo(domain); + } + + private Domain createDomain() { + return new Domain().withMetadata(createMetaData()).withSpec(createDomainSpec()); + } + + private V1ObjectMeta createMetaData() { + return new V1ObjectMeta().namespace(NS); + } + + private DomainSpec createDomainSpec() { + return new DomainSpec().withDomainUid(UID).withReplicas(1); + } + + /** + * Setup env for tests. + * @throws NoSuchFieldException if TestStepFactory fails to install + */ + @Before + public void setUp() throws NoSuchFieldException { + mementos.add(consoleHandlerMemento = TestUtils.silenceOperatorLogger()); + mementos.add(TestStepFactory.install()); + testSupport.addDomainPresenceInfo(domainPresenceInfo); + } + + /** + * Cleanup env after tests. + * @throws Exception if test support failed + */ + @After + public void tearDown() throws Exception { + for (Memento memento : mementos) { + memento.revert(); + } + + testSupport.throwOnCompletionFailure(); + } + + @Test + public void withConcurrencyOf1_bothClusteredServersStartSequentially() { + configureCluster(CLUSTER).withMaxConcurrentStartup(1); + addWlsCluster(CLUSTER, "ms1", "ms2"); + + invokeStepWithServerStartupInfos(createServerStartupInfosForCluster(CLUSTER,"ms1", "ms2")); + + assertThat(getServers(), hasItem(Arrays.asList("ms1", "ms2"))); + assertThat(getServers().size(), equalTo(1)); + } + + @Test + public void withConcurrencyOf0_bothClusteredServersStartConcurrently() { + configureCluster(CLUSTER).withMaxConcurrentStartup(0); + addWlsCluster(CLUSTER, "ms1", "ms2"); + + invokeStepWithServerStartupInfos(createServerStartupInfosForCluster(CLUSTER,"ms1", "ms2")); + + assertThat(getServers(), allOf(hasItem("ms1"), hasItem("ms2"))); + } + + @Test + public void withConcurrencyOf2_bothClusteredServersStartConcurrently() { + configureCluster(CLUSTER).withMaxConcurrentStartup(2); + addWlsCluster(CLUSTER, "ms1", "ms2"); + + invokeStepWithServerStartupInfos(createServerStartupInfosForCluster(CLUSTER, "ms1", "ms2")); + + assertThat(getServers(), allOf(hasItem("ms1"), hasItem("ms2"))); + } + + @Test + public void withConcurrencyOf2_4clusteredServersStartIn2Threads() { + configureCluster(CLUSTER).withMaxConcurrentStartup(2); + addWlsCluster(CLUSTER, "ms1", "ms2", "ms3", "ms4"); + + invokeStepWithServerStartupInfos(createServerStartupInfosForCluster(CLUSTER, "ms1", "ms2", "ms3", "ms4")); + + assertThat(getServers(), hasItem(Arrays.asList("ms1", "ms2", "ms3", "ms4"))); + assertThat(getServers().size(), equalTo(2)); + } + + @Test + public void withMultipleClusters_differentClusterStartDifferently() { + final String CLUSTER2 = "cluster2"; + configureCluster(CLUSTER).withMaxConcurrentStartup(1); + configureCluster(CLUSTER2).withMaxConcurrentStartup(0); + + addWlsCluster(CLUSTER, "ms1", "ms2"); + addWlsCluster(CLUSTER2, "ms3", "ms4"); + + Collection serverStartupInfos = createServerStartupInfosForCluster(CLUSTER, "ms1", "ms2"); + serverStartupInfos.addAll(createServerStartupInfosForCluster(CLUSTER2, "ms3", "ms4")); + invokeStepWithServerStartupInfos(serverStartupInfos); + + assertThat(getServers(), hasItem(Arrays.asList("ms1", "ms2"))); + assertThat(getServers(), allOf(hasItem("ms3"), hasItem("ms4"))); + } + + @Test + public void maxClusterConcurrentStartup_doesNotApplyToNonClusteredServers() { + domain.getSpec().setMaxClusterConcurrentStartup(1); + + addWlsServers("ms3", "ms4"); + + invokeStepWithServerStartupInfos(createServerStartupInfos("ms3", "ms4")); + + assertThat(getServers(), allOf(hasItem("ms3"), hasItem("ms4"))); + } + + @NotNull + private Collection createServerStartupInfosForCluster(String clusterName, String... servers) { + Collection serverStartupInfos = new ArrayList<>(); + Arrays.asList(servers).stream().forEach(server -> + serverStartupInfos.add( + new ServerStartupInfo(configSupport.getWlsServer(clusterName, server), + clusterName, + domain.getServer(server, clusterName)) + ) + ); + return serverStartupInfos; + } + + @NotNull + private Collection createServerStartupInfos(String... servers) { + Collection serverStartupInfos = new ArrayList<>(); + Arrays.asList(servers).stream().forEach(server -> + serverStartupInfos.add( + new ServerStartupInfo(configSupport.getWlsServer(server), + null, + domain.getServer(server, null)) + ) + ); + return serverStartupInfos; + } + + private void invokeStepWithServerStartupInfos(Collection startupInfos) { + ManagedServerUpIteratorStep step = new ManagedServerUpIteratorStep(startupInfos, nextStep); + // configSupport.setAdminServerName(ADMIN); + + testSupport.addToPacket( + ProcessingConstants.DOMAIN_TOPOLOGY, configSupport.createDomainConfig()); + testSupport.runSteps(step); + } + + private ClusterConfigurator configureCluster(String clusterName) { + return configurator.configureCluster(clusterName); + } + + private void addWlsServers(String... serverNames) { + Arrays.asList(serverNames).forEach(serverName -> addWlsServer(serverName)); + } + + private void addWlsServer(String serverName) { + configSupport.addWlsServer(serverName); + } + + private void addWlsCluster(String clusterName, String... serverNames) { + configSupport.addWlsCluster(clusterName, serverNames); + } + + static class TestStepFactory implements ManagedServerUpIteratorStep.NextStepFactory { + + private static Step next; + private static TestStepFactory factory = new TestStepFactory(); + + private static Memento install() throws NoSuchFieldException { + return StaticStubSupport.install(ManagedServerUpIteratorStep.class, "NEXT_STEP_FACTORY", factory); + } + + static Collection getServers() { + if (next instanceof StartManagedServersStep) { + return ((StartManagedServersStep)next).getStartDetails() + .stream() + .map(serverToStart -> getServerFromStepAndPacket(serverToStart)).collect(Collectors.toList()); + } + return Collections.emptyList(); + } + + static Object getServerFromStepAndPacket(StepAndPacket startDetail) { + if (startDetail.step instanceof StartClusteredServersStep) { + Collection serversToStart = ((StartClusteredServersStep)startDetail.step).getServersToStart(); + return serversToStart.stream().map(serverToStart -> getServerFromStepAndPacket(serverToStart)) + .collect(Collectors.toList()); + } + return startDetail.packet.get(ProcessingConstants.SERVER_NAME); + } + + @Override + public Step createStatusUpdateStep(Step next) { + TestStepFactory.next = next; + return new TerminalStep(); + } + } + +} diff --git a/operator/src/test/java/oracle/kubernetes/operator/steps/ManagedServersUpStepTest.java b/operator/src/test/java/oracle/kubernetes/operator/steps/ManagedServersUpStepTest.java index 7ca7f2f2e79..30d813b57ee 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/steps/ManagedServersUpStepTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/steps/ManagedServersUpStepTest.java @@ -550,6 +550,19 @@ public void whenClusterStartupDefinedWithPreCreateServerService_allServersDown_a assertThat(getServers(), empty()); } + @Test + public void whenReplicasLessThanMinDynClusterSize_setReplicaCountToMinClusterSize() { + startNoServers(); + setCluster1Replicas(0); + setCluster1AllowReplicasBelowMinDynClusterSize(false); + + addDynamicWlsCluster("cluster1", 2, 5,"ms1", "ms2", "ms3", "ms4", "ms5"); + + invokeStep(); + + assertThat(2, equalTo(domain.getReplicaCount("cluster1"))); + } + @Test public void whenReplicasLessThanMinDynClusterSize_allowBelowMin_doNotChangeReplicaCount() { startNoServers(); @@ -562,6 +575,19 @@ public void whenReplicasLessThanMinDynClusterSize_allowBelowMin_doNotChangeRepli assertThat(0, equalTo(domain.getReplicaCount("cluster1"))); } + @Test + public void whenReplicasMoreThanMinDynClusterSize_doNotChangeReplicaCount() { + startNoServers(); + setCluster1Replicas(3); + setCluster1AllowReplicasBelowMinDynClusterSize(false); + + addDynamicWlsCluster("cluster1", 2, 5,"ms1", "ms2", "ms3", "ms4", "ms5"); + + invokeStep(); + + assertThat(3, equalTo(domain.getReplicaCount("cluster1"))); + } + @Test public void whenDomainToplogyIsMissing_noExceptionAndDontStartServers() { invokeStepWithoutDomainTopology(); @@ -600,6 +626,10 @@ private void setCluster1Replicas(int replicas) { configurator.configureCluster("cluster1").withReplicas(replicas); } + private void setCluster1AllowReplicasBelowMinDynClusterSize(boolean allowReplicasBelowMinDynClusterSize) { + configurator.configureCluster("cluster1").withAllowReplicasBelowDynClusterSize(allowReplicasBelowMinDynClusterSize); + } + private void configureServers(String... serverNames) { for (String serverName : serverNames) { configureServerToStart(serverName); diff --git a/operator/src/test/java/oracle/kubernetes/operator/steps/ReadHealthStepTest.java b/operator/src/test/java/oracle/kubernetes/operator/steps/ReadHealthStepTest.java index 2d142883bb4..83daff33b7f 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/steps/ReadHealthStepTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/steps/ReadHealthStepTest.java @@ -68,7 +68,7 @@ public class ReadHealthStepTest { + "}"; // The log messages to be checked during this test private static final String[] LOG_KEYS = { - WLS_HEALTH_READ_FAILED, WLS_HEALTH_READ_FAILED_NO_HTTPCLIENT + WLS_HEALTH_READ_FAILED, WLS_HEALTH_READ_FAILED_NO_HTTPCLIENT }; private static final String DOMAIN_NAME = "domain"; private static final String ADMIN_NAME = "admin-server"; @@ -88,6 +88,7 @@ public class ReadHealthStepTest { .withDynamicWlsCluster(DYNAMIC_CLUSTER_NAME, DYNAMIC_MANAGED_SERVER1) .withAdminServerName(ADMIN_NAME); private V1Service service = createStub(V1ServiceStub.class); + private V1Service headlessService = createStub(V1HeadlessServiceStub.class); private List logRecords = new ArrayList<>(); private List mementos = new ArrayList<>(); private KubernetesTestSupport testSupport = new KubernetesTestSupport(); @@ -106,9 +107,9 @@ public class ReadHealthStepTest { @Before public void setup() throws NoSuchFieldException { mementos.add(TestUtils.silenceOperatorLogger() - .collectLogMessages(logRecords, LOG_KEYS) - .ignoringLoggedExceptions(CLASSCAST_EXCEPTION) - .withLogLevel(Level.FINE)); + .collectLogMessages(logRecords, LOG_KEYS) + .ignoringLoggedExceptions(CLASSCAST_EXCEPTION) + .withLogLevel(Level.FINE)); mementos.add(testSupport.install()); mementos.add(httpSupport.install()); @@ -126,23 +127,31 @@ private int getRemainingServersToRead(Packet packet) { } private void selectServer(String serverName) { + selectServer(serverName, false); + } + + private void selectServer(String serverName, boolean headless) { testSupport.addToPacket(SERVER_NAME, serverName); - info.setServerService(serverName, service); + if (headless) { + info.setServerService(serverName, headlessService); + } else { + info.setServerService(serverName, service); + } } private void defineSecretData() { testSupport.defineResources( - new V1Secret() - .metadata(new V1ObjectMeta().namespace(NS).name(SECRET_NAME)) - .data(Map.of(ADMIN_SERVER_CREDENTIALS_USERNAME, "user".getBytes(), - ADMIN_SERVER_CREDENTIALS_PASSWORD, "password".getBytes()))); + new V1Secret() + .metadata(new V1ObjectMeta().namespace(NS).name(SECRET_NAME)) + .data(Map.of(ADMIN_SERVER_CREDENTIALS_USERNAME, "user".getBytes(), + ADMIN_SERVER_CREDENTIALS_PASSWORD, "password".getBytes()))); } @After public void tearDown() { mementos.forEach(Memento::revert); } - + @Test public void whenReadAdminServerHealth_decrementRemainingServers() { selectServer(ADMIN_NAME); @@ -154,16 +163,26 @@ public void whenReadAdminServerHealth_decrementRemainingServers() { } private void defineResponse(int status, String body) { - httpSupport.defineResponse(createExpectedRequest(), createStub(HttpResponseStub.class, status, body)); + defineResponse(status, body, null); + } + + private void defineResponse(int status, String body, String url) { + if (url == null) { + httpSupport.defineResponse(createExpectedRequest("127.0.0.1:7001"), createStub(HttpResponseStub.class, + status, body)); + } else { + httpSupport.defineResponse(createExpectedRequest(url), createStub(HttpResponseStub.class, status, body)); + } } - private HttpRequest createExpectedRequest() { + private HttpRequest createExpectedRequest(String url) { return HttpRequest.newBuilder() - .uri(URI.create("https://127.0.0.1:7001/management/weblogic/latest/serverRuntime/search")) - .POST(HttpRequest.BodyPublishers.noBody()) - .build(); + .uri(URI.create("https://" + url + "/management/weblogic/latest/serverRuntime/search")) + .POST(HttpRequest.BodyPublishers.noBody()) + .build(); } + @Test public void whenReadConfiguredManagedServerHealth_decrementRemainingServers() { selectServer(CONFIGURED_MANAGED_SERVER1); @@ -201,6 +220,17 @@ public void whenServerRunning_verifyServerHealth() { assertThat(getServerStateMap(packet).get(MANAGED_SERVER1), is("RUNNING")); } + @Test + public void whenAdminPodIPNull_verifyServerHealth() { + selectServer(ADMIN_NAME, true); + + defineResponse(200, OK_RESPONSE, "admin-server.Test:7001"); + + Packet packet = testSupport.runSteps(readHealthStep); + + assertThat(getServerStateMap(packet).get(ADMIN_NAME), is("RUNNING")); + } + private Map getServerHealthMap(Packet packet) { return packet.getValue(SERVER_HEALTH_MAP); } @@ -218,7 +248,7 @@ public void whenServerOverloaded_verifyServerHealth() { Packet packet = testSupport.runSteps(readHealthStep); assertThat(getServerHealthMap(packet).get(MANAGED_SERVER1).getOverallHealth(), - equalTo(OVERALL_HEALTH_FOR_SERVER_OVERLOADED)); + equalTo(OVERALL_HEALTH_FOR_SERVER_OVERLOADED)); assertThat(getServerStateMap(packet).get(MANAGED_SERVER1), is("UNKNOWN")); } @@ -231,7 +261,7 @@ public void whenUnableToReadHealth_verifyNotAvailable() { Packet packet = testSupport.runSteps(readHealthStep); assertThat(getServerHealthMap(packet).get(MANAGED_SERVER1).getOverallHealth(), - equalTo(OVERALL_HEALTH_NOT_AVAILABLE)); + equalTo(OVERALL_HEALTH_NOT_AVAILABLE)); assertThat(getServerStateMap(packet).get(MANAGED_SERVER1), is("UNKNOWN")); } @@ -245,8 +275,23 @@ public V1ServiceSpec getSpec() { } } + public abstract static class V1HeadlessServiceStub extends V1Service { + + @Override + public V1ObjectMeta getMetadata() { + return new V1ObjectMeta().name(ADMIN_NAME).namespace("Test"); + } + + @Override + public V1ServiceSpec getSpec() { + List ports = new ArrayList<>(); + ports.add(new V1ServicePort().port(7001).name("default")); + return new V1ServiceSpec().clusterIP("None").ports(ports); + } + } + private void configureServiceWithClusterName(String clusterName) { service.setMetadata(new V1ObjectMeta().putLabelsItem(CLUSTERNAME_LABEL, clusterName)); } -} \ No newline at end of file +} diff --git a/operator/src/test/java/oracle/kubernetes/operator/utils/InMemoryFileSystem.java b/operator/src/test/java/oracle/kubernetes/operator/utils/InMemoryFileSystem.java index 5ffcec6474f..26a44376e47 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/utils/InMemoryFileSystem.java +++ b/operator/src/test/java/oracle/kubernetes/operator/utils/InMemoryFileSystem.java @@ -4,6 +4,7 @@ package oracle.kubernetes.operator.utils; import java.io.FileNotFoundException; +import java.net.URI; import java.nio.ByteBuffer; import java.nio.channels.SeekableByteChannel; import java.nio.file.DirectoryStream; @@ -27,7 +28,7 @@ public abstract class InMemoryFileSystem extends FileSystem { private static InMemoryFileSystem instance; - private FileSystemProviderStub provider = createStrictStub(FileSystemProviderStub.class); + private final FileSystemProviderStub provider = createStrictStub(FileSystemProviderStub.class); public static InMemoryFileSystem createInstance() { return instance = createStrictStub(InMemoryFileSystem.class); @@ -38,10 +39,15 @@ public void defineFile(String filePath, String contents) { } @Nonnull - public Path getPath(String first, String... more) { + public Path getPath(@Nonnull String first, @Nonnull String... more) { return createStrictStub(PathStub.class, createPathString(first, more)); } + @Nonnull + public Path getPath(@Nonnull URI uri) { + return createStrictStub(PathStub.class, createPathString(uri.getPath(), new String[0])); + } + private String createPathString(String first, String[] more) { return more.length == 0 ? first : first + "/" + String.join("/", more); } @@ -67,8 +73,7 @@ boolean isDirectory() { boolean isRegularFile() { return true; } - }, - NONE; + }; boolean isDirectory() { return false; @@ -80,14 +85,14 @@ boolean isRegularFile() { } abstract static class PathStub implements Path { - private String filePath; + private final String filePath; PathStub(String filePath) { this.filePath = filePath; } @Override - public FileSystem getFileSystem() { + @Nonnull public FileSystem getFileSystem() { return instance; } @@ -103,7 +108,7 @@ public String toString() { } abstract static class FileSystemProviderStub extends FileSystemProvider { - private Map fileContents = new HashMap<>(); + private final Map fileContents = new HashMap<>(); static String getFilePath(Path path) { if (!(path instanceof PathStub)) { @@ -140,10 +145,10 @@ public SeekableByteChannel newByteChannel( } private BasicFileAttributes createAttributes(String filePath) { - return createStrictStub(BasicFileAttributesStub.class, isDirectory(filePath)); + return createStrictStub(BasicFileAttributesStub.class, getPathType(filePath)); } - private PathType isDirectory(String filePath) { + private PathType getPathType(String filePath) { for (String key : fileContents.keySet()) { if (key.startsWith(filePath + '/')) { return PathType.DIRECTORY; @@ -152,12 +157,12 @@ private PathType isDirectory(String filePath) { return PathType.FILE; } } - return PathType.NONE; + return PathType.DIRECTORY; // treat it as an empty directory } } abstract static class BasicFileAttributesStub implements BasicFileAttributes { - private PathType pathType; + private final PathType pathType; BasicFileAttributesStub(PathType pathType) { this.pathType = pathType; @@ -203,7 +208,7 @@ public void close() { } abstract static class SeekableByteChannelStub implements SeekableByteChannel { - private byte[] contents; + private final byte[] contents; private int index = 0; SeekableByteChannelStub(String contents) { diff --git a/operator/src/main/java/oracle/kubernetes/operator/utils/WlsDomainConfigSupport.java b/operator/src/test/java/oracle/kubernetes/operator/utils/WlsDomainConfigSupport.java similarity index 100% rename from operator/src/main/java/oracle/kubernetes/operator/utils/WlsDomainConfigSupport.java rename to operator/src/test/java/oracle/kubernetes/operator/utils/WlsDomainConfigSupport.java diff --git a/operator/src/test/java/oracle/kubernetes/operator/work/FiberTestSupport.java b/operator/src/test/java/oracle/kubernetes/operator/work/FiberTestSupport.java index c1956436633..db7a58034fe 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/work/FiberTestSupport.java +++ b/operator/src/test/java/oracle/kubernetes/operator/work/FiberTestSupport.java @@ -4,9 +4,7 @@ package oracle.kubernetes.operator.work; import java.util.ArrayDeque; -import java.util.ArrayList; import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Optional; @@ -16,15 +14,18 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import javax.annotation.Nonnull; import javax.annotation.Nullable; import oracle.kubernetes.operator.calls.RetryStrategy; import oracle.kubernetes.operator.helpers.DomainPresenceInfo; +import oracle.kubernetes.operator.logging.LoggingContext; import static com.meterware.simplestub.Stub.createStrictStub; import static com.meterware.simplestub.Stub.createStub; import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_COMPONENT_NAME; +import static oracle.kubernetes.operator.logging.LoggingContext.LOGGING_CONTEXT_KEY; /** * Support for writing unit tests that use a fiber to run steps. Such tests can call #runStep to @@ -38,12 +39,13 @@ */ @SuppressWarnings("UnusedReturnValue") public class FiberTestSupport { - private static Container container = new Container(); - private CompletionCallbackStub completionCallback = new CompletionCallbackStub(); - private ScheduledExecutorStub schedule = ScheduledExecutorStub.create(); - private Engine engine = new Engine(schedule); + private static final Container container = new Container(); + private final CompletionCallbackStub completionCallback = new CompletionCallbackStub(); + private final ScheduledExecutorStub schedule = ScheduledExecutorStub.create(); + private final Engine engine = new Engine(schedule); + private final Packet packet = new Packet(); + private Fiber fiber = engine.createFiber(); - private Packet packet = new Packet(); /** Creates a single-threaded FiberGate instance. */ public FiberGate createFiberGate() { @@ -60,6 +62,17 @@ public void schedule(Runnable runnable) { schedule.execute(runnable); } + /** + * Schedules a runnable to run at some time in the future. See {@link #schedule(Runnable)}. + * + * @param command a runnable to be executed by the scheduler. + * @param delay the number of time units in the future to run. + * @param unit the time unit used for the above parameters + */ + public ScheduledFuture schedule(@Nonnull Runnable command, long delay, @Nonnull TimeUnit unit) { + return schedule.schedule(command, delay, unit); + } + /** * Schedules a runnable to run immediately and at fixed intervals afterwards. See {@link * #schedule(Runnable)}. @@ -123,6 +136,11 @@ public FiberTestSupport addDomainPresenceInfo(DomainPresenceInfo info) { return this; } + public FiberTestSupport addLoggingContext(LoggingContext loggingContext) { + packet.getComponents().put(LOGGING_CONTEXT_KEY, Component.createFor(loggingContext)); + return this; + } + public FiberTestSupport addRetryStrategy(RetryStrategy retryStrategy) { packet.getComponents().put("retry", Component.createFor(RetryStrategy.class, retryStrategy)); return this; @@ -226,8 +244,8 @@ abstract static class ScheduledExecutorStub implements ScheduledExecutorService /* current time in milliseconds. */ private long currentTime = 0; - private SortedSet scheduledItems = new TreeSet<>(); - private Queue queue = new ArrayDeque<>(); + private final SortedSet scheduledItems = new TreeSet<>(); + private final Queue queue = new ArrayDeque<>(); private Runnable current; public static ScheduledExecutorStub create() { @@ -289,21 +307,19 @@ void setTime(long time, TimeUnit unit) { "Attempt to move clock backwards from " + currentTime + " to " + newTime); } - List rescheduledItems = new ArrayList<>(); - for (Iterator it = scheduledItems.iterator(); it.hasNext(); ) { - ScheduledItem item = it.next(); - if (item.atTime > newTime) { - break; - } - it.remove(); - Optional.ofNullable(item.rescheduled()).ifPresent(rescheduledItems::add); - execute(item.runnable); - } - scheduledItems.addAll(rescheduledItems); + List itemsToRun = getItemsToRunByMsec(newTime); + scheduledItems.removeAll(itemsToRun); + itemsToRun.forEach(item -> execute(item.runnable)); + itemsToRun.stream().filter(ScheduledItem::isReschedulable).forEach(scheduledItems::add); currentTime = newTime; } + @Nonnull + private List getItemsToRunByMsec(long newTime) { + return scheduledItems.stream().filter(item -> item.shouldRunBy(newTime)).collect(Collectors.toList()); + } + /** * Returns true if a runnable item has been scheduled for the specified time. * @@ -321,14 +337,24 @@ boolean containsItemAt(int time, TimeUnit unit) { } private static class ScheduledItem implements Comparable { - private long atTime; - private Runnable runnable; + private final long atTime; + private final Runnable runnable; ScheduledItem(long atTime, Runnable runnable) { this.atTime = atTime; this.runnable = runnable; } + // Return true if the item should be rescheduled after it is run. + private boolean isReschedulable() { + return rescheduled() != null; + } + + // Return true if the item is intended to run at or before the specified time in msec. + private boolean shouldRunBy(long newTime) { + return atTime <= newTime; + } + @Override public int compareTo(@Nonnull ScheduledItem o) { return Long.compare(atTime, o.atTime); diff --git a/operator/src/test/java/oracle/kubernetes/operator/work/InMemoryDatabaseTest.java b/operator/src/test/java/oracle/kubernetes/operator/work/InMemoryDatabaseTest.java index 68c84e9ab97..fd5e3131597 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/work/InMemoryDatabaseTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/work/InMemoryDatabaseTest.java @@ -8,8 +8,8 @@ import java.util.List; import java.util.Map; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1Ingress; -import io.kubernetes.client.openapi.models.ExtensionsV1beta1IngressList; +import io.kubernetes.client.openapi.models.NetworkingV1beta1Ingress; +import io.kubernetes.client.openapi.models.NetworkingV1beta1IngressList; import io.kubernetes.client.openapi.models.V1ObjectMeta; import org.junit.Test; @@ -25,11 +25,11 @@ public class InMemoryDatabaseTest { private static final String NAME1 = "name1"; private static final String NAME2 = "name2"; - private InMemoryDatabase database = - new InMemoryDatabase() { + private InMemoryDatabase database = + new InMemoryDatabase() { @Override - ExtensionsV1beta1IngressList createList(List items) { - return new ExtensionsV1beta1IngressList().items(items); + NetworkingV1beta1IngressList createList(List items) { + return new NetworkingV1beta1IngressList().items(items); } }; @@ -49,7 +49,7 @@ public void whenItemPresent_createThrowsException() throws Exception { try { database.create( - new ExtensionsV1beta1Ingress().metadata(new V1ObjectMeta().namespace(NS1).name(NAME1)), + new NetworkingV1beta1Ingress().metadata(new V1ObjectMeta().namespace(NS1).name(NAME1)), keys().namespace(NS1).map()); fail("Should have thrown an InMemoryDatabaseException"); } catch (InMemoryDatabaseException e) { @@ -57,16 +57,16 @@ public void whenItemPresent_createThrowsException() throws Exception { } } - private ExtensionsV1beta1Ingress createItem(String name, String namespace) { - ExtensionsV1beta1Ingress item = - new ExtensionsV1beta1Ingress().metadata(new V1ObjectMeta().namespace(namespace).name(name)); + private NetworkingV1beta1Ingress createItem(String name, String namespace) { + NetworkingV1beta1Ingress item = + new NetworkingV1beta1Ingress().metadata(new V1ObjectMeta().namespace(namespace).name(name)); database.create(item, keys().namespace(namespace).map()); return item; } @Test public void afterItemCreated_canRetrieveIt() throws Exception { - ExtensionsV1beta1Ingress item = createItem(NAME1, NS1); + NetworkingV1beta1Ingress item = createItem(NAME1, NS1); assertThat(database.read(keys().name(NAME1).namespace(NS1).map()), equalTo(item)); } @@ -75,7 +75,7 @@ public void afterItemCreated_canRetrieveIt() throws Exception { public void whenItemAbsent_replaceThrowsException() throws Exception { try { database.replace( - new ExtensionsV1beta1Ingress().metadata(new V1ObjectMeta().namespace(NS1).name(NAME1)), + new NetworkingV1beta1Ingress().metadata(new V1ObjectMeta().namespace(NS1).name(NAME1)), keys().namespace(NS1).map()); fail("Should have thrown an InMemoryDatabaseException"); } catch (InMemoryDatabaseException e) { @@ -87,8 +87,8 @@ public void whenItemAbsent_replaceThrowsException() throws Exception { public void afterReplaceItem_canRetrieveNewItem() throws Exception { createItem(NAME1, NS1).kind("old item"); - ExtensionsV1beta1Ingress replacement = - new ExtensionsV1beta1Ingress() + NetworkingV1beta1Ingress replacement = + new NetworkingV1beta1Ingress() .metadata(new V1ObjectMeta().namespace(NS1).name(NAME1)) .kind("new item"); database.replace(replacement, keys().namespace(NS1).map()); @@ -116,9 +116,9 @@ public void whenItemToDeletedAbsent_throwException() throws Exception { @Test public void afterItemsCreated_canListMatches() throws Exception { - ExtensionsV1beta1Ingress item1 = createItem(NAME1, NS1); - ExtensionsV1beta1Ingress item2 = createItem(NAME2, NS1); - ExtensionsV1beta1Ingress item3 = createItem(NAME1, NS2); + NetworkingV1beta1Ingress item1 = createItem(NAME1, NS1); + NetworkingV1beta1Ingress item2 = createItem(NAME2, NS1); + NetworkingV1beta1Ingress item3 = createItem(NAME1, NS2); assertThat( database.list(keys().namespace(NS1).map()).getItems(), containsInAnyOrder(item1, item2)); diff --git a/operator/src/test/java/oracle/kubernetes/weblogic/domain/DomainTestBase.java b/operator/src/test/java/oracle/kubernetes/weblogic/domain/DomainTestBase.java index 55f92f6de1f..22775fd4a51 100644 --- a/operator/src/test/java/oracle/kubernetes/weblogic/domain/DomainTestBase.java +++ b/operator/src/test/java/oracle/kubernetes/weblogic/domain/DomainTestBase.java @@ -22,6 +22,7 @@ import static oracle.kubernetes.operator.KubernetesConstants.ALWAYS_IMAGEPULLPOLICY; import static oracle.kubernetes.operator.KubernetesConstants.DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE; import static oracle.kubernetes.operator.KubernetesConstants.DEFAULT_IMAGE; +import static oracle.kubernetes.operator.KubernetesConstants.DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP; import static oracle.kubernetes.operator.KubernetesConstants.IFNOTPRESENT_IMAGEPULLPOLICY; import static oracle.kubernetes.operator.KubernetesConstants.LATEST_IMAGE_SUFFIX; import static org.hamcrest.Matchers.both; @@ -319,20 +320,86 @@ public void afterMaxUnavailableSetForCluster_canReadIt() { assertThat(domain.getMaxUnavailable("cluster1"), equalTo(5)); } + @Test + public void afterAllowReplicasBelowMinDynamicClusterSizeSetForCluster_canReadIt() { + configureCluster("cluster1").withAllowReplicasBelowDynClusterSize(false); + + assertThat(domain.isAllowReplicasBelowMinDynClusterSize("cluster1"), equalTo(false)); + } + @Test public void whenNotSpecified_allowReplicasBelowMinDynamicClusterSizeHasDefault() { configureCluster("cluster1"); + configureDomain(domain).withAllowReplicasBelowMinDynClusterSize(null); assertThat(domain.isAllowReplicasBelowMinDynClusterSize("cluster1"), equalTo(DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE)); } + @Test + public void whenNotSpecified_allowReplicasBelowMinDynamicClusterSizeFromDomain() { + configureCluster("cluster1"); + configureDomain(domain).withAllowReplicasBelowMinDynClusterSize(false); + + assertThat(domain.isAllowReplicasBelowMinDynClusterSize("cluster1"), + equalTo(false)); + } + @Test public void whenNoClusterSpec_allowReplicasBelowMinDynamicClusterSizeHasDefault() { assertThat(domain.isAllowReplicasBelowMinDynClusterSize("cluster-with-no-spec"), equalTo(DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE)); } + @Test + public void whenBothClusterAndDomainSpecified_allowReplicasBelowMinDynamicClusterSizeFromCluster() { + configureCluster("cluster1").withAllowReplicasBelowDynClusterSize(false); + configureDomain(domain).withAllowReplicasBelowMinDynClusterSize(true); + + assertThat(domain.isAllowReplicasBelowMinDynClusterSize("cluster1"), + equalTo(false)); + } + + @Test + public void afterMaxConcurrentStartupSetForCluster_canReadIt() { + configureCluster("cluster1").withMaxConcurrentStartup(3); + + assertThat(domain.getMaxConcurrentStartup("cluster1"), equalTo(3)); + } + + @Test + public void whenNotSpecified_maxConcurrentStartupHasDefault() { + configureCluster("cluster1"); + configureDomain(domain).withMaxConcurrentStartup(null); + + assertThat(domain.getMaxConcurrentStartup("cluster1"), + equalTo(DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP)); + } + + @Test + public void whenNotSpecified_maxConcurrentStartupFromDomain() { + configureCluster("cluster1"); + configureDomain(domain).withMaxConcurrentStartup(2); + + assertThat(domain.getMaxConcurrentStartup("cluster1"), + equalTo(2)); + } + + @Test + public void whenNoClusterSpec_maxConcurrentStartupHasDefault() { + assertThat(domain.getMaxConcurrentStartup("cluster-with-no-spec"), + equalTo(DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP)); + } + + @Test + public void whenBothClusterAndDomainSpecified_maxConcurrentStartupFromCluster() { + configureCluster("cluster1").withMaxConcurrentStartup(1); + configureDomain(domain).withMaxConcurrentStartup(0); + + assertThat(domain.getMaxConcurrentStartup("cluster1"), + equalTo(1)); + } + @Test public void whenBothClusterAndServerStateSpecified_managedServerUsesServerState() { configureServer(SERVER1).withDesiredState("STAND-BY"); diff --git a/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainSpecTest.java b/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainSpecTest.java index 3b936c5ff53..8bab0d4f929 100644 --- a/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainSpecTest.java +++ b/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainSpecTest.java @@ -58,10 +58,52 @@ public void whenEffectiveImageWithLatestImage_imageNotEquals() { spec1.getImage(), not(equalTo(spec2.getImage()))); } + @Test + public void verifyThatDomainSpecWithoutAllowMinDynClusterSize_equalsToDomainSpecWithDefaultValue() { + DomainSpec spec1 = new DomainSpec(); + DomainSpec spec2 = new DomainSpec(); + spec2.setAllowReplicasBelowMinDynClusterSize(KubernetesConstants.DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE); + assertThat("Expected null allowReplicasBelowMinDynClusterSize equal to explicit set to " + + KubernetesConstants.DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE, + spec1.equals(spec2), equalTo(true)); + } + + @Test + public void verifyThatDomainSpecWithoutAllowMinDynClusterSize_notEqualsToDomainSpecWithFalse() { + DomainSpec spec1 = new DomainSpec(); + DomainSpec spec2 = new DomainSpec(); + spec2.setAllowReplicasBelowMinDynClusterSize( + !KubernetesConstants.DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE); + assertThat("Expected null allowReplicasBelowMinDynClusterSize not equal to explicit set to " + + !KubernetesConstants.DEFAULT_ALLOW_REPLICAS_BELOW_MIN_DYN_CLUSTER_SIZE, + spec1.equals(spec2), equalTo(false)); + } + + @Test + public void verifyThatDomainSpecWithoutMaxClusterConcurrentStartup_equalsToDomainSpecWithDefaultValue() { + DomainSpec spec1 = new DomainSpec(); + DomainSpec spec2 = new DomainSpec(); + spec2.setMaxClusterConcurrentStartup(KubernetesConstants.DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP); + assertThat("Expected null maxClusterConcurrentStartup equal to explicit set to " + + KubernetesConstants.DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP, + spec1.equals(spec2), equalTo(true)); + } + + @Test + public void verifyThatDomainSpecWithoutMaxClusterConcurrentStartup_notEqualsToDomainSpecWithFalse() { + DomainSpec spec1 = new DomainSpec(); + DomainSpec spec2 = new DomainSpec(); + spec2.setMaxClusterConcurrentStartup(KubernetesConstants.DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP + + 1); + assertThat("Expected null maxClusterConcurrentStartup not equal to explicit set to " + + (KubernetesConstants.DEFAULT_MAX_CLUSTER_CONCURRENT_START_UP + 1), + spec1.equals(spec2), equalTo(false)); + } + private String getLatestDefaultImage() { String defaultImageName = KubernetesConstants.DEFAULT_IMAGE .substring(0, KubernetesConstants.DEFAULT_IMAGE.indexOf(':')); String latestImage = defaultImageName + KubernetesConstants.LATEST_IMAGE_SUFFIX; return latestImage; } -} \ No newline at end of file +} diff --git a/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainStatusTest.java b/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainStatusTest.java index 0a152138889..6ba96289502 100644 --- a/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainStatusTest.java +++ b/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainStatusTest.java @@ -330,7 +330,7 @@ public void whenSetServerIncludesServerWithoutStateAndHasExistingState_preserveI new ServerStatus().withClusterName("1").withServerName("1").withState("state1"), new ServerStatus().withClusterName("1").withServerName("2").withState("state1"), new ServerStatus().withClusterName("1").withServerName("3") - )); + )); assertThat(getServer("1", "3").getState(), equalTo("state1")); } diff --git a/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainV2Test.java b/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainV2Test.java index ea8254a6cc3..f71ef3bd8ad 100644 --- a/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainV2Test.java +++ b/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainV2Test.java @@ -20,12 +20,14 @@ import io.kubernetes.client.openapi.models.V1Volume; import io.kubernetes.client.openapi.models.V1VolumeMount; import oracle.kubernetes.operator.DomainSourceType; +import oracle.kubernetes.operator.OverrideDistributionStrategy; import oracle.kubernetes.weblogic.domain.DomainConfigurator; import oracle.kubernetes.weblogic.domain.DomainTestBase; import org.hamcrest.Matcher; import org.junit.Before; import org.junit.Test; +import static oracle.kubernetes.operator.DomainSourceType.FromModel; import static oracle.kubernetes.operator.KubernetesConstants.DEFAULT_IMAGE; import static oracle.kubernetes.operator.KubernetesConstants.IFNOTPRESENT_IMAGEPULLPOLICY; import static oracle.kubernetes.weblogic.domain.ChannelMatcher.channelWith; @@ -41,7 +43,7 @@ import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.junit.MatcherAssert.assertThat; public class DomainV2Test extends DomainTestBase { @@ -718,14 +720,14 @@ public void whenDomainReadFromYaml_unconfiguredServerHasDomainDefaults() throws public void whenDomainReadFromYamlWithNoSetting_defaultsToDomainHomeInImage() throws IOException { Domain domain = readDomain(DOMAIN_V2_SAMPLE_YAML); - assertThat(domain.getDomainHomeSourceType(), is(DomainSourceType.Image.toString())); + assertThat(domain.getDomainHomeSourceType(), equalTo(DomainSourceType.Image)); } @Test public void whenDomainReadFromYaml_domainHomeInImageIsDisabled() throws IOException { Domain domain = readDomain(DOMAIN_V2_SAMPLE_YAML_2); - assertThat(domain.getDomainHomeSourceType(), is(DomainSourceType.PersistentVolume.toString())); + assertThat(domain.getDomainHomeSourceType(), equalTo(DomainSourceType.PersistentVolume)); } @Test @@ -953,6 +955,37 @@ public void whenDomain2ReadFromYaml_ManagedServerInheritContainerSecurityContext assertThat(server2ContainerSecCtx.getRunAsUser(), nullValue()); } + @Test + public void whenDomain2ReadFromYamlTwice_objectsEquals() + throws IOException { + Domain domain1 = readDomain(DOMAIN_V2_SAMPLE_YAML_2); + Domain domain2 = readDomain(DOMAIN_V2_SAMPLE_YAML_2); + + assertThat(domain1, equalTo(domain2)); + } + + @Test + public void whenDomain2ReadFromYamlTwice_matchingIntrospectionVersionValuesLeaveDomainsEqual() + throws IOException { + Domain domain1 = readDomain(DOMAIN_V2_SAMPLE_YAML_2); + Domain domain2 = readDomain(DOMAIN_V2_SAMPLE_YAML_2); + + domain1.getSpec().setIntrospectVersion("123"); + domain2.getSpec().setIntrospectVersion("123"); + assertThat(domain1, equalTo(domain2)); + } + + @Test + public void whenDomain2ReadFromYamlTwice_differentIntrospectionVersionValuesLeaveDomainsUnequal() + throws IOException { + Domain domain1 = readDomain(DOMAIN_V2_SAMPLE_YAML_2); + Domain domain2 = readDomain(DOMAIN_V2_SAMPLE_YAML_2); + + domain1.getSpec().setIntrospectVersion("123"); + domain2.getSpec().setIntrospectVersion("124"); + assertThat(domain1, not(equalTo(domain2))); + } + @Test public void whenDomain2ReadFromYaml_ManagedServerInheritContainerSecurityContextFromCluster() throws IOException { @@ -1438,6 +1471,13 @@ public void whenLogHomeEnabledSet_useValue() { assertThat(domain.getSpec().isLogHomeEnabled(), is(true)); } + @Test + public void domainHomeTest_standardHome1() { + configureDomain(domain).withDomainHomeSourceType(FromModel); + + assertThat(domain.getDomainHome(), equalTo("/u01/domains/uid1")); + } + @Test public void domainHomeTest_standardHome2() { configureDomain(domain).withDomainHomeInImage(false); @@ -1563,4 +1603,25 @@ private V1Volume volume(String name, String path) { private V1VolumeMount volumeMount(String name, String path) { return new V1VolumeMount().name(name).mountPath(path); } + + @Test + public void whenNoDistributionStrategySpecified_defaultToDynamic() throws IOException { + Domain domain = readDomain(DOMAIN_V2_SAMPLE_YAML_2); + + assertThat(domain.getOverrideDistributionStrategy(), equalTo(OverrideDistributionStrategy.DYNAMIC)); + } + + @Test + public void whenDistributionStrategySpecified_readIt() throws IOException { + Domain domain = readDomain(DOMAIN_V2_SAMPLE_YAML_4); + + assertThat(domain.getOverrideDistributionStrategy(), equalTo(OverrideDistributionStrategy.ON_RESTART)); + } + + @Test + public void whenDistributionStrategyConfigured_returnIt() { + configureDomain(domain).withConfigOverrideDistributionStrategy(OverrideDistributionStrategy.ON_RESTART); + + assertThat(domain.getOverrideDistributionStrategy(), equalTo(OverrideDistributionStrategy.ON_RESTART)); + } } diff --git a/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainValidationTest.java b/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainValidationTest.java index 84982c92473..aa6c360bf7c 100644 --- a/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainValidationTest.java +++ b/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainValidationTest.java @@ -21,6 +21,8 @@ import static oracle.kubernetes.operator.DomainProcessorTestSetup.NS; import static oracle.kubernetes.operator.DomainProcessorTestSetup.UID; import static oracle.kubernetes.operator.DomainProcessorTestSetup.createTestDomain; +import static oracle.kubernetes.operator.DomainSourceType.FromModel; +import static oracle.kubernetes.operator.DomainSourceType.Image; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.stringContainsInOrder; @@ -263,18 +265,208 @@ public void whenConfigOverrideSecretExists_dontReportError() { @Test public void whenConfigOverrideCmExistsTypeImage_dontReportError() { resourceLookup.defineResource("overrides-cm-image", KubernetesResourceType.ConfigMap, NS); - configureDomain(domain).withConfigOverrides("overrides-cm-image").withDomainHomeInImage(true); + configureDomain(domain).withConfigOverrides("overrides-cm-image").withDomainHomeSourceType(Image); + + assertThat(domain.getValidationFailures(resourceLookup), empty()); + } + + @Test + public void whenConfigOverrideCmExistsTypeFromModel_reportError() { + resourceLookup.defineResource("overrides-cm-model", KubernetesResourceType.ConfigMap, NS); + resourceLookup.defineResource("wdt-cm-secret", KubernetesResourceType.Secret, NS); + configureDomain(domain).withConfigOverrides("overrides-cm-model") + .withRuntimeEncryptionSecret("wdt-cm-secret") + .withDomainHomeSourceType(FromModel); + + assertThat(domain.getValidationFailures(resourceLookup), + contains(stringContainsInOrder("Configuration overridesConfigMap", + "overrides-cm", "not supported", "FromModel"))); + } + + @Test + public void whenWdtConfigMapExists_fromModel_dontReportError() { + resourceLookup.defineResource("wdt-cm", KubernetesResourceType.ConfigMap, NS); + resourceLookup.defineResource("wdt-cm-secret-model1", KubernetesResourceType.Secret, NS); + configureDomain(domain) + .withRuntimeEncryptionSecret("wdt-cm-secret-model1") + .withModelConfigMap("wdt-cm") + .withDomainHomeSourceType(FromModel); + + assertThat(domain.getValidationFailures(resourceLookup), empty()); + } + + @Test + public void whenWdtConfigMapSpecifiedButDoesNotExist_fromModel_reportError() { + resourceLookup.defineResource("wdt-cm-secret-model2", KubernetesResourceType.Secret, NS); + configureDomain(domain).withRuntimeEncryptionSecret("wdt-cm-secret-model2") + .withModelConfigMap("wdt-configmap") + .withDomainHomeSourceType(FromModel); + + assertThat(domain.getValidationFailures(resourceLookup), + contains(stringContainsInOrder("ConfigMap", "wdt-configmap", "spec.configuration.model.configMap", + "not found", NS))); + } + + @Test + public void whenWdtConfigMapSpecifiedButDoesNotExist_Image_dontReportError() { + configureDomain(domain).withDomainHomeSourceType(Image) + .withModelConfigMap("wdt-configmap"); + + assertThat(domain.getValidationFailures(resourceLookup), empty()); + } + + @Test + public void whenRuntimeEncryptionSecretSpecifiedButDoesNotExist_Image_dontReportError() { + configureDomain(domain).withDomainHomeSourceType(Image) + .withRuntimeEncryptionSecret("runtime-secret"); assertThat(domain.getValidationFailures(resourceLookup), empty()); } @Test public void whenRuntimeEncryptionSecretUnspecified_Image_dontReportError() { - configureDomain(domain).withDomainHomeInImage(true); + configureDomain(domain).withDomainHomeSourceType(Image); + + assertThat(domain.getValidationFailures(resourceLookup), empty()); + } + + @Test + public void whenRuntimeEncryptionSecretSpecifiedButDoesNotExist_fromModel_reportError() { + configureDomain(domain).withDomainHomeSourceType(FromModel) + .withRuntimeEncryptionSecret("runtime-secret"); + + assertThat(domain.getValidationFailures(resourceLookup), + contains(stringContainsInOrder("RuntimeEncryption", "runtime-secret", "not found", NS))); + } + + @Test + public void whenRuntimeEncryptionSecretExists_fromModel_dontReportError() { + configureDomain(domain).withDomainHomeSourceType(FromModel) + .withRuntimeEncryptionSecret("runtime-good-secret"); + resourceLookup.defineResource("runtime-good-secret", KubernetesResourceType.Secret, NS); + + assertThat(domain.getValidationFailures(resourceLookup), empty()); + } + + @Test + public void whenRuntimeEncryptionSecretUnspecified_fromModel_reportError() { + configureDomain(domain).withDomainHomeSourceType(FromModel); + + assertThat(domain.getValidationFailures(resourceLookup), + contains(stringContainsInOrder("spec.configuration.model.runtimeEncryptionSecret", + "must be specified", "FromModel"))); + } + + @Test + public void whenWalletPasswordSecretSpecifiedButDoesNotExist_fromModel_reportError() { + configureDomain(domain).withDomainHomeSourceType(FromModel) + .withRuntimeEncryptionSecret("runtime-encryption-secret-good") + .withOpssWalletPasswordSecret("wallet-password-secret-missing"); + + resourceLookup.defineResource("runtime-encryption-secret-good", KubernetesResourceType.Secret, NS); + + assertThat(domain.getValidationFailures(resourceLookup), + contains(stringContainsInOrder("secret", "wallet-password-secret-missing", "not found", NS))); + } + + @Test + public void whenWalletFileSecretSpecifiedButDoesNotExist_Image_reportError() { + configureDomain(domain).withDomainHomeSourceType(FromModel) + .withRuntimeEncryptionSecret("runtime-encryption-secret-good") + .withOpssWalletFileSecret("wallet-file-secret-missing"); + + resourceLookup.defineResource("runtime-encryption-secret-good", KubernetesResourceType.Secret, NS); + + assertThat(domain.getValidationFailures(resourceLookup), + contains(stringContainsInOrder("secret", + "wallet-file-secret-missing", "not found", NS))); + } + + @Test + public void whenWalletPasswordSecretExists_fromModel_dontReportError() { + configureDomain(domain).withDomainHomeSourceType(FromModel) + .withRuntimeEncryptionSecret("runtime-encryption-secret-good") + .withOpssWalletPasswordSecret("wallet-password-secret-good"); + resourceLookup.defineResource("runtime-encryption-secret-good", KubernetesResourceType.Secret, NS); + resourceLookup.defineResource("wallet-password-secret-good", KubernetesResourceType.Secret, NS); + + assertThat(domain.getValidationFailures(resourceLookup), empty()); + } + + @Test + public void whenWalletFileSecretExists_fromModel_dontReportError() { + configureDomain(domain).withDomainHomeSourceType(FromModel) + .withRuntimeEncryptionSecret("runtime-encryption-secret-good") + .withOpssWalletFileSecret("wallet-file-secret-good"); + resourceLookup.defineResource("runtime-encryption-secret-good", KubernetesResourceType.Secret, NS); + resourceLookup.defineResource("wallet-file-secret-good", KubernetesResourceType.Secret, NS); + + assertThat(domain.getValidationFailures(resourceLookup), empty()); + } + + @Test + public void whenWalletPasswordSecretUnspecified_fromModel_jrf_reportError() { + configureDomain(domain).withDomainHomeSourceType(FromModel) + .withRuntimeEncryptionSecret("runtime-encryption-secret-good") + .withDomainType("JRF"); + resourceLookup.defineResource("runtime-encryption-secret-good", KubernetesResourceType.Secret, NS); + + assertThat(domain.getValidationFailures(resourceLookup), + contains(stringContainsInOrder("spec.configuration.opss.walletPasswordSecret", + "must be specified", "FromModel", "JRF"))); + } + + @Test + public void whenWalletFileSecretUnspecified_fromModel_jrf_dontReportError() { + configureDomain(domain).withDomainHomeSourceType(FromModel) + .withDomainType("JRF") + .withRuntimeEncryptionSecret("runtime-encryption-secret-good") + .withOpssWalletPasswordSecret("wallet-password-secret-good"); + + resourceLookup.defineResource("runtime-encryption-secret-good", KubernetesResourceType.Secret, NS); + resourceLookup.defineResource("wallet-password-secret-good", KubernetesResourceType.Secret, NS); + + assertThat(domain.getValidationFailures(resourceLookup), empty()); + } + + @Test + public void whenWalletPasswordSecretUnspecified_Image_dontReportError() { + configureDomain(domain).withDomainHomeSourceType(Image) + .withOpssWalletFileSecret("wallet-file-secret"); + + resourceLookup.defineResource("wallet-file-secret", KubernetesResourceType.Secret, NS); assertThat(domain.getValidationFailures(resourceLookup), empty()); } + @Test + public void whenWalletPasswordSecretUnspecified_fromModel_wls_dontReportError() { + configureDomain(domain).withDomainHomeSourceType(Image) + .withRuntimeEncryptionSecret("runtime-encryption-secret-good") + .withDomainType("WLS") + .withOpssWalletFileSecret("wallet-file-secret"); + + resourceLookup.defineResource("runtime-encryption-secret-good", KubernetesResourceType.Secret, NS); + resourceLookup.defineResource("wallet-file-secret", KubernetesResourceType.Secret, NS); + + assertThat(domain.getValidationFailures(resourceLookup), empty()); + } + + @Test + public void whenExposingDefaultChannelIfIstio_Enabled() { + configureDomain(domain) + .withDomainHomeSourceType(Image) + .withIstio() + .withDomainType("WLS") + .configureAdminServer() + .configureAdminService() + .withChannel("default"); + + assertThat(domain.getValidationFailures(resourceLookup), contains(stringContainsInOrder( + "Istio is enabled and the domain resource specified to expose channel", + "default"))); + } + private DomainConfigurator configureDomain(Domain domain) { return new DomainCommonConfigurator(domain); } diff --git a/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample-2.yaml b/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample-2.yaml index 18ee379f14e..4ec8c2ae565 100644 --- a/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample-2.yaml +++ b/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample-2.yaml @@ -21,7 +21,7 @@ spec: # to be started to get to the cluster's replica count.. serverStartPolicy: NEVER - domainHomeInImage: false + domainHomeSourceType: PersistentVolume includeServerOutInPodLog: false # Specifies the number of replicas for any clusters which do not specify their own count: diff --git a/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample-4.yaml b/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample-4.yaml index 961696d6a2e..e75d5f8d4c5 100644 --- a/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample-4.yaml +++ b/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample-4.yaml @@ -52,11 +52,15 @@ spec: shutdownType: Graceful timeoutSeconds: 45 - # configured wls configuration overrides configmap name - configOverrides: overrides-config-map + configuration: + # configured wls configuration overrides configmap name + overridesConfigMap: overrides-config-map - # configured wls configuration overrides secret names - configOverrideSecrets: [overrides-secret-1, overrides-secret-2] + # configured wls configuration overrides secret names + secrets: [overrides-secret-1, overrides-secret-2] + + # strategy for handling changes to configuration overrides + overrideDistributionStrategy: ON_RESTART # Restart version restartVersion: "1" diff --git a/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample-5.yaml b/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample-5.yaml index 638b7b753b3..9c6405ecf0b 100644 --- a/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample-5.yaml +++ b/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample-5.yaml @@ -49,11 +49,12 @@ spec: values: - another-node-label-value - # configured wls configuration overrides configmap name - configOverrides: overrides-config-map + configuration: + # configured wls configuration overrides configmap name + overridesConfigMap: overrides-config-map - # configured wls configuration overrides secret names - configOverrideSecrets: [overrides-secret-1, overrides-secret-2] + # configured wls configuration overrides secret names + secrets: [overrides-secret-1, overrides-secret-2] # Restart version restartVersion: "1" diff --git a/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample.yaml b/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample.yaml index e41bb49d0c0..d4b0f57fddc 100644 --- a/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample.yaml +++ b/operator/src/test/resources/oracle/kubernetes/weblogic/domain/model/domain-sample.yaml @@ -41,11 +41,12 @@ spec: memory: "128Mi" cpu: "500m" - # configured wls configuration overrides configmap name - configOverrides: overrides-config-map + configuration: + # configured wls configuration overrides configmap name + overridesConfigMap: overrides-config-map - # configured wls configuration overrides secret names - configOverrideSecrets: [overrides-secret-1, overrides-secret-2] + # configured wls configuration overrides secret names + secrets: [overrides-secret-1, overrides-secret-2] # Restart version restartVersion: "1" diff --git a/pom.xml b/pom.xml index d22433a9025..7338e47423c 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ oracle.kubernetes operator-parent - 2.6.0 + 3.0.0 operator @@ -25,7 +25,7 @@ scm:git:git@github.com:oracle/weblogic-kubernetes-operator.git https://github.com/oracle/weblogic-kubernetes-operator - v2.6.0 + v2.5.0 Oracle WebLogic Server Kubernetes Operator @@ -284,6 +284,11 @@ maven-pmd-plugin + + org.apache.maven.plugins + maven-checkstyle-plugin + + com.github.spotbugs spotbugs-maven-plugin @@ -309,11 +314,6 @@ - - - org.apache.maven.plugins - maven-checkstyle-plugin - @@ -463,11 +463,6 @@ client-java-extended ${client-java-version} - - org.slf4j - slf4j-api - 1.7.30 - org.hamcrest hamcrest-junit @@ -511,8 +506,8 @@ org.glassfish - javax.json - 1.1.4 + jakarta.json + 1.1.6 org.glassfish.jersey.core @@ -616,15 +611,10 @@ mbknor-jackson-jsonschema_2.12 1.0.38 - - joda-time - joda-time - ${jodatime-version} - org.apache.commons commons-lang3 - 3.8.1 + 3.10 org.apache.commons @@ -706,8 +696,7 @@ 1.6.0 3.1.12.2 3.1.12 - 1.6.0 - 2.10.5 + 1.6.2 1.0.0 3.15.0 2.6 @@ -718,9 +707,9 @@ 1.6.0 1.3.2 UTF-8 - 2.30.1 - 2.10.3 - 2.10.3 + 2.31 + 2.11.1 + 2.11.1 1.26 ${project.basedir}/src-generated-swagger ${root-generated-swagger}/main/java diff --git a/src/integration-tests/bash/cleanup.sh b/src/integration-tests/bash/cleanup.sh index 0a136b2ee21..5148d1dd3f1 100755 --- a/src/integration-tests/bash/cleanup.sh +++ b/src/integration-tests/bash/cleanup.sh @@ -462,8 +462,8 @@ function deleteByTypeAndLabel { # for no more than 60 seconds total. # # -forceDelete: Try delete objects using "--force=true" and -# "--grace-period=0" for no more than 60 seconds total. -# Note that this is incompatible with "FAST_DELETE" so +# "--grace-period=0" for no more than 60 seconds total. +# Note that this is incompatible with "FAST_DELETE" so # FAST_DELETE is overridden in this path. # function genericDelete { @@ -758,5 +758,5 @@ if [ ! "$LEASE_ID" = "" ] && [ ! "$SUCCESS" = "0" ]; then rm -f /tmp/release_lease.out fi -echo @@ `timestamp` Info: Exiting after $SECONDS seconds with status $SUCCESS -exit $SUCCESS \ No newline at end of file +echo @@ `timestamp` Info: Exiting after $SECONDS seconds with status $SUCCESS +exit $SUCCESS diff --git a/src/integration-tests/bash/decrypt_model.sh b/src/integration-tests/bash/decrypt_model.sh new file mode 100755 index 00000000000..49cc19e4630 --- /dev/null +++ b/src/integration-tests/bash/decrypt_model.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# This script is to be run inside a model in image pod that has JDK, WebLogic and WDT in it. +# +# Encrypt WDT model (Full encryption) +# +# parameter: +# 1 - action (encrypt| decrypt) +# 2 - input file +# 3 - password +# 4 - output file +# + +function encrypt_decrypt_model() { + trace "Entering encrypt_decrypt_model" + + local ORACLE_SERVER_DIR=${ORACLE_HOME}/wlserver + local WDT_OUTPUT=/tmp/output.log + local WDT_BINDIR=/u01/wdt/weblogic-deploy/bin + local JAVA_PROPS="${JAVA_PROPS} -Dpython.cachedir.skip=true" + local JAVA_PROPS="-Dpython.path=${ORACLE_SERVER_DIR}/common/wlst/modules/jython-modules.jar/Lib ${JAVA_PROPS}" + local JAVA_PROPS="-Dpython.console= ${JAVA_PROPS} -Dpython.verbose=debug" + local CP="${ORACLE_SERVER_DIR}/server/lib/weblogic.jar:/u01/wdt/weblogic-deploy/lib/weblogic-deploy-core.jar:/tmpmount/code.jar" + ${JAVA_HOME}/bin/java -cp ${CP} \ + ${JAVA_PROPS} org.python.util.jython /tmp/encryption_util.py $1 $(cat $2) $3 $4 > ${WDT_OUTPUT} 2>&1 + rc=$? + if [ $rc -ne 0 ]; then + trace SEVERE "encrypt_decrypt_model failure " + trace SEVERE "$(cat ${WDT_OUTPUT})" + exit 1 + fi + + trace "Exiting encrypt_decrypt_model" +} + +function trace() { + echo $* +} + +encrypt_decrypt_model $* diff --git a/src/integration-tests/bash/encryption_util.py b/src/integration-tests/bash/encryption_util.py new file mode 100644 index 00000000000..018a2e7c75d --- /dev/null +++ b/src/integration-tests/bash/encryption_util.py @@ -0,0 +1,57 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# ------------ +# Description: +# ------------ +# +# This code uses WDT encryption utility class EncryptionUtils +# for encrypting and decryption the domain secret SerializedSystemIni.dat +# +# This script is invoked by jython. See modelInImage.sh encrypt_decrypt_domain_secret +# It's the user responsibility to save off the original file if needed +# + +from oracle.weblogic.deploy.encrypt import EncryptionUtils +from java.lang import String +import sys, os, traceback +from java.lang import System + +def decrypt_file(cipher_text, password, outputfile): + try: + pwd = String(password) + x = EncryptionUtils.decryptString(cipher_text, pwd.toCharArray()); + restored_text = String(x) + fh = open(outputfile, "w") + fh.write(str(restored_text)) + fh.close() + System.exit(0) + except: + exc_type, exc_obj, exc_tb = sys.exc_info() + eeString = traceback.format_exception(exc_type, exc_obj, exc_tb) + print eeString + System.exit(-1) + +def encrypt_file(clear_text, password, outputfile): + try: + pwd = String(password) + x = EncryptionUtils.encryptString(clear_text, pwd.toCharArray()); + encrypted_text = String(x) + fh = open(outputfile, "w") + fh.write(str(encrypted_text)) + fh.close() + System.exit(0) + except: + exc_type, exc_obj, exc_tb = sys.exc_info() + eeString = traceback.format_exception(exc_type, exc_obj, exc_tb) + print eeString + System.exit(-1) + +if __name__ == "__main__": + if sys.argv[1] == 'encrypt': + encrypt_file(sys.argv[2], sys.argv[3], sys.argv[4]) + else: + if sys.argv[1] == 'decrypt': + decrypt_file(sys.argv[2], sys.argv[3], sys.argv[4]) + + diff --git a/src/integration-tests/bash/show_merged_model.sh b/src/integration-tests/bash/show_merged_model.sh new file mode 100755 index 00000000000..641d3a9004e --- /dev/null +++ b/src/integration-tests/bash/show_merged_model.sh @@ -0,0 +1,105 @@ +#!/bin/bash +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# This script show the model in image merged model of the running domain in clear text +# +DOMAIN_NAMESPACE=sample-domain1-ns +DOMAIN_UID=sample-domain1 +PASSWORD=my_runtime_password +IMAGE=model-in-image:JRF-v1 +IMAGEPULLPOLICY=IfNotPresent +IMAGEPULLSECRETSTAG='' +IMGPS='' +IMGPSN='' + +usage_exit() { +cat << EOF + + Usage: $(basename $0) ...options... + + Show the encrypted merged model json file for model in image + + Parameters: + + -i imagename - Image, default is "$IMAGE". + -l imagepullpolicy - Image pull policy, default is "$IMAGEPULLPOLICY". + -n namespace - Namespace, default is "$NAMESPACE". + -p password - Password, default is "$PASSWORD". + -d domain uid - Domain UID, default is "${DOMAIN_UID}" + + You can specify -f, -m, and -s more than once. + + Sample usage: + + $(basename $0) -i model-in-image:v1 -n sample-domain1-ns -p weblogic -d domain1 + +EOF + + exit 1 +} + +while getopts i:n:p:l:s:d:h OPT +do + case $OPT in + i) IMAGE=$OPTARG + ;; + l) IMAGEPULLPOLICY=$OPTARG + ;; + s) IMAGEPULLSECRETS=$OPTARG + + IMGPS="imagePullSecrets:" + IMGPSN=" -name ${IMAGEPULLSECRETS}" + ;; + p) PASSWORD=$OPTARG + ;; + n) DOMAIN_NAMESPACE=$OPTARG + ;; + d) DOMAIN_UID=$OPTARG + ;; + h) usage_exit + ;; + *) usage_exit + ;; + esac +done +shift $(($OPTIND - 1)) +[ ! -z "$1" ] && usage_exit + + +cat > decrypt_model.yaml < encrypted_model.json +kubectl cp encrypted_model.json ${DOMAIN_NAMESPACE}/decryptmodel:/tmp +kubectl cp decrypt_model.sh ${DOMAIN_NAMESPACE}/decryptmodel:/tmp +kubectl cp encryption_util.py ${DOMAIN_NAMESPACE}/decryptmodel:/tmp +kubectl -n ${DOMAIN_NAMESPACE} exec decryptmodel -- bash -c "/tmp/decrypt_model.sh decrypt /tmp/encrypted_model.json ${PASSWORD} /tmp/decrypted_model.json && cat /tmp/decrypted_model.json" +kubectl -n ${DOMAIN_NAMESPACE} delete -f decrypt_model.yaml + diff --git a/src/integration-tests/introspector/README b/src/integration-tests/introspector/README index 0a499019d36..7f0c85ca0cc 100755 --- a/src/integration-tests/introspector/README +++ b/src/integration-tests/introspector/README @@ -19,7 +19,11 @@ Usage: One way to do this when running locally is to run the integration tests. (Note that this test doesn't depend on Operator image as of 2018/10/16, but may in the future.) (2) Optionally specify values for input env vars (see introspectTest.sh for the list). -(3) Run introspectTest.sh +(3) For a non Model In Image domain type. + Run introspectTest.sh + For a Model In Image domain type. + export DOMAIN_SOURCE_TYPE=FromModel + Run introspectTest.sh ------------------- Internal Test Flow: ------------------- diff --git a/src/integration-tests/introspector/checkBeans.py b/src/integration-tests/introspector/checkBeans.py index b7407549646..c2ace52590f 100644 --- a/src/integration-tests/introspector/checkBeans.py +++ b/src/integration-tests/introspector/checkBeans.py @@ -95,6 +95,7 @@ def checkNAPInDomainConfig(path): """ Check to see if there is a network access points defined in the domainConfig tree Avoid getting cd exception by navigating the tree using ls() + :param path: :return: domainConfig nap path, true if the test path is istio network access points """ diff --git a/src/integration-tests/introspector/checkBeansIstio.inputt b/src/integration-tests/introspector/checkBeansIstio.inputt index 6149ce45b57..dae4c6d7bbe 100644 --- a/src/integration-tests/introspector/checkBeansIstio.inputt +++ b/src/integration-tests/introspector/checkBeansIstio.inputt @@ -56,4 +56,4 @@ /ServerTemplates/mycluster-template/NetworkAccessPoints/http-default,ListenAddress,127.0.0.1,127.0.0.1 /ServerTemplates/mycluster-template/NetworkAccessPoints/http-default,PublicAddress,domain1-managed-server${id},domain1-managed-server${id} -/ServerTemplates/mycluster-template/NetworkAccessPoints/http-default,Protocol,http,http \ No newline at end of file +/ServerTemplates/mycluster-template/NetworkAccessPoints/http-default,Protocol,http,http diff --git a/src/integration-tests/introspector/checkMIIBeans.inputt b/src/integration-tests/introspector/checkMIIBeans.inputt new file mode 100644 index 00000000000..d741ac49851 --- /dev/null +++ b/src/integration-tests/introspector/checkMIIBeans.inputt @@ -0,0 +1,30 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +/Log/base_domain,FileName,logs/base_domain.log,/shared/logs/base_domain.log + +/Servers/${ADMIN_NAME},ListenAddress,,${DOMAIN_UID}-${ADMIN_NAME} + +/Servers/${ADMIN_NAME}/Log/${ADMIN_NAME},FileName,logs/${ADMIN_NAME}.log,/shared/logs/${ADMIN_NAME}.log + +/Servers/${ADMIN_NAME}/NetworkAccessPoints/T3Channel1,ListenAddress,${DOMAIN_UID}-${ADMIN_NAME},${DOMAIN_UID}-${ADMIN_NAME} +/Servers/${ADMIN_NAME}/NetworkAccessPoints/T3Channel2,ListenAddress,${DOMAIN_UID}-${ADMIN_NAME},${DOMAIN_UID}-${ADMIN_NAME} +/Servers/${ADMIN_NAME}/NetworkAccessPoints/T3Channel3,ListenAddress,,${DOMAIN_UID}-${ADMIN_NAME} + +/Servers/${ADMIN_NAME}/NetworkAccessPoints/T3Channel1,PublicAddress,${TEST_HOST},${TEST_HOST} +/Servers/${ADMIN_NAME}/NetworkAccessPoints/T3Channel2,PublicAddress,${TEST_HOST},${TEST_HOST} +/Servers/${ADMIN_NAME}/NetworkAccessPoints/T3Channel3,PublicAddress,${TEST_HOST},${TEST_HOST} + +/Servers/${ADMIN_NAME}/NetworkAccessPoints/T3Channel1,PublicPort,40012,40012 +/Servers/${ADMIN_NAME}/NetworkAccessPoints/T3Channel2,PublicPort,40013,40013 +/Servers/${ADMIN_NAME}/NetworkAccessPoints/T3Channel3,PublicPort,40014,40014 + +/Servers/${ADMIN_NAME},MaxMessageSize,78787878,78787878 +/Servers/standalone1,MaxMessageSize,1111111,1111111 +/Servers/standalone2,MaxMessageSize,2222222,2222222 + +/ServerTemplates/mycluster-template/Log/mycluster-template,FileName,logs/mycluster-template.log,/shared/logs/managed-server${id}.log +/ServerTemplates/mycluster-template,ListenAddress,None,domain1-managed-server${id} +# Note that a customer/admin should never override a port, they must stay fixed +/ServerTemplates/mycluster-template,ListenPort,8001,8001 + diff --git a/src/integration-tests/introspector/introspectTest.sh b/src/integration-tests/introspector/introspectTest.sh index 0500f5728d9..ce947b675da 100755 --- a/src/integration-tests/introspector/introspectTest.sh +++ b/src/integration-tests/introspector/introspectTest.sh @@ -27,11 +27,17 @@ # calls in the implementation below for the complete list. # # Usage: +# For non Model In Image test # # introspectTest.sh # +# For Model In Image test +# +# export DOMAIN_SOURCE_TYPE=FromModel +# introspectTest.sh +# # To check for ISTIO -# export ISTIO_ENABELD=true +# export ISTIO_ENABELD=true - this only test for Non Model in Image # ############################################################################# # @@ -110,6 +116,17 @@ export EXPECT_INVALID_DOMAIN=${EXPECT_INVALID_DOMAIN:-false} DOMAIN_SOURCE_TYPE=${DOMAIN_SOURCE_TYPE:-PersistentVolume} export DOMAIN_SOURCE_TYPE=${DOMAIN_SOURCE_TYPE} +WDT_DOMAIN_TYPE=${WDT_DOMAIN_TYPE:-WLS} +export WDT_DOMAIN_TYPE +if [ "${DOMAIN_SOURCE_TYPE}" == "FromModel" ] ; then + # Make sure the configmap and secrets are not optional + export MII_WDT_CONFIGMAP="false" + export MII_WDT_ENCRYPT_SECRET="false" +else + # Make sure the configmap and secrets are optional + export MII_WDT_CONFIGMAP="true" + export MII_WDT_ENCRYPT_SECRET="true" +fi ############################################################################# # @@ -223,7 +240,6 @@ createConfigMapFromDir() { kubectl -n $NAMESPACE label cm ${cm_name} \ weblogic.createdByOperator=true \ weblogic.operatorName=look-ma-no-hands \ - weblogic.resourceVersion=domain-v2 \ weblogic.domainUID=$DOMAIN_UID \ 2>&1 | tracePipe "Info: kubectl output: " || exit 1 } @@ -251,13 +267,13 @@ function toDNS1123Legal { # function deployDomainConfigMap() { - trace "Info: Deploying 'weblogic-domain-cm'." + trace "Info: Deploying 'weblogic-script-cm'." - kubectl -n $NAMESPACE delete cm weblogic-domain-cm \ + kubectl -n $NAMESPACE delete cm weblogic-script-cm \ --ignore-not-found \ 2>&1 | tracePipe "Info: kubectl output: " - createConfigMapFromDir weblogic-domain-cm ${SOURCEPATH}/operator/src/main/resources/scripts + createConfigMapFromDir weblogic-script-cm ${SOURCEPATH}/operator/src/main/resources/scripts } ############################################################################# @@ -317,6 +333,11 @@ function deployCustomOverridesConfigMap() { ${SCRIPTPATH}/util_subst.sh -g ${filname} ${cmdir}/${bfilname} || exit 1 done + # We don't use overrides for MII + if [ ${DOMAIN_SOURCE_TYPE} == "FromModel" ] ; then + rm ${cmdir}/jdbc* ${cmdir}/diagnostics* ${cmdir}/config* + fi + kubectl -n $NAMESPACE delete cm $cmname \ --ignore-not-found \ 2>&1 | tracePipe "Info: kubectl output: " @@ -412,6 +433,70 @@ function deployCreateDomainJobPod() { waitForPod $pod_name } +# +# Create the model in image docker image +# +function createMII_Image() { + trace "Info: Create MII Image" + + ( + mkdir -p ${test_home}/mii/workdir/models || exit 1 + cp ${SCRIPTPATH}/mii/models/* ${test_home}/mii/workdir/models || exit 1 + cd ${test_home}/mii/workdir || exit 1 + echo "place holder" > dummy.txt || exit 1 + zip ${test_home}/mii/workdir/models/archive.zip dummy.txt > /dev/null 2>&1 || exit 1 + + export WORKDIR=${test_home}/mii/workdir || exit 1 + export MODEL_IMAGE_TAG=it || exit 1 + export MODEL_IMAGE_NAME=model-in-image || exit 1 + export MODEL_IMAGE_BUILD="when-missing" + + docker rmi ${MODEL_IMAGE_NAME}:${MODEL_IMAGE_TAG} --force > /dev/null 2>&1 + + tracen "Info: Downloading WDT and WIT" + printdots_start + ${SCRIPTPATH}/util_download_mii_tools.sh > ${test_home}/miibuild_download.out 2>&1 + local rc=$? + printdots_end + if [ $rc -ne 0 ] ; then + trace "Error: createMII_Image: download tools failed" + cat ${test_home}/miibuild_download.out + exit 1 + fi + + tracen "Info: Launching WIT to build the image" + printdots_start + + ${SCRIPTPATH}/util_build_mii_image.sh > ${test_home}/miibuild_image.out 2>&1 + local rc=$? + printdots_end + + if [ $rc -ne 0 ] ; then + trace "Error: createMII_Image: build image failed" + cat ${test_home}/miibuild_image.out + exit 1 + fi + ) || exit 1 + + export WEBLOGIC_IMAGE_NAME=model-in-image || exit 1 + export WEBLOGIC_IMAGE_TAG=it || exit 1 + + kubectl -n $NAMESPACE delete configmap ${DOMAIN_UID}-wdt-config-map --ignore-not-found || exit 1 + kubectl -n $NAMESPACE create configmap ${DOMAIN_UID}-wdt-config-map \ + --from-file=${SCRIPTPATH}/mii/wdtconfigmap | tracePipe "Info: kubectl output: " + + kubectl -n $NAMESPACE label configmap ${DOMAIN_UID}-wdt-config-map weblogic.domainUID=$DOMAIN_UID \ + 2>&1 | tracePipe "Info: kubectl output: " || exit 1 + + kubectl -n $NAMESPACE delete secret ${DOMAIN_UID}-runtime-encryption-secret --ignore-not-found || exit 1 + kubectl -n $NAMESPACE create secret generic ${DOMAIN_UID}-runtime-encryption-secret \ + --from-literal=password=welcome1 | tracePipe "Info: kubectl output: " + + kubectl -n $NAMESPACE label secret ${DOMAIN_UID}-runtime-encryption-secret weblogic.domainUID=$DOMAIN_UID \ + 2>&1 | tracePipe "Info: kubectl output: " || exit 1 + +} + ############################################################################# # # Run introspection "JobPod", parse its output to files, and put files in a cm @@ -600,7 +685,7 @@ function deploySinglePodService() { ############################################################################# # -# Check if automatic overrides and custom overrides took effect on the admin pod +# Check if automatic overrides and custom overrides took effect on the admin pod for non MII # function checkOverrides() { @@ -613,6 +698,9 @@ function checkOverrides() { linecount="`kubectl -n ${NAMESPACE} logs ${DOMAIN_UID}-${ADMIN_NAME} | awk '/.*Starting WebLogic server with command/ { buf = "" } { buf = buf "\n" $0 } END { print buf }' | grep -ci 'BEA.*situational'`" logstatus=0 local target_linecount=5 + if [ ${DOMAIN_SOURCE_TYPE} == "FromModel" ] ; then + target_linecount=1 + fi if [ "$linecount" != "${target_linecount}" ]; then trace "Error: The latest boot in 'kubectl -n ${NAMESPACE} logs ${DOMAIN_UID}-${ADMIN_NAME}' does not contain exactly 5 lines that match ' grep 'BEA.*situational' ', this probably means that it's reporting situational config problems." logstatus=1 @@ -625,7 +713,9 @@ function checkOverrides() { trace "Info: Checking beans to see if sit-cfg took effect. Input file '$test_home/checkBeans.input', output file '$test_home/checkBeans.out'." local src_input_file=checkBeans.inputt - if [ "${ISTIO_ENABLED}" == "true" ]; then + if [ ${DOMAIN_SOURCE_TYPE} == "FromModel" ] ; then + src_input_file=checkMIIBeans.inputt + elif [ "${ISTIO_ENABLED}" == "true" ]; then src_input_file=checkBeansIstio.inputt fi @@ -780,7 +870,7 @@ function checkFileStores() { function checkNodeManagerMemArg() { - trace "Verifying node manager memory arguments" + trace "Info: Verifying node manager memory arguments" # Verify that default NODEMGR_MEM_ARGS environment value (-Xms64m -Xmx100m) was applied to the Node Manager # command line when NODEMGR_MEM_ARGS was not defined. @@ -853,7 +943,7 @@ function checkNodeManagerMemArg() { # function checkManagedServer1MemArg() { - trace "Verifying managed server memory arguments" + trace "Info: Verifying managed server memory arguments" # Verify that USER_MEM_ARGS environment value was applied to the Managed Server 1 command line maxRamlinecount="`kubectl exec -it -n ${NAMESPACE} ${DOMAIN_UID}-${MANAGED_SERVER_NAME_BASE?}1 \ @@ -894,7 +984,7 @@ function checkManagedServer1MemArg() { function checkNodeManagerJavaOptions() { - trace "Verifying node manager java options" + trace "Info: Verifying node manager java options" # Verify that NODEMGR_JAVA_OPTIONS environment value was applied to the Node Manager command line nodeMgrlinecount="`kubectl exec -it -n ${NAMESPACE} ${DOMAIN_UID}-${MANAGED_SERVER_NAME_BASE?}1 \ @@ -959,7 +1049,11 @@ if [ ! "$RERUN_INTROSPECT_ONLY" = "true" ]; then createTestRootPVDir deployMySQL deployWebLogic_PV_PVC_and_Secret - deployCreateDomainJobPod + if [ "${DOMAIN_SOURCE_TYPE}" == "FromModel" ] ; then + createMII_Image + else + deployCreateDomainJobPod + fi fi deployIntrospectJobPod diff --git a/src/integration-tests/introspector/mii/models/domain1.yaml b/src/integration-tests/introspector/mii/models/domain1.yaml new file mode 100644 index 00000000000..7d13efb12f6 --- /dev/null +++ b/src/integration-tests/introspector/mii/models/domain1.yaml @@ -0,0 +1,108 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +domainInfo: + AdminUserName: '@@SECRET:__weblogic-credentials__:username@@' + AdminPassword: '@@SECRET:__weblogic-credentials__:password@@' + ServerStartMode: 'prod' +topology: + Name: base_domain + AdminServerName: 'admin-server' + ProductionModeEnabled: true + Cluster: + mycluster: + DynamicServers: + ServerNamePrefix: 'managed-server' + MaxDynamicClusterSize: 2 + CalculatedListenPorts: false + ServerTemplate: 'mycluster-template' + DynamicClusterSize: 2 + Server: + 'admin-server': + AdministrationPortEnabled: true + AdministrationPort: 7099 + MaxMessageSize: 999999 + NetworkAccessPoint: + T3Channel1: + PublicPort: 22222 + ListenPort: 30012 + ListenAddress: '@@PROP:T3CHANNEL1_LISTEN_ADDR@@' + PublicAddress: '@@PROP:T3CHANNEL1_PUBLIC_LISTEN_ADDR@@' + T3Channel2: + PublicPort: 22222 + ListenPort: 30013 + ListenAddress: '@@PROP:T3CHANNEL2_LISTEN_ADDR@@' + PublicAddress: '@@PROP:T3CHANNEL2_PUBLIC_LISTEN_ADDR@@' + T3Channel3: + ListenPort: 30014 + SSL: + Enabled: true + standalone1: + ListenPort: 6123 + MaxMessageSize: 7777777 + standalone2: + ListenPort: 6124 + ServerTemplate: + 'mycluster-template': + ListenPort: 8001 + Cluster: mycluster + SSL: + ListenPort: 8100 + 'mycluster-template-dummy1': + ListenPort: 8001 + SSL: + ListenPort: 8100 + 'mycluster-template-dummy2': + ListenPort: 8001 + SSL: + ListenPort: 8100 +resources: + JDBCSystemResource: + testDS: + Target: 'admin-server' + JdbcResource: + JDBCConnectionPoolParams: + InitialCapacity: 0 + CapacityIncrement: 1 + TestConnectionsOnReserve: true + MinCapacity: 0 + TestTableName: SQL SELECT 1 FROM DUAL + MaxCapacity: 10 + JDBCDataSourceParams: + JNDIName: testDS + JDBCDriverParams: + URL: '@@PROP:TESTDS_URL@@' + PasswordEncrypted: '@@SECRET:my-secret:encryptd@@' + DriverName: oracle.jdbc.OracleDriver + Properties: + user: + Value: '@@SECRET:my-secret:key1@@' + mysqlDS: + Target: 'admin-server' + JdbcResource: + JDBCConnectionPoolParams: + InitialCapacity: 0 + CapacityIncrement: 1 + TestConnectionsOnReserve: true + MinCapacity: 0 + TestTableName: SQL SELECT 1 + MaxCapacity: 10 + JDBCDataSourceParams: + JNDIName: mysqlDS + JDBCDriverParams: + URL: 'jdbc:mysql://invalid-host:3306/invalid-db-name' + PasswordEncrypted: '@@SECRET:@@ENV:DOMAIN_UID@@-mysql-secret:root-password@@' + DriverName: com.mysql.jdbc.Driver + Properties: + user: + Value: '@@PROP:MYSQL-USER@@' + FileStore: + AdminServerCustomFileStore: + Directory: 'stores/AdminServerCustomFileStore/' + Target: 'admin-server' + JMSServer: + AdminServerJMSServer: + PersistentStore: AdminServerCustomFileStore + Target: 'admin-server' + WLDFSystemResource: + myWLDF: diff --git a/src/integration-tests/introspector/mii/models/model1.properties b/src/integration-tests/introspector/mii/models/model1.properties new file mode 100644 index 00000000000..90918cbd8fe --- /dev/null +++ b/src/integration-tests/introspector/mii/models/model1.properties @@ -0,0 +1,9 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +T3CHANNEL1_LISTEN_ADDR=unresolvable-dns-name +T3CHANNEL1_PUBLIC_LISTEN_ADDR=mycustompublicaddress +T3CHANNEL2_LISTEN_ADDR=junk +T3CHANNEL2_PUBLIC_LISTEN_ADDR=mycustompublicaddress +TESTDS_URL=jdbc:oracle:thin:@invalid-host:1521:invalid-sid +MYSQL-USER=nobody diff --git a/src/integration-tests/introspector/mii/wdtconfigmap/domain1.10.yaml b/src/integration-tests/introspector/mii/wdtconfigmap/domain1.10.yaml new file mode 100644 index 00000000000..67f0f84e50a --- /dev/null +++ b/src/integration-tests/introspector/mii/wdtconfigmap/domain1.10.yaml @@ -0,0 +1,33 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +topology: + Server: + 'admin-server': + AdministrationPortEnabled: true + AdministrationPort: 7099 + MaxMessageSize: 78787878 + NetworkAccessPoint: + T3Channel1: + ListenAddress: '@@ENV:DOMAIN_UID@@-admin-server' + PublicPort: 40012 + T3Channel2: + ListenAddress: '@@ENV:DOMAIN_UID@@-admin-server' + PublicPort: 40013 + T3Channel3: + PublicAddress: 'mycustompublicaddress' + ListenPort: 40014 + standalone1: + MaxMessageSize: 1111111 + standalone2: + MaxMessageSize: 2222222 + +resources: + JDBCSystemResource: + mysqlDS: + JdbcResource: + JDBCDriverParams: + URL: 'jdbc:mysql://@@ENV:DOMAIN_UID@@-mysql:3306/mysql' + Properties: + user: + Value: '@@SECRET:@@ENV:DOMAIN_UID@@-mysql-secret:root-user@@' diff --git a/src/integration-tests/introspector/util_build_mii_image.sh b/src/integration-tests/introspector/util_build_mii_image.sh new file mode 100755 index 00000000000..d6a93433edd --- /dev/null +++ b/src/integration-tests/introspector/util_build_mii_image.sh @@ -0,0 +1,122 @@ +#!/bin/bash +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# This script uses the WebLogic Image Tool to build a Docker image with model in image +# artifacts. +# +# Assumptions: +# +# WORKDIR +# Working directory. Defaults to '/tmp/$USER/model-in-image-sample-work-dir'. +# +# MODEL_DIR: +# Location of the model .zip, .properties, and .yaml files +# that will be copied in to the image. Default is 'WORKDIR/models' +# which is populated by the ./build_model.sh script. +# +# MODEL_YAML_FILES, MODEL_ARCHIVE_FILES, MODEL_VARIABLES_FILES: +# Optionally, set one or more of these with comma-separated lists of file +# locations to override the corresponding .yaml, .zip, and .properties +# files normally obtained from MODEL_DIR. +# +# WDT_DOMAIN_TYPE - WLS (default), RestrictedJRF, or JRF +# BASE_IMAGE_NAME - defaults to container-registry.oracle.com/middleware/weblogic for +# the 'WLS' domain type, and otherwise defaults to +# container-registry.oracle.com/middleware/fmw-infrastructure +# BASE_IMAGE_TAG - defaults to 12.2.1.4 +# MODEL_IMAGE_NAME - defaults to 'model-in-image' +# MODEL_IMAGE_TAG - defaults to 'v1' +# MODEL_IMAGE_BUILD - 'when-missing' or 'always' (default) +# + +set -eu + +SCRIPTDIR="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" +echo "@@ Info: Running '$(basename "$0")'." + +WORKDIR=${WORKDIR:-/tmp/$USER/model-in-image-sample-work-dir} + +echo "@@ Info: WORKDIR='$WORKDIR'." + +mkdir -p ${WORKDIR} +cd ${WORKDIR} + +WDT_DOMAIN_TYPE=${WDT_DOMAIN_TYPE:-WLS} + +case "$WDT_DOMAIN_TYPE" in + WLS) + BASE_IMAGE_NAME="${BASE_IMAGE_NAME:-container-registry.oracle.com/middleware/weblogic}" ;; + JRF|RestrictedJRF) + BASE_IMAGE_NAME="${BASE_IMAGE_NAME:-container-registry.oracle.com/middleware/fmw-infrastructure}" ;; + *) + echo "@@ Error: Invalid domain type WDT_DOMAIN_TYPE '$WDT_DOMAIN_TYPE': expected 'WLS', 'JRF', or 'RestrictedJRF'." && exit 1 ;; +esac + +BASE_IMAGE_TAG=${BASE_IMAGE_TAG:-12.2.1.4} + +MODEL_IMAGE_NAME=${MODEL_IMAGE_NAME:-model-in-image} +MODEL_IMAGE_TAG=${MODEL_IMAGE_TAG:-v1} +MODEL_IMAGE_BUILD=${MODEL_IMAGE_BUILD:-always} + +if [ ! "$MODEL_IMAGE_BUILD" = "always" ] && \ + [ "`docker images $MODEL_IMAGE_NAME:$MODEL_IMAGE_TAG | awk '{ print $1 ":" $2 }' | grep -c $MODEL_IMAGE_NAME:$MODEL_IMAGE_TAG`" = "1" ]; then + echo @@ + echo "@@ Info: --------------------------------------------------------------------------------------------------" + echo "@@ Info: NOTE!!! " + echo "@@ Info: Skipping model image build because image '$MODEL_IMAGE_NAME:$MODEL_IMAGE_TAG' already exists. " + echo "@@ Info: To always build the model image, 'export MODEL_IMAGE_BUILD=always'. " + echo "@@ Info: --------------------------------------------------------------------------------------------------" + echo @@ + sleep 3 + exit 0 +fi + +echo @@ +echo @@ Info: Obtaining model files +echo @@ + +MODEL_DIR=${MODEL_DIR:-$WORKDIR/models} +MODEL_YAML_FILES="${MODEL_YAML_FILES:-$(ls $MODEL_DIR/*.yaml | xargs | sed 's/ /,/g')}" +MODEL_ARCHIVE_FILES="${MODEL_ARCHIVE_FILES:-$(ls $MODEL_DIR/*.zip | xargs | sed 's/ /,/g')}" +MODEL_VARIABLE_FILES="${MODEL_VARIABLE_FILES:-$(ls $MODEL_DIR/*.properties | xargs | sed 's/ /,/g')}" + +echo @@ MODEL_YAML_FILES=${MODEL_YAML_FILES} +echo @@ MODEL_ARCHIVE_FILES=${MODEL_ARCHIVE_FILES} +echo @@ MODEL_VARIABLE_FILES=${MODEL_VARIABLE_FILES} + +echo @@ +echo @@ Info: Setting up imagetool and populating its caches +echo @@ + +mkdir -p cache +unzip -o weblogic-image-tool.zip + +IMGTOOL_BIN=${WORKDIR}/imagetool/bin/imagetool.sh + +# The image tool uses the WLSIMG_CACHEDIR and WLSIMG_BLDIR env vars: +export WLSIMG_CACHEDIR=${WORKDIR}/cache +export WLSIMG_BLDDIR=${WORKDIR} + +${IMGTOOL_BIN} cache deleteEntry --key wdt_myversion +${IMGTOOL_BIN} cache addInstaller \ + --type wdt --version myversion --path ${WORKDIR}/weblogic-deploy-tooling.zip + +echo "@@" +echo "@@ Info: Starting model image build for '$MODEL_IMAGE_NAME:$MODEL_IMAGE_TAG'" +echo "@@" + +# +# Run the image tool to create the image. It will use the WDT binaries +# in the local image tool cache marked with key 'myversion' (see 'cache' commands above). +# + +${IMGTOOL_BIN} update \ + --tag $MODEL_IMAGE_NAME:$MODEL_IMAGE_TAG \ + --fromImage $BASE_IMAGE_NAME:$BASE_IMAGE_TAG \ + --wdtModel ${MODEL_YAML_FILES} \ + --wdtVariables ${MODEL_VARIABLE_FILES} \ + --wdtArchive ${MODEL_ARCHIVE_FILES} \ + --wdtModelOnly \ + --wdtVersion myversion \ + --wdtDomainType ${WDT_DOMAIN_TYPE} diff --git a/src/integration-tests/introspector/util_download_mii_tools.sh b/src/integration-tests/introspector/util_download_mii_tools.sh new file mode 100755 index 00000000000..8561db158d6 --- /dev/null +++ b/src/integration-tests/introspector/util_download_mii_tools.sh @@ -0,0 +1,85 @@ +#!/bin/bash +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# +# This script downloads the latest WebLogic Deploy Tool and WebLogic Image Tool +# to the WORKDIR directory. +# +# Optional environment variables: +# +# WORKDIR +# working directory with at least 10g of space +# defaults to /tmp/$USER/model-in-image-sample-work-dir +# +# http_proxy https_proxy +# If running behind a proxy, then set as needed to allow curl access to github.com. +# +# DOWNLOAD_WDT DOWNLOAD_WIT +# Default to 'when-missing'. Set to 'always' to force download even +# if local installer zip is missing. +# +# WDT_INSTALLER_URL WIT_INSTALLER_URL +# Defaults to 'https://github.com/oracle/weblogic-deploy-tooling/releases/latest' +# and 'https://github.com/oracle/weblogic-image-tool/releases/latest' respectively. +# +# To override an installer URL, export the URL env to point to a specific zip file, for example: +# export WDT_INSTALLER_URL=https://github.com/oracle/weblogic-deploy-tooling/releases/download/weblogic-deploy-tooling-1.9.1/weblogic-deploy.zip +# + +set -o pipefail + +set -eu + +SCRIPTDIR="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" +echo "@@ Info: Running '$(basename "$0")'." + +DOWNLOAD_WIT=${DOWNLOAD_WIT:-when-missing} +DOWNLOAD_WDT=${DOWNLOAD_WDT:-when-missing} +WDT_INSTALLER_URL=${WDT_INSTALLER_URL:-https://github.com/oracle/weblogic-deploy-tooling/releases/latest} +WIT_INSTALLER_URL=${WIT_INSTALLER_URL:-https://github.com/oracle/weblogic-image-tool/releases/latest} +WORKDIR=${WORKDIR:-/tmp/$USER/model-in-image-sample-work-dir} + +echo "@@ Info: WORKDIR='$WORKDIR'." + +mkdir -p ${WORKDIR} +cd ${WORKDIR} + +download_zip() { + set -eu + local ZIPFILE=$1 + local LOCATION=$2 + local DOWNLOAD_VAR_NAME=$3 + local DOWNLOAD=${!DOWNLOAD_VAR_NAME} + + if [ ! "$DOWNLOAD" = "always" ] && [ -f $ZIPFILE ]; then + echo "@@" + echo "@@ -----------------------------------------------------------------------" + echo "@@ Info: NOTE! Skipping '$LOCATION' download since local " + echo "@@ file '$WORKDIR/$ZIPFILE' already exists. " + echo "@@ To force a download, 'export $DOWNLOAD_VAR_NAME=always'. " + echo "@@ -----------------------------------------------------------------------" + echo "@@" + sleep 2 + return + fi + + echo "@@ Downloading '$LOCATION' to '$WORKDIR/$ZIPFILE'." + + local iurl="$LOCATION" + if [ "`echo $iurl | grep -c 'https://github.com.*/latest$'`" = "1" ]; then + echo "@@ The location URL matches regex 'https://github.com.*/latest$'. About to convert to direct location." + local tempfile="$(mktemp -u).$(basename $0).$SECONDS.$PPID.$RANDOM" + curl -fL $LOCATION -o $tempfile + LOCATION=https://github.com/$(cat $tempfile | grep "releases/download" | awk '{ split($0,a,/href="/); print a[2]}' | cut -d\" -f 1) + rm -f $tempfile + echo "@@ The location URL matched regex 'https://github.com.*/latest$' so it was converted to '$LOCATION'" + echo "@@ Now downloading '$LOCATION' to '$WORKDIR/$ZIPFILE'." + fi + + rm -f $ZIPFILE + curl -fL $LOCATION -o $ZIPFILE +} + +download_zip weblogic-deploy-tooling.zip $WDT_INSTALLER_URL DOWNLOAD_WDT +download_zip weblogic-image-tool.zip $WIT_INSTALLER_URL DOWNLOAD_WIT diff --git a/src/integration-tests/introspector/wl-create-domain-pod.yamlt b/src/integration-tests/introspector/wl-create-domain-pod.yamlt index e679d9d8cdb..7afa8bf608f 100644 --- a/src/integration-tests/introspector/wl-create-domain-pod.yamlt +++ b/src/integration-tests/introspector/wl-create-domain-pod.yamlt @@ -45,7 +45,7 @@ spec: - name: weblogic-credentials-volume mountPath: /weblogic-operator/secrets readOnly: true - - name: weblogic-domain-cm-volume + - name: weblogic-script-cm-volume mountPath: /weblogic-operator/scripts readOnly: true - name: ${DOMAIN_UID}-mycustom-overrides-cm-volume @@ -65,10 +65,10 @@ spec: secret: defaultMode: 420 secretName: ${WEBLOGIC_CREDENTIALS_SECRET_NAME} - - name: weblogic-domain-cm-volume + - name: weblogic-script-cm-volume configMap: defaultMode: 365 - name: weblogic-domain-cm + name: weblogic-script-cm - name: ${DOMAIN_UID}-mycustom-overrides-cm-volume configMap: defaultMode: 365 diff --git a/src/integration-tests/introspector/wl-introspect-pod.yamlt b/src/integration-tests/introspector/wl-introspect-pod.yamlt index e6058877ab5..055d90ebe0c 100644 --- a/src/integration-tests/introspector/wl-introspect-pod.yamlt +++ b/src/integration-tests/introspector/wl-introspect-pod.yamlt @@ -7,7 +7,6 @@ metadata: labels: weblogic.createdByOperator: "true" weblogic.domainUID: ${DOMAIN_UID} - weblogic.resourceVersion: domain-v2 name: ${JOB_NAME} namespace: ${NAMESPACE} spec: @@ -35,10 +34,14 @@ spec: value: "${ALLOW_DYNAMIC_CLUSTER_IN_FMW}" - name: DOMAIN_SOURCE_TYPE value: "${DOMAIN_SOURCE_TYPE}" + - name: WDT_DOMAIN_TYPE + value: "${WDT_DOMAIN_TYPE:-WLS}" - name: ISTIO_ENABLED value: "${ISTIO_ENABLED:-false}" - name: ISTIO_READINESS_PORT value: "${ISTIO_READINESS_PORT:-8888}" + - name: OPERATOR_ENVVAR_NAMES + value: "JAVA_OPTIONS,NAMESPACE,DOMAIN_UID,DOMAIN_HOME,NODEMGR_HOME,LOG_HOME,DATA_HOME,CREDENTIALS_SECRET_NAME,ALLOW_DYNAMIC_CLUSTER_IN_FMW,DOMAIN_SOURCE_TYPE,WDT_DOMAIN_TYPE,ISTIO_ENABLED,ISTIO_READINESS_PORT" image: "${WEBLOGIC_IMAGE_NAME}:${WEBLOGIC_IMAGE_TAG}" imagePullPolicy: ${WEBLOGIC_IMAGE_PULL_POLICY} name: weblogic-server @@ -59,7 +62,7 @@ spec: - name: my-secret-volume mountPath: /weblogic-operator/config-overrides-secrets/my-secret readOnly: true - - name: weblogic-domain-cm-volume + - name: weblogic-script-cm-volume mountPath: /weblogic-operator/scripts readOnly: true - name: ${DOMAIN_UID}-mycustom-overrides-cm-volume @@ -70,6 +73,10 @@ spec: readOnly: true - name: weblogic-domain-storage-volume mountPath: /shared + - name: weblogic-runtime-encryption-volume + mountPath: /weblogic-operator/model-runtime-secret + - name: weblogic-wdt-config-map-volume + mountPath: /weblogic-operator/wdt-config-map volumes: - name: weblogic-credentials-volume secret: @@ -83,10 +90,20 @@ spec: secret: defaultMode: 420 secretName: my-secret - - name: weblogic-domain-cm-volume + - name: weblogic-runtime-encryption-volume + secret: + defaultMode: 420 + secretName: ${DOMAIN_UID}-runtime-encryption-secret + optional: ${MII_WDT_ENCRYPT_SECRET} + - name: weblogic-script-cm-volume + configMap: + defaultMode: 365 + name: weblogic-script-cm + - name: weblogic-wdt-config-map-volume configMap: defaultMode: 365 - name: weblogic-domain-cm + name: ${DOMAIN_UID}-wdt-config-map + optional: ${MII_WDT_CONFIGMAP} - name: ${DOMAIN_UID}-mycustom-overrides-cm-volume configMap: defaultMode: 365 diff --git a/src/integration-tests/introspector/wl-nodeport-svc.yamlt b/src/integration-tests/introspector/wl-nodeport-svc.yamlt index 1e5a794896a..92e103cd3e9 100644 --- a/src/integration-tests/introspector/wl-nodeport-svc.yamlt +++ b/src/integration-tests/introspector/wl-nodeport-svc.yamlt @@ -8,7 +8,6 @@ metadata: weblogic.createdByOperator: "true" weblogic.domainName: ${DOMAIN_NAME} weblogic.domainUID: ${DOMAIN_UID} - weblogic.resourceVersion: domain-v1 weblogic.serverName: ${SERVER_NAME} name: ${SERVICE_NAME} namespace: ${NAMESPACE} diff --git a/src/integration-tests/introspector/wl-pod.yamlt b/src/integration-tests/introspector/wl-pod.yamlt index 0a42b9deafd..77aec789d13 100644 --- a/src/integration-tests/introspector/wl-pod.yamlt +++ b/src/integration-tests/introspector/wl-pod.yamlt @@ -8,7 +8,6 @@ metadata: weblogic.createdByOperator: "true" weblogic.domainName: ${DOMAIN_NAME} weblogic.domainUID: ${DOMAIN_UID} - weblogic.resourceVersion: domain-v1 weblogic.serverName: ${SERVER_NAME} name: ${SERVICE_NAME} namespace: ${NAMESPACE} @@ -61,6 +60,8 @@ spec: value: "" - name: DOMAIN_SOURCE_TYPE value: "${DOMAIN_SOURCE_TYPE}" + - name: WDT_DOMAIN_TYPE + value: "${WDT_DOMAIN_TYPE:-WLS}" image: "${WEBLOGIC_IMAGE_NAME}:${WEBLOGIC_IMAGE_TAG}" imagePullPolicy: ${WEBLOGIC_IMAGE_PULL_POLICY} lifecycle: @@ -108,15 +109,23 @@ spec: # name: weblogic-credentials-volume # readOnly: true - mountPath: /weblogic-operator/scripts - name: weblogic-domain-cm-volume + name: weblogic-script-cm-volume readOnly: true - mountPath: /weblogic-operator/introspector name: introspect-domain-cm-volume readOnly: true + - name: weblogic-runtime-encryption-volume + mountPath: /weblogic-operator/model-runtime-secret dnsPolicy: ClusterFirst hostname: ${SERVICE_NAME} restartPolicy: Always terminationGracePeriodSeconds: 1 + volumes: + - name: weblogic-runtime-encryption-volume + secret: + defaultMode: 420 + secretName: ${DOMAIN_UID}-runtime-encryption-secret + optional: ${MII_WDT_ENCRYPT_SECRET} # WL Pods shouldn't need secrets if the introspector is working: #- name: weblogic-credentials-volume # secret: @@ -124,8 +133,8 @@ spec: # secretName: ${WEBLOGIC_CREDENTIALS_SECRET_NAME} - configMap: defaultMode: 365 - name: weblogic-domain-cm - name: weblogic-domain-cm-volume + name: weblogic-script-cm + name: weblogic-script-cm-volume - configMap: defaultMode: 365 name: ${DOMAIN_UID}-weblogic-domain-introspect-cm diff --git a/src/integration-tests/introspector/wl-pv.yamlt b/src/integration-tests/introspector/wl-pv.yamlt index 2ed1c030fcf..3e23c4d1c74 100644 --- a/src/integration-tests/introspector/wl-pv.yamlt +++ b/src/integration-tests/introspector/wl-pv.yamlt @@ -7,7 +7,6 @@ metadata: labels: weblogic.domainName: ${DOMAIN_NAME} weblogic.domainUID: ${DOMAIN_UID} - weblogic.resourceVersion: domain-v1 name: ${DOMAIN_UID}-weblogic-domain-pv spec: accessModes: diff --git a/src/integration-tests/introspector/wl-pvc.yamlt b/src/integration-tests/introspector/wl-pvc.yamlt index bada2be1538..4a0dbf102f7 100644 --- a/src/integration-tests/introspector/wl-pvc.yamlt +++ b/src/integration-tests/introspector/wl-pvc.yamlt @@ -7,7 +7,6 @@ metadata: labels: weblogic.domainName: ${DOMAIN_NAME} weblogic.domainUID: ${DOMAIN_UID} - weblogic.resourceVersion: domain-v1 name: ${DOMAIN_UID}-weblogic-domain-pvc namespace: ${NAMESPACE} spec: diff --git a/src/integration-tests/kubernetes/elasticsearch.yaml b/src/integration-tests/kubernetes/elasticsearch.yaml index 6b9d1f6bc8c..db0318a6f52 100644 --- a/src/integration-tests/kubernetes/elasticsearch.yaml +++ b/src/integration-tests/kubernetes/elasticsearch.yaml @@ -1,7 +1,7 @@ # Copyright (c) 2017, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. -apiVersion: apps/v1beta1 +apiVersion: apps/v1 kind: Deployment metadata: name: elasticsearch diff --git a/src/integration-tests/kubernetes/flannel.yml b/src/integration-tests/kubernetes/flannel.yml index 5372fe54fe1..1c393b3dc4e 100644 --- a/src/integration-tests/kubernetes/flannel.yml +++ b/src/integration-tests/kubernetes/flannel.yml @@ -72,7 +72,7 @@ data: } } --- -apiVersion: extensions/v1beta1 +apiVersion: apps/v1 kind: DaemonSet metadata: name: kube-flannel-ds diff --git a/src/integration-tests/kubernetes/kibana.yaml b/src/integration-tests/kubernetes/kibana.yaml index 2ba60b61e8f..5931a66c608 100644 --- a/src/integration-tests/kubernetes/kibana.yaml +++ b/src/integration-tests/kubernetes/kibana.yaml @@ -1,7 +1,7 @@ # Copyright (c) 2017, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. -apiVersion: apps/v1beta1 +apiVersion: apps/v1 kind: Deployment metadata: name: kibana diff --git a/src/integration-tests/kubernetes/logstash.yaml b/src/integration-tests/kubernetes/logstash.yaml index be6bc27f6a7..7e09bcb8e28 100644 --- a/src/integration-tests/kubernetes/logstash.yaml +++ b/src/integration-tests/kubernetes/logstash.yaml @@ -1,7 +1,7 @@ # Copyright (c) 2017, 2020, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. -apiVersion: apps/v1beta1 # for versions before 1.8.0 use apps/v1beta1 +apiVersion: apps/v1 kind: Deployment metadata: name: logstash diff --git a/src/integration-tests/model-in-image/README b/src/integration-tests/model-in-image/README new file mode 100644 index 00000000000..e4f285af687 --- /dev/null +++ b/src/integration-tests/model-in-image/README @@ -0,0 +1,70 @@ +Copyright (c) 2020, Oracle Corporation and/or its affiliates. +Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +SUMMARY: + +This is a stand alone test for running the mii-sample in +'kubernetes/samples/scripts/create-weblogic-domain/model-in-image'. + +To run the test. + Usage: + ./run-test.sh -? + + WLS mode: + ./run-test.sh -precleanup -oper -traefik -all + + JRF mode: + ./run-test.sh -precleanup -oper -traefik -precleandb -jrf -db -rcu -all + +NOTES: + +- The order of the parameters doesn't matter. + +- To customize the location of output, etc, + see the customizable env vars described by + './run-test.sh -?'. + +- The '-precleanup' option: + - Calls 'cleanup.sh' before doing anything else, + which deletes almost everything in your k8s cluster. + - Deletes the current WORKDIR before proceeding. + +- The '-db' option will cause the test to deploy Oracle DB, + '-oper' builds/deploys the operator, and '-traefik' deploys + traefik. It is not necessary to use these options if the + corresponding service is already running: + + - Make sure operator is monitoring DOMAIN_NAMESPACE. + - Make sure Oracle DB is running in DB_NAMESPACE and + can be reached by the URLs and credentials defined + in the sample's secrets. + - Make sure traefik is running with node port + TRAEFIK_HTTP_NODEPORT (default 30305), in namespace + TRAEFIK_NAMESPACE. If TRAEFIK_HTTP_NODEPORT is set + to 0 that's fine, the test will dynamically find + the actual nodeport. + +- Do not call '-rcu' if the database is already RCU initialized. + +- The '-all' options runs the tests "-check-sample", "-initial-image", + "-initial-main", "-update1", "-update2", and + "-update3-image", and "-update3-main". + +- You can run the test in stages. For example: + ./run-test.sh -precleanup + ./run-test.sh -oper + ./run-test.sh -traefik + ./run-test.sh -initial-image + ./run-test.sh -initial-main + +- If you are not running Kubernetes locally on a single machine, + then you will need to + + (a) Set image pull env vars and deploy image pull secrets + before calling the test (see ./run-test.sh -? for + env vars). Remember to set the image name env var + with registry location. + + (b) Run the test in stages instead of all at once + so that you can push the images generated by "-initial-image" + and "-update3-image" before proceeding to test the next stage. diff --git a/src/integration-tests/model-in-image/build-operator.sh b/src/integration-tests/model-in-image/build-operator.sh new file mode 100755 index 00000000000..dcee67f8b54 --- /dev/null +++ b/src/integration-tests/model-in-image/build-operator.sh @@ -0,0 +1,71 @@ +#!/bin/bash + +# Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# 'build-wl-operator.sh' +# +# Build and helm install an operator that monitors DOMAIN_NAMESPACE. +# +# This script is not necessary if the operator is already running +# and monitoring DOMAIN_NAMESPACE. +# +# This script skips the build if it finds no changes since the last build. +# +# This script always does a helm uninstall/install. + +set -eu +set -o pipefail + +TESTDIR="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" +SRCDIR="$( cd "$TESTDIR/../../.." > /dev/null 2>&1 ; pwd -P )" + +cd ${SRCDIR} + +echo "docker build Operator" + +OPER_IMAGE_TAG=${OPER_IMAGE_TAG:-test} +OPER_IMAGE_NAME=${OPER_IMAGE_NAME:-weblogic-kubernetes-operator} +OPER_JAR_VERSION="`grep -m1 "" pom.xml | cut -f2 -d">" | cut -f1 -d "<"`" + +echo "OPER_IMAGE_NAME=$OPER_IMAGE_NAME" +echo "OPER_IMAGE_TAG=$OPER_IMAGE_TAG" +echo "OPER_JAR_VERSION=$OPER_JAR_VERSION" + +function latest_cksum() { + # force a rebuild even if only image name/tag/ver changes... + echo "$OPER_IMAGE_NAME $OPER_IMAGE_TAG $OPER_JAR_VERSION" + + # force a rebuild if the docker image isn't cached anymore + docker images $OPER_IMAGE_NAME:$OPER_IMAGE_TAG -q + + # force a rebuild if any .java, .sh, or .py file changed + find "$SRCDIR/operator/src/main" -name "*.[jsp]*" | xargs cat | cksum +} + +function save_cksum() { + latest_cksum > $SRCDIR/operator/src/main.cksum +} + +function old_cksum() { + [ -f $SRCDIR/operator/src/main.cksum ] && cat $SRCDIR/operator/src/main.cksum +} + +if [ "$(old_cksum)" = "$(latest_cksum)" ]; then + echo "@@ Info: Skipping oper build/tag - cksum unchanged." + exit 0 +fi + +#mvn clean install -DskipTests -Dcheckstyle.skip +mvn clean install +docker build --build-arg http_proxy=$http_proxy --build-arg https_proxy=$https_proxy --build-arg no_proxy=$no_proxy -t "$OPER_IMAGE_NAME:$OPER_IMAGE_TAG" --build-arg VERSION=$OPER_JAR_VERSION --no-cache=true . + +save_cksum + +# push to remote repo if cluster is remote +# if [ -z "$REPO_REGISTRY" ] || [ -z "$REPO_USERNAME" ] || [ -z "$REPO_PASSWORD" ]; then +# echo "Provide Docker login details using REPO_REGISTRY, REPO_USERNAME & REPO_PASSWORD env variables to push the Operator image to the repository." +# exit 1 +# fi +# docker login $REPO_REGISTRY -u $REPO_USERNAME -p $REPO_PASSWORD +# docker push ${IMAGE_NAME_OPERATOR}:${IMAGE_TAG_OPERATOR} diff --git a/src/integration-tests/model-in-image/deploy-operator.sh b/src/integration-tests/model-in-image/deploy-operator.sh new file mode 100755 index 00000000000..38e312c62c0 --- /dev/null +++ b/src/integration-tests/model-in-image/deploy-operator.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# Helm uninstall/install an operator that monitors DOMAIN_NAMESPACE. +# +# This script is not necessary if the operator is already running +# and monitoring DOMAIN_NAMESPACE. +# +# This script skips itself if it can find a record of its +# last run and the cksum matches the current cksum. + +TESTDIR="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" +SRCDIR="$( cd "$TESTDIR/../../.." > /dev/null 2>&1 ; pwd -P )" + +set -u + +WORKDIR=${WORKDIR:-/tmp/$USER/model-in-image-sample-work-dir} +DOMAIN_NAMESPACE=${DOMAIN_NAMESPACE:-sample-domain1-ns} + +OPER_NAME=${OPER_NAME:-sample-weblogic-operator} +OPER_NAMESPACE=${OPER_NAMESPACE:-${OPER_NAME}-ns} +OPER_SA=${OPER_SA:-${OPER_NAME}-sa} + +OPER_IMAGE_TAG=${OPER_IMAGE_TAG:-test} +OPER_IMAGE_NAME=${OPER_IMAGE_NAME:-weblogic-kubernetes-operator} +OPER_IMAGE=${OPER_IMAGE_NAME}:${OPER_IMAGE_TAG} + +mkdir -p $WORKDIR/test-out + +# +# Do not re-install if operator is up and running and has same setting as last deploy +# + +if [ -e $WORKDIR/test-out/operator-values.orig ]; then + helm get values ${OPER_NAME} -n ${OPER_NAMESPACE} > $WORKDIR/test-out/operator-values.cur 2>&1 + helm list -n ${OPER_NAMESPACE} | awk '{ print $1 }' >> $WORKDIR/test-out/operator-values.cur + if [ "$(cat $WORKDIR/test-out/operator-values.cur)" = "$(cat $WORKDIR/test-out/operator-values.orig)" ]; then + echo "@@" + echo "@@ Operator already running. Skipping." + echo "@@" + echo "@@ log command: kubectl logs -n $OPER_NAMESPACE -c weblogic-operator deployments/weblogic-operator" + exit + fi +fi + +set +e + +kubectl create namespace $DOMAIN_NAMESPACE +kubectl create namespace $OPER_NAMESPACE +kubectl create serviceaccount -n $OPER_NAMESPACE $OPER_SA + +helm uninstall $OPER_NAME -n $OPER_NAMESPACE + +set -eu +cd ${SRCDIR} + +helm install $OPER_NAME kubernetes/charts/weblogic-operator \ + --namespace $OPER_NAMESPACE \ + --set image=$OPER_IMAGE \ + --set serviceAccount=$OPER_SA \ + --set "domainNamespaces={$DOMAIN_NAMESPACE}" \ + --set "javaLoggingLevel=FINE" \ + --wait + + +kubectl get deployments -n $OPER_NAMESPACE + +helm get values ${OPER_NAME} -n ${OPER_NAMESPACE} > $WORKDIR/test-out/operator-values.orig 2>&1 +helm list -n ${OPER_NAMESPACE} | awk '{ print $1 }' >> $WORKDIR/test-out/operator-values.orig + +echo "@@ log command: kubectl logs -n $OPER_NAMESPACE -c weblogic-operator deployments/weblogic-operator" + diff --git a/src/integration-tests/model-in-image/deploy-traefik.sh b/src/integration-tests/model-in-image/deploy-traefik.sh new file mode 100755 index 00000000000..9290139ea87 --- /dev/null +++ b/src/integration-tests/model-in-image/deploy-traefik.sh @@ -0,0 +1,112 @@ +#!/bin/bash + +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# Summary: +# +# This script helm uninstalls and installs Traefik TRAEFIK_NAME +# at node-port 30305 in namespace TRAEFIK_NAMESPACE and ensures +# it monitors namespace DOMAIN_NAMESPACE. It uses this operator +# release's sample helm chart in 'kubernetes/samples/charts/traefik'. +# +# Defaults: +# WORKDIR: /tmp/$USER/model-in-image-sample-work-dir +# TRAEFIK_NAME: traefik-operator +# TRAEFIK_NAMESPACE: ${TRAEFIK_NAME}-ns +# DOMAIN_NAMESPACE: sample-domain1-ns +# +# This script also tracks an release checksum in the +# WORKDIR/test-out directory so it can skip itself +# if one already occurred. +# + +TESTDIR="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" +SRCDIR="$( cd "$TESTDIR/../../.." > /dev/null 2>&1 ; pwd -P )" + +set -eu +set -o pipefail + +source $TESTDIR/test-env.sh + +WORKDIR=${WORKDIR:-/tmp/$USER/model-in-image-sample-work-dir} + +TRAEFIK_NAME=${TRAEFIK_NAME:-traefik-operator} +TRAEFIK_NAMESPACE=${TRAEFIK_NAMESPACE:-traefik-operator-ns} +TRAEFIK_HTTP_NODEPORT=${TRAEFIK_HTTP_NODEPORT:-30305} +TRAEFIK_HTTPS_NODEPORT=${TRAEFIK_HTTPS_NODEPORT:-30433} + +DOMAIN_NAMESPACE=${DOMAIN_NAMESPACE:-sample-domain1-ns} + +mkdir -p $WORKDIR/test-out + +function kubehost() { + kubectl cluster-info | grep KubeDNS | sed 's;^.*//;;' | sed 's;:.*$;;' +} + +# +# Helm uninstall then install traefik +# Skip if it's up and running and it has the same external ports and namespace values +# + +set +e +helm get values ${TRAEFIK_NAME} -n ${TRAEFIK_NAMESPACE} > $WORKDIR/test-out/traefik-values.cur 2>&1 +res=$? +set -e +for evar in DOMAIN_NAMESPACE TRAEFIK_NAMESPACE TRAEFIK_NAME TRAEFIK_HTTP_NODEPORT TRAEFIK_HTTPS_NODEPORT; do + echo "${evar}=${!evar}" >> $WORKDIR/test-out/traefik-values.cur +done +if [ $res -eq 0 ] \ + && [ -e "$WORKDIR/test-out/traefik-values.orig" ] \ + && [ "$(cat $WORKDIR/test-out/traefik-values.cur)" = "$(cat $WORKDIR/test-out/traefik-values.orig)" ]; then + echo "@@" + echo "@@ Traefik already installed. Skipping uninstall/install. Current values:" + cat $WORKDIR/test-out/traefik-values.orig + echo "@@" +else + set +e + echo "@@" + echo "@@ Uninstalling old install (if any) using 'helm uninstall $TRAEFIK_NAME -n $TRAEFIK_NAMESPACE'" + echo "@@" + helm uninstall $TRAEFIK_NAME -n $TRAEFIK_NAMESPACE + echo "@@ Creating traefik namespace '$TRAEFIK_NAMESPACE' and domain namepace '$DOMAIN_NAMESPACE'" + kubectl create namespace $TRAEFIK_NAMESPACE + kubectl create namespace $DOMAIN_NAMESPACE + set -e + + cd ${SRCDIR} + + echo "@@ Installing traefik" + + # you only need to add the repo once, but we do it every time for simplicity + helm repo add stable https://kubernetes-charts.storage.googleapis.com/ + + set -x + + helm install ${TRAEFIK_NAME} stable/traefik \ + --namespace $TRAEFIK_NAMESPACE \ + --values kubernetes/samples/charts/traefik/values.yaml \ + --set "kubernetes.namespaces={$TRAEFIK_NAMESPACE,$DOMAIN_NAMESPACE}" \ + --set "service.nodePorts.http=${TRAEFIK_HTTP_NODEPORT}" \ + --set "service.nodePorts.https=${TRAEFIK_HTTPS_NODEPORT}" \ + --wait + + set +x + + # Save Traefik settings (we will check this if this script is run again) + helm get values ${TRAEFIK_NAME} -n ${TRAEFIK_NAMESPACE} > $WORKDIR/test-out/traefik-values.orig 2>&1 + for evar in DOMAIN_NAMESPACE TRAEFIK_NAMESPACE TRAEFIK_NAME TRAEFIK_HTTP_NODEPORT TRAEFIK_HTTPS_NODEPORT; do + echo "${evar}=${!evar}" >> $WORKDIR/test-out/traefik-values.orig + done +fi + +cat< /dev/null 2>&1 ; pwd -P )" +source $SCRIPTDIR/env-init.sh + +DRY_RUN="false" +if [ "${1:-}" = "-dry" ]; then + DRY_RUN="true" +fi + +echo @@ Info: WDT_DOMAIN_TYPE=${WDT_DOMAIN_TYPE} +echo @@ Info: MODEL_DIR=${MODEL_DIR} +echo @@ Info: BASE_IMAGE_NAME=${BASE_IMAGE_NAME} +echo @@ Info: BASE_IMAGE_TAG=${BASE_IMAGE_TAG} +echo @@ Info: MODEL_IMAGE_NAME=${MODEL_IMAGE_NAME} +echo @@ Info: MODEL_IMAGE_TAG=${MODEL_IMAGE_TAG} +echo @@ Info: MODEL_IMAGE_BUILD=${MODEL_IMAGE_BUILD} + +IMGTOOL=$WORKDIR/model-images/imagetool/bin/imagetool.sh + +function output_dryrun() { + +MODEL_YAML_FILES="$(ls $WORKDIR/$MODEL_DIR/*.yaml | xargs | sed 's/ /,/g')" +MODEL_ARCHIVE_FILES=$WORKDIR/$MODEL_DIR/archive.zip +MODEL_VARIABLE_FILES="$(ls $WORKDIR/$MODEL_DIR/*.properties | xargs | sed 's/ /,/g')" + +cat << EOF + +dryrun:#!/bin/bash +dryrun:# Use this script to build image '$MODEL_IMAGE_NAME:$MODEL_IMAGE_TAG' +dryrun:# using the contents of '$WORKDIR/$MODEL_DIR'. +dryrun: +dryrun:set -eux +dryrun: +dryrun:rm -f $WORKDIR/$MODEL_DIR/archive.zip +dryrun:cd $WORKDIR/$ARCHIVE_SOURCEDIR +dryrun:zip -q -r $WORKDIR/$MODEL_DIR/archive.zip wlsdeploy +dryrun: +dryrun:cd $WORKDIR/model-images +dryrun:unzip -o imagetool.zip +dryrun: +dryrun:mkdir -p $WORKDIR/model-images/imagetool/cache +dryrun:export WLSIMG_CACHEDIR=$WORKDIR/model-images/imagetool/cache +dryrun: +dryrun:mkdir -p $WORKDIR/model-images/imagetool/bld +dryrun:export WLSIMG_BLDDIR=$WORKDIR/model-images/imagetool/bld +dryrun: +dryrun:$IMGTOOL cache deleteEntry \\ +dryrun: --key wdt_latest +dryrun: +dryrun:$IMGTOOL cache addInstaller \\ +dryrun: --type wdt \\ +dryrun: --version latest \\ +dryrun: --path ${WORKDIR}/model-images/weblogic-deploy.zip +dryrun: +dryrun:$IMGTOOL update \\ +dryrun: --tag $MODEL_IMAGE \\ +dryrun: --fromImage $BASE_IMAGE \\ +dryrun: ${MODEL_YAML_FILES:+--wdtModel ${MODEL_YAML_FILES}} \\ +dryrun: ${MODEL_VARIABLE_FILES:+--wdtVariables ${MODEL_VARIABLE_FILES}} \\ +dryrun: ${MODEL_ARCHIVE_FILES:+--wdtArchive ${MODEL_ARCHIVE_FILES}} \\ +dryrun: --wdtModelOnly \\ +dryrun: --wdtDomainType ${WDT_DOMAIN_TYPE} +dryrun: +dryrun:echo "@@ Info: Success! Model image '$MODEL_IMAGE' build complete. Seconds=\$SECONDS." + +EOF + +} # end of function output_dryrun() + +if [ "$DRY_RUN" = "true" ]; then + + output_dryrun + exit 0 # done with dry run + +else + + # we're not dry running + + if [ ! "$MODEL_IMAGE_BUILD" = "always" ] && [ ! -z "$(docker images -q $MODEL_IMAGE)" ]; then + echo "@@" + echo "@@ Info: ----------------------------------------------------------------------------" + echo "@@ Info: NOTE!!! " + echo "@@ Info: Skipping model image build because '$MODEL_IMAGE' found in docker images. " + echo "@@ Info: To always build the model image, 'export MODEL_IMAGE_BUILD=always'. " + echo "@@ Info: ----------------------------------------------------------------------------" + echo "@@" + exit 0 + fi + + if [ ! -d "$WORKDIR/$MODEL_DIR" ]; then + echo "@@ Error: MODEL_DIR directory not found. Did you remember to stage it first?" + exit 1 + fi + + CURPID=$(bash -c "echo \$PPID") + + tmpfil="$WORKDIR/$(basename $0).$CURPID.$PPID.$SECONDS.$RANDOM.sh" + + output_dryrun | grep "^dryrun:" | sed 's/^dryrun://' > $tmpfil + + chmod +x $tmpfil + + echo "@@ Info: About to run '$tmpfil'." + + $tmpfil + + echo "@@ Info: About to remove '$tmpfil'." + + rm $tmpfil + + echo "@@ Info: Done!" + +fi + diff --git a/src/integration-tests/model-in-image/mii-sample-wrapper/create-secrets.sh b/src/integration-tests/model-in-image/mii-sample-wrapper/create-secrets.sh new file mode 100755 index 00000000000..436bf6fd3ed --- /dev/null +++ b/src/integration-tests/model-in-image/mii-sample-wrapper/create-secrets.sh @@ -0,0 +1,88 @@ +#!/bin/bash +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# +# This script deploys secrets for the Model in Image sample, +# including extra secretes for the JRF domain type or for +# the datasource config map as needed. +# +# Optional parameters: +# +# -dry kubectl - Dry run. Show but don't do. Dry run +# -dry yaml output is prefixed with 'dryrun:'. +# +# Optional environment variables (see README for details): +# +# WORKDIR, DOMAIN_UID, DOMAIN_NAMESPACE, WDT_DOMAIN_TYPE, +# DB_NAMESPACE, INCLUDE_MODEL_CONFIGMAP +# + +set -eu +set -o pipefail + +SCRIPTDIR="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" +source $SCRIPTDIR/env-init.sh + +DRY_RUN="" +if [ "${1:-}" = "-dry" ]; then + DRY_RUN="-dry $2" +fi + +# +# WebLogic Credential Secret referenced by domain resource +# field 'spec.weblogicCredentialsSecret'. +# + +echo "@@ Info: Creating weblogic domain secret" +$WORKDIR/utils/create-secret.sh $DRY_RUN -s ${DOMAIN_UID}-weblogic-credentials \ + -d $DOMAIN_UID -n $DOMAIN_NAMESPACE \ + -l username=weblogic \ + -l password=welcome1 + +# +# Model runtime encryption secret referenced by domain resource +# field 'spec.configuration.model.runtimeEncryptionSecret'. +# This secret can have any password but the password must remain +# the same throughout the life of a running model domain. +# + +echo "@@ Info: Creating model runtime encryption secret" +$WORKDIR/utils/create-secret.sh $DRY_RUN -s ${DOMAIN_UID}-runtime-encryption-secret \ + -d $DOMAIN_UID -n $DOMAIN_NAMESPACE \ + -l password=my_runtime_password + +# +# JRF Domain's RCU secret and wallet password secret. Only needed for JRF +# domains. +# + +if [ "$WDT_DOMAIN_TYPE" = "JRF" ]; then + echo "@@ Info: Creating rcu access secret (referenced by model yaml macros if domain type is JRF)" + $WORKDIR/utils/create-secret.sh $DRY_RUN -s ${DOMAIN_UID}-rcu-access \ + -d $DOMAIN_UID -n $DOMAIN_NAMESPACE \ + -l rcu_prefix=FMW${CUSTOM_DOMAIN_NAME} \ + -l rcu_schema_password=Oradoc_db1 \ + -l rcu_db_conn_string=oracle-db.${DB_NAMESPACE}.svc.cluster.local:1521/devpdb.k8s + echo "@@ Info: Creating OPSS wallet password secret (ignored unless domain type is JRF)" + $WORKDIR/utils/create-secret.sh $DRY_RUN -s ${DOMAIN_UID}-opss-wallet-password-secret \ + -d $DOMAIN_UID -n $DOMAIN_NAMESPACE \ + -l walletPassword=welcome1 +fi + +# +# Datasource access secret. This is needed for the sample's optional +# 'configuration.model.configMap' because it contains a model file +# with an '@@SECRET' macro that references this datasource secret. +# + +if [ "${INCLUDE_MODEL_CONFIGMAP}" = "true" ]; then + # this secret is referenced by the datasource in this sample's optional config.configMap + echo "@@ Info: Creating datasource secret" + $WORKDIR/utils/create-secret.sh $DRY_RUN \ + -d $DOMAIN_UID -n $DOMAIN_NAMESPACE \ + -n ${DOMAIN_NAMESPACE} \ + -s ${DOMAIN_UID}-datasource-secret \ + -l password=Oradoc_db1 \ + -l url=jdbc:oracle:thin:@oracle-db.${DB_NAMESPACE}.svc.cluster.local:1521/devpdb.k8s +fi diff --git a/src/integration-tests/model-in-image/mii-sample-wrapper/env-init.sh b/src/integration-tests/model-in-image/mii-sample-wrapper/env-init.sh new file mode 100755 index 00000000000..319a78bebfa --- /dev/null +++ b/src/integration-tests/model-in-image/mii-sample-wrapper/env-init.sh @@ -0,0 +1,69 @@ +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# This file sets the defaults for the sample wrapper scripts, +# and does other actions that are common to all of the sample's scripts. + +WORKDIR=${WORKDIR:-/tmp/$USER/model-in-image-sample-work-dir} + +SCRIPTDIR="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" +SRCDIR="$( cd "$SCRIPTDIR/../../../.." > /dev/null 2>&1 ; pwd -P )" +MIISAMPLEDIR="$( cd "$SRCDIR/kubernetes/samples/scripts/create-weblogic-domain/model-in-image" > /dev/null 2>&1 ; pwd -P )" + +WDT_DOMAIN_TYPE=${WDT_DOMAIN_TYPE:-WLS} + +if [ ! "$WDT_DOMAIN_TYPE" = "WLS" ] \ + && [ ! "$WDT_DOMAIN_TYPE" = "RestrictedJRF" ] \ + && [ ! "$WDT_DOMAIN_TYPE" = "JRF" ]; then + echo "@@ Error: Invalid domain type WDT_DOMAIN_TYPE '$WDT_DOMAIN_TYPE': expected 'WLS', 'JRF', or 'RestrictedJRF'." + exit 1 +fi + +DOMAIN_UID=${DOMAIN_UID:-sample-domain1} +DOMAIN_NAMESPACE=${DOMAIN_NAMESPACE:-sample-domain1-ns} +CUSTOM_DOMAIN_NAME=${CUSTOM_DOMAIN_NAME:-domain1} + +DOMAIN_RESOURCE_TEMPLATE="${DOMAIN_RESOURCE_TEMPLATE:-mii-domain.yaml.template-$WDT_DOMAIN_TYPE}" +DOMAIN_RESOURCE_FILENAME="${DOMAIN_RESOURCE_FILENAME:-domain-resources/mii-${DOMAIN_UID}.yaml}" + +DB_NAMESPACE=${DB_NAMESPACE:-default} + +DOWNLOAD_WIT=${DOWNLOAD_WIT:-when-missing} +DOWNLOAD_WDT=${DOWNLOAD_WDT:-when-missing} +WDT_INSTALLER_URL=${WDT_INSTALLER_URL:-https://github.com/oracle/weblogic-deploy-tooling/releases/latest} +WIT_INSTALLER_URL=${WIT_INSTALLER_URL:-https://github.com/oracle/weblogic-image-tool/releases/latest} + +if [ "$WDT_DOMAIN_TYPE" = "WLS" ]; then + defaultBaseImage="container-registry.oracle.com/middleware/weblogic" +else + defaultBaseImage="container-registry.oracle.com/middleware/fmw-infrastructure" +fi + +BASE_IMAGE_NAME="${BASE_IMAGE_NAME:-$defaultBaseImage}" +BASE_IMAGE_TAG=${BASE_IMAGE_TAG:-12.2.1.4} +BASE_IMAGE="${BASE_IMAGE_NAME}:${BASE_IMAGE_TAG}" + +MODEL_IMAGE_NAME=${MODEL_IMAGE_NAME:-model-in-image} +MODEL_IMAGE_TAG=${MODEL_IMAGE_TAG:-${WDT_DOMAIN_TYPE}-v1} +MODEL_IMAGE="${MODEL_IMAGE_NAME}:${MODEL_IMAGE_TAG}" +MODEL_IMAGE_BUILD=${MODEL_IMAGE_BUILD:-always} +MODEL_DIR=${MODEL_DIR:-model-images/model-in-image__${MODEL_IMAGE_TAG}} + +IMAGE_PULL_SECRET_NAME=${IMAGE_PULL_SECRET_NAME:-""} + +ARCHIVE_SOURCEDIR=${ARCHIVE_SOURCEDIR:-archives/archive-v1} + +INCLUDE_MODEL_CONFIGMAP=${INCLUDE_MODEL_CONFIGMAP:-false} + +INTROSPECTOR_DEADLINE_SECONDS=${INTROSPECTOR_DEADLINE_SECONDS:-300} + +echo "@@" +echo "@@ ######################################################################" +[ $# -eq 0 ] && echo "@@ Info: Running '$(basename "$0")'" +[ $# -ne 0 ] && echo "@@ Info: Running '$(basename "$0") $@'" +echo "@@ Info: WORKDIR='$WORKDIR'." +echo "@@ Info: SCRIPTDIR='$SCRIPTDIR'." +echo "@@ Info: MIISAMPLEDIR='$MIISAMPLEDIR'." +echo "@@ Info: DOMAIN_UID='$DOMAIN_UID'." +echo "@@ Info: DOMAIN_NAMESPACE='$DOMAIN_NAMESPACE'." + diff --git a/src/integration-tests/model-in-image/mii-sample-wrapper/generate-sample-doc.sh b/src/integration-tests/model-in-image/mii-sample-wrapper/generate-sample-doc.sh new file mode 100755 index 00000000000..246c4ed679e --- /dev/null +++ b/src/integration-tests/model-in-image/mii-sample-wrapper/generate-sample-doc.sh @@ -0,0 +1,221 @@ +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# +# Summary: +# +# This script generates 'dry run' output suitable +# for the MII sample. It uses local templates, helper +# scripts, and files in the MII sample to generate +# the following 'complete sample' in '$GENROOTDIR/mii-sample': +# +# - model image archives (applications) +# - model image files (wl config) +# - image build scripts for above model image archive/files +# - tooling download script +# - model configmap creation script/source +# - domain resources +# - secret creation scripts for above model file, configmap, and domain resource +# - traefik ingress yaml +# +# This script exits with a non-zero exit code if: +# +# - Directory '/$GENROOTDIR/mii-sample' already exists. +# - A generated domain resource or ingress yaml does +# not match yaml checked into the MII sample. +# +# Default for GENROOTDIR is "/tmp". +# +# TBD add parm to run the 'tooling' script - since that calls curl... +# + +SCRIPTDIR="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" +SRCDIR="$( cd "$SCRIPTDIR/../../../.." > /dev/null 2>&1 ; pwd -P )" +MIISAMPLEDIR="$( cd "$SRCDIR/kubernetes/samples/scripts/create-weblogic-domain/model-in-image" > /dev/null 2>&1 ; pwd -P )" + +set -e +set -o pipefail +set -u + +# setup globals based on phase, the phases match the phases in the MII sample +function phase_setup() { + case "$1" in + # An initial domain with admin server, web-app 'v1', and a single cluster 'cluster-1' with 2 replicas. + initial) + domain_num=1 + image_version=v1 + archive_version=v1 + configmap=false + ;; + # Same as initial, plus a data source targeted to 'cluster-1' which is dynamically supplied using a model configmap. + update1) + domain_num=1 + image_version=v1 + archive_version=v1 + configmap=true + ;; + # Same as update1, with a second domain with its own uid 'sample-domain2' that's based on the update1 domain's resource file. + update2) + domain_num=2 + image_version=v1 + archive_version=v1 + configmap=true + ;; + # Similar to update1, except deploy an updated web-app 'v2' while keeping the original app in the archive. + update3) + domain_num=1 + image_version=v2 + archive_version=v2 + configmap=true + ;; + *) + echo "Error: Unknown phase $1." + ;; + esac +} + +# +# Init WORKDIR +# + +export WORKDIR=${GENROOTDIR:-/tmp}/mii-sample + +echo "@@ Info: Starting '$(basename $0)'. See target directory '$WORKDIR'." + +if [ -d $WORKDIR ] && [ "$(ls $WORKDIR)" ]; then + echo "@@ Error: Target dir $WORKDIR already exists." + exit 1 +fi + +mkdir -p $WORKDIR +cd $WORKDIR + +# +# Copy over the sample to WORKDIR, but don't keep the ingress & domain yaml resources (we will regenerate them) +# + +cp -r $MIISAMPLEDIR/* $WORKDIR +rm -f $WORKDIR/domain-resources/WLS/*.yaml +rm -f $WORKDIR/domain-resources/JRF/*.yaml +rm -f $WORKDIR/ingresses/*.yaml + +# +# Stage commands for downloading WDT and WIT installer zips +# + +$SCRIPTDIR/stage-tooling.sh -dry | grep dryrun | sed 's/dryrun://' > $WORKDIR/model-images/download-tooling.sh +chmod +x $WORKDIR/model-images/download-tooling.sh + +# +# Stage everything else +# + +for phase in initial update1 update2 update3; do + + phase_setup $phase + + export DOMAIN_NAMESPACE=sample-domain1-ns + export DOMAIN_UID=sample-domain$domain_num + export ARCHIVE_SOURCEDIR="archives/archive-$archive_version" + export INCLUDE_MODEL_CONFIGMAP=$configmap + export CUSTOM_DOMAIN_NAME=domain$domain_num + export MODEL_IMAGE_NAME=model-in-image + export INTROSPECTOR_DEADLINE_SECONDS=600 + export IMAGE_PULL_SECRET_NAME="" + + # setup ingress yaml files + $SCRIPTDIR/stage-and-create-ingresses.sh -dry + + for type in WLS JRF; do + + export WDT_DOMAIN_TYPE=$type + export MODEL_IMAGE_TAG=$type-$image_version + export MODEL_DIR=model-images/${MODEL_IMAGE_NAME}__${MODEL_IMAGE_TAG} + + # setup image build scripts + + if [ -d $WORKDIR/$MODEL_DIR ]; then + $SCRIPTDIR/build-model-image.sh -dry \ + | grep dryrun | sed 's/dryrun://' \ + > $WORKDIR/$MODEL_DIR/build-image.sh + chmod +x $WORKDIR/$MODEL_DIR/build-image.sh + fi + + # setup domain resource + + domain_path=domain-resources/$type/mii-$phase-d$domain_num-$MODEL_IMAGE_TAG + if [ "$configmap" = "true" ]; then + domain_path=$domain_path-ds + fi + export DOMAIN_RESOURCE_FILENAME=$domain_path.yaml + $SCRIPTDIR/stage-domain-resource.sh + + # setup secret script for the domain resource + + $SCRIPTDIR/create-secrets.sh -dry kubectl | grep dryrun | sed 's/dryrun://' > $WORKDIR/$domain_path.secrets.sh + chmod +x $WORKDIR/$domain_path.secrets.sh + + # setup script for the configmap + + if [ "$configmap" = "true" ]; then + $WORKDIR/utils/create-configmap.sh \ + -c ${DOMAIN_UID}-wdt-config-map \ + -f ${WORKDIR}/model-configmaps/datasource \ + -d $DOMAIN_UID \ + -n $DOMAIN_NAMESPACE \ + -dry kubectl | grep dryrun | sed 's/dryrun://' \ + > $WORKDIR/$domain_path.model-configmap.sh + chmod +x $WORKDIR/$domain_path.model-configmap.sh + fi + + done +done + +echo "@@" +echo "@@ ##############################################" +echo "@@" + +# +# Assert that generated ingress and domain resource +# yaml files match the files in the sample's git check-in. +# + +yaml_error=false + +function yaml_compare() { + set -e + cd $1 + for line in $(find . -name "*.yaml"); do + if [ ! -f "$2/$line" ]; then + echo "@@ Error: file '$1/$line' exists, but file '$2/$line' does not." + yaml_error=true + else + set +e + diff $line $2/$line > /dev/null 2>&1 + if [ $? -ne 0 ]; then + echo "@@ Error: file '$1/$line' differs from '$2/$line':" + diff $line $2/$line + yaml_error=true + fi + set -e + fi + done +} + +yaml_compare $WORKDIR $MIISAMPLEDIR +yaml_compare $MIISAMPLEDIR $WORKDIR + +if [ "$yaml_error" = "true" ]; then + echo "@@ Error: Files in '$MIISAMPLEDIR' don't match the files generated by '$SCRIPTDIR/$(basename $0)'." + echo "@@ Error: The mismatch could be due to a direct edit of a generated file in '$MIISAMPLEDIR' (which is not supported)." + echo "@@ Error: The mismatch could be due to an edit of a domain resource template in '$SCRIPTDIR/*template*' " + echo "@@ or an edit of an ingress template in '$SCRIPTDIR/stage-and-create-ingresses.sh', where the generated " + echo "@@ result from this script '$0' was not checked into git at '$MIISAMPLEDIR'." + echo "@@" + exit 1 +else + echo "@@ Info: Confirmed that files in '$MIISAMPLEDIR' match the files generated by '$SCRIPTDIR/$(basename $0)'." + echo "@@ Info: Finished '$(basename $0)'! See target directory '$WORKDIR'." + echo "@@" +fi + diff --git a/src/integration-tests/model-in-image/mii-sample-wrapper/mii-domain.yaml.template-JRF b/src/integration-tests/model-in-image/mii-sample-wrapper/mii-domain.yaml.template-JRF new file mode 100644 index 00000000000..d15824db476 --- /dev/null +++ b/src/integration-tests/model-in-image/mii-sample-wrapper/mii-domain.yaml.template-JRF @@ -0,0 +1,153 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. +# +# This is an example of how to define a Domain resource. +# +apiVersion: "weblogic.oracle/v8" +kind: Domain +metadata: + name: @@DOMAIN_UID@@ + namespace: @@DOMAIN_NAMESPACE@@ + labels: + weblogic.domainUID: @@DOMAIN_UID@@ + +spec: + # Set to 'FromModel' to indicate 'Model in Image'. + domainHomeSourceType: FromModel + + # The WebLogic Domain Home, this must be a location within + # the image for 'Model in Image' domains. + domainHome: /u01/domains/@@DOMAIN_UID@@ + + # The WebLogic Server Docker image that the Operator uses to start the domain + image: "@@MODEL_IMAGE_NAME@@:@@MODEL_IMAGE_TAG@@" + + # Defaults to "Always" if image tag (version) is ':latest' + imagePullPolicy: "IfNotPresent" + + # Identify which Secret contains the credentials for pulling an image + #imagePullSecrets: + #- name: @@IMAGE_PULL_SECRET_NAME@@ + + # Identify which Secret contains the WebLogic Admin credentials, + # the secret must contain 'username' and 'password' fields. + webLogicCredentialsSecret: + name: @@DOMAIN_UID@@-weblogic-credentials + + # Whether to include the WebLogic Server stdout in the pod's stdout, default is true + includeServerOutInPodLog: true + + # Whether to enable overriding your log file location, see also 'logHome' + #logHomeEnabled: false + + # The location for domain log, server logs, server out, and Node Manager log files + # see also 'logHomeEnabled', 'volumes', and 'volumeMounts'. + #logHome: /shared/logs/@@DOMAIN_UID@@ + + # Set which WebLogic Servers the Operator will start + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server, and clustered servers up to their replica count. + serverStartPolicy: "IF_NEEDED" + + # Settings for all server pods in the domain including the introspector job pod + serverPod: + # Optional new or overridden environment variables for the domain's pods + # - This sample uses CUSTOM_DOMAIN_NAME in its image model file + # to set the Weblogic domain name + env: + - name: CUSTOM_DOMAIN_NAME + value: "@@CUSTOM_DOMAIN_NAME@@" + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx1024m " + resources: + requests: + cpu: "500m" + memory: "1280Mi" + + # Optional volumes and mounts for the domain's pods. See also 'logHome'. + #volumes: + #- name: weblogic-domain-storage-volume + # persistentVolumeClaim: + # claimName: @@DOMAIN_UID@@-weblogic-sample-pvc + #volumeMounts: + #- mountPath: /shared + # name: weblogic-domain-storage-volume + + # The desired behavior for starting the domain's administration server. + adminServer: + # The serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + # Setup a Kubernetes node port for the administration server default channel + #adminService: + # channels: + # - channelName: default + # nodePort: 30701 + serverPod: + # Optional new or overridden environment variables for the admin pods + env: + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms512m -Xmx1024m " + + # The number of managed servers to start for unlisted clusters + replicas: 1 + + # The desired behavior for starting a specific cluster's member servers + clusters: + - clusterName: cluster-1 + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: 2 + + # Change the restartVersion to force the introspector job to rerun + # and apply any new model configuration, to also force a subsequent + # roll of your domain's WebLogic Server pods. + restartVersion: '1' + + configuration: + + # Settings for domainHomeSourceType 'FromModel' + model: + # Valid model domain types are 'WLS', 'JRF', and 'RestrictedJRF', default is 'WLS' + domainType: "JRF" + + # Optional configmap for additional models and variable files + #configMap: @@DOMAIN_UID@@-wdt-config-map + + # All 'FromModel' domains require a runtimeEncryptionSecret with a 'password' field + runtimeEncryptionSecret: @@DOMAIN_UID@@-runtime-encryption-secret + + # Secrets that are referenced by model yaml macros + # (the model yaml in the optional configMap or in the image) + secrets: + #- @@DOMAIN_UID@@-datasource-secret + - @@DOMAIN_UID@@-rcu-access + + # Increase the introspector job active timeout value for JRF use cases + introspectorJobActiveDeadlineSeconds: @@INTROSPECTOR_DEADLINE_SECONDS@@ + + opss: + + # Name of secret with walletPassword for extracting the wallet, used for JRF domains + walletPasswordSecret: @@DOMAIN_UID@@-opss-wallet-password-secret + + # Name of secret with walletFile containing base64 encoded opss wallet, used for JRF domains + #walletFileSecret: @@DOMAIN_UID@@-opss-walletfile-secret diff --git a/src/integration-tests/model-in-image/mii-sample-wrapper/mii-domain.yaml.template-WLS b/src/integration-tests/model-in-image/mii-sample-wrapper/mii-domain.yaml.template-WLS new file mode 100644 index 00000000000..db1941f47f6 --- /dev/null +++ b/src/integration-tests/model-in-image/mii-sample-wrapper/mii-domain.yaml.template-WLS @@ -0,0 +1,136 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. +# +# This is an example of how to define a Domain resource. +# +apiVersion: "weblogic.oracle/v8" +kind: Domain +metadata: + name: @@DOMAIN_UID@@ + namespace: @@DOMAIN_NAMESPACE@@ + labels: + weblogic.domainUID: @@DOMAIN_UID@@ + +spec: + # Set to 'FromModel' to indicate 'Model in Image'. + domainHomeSourceType: FromModel + + # The WebLogic Domain Home, this must be a location within + # the image for 'Model in Image' domains. + domainHome: /u01/domains/@@DOMAIN_UID@@ + + # The WebLogic Server Docker image that the Operator uses to start the domain + image: "@@MODEL_IMAGE_NAME@@:@@MODEL_IMAGE_TAG@@" + + # Defaults to "Always" if image tag (version) is ':latest' + imagePullPolicy: "IfNotPresent" + + # Identify which Secret contains the credentials for pulling an image + #imagePullSecrets: + #- name: @@IMAGE_PULL_SECRET_NAME@@ + + # Identify which Secret contains the WebLogic Admin credentials, + # the secret must contain 'username' and 'password' fields. + webLogicCredentialsSecret: + name: @@DOMAIN_UID@@-weblogic-credentials + + # Whether to include the WebLogic Server stdout in the pod's stdout, default is true + includeServerOutInPodLog: true + + # Whether to enable overriding your log file location, see also 'logHome' + #logHomeEnabled: false + + # The location for domain log, server logs, server out, and Node Manager log files + # see also 'logHomeEnabled', 'volumes', and 'volumeMounts'. + #logHome: /shared/logs/@@DOMAIN_UID@@ + + # Set which WebLogic Servers the Operator will start + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server, and clustered servers up to their replica count. + serverStartPolicy: "IF_NEEDED" + + # Settings for all server pods in the domain including the introspector job pod + serverPod: + # Optional new or overridden environment variables for the domain's pods + # - This sample uses CUSTOM_DOMAIN_NAME in its image model file + # to set the Weblogic domain name + env: + - name: CUSTOM_DOMAIN_NAME + value: "@@CUSTOM_DOMAIN_NAME@@" + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx512m " + resources: + requests: + cpu: "250m" + memory: "768Mi" + + # Optional volumes and mounts for the domain's pods. See also 'logHome'. + #volumes: + #- name: weblogic-domain-storage-volume + # persistentVolumeClaim: + # claimName: @@DOMAIN_UID@@-weblogic-sample-pvc + #volumeMounts: + #- mountPath: /shared + # name: weblogic-domain-storage-volume + + # The desired behavior for starting the domain's administration server. + adminServer: + # The serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + # Setup a Kubernetes node port for the administration server default channel + #adminService: + # channels: + # - channelName: default + # nodePort: 30701 + + # The number of managed servers to start for unlisted clusters + replicas: 1 + + # The desired behavior for starting a specific cluster's member servers + clusters: + - clusterName: cluster-1 + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: 2 + + # Change the restartVersion to force the introspector job to rerun + # and apply any new model configuration, to also force a subsequent + # roll of your domain's WebLogic Server pods. + restartVersion: '1' + + configuration: + + # Settings for domainHomeSourceType 'FromModel' + model: + # Valid model domain types are 'WLS', 'JRF', and 'RestrictedJRF', default is 'WLS' + domainType: "WLS" + + # Optional configmap for additional models and variable files + #configMap: @@DOMAIN_UID@@-wdt-config-map + + # All 'FromModel' domains require a runtimeEncryptionSecret with a 'password' field + runtimeEncryptionSecret: @@DOMAIN_UID@@-runtime-encryption-secret + + # Secrets that are referenced by model yaml macros + # (the model yaml in the optional configMap or in the image) + #secrets: + #- @@DOMAIN_UID@@-datasource-secret diff --git a/src/integration-tests/model-in-image/mii-sample-wrapper/stage-and-create-ingresses.sh b/src/integration-tests/model-in-image/mii-sample-wrapper/stage-and-create-ingresses.sh new file mode 100755 index 00000000000..acd2ae7df90 --- /dev/null +++ b/src/integration-tests/model-in-image/mii-sample-wrapper/stage-and-create-ingresses.sh @@ -0,0 +1,186 @@ +#!/bin/bash +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# +# This script stages Traefik ingresses for this sample's admin +# server and cluster ingresses to yaml files in WORKDIR/ingresses. +# It than calls 'kubectl apply -f' on the yaml by default. +# +# Note: For admin server ingresses, it skips generating yaml or +# calling apply -f unless the DOMAIN_UID is 'sample-domain1' because +# multiple admin server ingresses would compete for the +# same wide open 'host'. See internal comments below for details. +# +# It assumes the following: +# - Traefik is (or will be) deployed, and monitors DOMAIN_NAMESPACE +# (otherwise the ingresses will simply be ignored). +# - Traefik's external port is 30305. +# - The WL admin server is named 'admin-server' and listens on port 7001. +# - a first WL cluster is named 'cluster-1' and listens on port 8001. +# - A second WL cluster (if any) is named 'cluster-2' and listens on port 9001. +# +# Optional param: +# '-dry' Stage the ingress yaml files, but don't call 'kubectl'. +# +# Optional environment variables (see ./README for details): +# WORKDIR +# DOMAIN_NAMESPACE +# DOMAIN_UID +# + +set -eu +set -o pipefail + +SCRIPTDIR="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" +source $SCRIPTDIR/env-init.sh + +DRY_RUN="false" +[ "${1:-}" = "-dry" ] && DRY_RUN="true" + +function get_service_name() { + # $1 is service name + echo $(tr [A-Z_] [a-z-] <<< $1) +} + +function get_service_yaml() { + # $1 is service name + echo "$WORKDIR/ingresses/traefik-ingress-$(get_service_name $1).yaml" +} + +function get_kube_address() { + echo "\$(kubectl cluster-info | grep KubeDNS | sed 's;^.*//;;' | sed 's;:.*$;;')" +} + +function get_sample_host() { + # $1 is service name + tr [A-Z_] [a-z-] <<< $1.mii-sample.org +} + +function get_curl_command() { + # $1 is service name + echo "curl -s -S -m 10 -H 'host: $(get_sample_host $1)'" +} + +function timestamp() { + date --utc '+%Y-%m-%dT%H:%M:%S' +} + +function get_help() { + # $1 is echo prefix + # $2 is service name + echo "${1:-}" + echo "${1:-} This is a Traefik ingress for service '${2}'." + echo "${1:-}" + echo "${1:-} Sample curl access:" + echo "${1:-}" + echo "${1:-} Using 'localhost':" + echo "${1:-} $(get_curl_command $2) \\" + echo "${1:-} http://localhost:30305/myapp_war/index.jsp" + echo "${1:-} - or -" + echo "${1:-} Using 'machine host':" + echo "${1:-} $(get_curl_command $2) \\" + echo "${1:-} http://\$(hostname).\$(dnsdomainname):30305/myapp_war/index.jsp" + echo "${1:-} - or -" + echo "${1:-} Using 'kubernetes cluster host':" + echo "${1:-} $(get_curl_command $2) \\" + echo "${1:-} http://$(get_kube_address):30305/myapp_war/index.jsp" + echo "${1:-}" + echo "${1:-} If Traefik is unavailable and your admin server pod is running, try 'kubectl exec':" + echo "${1:-}" + echo "${1:-} kubectl exec -n sample-domain1-ns $DOMAIN_UID-admin-server -- bash -c \\" + echo "${1:-} \"curl -s -S -m 10 http://$service_name:8001/myapp_war/index.jsp\"" + echo "${1:-}" +} + +mkdir -p $WORKDIR/ingresses + +for service_name in $DOMAIN_UID-admin-server \ + $DOMAIN_UID-cluster-cluster-1 +do + + target_yaml="$(get_service_yaml $service_name)" + + echo "@@ Info: Generating ingress file '$target_yaml'." + + if [ "${service_name/admin//}" = "$service_name" ]; then + # assume we're _not_ an admin server + + cat << EOF > "$target_yaml" +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +$(get_help "# " "$service_name") + +apiVersion: networking.k8s.io/v1beta1 +kind: Ingress +metadata: + name: traefik-ingress-$(get_service_name $service_name) + namespace: ${DOMAIN_NAMESPACE} + labels: + weblogic.domainUID: ${DOMAIN_UID} + annotations: + kubernetes.io/ingress.class: traefik +spec: + rules: + - host: $(get_sample_host $service_name) + http: + paths: + - path: + backend: + serviceName: $(get_service_name $service_name) + servicePort: 8001 +EOF + + else + + # assume we're an admin server + # + # Note: The admin server console doesn't easily support setting host in an + # ingress for demo purposes (it requires configuring /etc/hosts or DNS to + # make the host resolvable by the browser), so we don't set the host. This + # has the limitation that only one admin ingress and therefore only one + # admin console on one domain-uid should be deployed per Traefik node port, + # since more than one would try route form the same port... + + if [ "$DOMAIN_UID" = "sample-domain1" ]; then + + cat << EOF > "$target_yaml" +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +apiVersion: networking.k8s.io/v1beta1 +kind: Ingress +metadata: + name: traefik-ingress-$(get_service_name $service_name) + namespace: ${DOMAIN_NAMESPACE} + labels: + weblogic.domainUID: ${DOMAIN_UID} + annotations: + kubernetes.io/ingress.class: traefik +spec: + rules: + - host: + http: + paths: + - path: /console + backend: + serviceName: $(get_service_name $service_name) + servicePort: 7001 +EOF + fi + fi + + if [ ! "$DRY_RUN" = "true" ] && [ -e "$target_yaml" ]; then + echo "@@ Info: Creating traefik ingresses." + + kubectl delete -f "$target_yaml" --ignore-not-found + kubectl apply -f "$target_yaml" + + if [ "${service_name/admin//}" = "$service_name" ]; then + # assume we're _not_ an admin server + get_help "@@ Info: " "$service_name" + fi + fi + +done diff --git a/src/integration-tests/model-in-image/mii-sample-wrapper/stage-domain-resource.sh b/src/integration-tests/model-in-image/mii-sample-wrapper/stage-domain-resource.sh new file mode 100755 index 00000000000..2dd6a0874be --- /dev/null +++ b/src/integration-tests/model-in-image/mii-sample-wrapper/stage-domain-resource.sh @@ -0,0 +1,77 @@ +#!/bin/bash +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# +# This is an example of how to configure a model-in-image domain resource. +# +# This script creates 'WORKDIR/DOMAIN_RESOURCE_FILENAME' +# from template './DOMAIN_RESOURCE_TEMPLATE'. +# +# Optional environment variables (see ./README for details): +# +# WORKDIR, CUSTOM_DOMAIN_NAME, DOMAIN_UID, DOMAIN_NAMESPACE +# MODEL_IMAGE_NAME, MODEL_IMAGE_TAG, IMAGE_PULL_SECRET_NAME +# WDT_DOMAIN_TYPE +# INCLUDE_MODEL_CONFIGMAP +# DOMAIN_RESOURCE_FILENAME, DOMAIN_RESOURCE_TEMPLATE +# + +set -eu +set -o pipefail + +SCRIPTDIR="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" +source $SCRIPTDIR/env-init.sh + +for var in DOMAIN_UID \ + DOMAIN_NAMESPACE \ + CUSTOM_DOMAIN_NAME \ + WDT_DOMAIN_TYPE \ + IMAGE_PULL_SECRET_NAME \ + MODEL_IMAGE_NAME \ + MODEL_IMAGE_TAG \ + INCLUDE_MODEL_CONFIGMAP \ + DOMAIN_RESOURCE_FILENAME \ + DOMAIN_RESOURCE_TEMPLATE \ + INTROSPECTOR_DEADLINE_SECONDS +do + echo "@@ Info: ${var}=${!var}" +done + +mkdir -p $(dirname $WORKDIR/$DOMAIN_RESOURCE_FILENAME) + +echo "@@" +echo "@@ Info: Creating domain resource file 'WORKDIR/DOMAIN_RESOURCE_FILENAME' from 'SCRIPTDIR/DOMAIN_RESOURCE_TEMPLATE'" +echo "@@" + +cp "$SCRIPTDIR/$DOMAIN_RESOURCE_TEMPLATE" "$WORKDIR/$DOMAIN_RESOURCE_FILENAME" + +if [ ! -z "${IMAGE_PULL_SECRET_NAME}" ]; then + sed -i -e "s;\#\(imagePullSecrets:\);\1;" "$WORKDIR/$DOMAIN_RESOURCE_FILENAME" + sed -i -e "s;\#\(-.*IMAGE_PULL_SECRET_NAME\);\1;" "$WORKDIR/$DOMAIN_RESOURCE_FILENAME" +fi + +IMAGE_PULL_SECRET_NAME="${IMAGE_PULL_SECRET_NAME:-regsecret}" + +for template_var in WDT_DOMAIN_TYPE \ + CUSTOM_DOMAIN_NAME \ + DOMAIN_UID \ + DOMAIN_NAMESPACE \ + IMAGE_PULL_SECRET_NAME \ + MODEL_IMAGE_NAME \ + MODEL_IMAGE_TAG \ + INTROSPECTOR_DEADLINE_SECONDS +do + sed -i -e "s;@@${template_var}@@;${!template_var};" "$WORKDIR/$DOMAIN_RESOURCE_FILENAME" +done + + +if [ "${INCLUDE_MODEL_CONFIGMAP}" = "true" ]; then + # we're going to deploy and use the model.configuration.configMap, and this + # configmap depends on the datasource-secret. + sed -i -e "s;\#\(configMap:\);\1;" "$WORKDIR/$DOMAIN_RESOURCE_FILENAME" + sed -i -e "s;\#\(secrets:\);\1;" "$WORKDIR/$DOMAIN_RESOURCE_FILENAME" + sed -i -e "s;\#\(-.*datasource-secret\);\1;" "$WORKDIR/$DOMAIN_RESOURCE_FILENAME" +fi + +echo "@@ Info: Done." diff --git a/src/integration-tests/model-in-image/mii-sample-wrapper/stage-tooling.sh b/src/integration-tests/model-in-image/mii-sample-wrapper/stage-tooling.sh new file mode 100755 index 00000000000..165b97f824b --- /dev/null +++ b/src/integration-tests/model-in-image/mii-sample-wrapper/stage-tooling.sh @@ -0,0 +1,102 @@ +#!/bin/bash +# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# +# This script downloads the latest version of the WebLogic Deploy Tooling +# and of the WebLogic Image Tool to WORKDIR/weblogic-deploy-tooling.zip +# and WORKDIR/weblogic-image-tool.zip by default. +# +# Optional command line: +# -dry Show, but don't perform, the final download command. (This +# may still implicilty perform some web actions in order +# to locate the installer in github.com). +# +# Optional environment variables (see README for details): +# +# http_proxy https_proxy +# If running behind a proxy, then set as needed to allow curl access +# to github.com. +# +# WORKDIR +# DOWNLOAD_WDT DOWNLOAD_WIT +# WDT_INSTALLER_URL WIT_INSTALLER_URL +# + +set -eu +set -o pipefail + +SCRIPTDIR="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" +source $SCRIPTDIR/env-init.sh + +# curl timeout args: + +curl_parms="--connect-timeout 5" +curl_parms+=" --max-time 120" # max seconds for each try +curl_parms+=" --retry 3" # retry up to 3 times +curl_parms+=" --retry-delay 0" # disable exponential backoff +curl_parms+=" --retry-max-time 400" # total seconds before giving up + +dry_run=false +[ "${1:-}" = "-dry" ] && dry_run=true + +cd ${WORKDIR}/model-images + +download_zip() { + set -eu + local ZIPFILE=$1 + local LOCATION=$2 + local DOWNLOAD_VAR_NAME=$3 + local DOWNLOAD=${!DOWNLOAD_VAR_NAME} + + if [ ! "$dry_run" = "true" ] && [ ! "$DOWNLOAD" = "always" ] && [ -f $ZIPFILE ]; then + echo "@@" + echo "@@ -----------------------------------------------------------------------" + echo "@@ Info: NOTE! Skipping '$LOCATION' download since local " + echo "@@ file '$WORKDIR/$ZIPFILE' already exists. " + echo "@@ To force a download, 'export $DOWNLOAD_VAR_NAME=always'. " + echo "@@ -----------------------------------------------------------------------" + echo "@@" + return + fi + + echo "@@ Info: Downloading '$LOCATION' to '$WORKDIR/$ZIPFILE'." + + local iurl="$LOCATION" + if [ "`echo $iurl | grep -c 'https://github.com.*/latest$'`" = "1" ]; then + echo "@@ Info: The location URL matches regex 'https://github.com.*/latest$'. About to convert to direct location." + local tempfile="$(mktemp -u).$(basename $0).$SECONDS.$PPID.$RANDOM" + echo "@@ Info: Calling 'curl $curl_parms -fL $LOCATION -o $tempfile' to find location of latest version." + curl $curl_parms -fL $LOCATION -o $tempfile + LOCATION=https://github.com/$(cat $tempfile | grep "releases/download" | awk '{ split($0,a,/href="/); print a[2]}' | cut -d\" -f 1) + rm -f $tempfile + echo "@@ Info: The location URL matched regex 'https://github.com.*/latest$' so it was converted to '$LOCATION'" + echo "@@ Info: Now downloading '$LOCATION' to '$WORKDIR/$ZIPFILE'." + fi + + if [ ! "$dry_run" = "true" ]; then + rm -f $ZIPFILE + echo "@@ Info: Calling 'curl $curl_parms -fL $LOCATION -o $ZIPFILE'" + curl $curl_parms -fL $LOCATION -o $ZIPFILE + else + echo "dryrun:rm -f $ZIPFILE" + echo "dryrun:curl $curl_parms -fL $LOCATION -o $ZIPFILE" + fi +} + +if [ "$dry_run" = "true" ]; then + echo "dryrun:#!/bin/bash" + echo "dryrun:# Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates." + echo "dryrun:# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl." + echo "dryrun:" + echo "dryrun:set -eux" + echo "dryrun:" +fi + +echo "@@ Info: Proxy settings:" +set +e +env | grep -i _proxy= +set -e + +download_zip weblogic-deploy.zip $WDT_INSTALLER_URL DOWNLOAD_WDT +download_zip imagetool.zip $WIT_INSTALLER_URL DOWNLOAD_WIT diff --git a/src/integration-tests/model-in-image/run-test.sh b/src/integration-tests/model-in-image/run-test.sh new file mode 100755 index 00000000000..4c72fef1058 --- /dev/null +++ b/src/integration-tests/model-in-image/run-test.sh @@ -0,0 +1,445 @@ +#!/bin/bash +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# +# This is a stand-alone test for testing the MII sample. +# +# Note! This is called by integration test 'ItMiiSample.java'. +# +# See "usage()" below for usage. +# + +set -eu +set -o pipefail +trap '[ -z "$(jobs -pr)" ] || kill $(jobs -pr)' SIGINT SIGTERM EXIT + +TESTDIR="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" + +source $TESTDIR/util-dots.sh +source $TESTDIR/util-misc.sh +source $TESTDIR/test-env.sh + +trace "Running end to end MII sample test." + +DRY_RUN=false +DO_CLEANUP=false +DO_CLEANDB=false +DO_DB=false +DO_RCU=false +DO_OPER=false +DO_TRAEFIK=false +DO_CHECK_SAMPLE=false +DO_INITIAL_IMAGE=false +DO_INITIAL_MAIN=false +DO_UPDATE1=false +DO_UPDATE2=false +DO_UPDATE3_IMAGE=false +DO_UPDATE3_MAIN=false +WDT_DOMAIN_TYPE=WLS + +function usage() { + cat << EOF + + Usage: $(basename $0) + + Commonly tuned env vars and their defaults: + + POD_WAIT_TIMEOUT_SECS : 1000 (max wait time for a domain to start) + INTROSPECTOR_DEADLINE_SECONDS: 600 (for JRF runs) + WORKDIR : /tmp/\$USER/mii-sample-work-dir + DOMAIN_NAMESPACE : sample-domain1-ns + MODEL_IMAGE_NAME : model-in-image + IMAGE_PULL_SECRET_NAME: (not set) + DB_NAMESPACE : default (used by -db and -rcu) + DB_IMAGE_PULL_SECRET : docker-secret (used by -db and -rcu) + TRAEFIK_NAMESPACE : traefik-operator-ns (used by -traefik and by tests) + TRAEFIK_HTTP_NODEPORT : 30305 (used by -traefik and by tests, can be 0 to dynamically choose) + TRAEFIK_HTTPS_NODEPORT: 30433 (used by -traefik, can be 0 to dynamically choose) + OPER_NAMESPACE : sample-weblogic-operator-ns (used by -oper) + + (see test-env.sh for full list) + + Misc: + + -dry : Dry run - show but don't do. + -? : This help. + -jrf : Run in JRF mode instead of WLS mode. + Note that this depends on the db being deployed + and initialized via rcu. So either pre-deploy + the db and run rcu or pass '-db' and '-rcu' too. + + Precleanup (occurs first): + + -precleanup : Call cleanup.sh, pre-delete MII image + '\$MODEL_IMAGE_NAME:*', and delete WORKDIR. + -precleandb : Deletes db leftover from running -db. + + + Setup dependencies: + + -oper : Build and deploy Operator. This + operator will monitor '\$DOMAIN_NAMESPACE' + which defaults to 'sample-domain1-ns'. + -traefik : Deploy Traefik. This will monitor + 'DOMAIN_NAMESPACE' which defaults + to 'sample-domain1-ns', and open port 30305. + -db : Deploy Oracle DB. A DB is needed for JRF mode. + See 'test-env.sh' for DB settings. + -rcu : Initialize FMWdomain1 and FMWdomain2 schemas + in the DB. Needed for JRF. + See 'test-env.sh' for DB settings. + + Tests: + + -check-sample : Generate sample and verify that this matches the source + checked into the mii sample git location. + + -initial-image: Build image required for initial use case. + Image is named '\$MODEL_IMAGE_NAME:WLS-v1' or '...:JRF-v1' + + -initial-main : Deployinitial use case (domain resource, secrets, etc). + Domain uid 'sample-domain1'. + Depends on '-initial-image'. + + -update1 : Deploy update1 use case (add data source to initial via configmap). + Domain uid 'sample-domain1'. + Rolls 'sample-domain1' if already running. + Depends on '-initial-image'. + + -update2 : Run update2 use case (deploy second domain similar to -update1). + Domain uid 'sample-domain2'. + Depends on '-initial-image'. + Depends on '-initial-main' (calls its app). + + -update3-image: Build image required for update3 use case. + Image is named '\$MODEL_IMAGE_NAME:WLS-v2' or '...:JRF-v2' + + -update3-main : Run update3 use case (update initial domain's app via new image). + Depends on '-update3-image'. + Rolls 'sample-domain1' if already running. + + -all : All of the above tests. + +EOF +} + +while [ ! -z "${1:-}" ]; do + case "${1}" in + -dry) DRY_RUN="true" ;; + -precleanup) DO_CLEANUP="true" ;; + -precleandb) DO_CLEANDB="true" ;; + -db) DO_DB="true" ;; + -oper) DO_OPER="true" ;; + -traefik) DO_TRAEFIK="true" ;; + -jrf) WDT_DOMAIN_TYPE="JRF" ;; + -rcu) DO_RCU="true" ;; + -check-sample) DO_CHECK_SAMPLE="true" ;; + -initial-image) DO_INITIAL_IMAGE="true" ;; + -initial-main) DO_INITIAL_MAIN="true" ;; + -update1) DO_UPDATE1="true" ;; + -update2) DO_UPDATE2="true" ;; + -update3-image) DO_UPDATE3_IMAGE="true" ;; + -update3-main) DO_UPDATE3_MAIN="true" ;; + -all) DO_CHECK_SAMPLE="true" + DO_INITIAL_IMAGE="true" + DO_INITIAL_MAIN="true" + DO_UPDATE1="true" + DO_UPDATE2="true" + DO_UPDATE3_IMAGE="true" + DO_UPDATE3_MAIN="true" + ;; + -?) usage; exit 0; ;; + *) trace "Error: Unrecognized parameter '${1}', pass '-?' for usage."; exit 1; ;; + esac + shift +done + +# We check that WORKDIR ends in "model-in-image-sample-work-dir" as a safety feature. +# (We're going to 'rm -fr' this directory, and its safer to do that without relying on env vars). + +bname=$(basename $WORKDIR) +if [ ! "$bname" = "model-in-image-sample-work-dir" ] \ + && [ ! "$bname" = "mii-sample" ] ; then + trace "Error: This test requires WORKDIR to end in 'mii-sample' or 'model-in-image-sample-work-dir'. WORKDIR='$WORKDIR'." + exit 1 +fi + +# +# Helper script ($1 == number of pods) +# + +function doPodWait() { + # wl-pod-wait.sh is a public script that's checked into the sample utils directory + + local wcmd="\$WORKDIR/utils/wl-pod-wait.sh -p $1 -d \$DOMAIN_UID -n \$DOMAIN_NAMESPACE -t \$POD_WAIT_TIMEOUT_SECS" + + if [ $1 -eq 0 ]; then + doCommand -c "$wcmd -q" + else + doCommand "$wcmd" + fi +} + +# +# Clean +# + +if [ "$DO_CLEANUP" = "true" ]; then + doCommand -c "echo ====== CLEANUP ======" + + doCommand -c mkdir -p \$WORKDIR + doCommand -c cd \$WORKDIR/.. + if [ "$bname" = "mii-sample" ]; then + doCommand -c rm -fr ./mii-sample + else + doCommand -c rm -fr ./model-in-image-sample-work-dir + fi + doCommand "\$SRCDIR/src/integration-tests/bash/cleanup.sh" + + # delete model images, if any, and dangling images + for m_image in \ + "${MODEL_IMAGE_NAME:-model-in-image}:${WDT_DOMAIN_TYPE}-v1" \ + "${MODEL_IMAGE_NAME:-model-in-image}:${WDT_DOMAIN_TYPE}-v2" + do + if [ ! "$DRY_RUN" = "true" ]; then + if [ ! -z "$(docker images -q $m_image)" ]; then + trace "Info: Forcing model image rebuild by removing old docker image '$m_image'!" + docker image rm $m_image + fi + else + echo "dryrun: [ ! -z "$(docker images -q $m_image)" ] && docker image rm $m_image" + fi + done +fi + +if [ "$DO_CLEANDB" = "true" ]; then + doCommand -c "echo ====== CLEANDB ======" + # TBD call DB sample's cleanup script? + doCommand -c "kubectl -n $DB_NAMESPACE delete deployment oracle-db --ignore-not-found" + doCommand -c "kubectl -n $DB_NAMESPACE delete service oracle-db --ignore-not-found" +fi + +# +# Env var pre-reqs +# + +doCommand -c "echo ====== SETUP ======" +doCommand -c set -e +doCommand -c SRCDIR=$SRCDIR +doCommand -c TESTDIR=$TESTDIR +doCommand -c MIISAMPLEDIR=$MIISAMPLEDIR +doCommand -c MIIWRAPPERDIR=$MIIWRAPPERDIR +doCommand -c DBSAMPLEDIR=$DBSAMPLEDIR +doCommand -c POD_WAIT_TIMEOUT_SECS=$POD_WAIT_TIMEOUT_SECS +doCommand -c source \$TESTDIR/test-env.sh +doCommand -c export WORKDIR=$WORKDIR +doCommand -c export WDT_DOMAIN_TYPE=$WDT_DOMAIN_TYPE +doCommand -c export DOMAIN_NAMESPACE=$DOMAIN_NAMESPACE +doCommand -c mkdir -p \$WORKDIR +doCommand -c cp -r \$MIISAMPLEDIR/* \$WORKDIR + + +# +# Build pre-req (operator) +# + +if [ "$DO_OPER" = "true" ]; then + doCommand -c "echo ====== OPER BUILD ======" + doCommand "\$TESTDIR/build-operator.sh" +fi + +# +# Deploy pre-reqs (db, rcu schema, traefik, operator) +# + +if [ "$DO_DB" = "true" ]; then + doCommand -c "echo ====== DB DEPLOY ======" + # TBD note that start-db (and maybe stop-db) seem to alter files right inside the source tree - + # this should be fixed to have a WORKDIR or similar, and means that they aren't suitable for multi-user/multi-ns environments + doCommand "\$DBSAMPLEDIR/stop-db-service.sh -n \$DB_NAMESPACE" + if [ ! -z "$DB_IMAGE_PULL_SECRET" ]; then + doCommand "\$DBSAMPLEDIR/start-db-service.sh -n \$DB_NAMESPACE -i \$DB_IMAGE_NAME:\$DB_IMAGE_TAG -p \$DB_NODE_PORT -s \$DB_IMAGE_PULL_SECRET" + else + doCommand "\$DBSAMPLEDIR/start-db-service.sh -n \$DB_NAMESPACE -i \$DB_IMAGE_NAME:\$DB_IMAGE_TAG -p \$DB_NODE_PORT" + fi +fi + +if [ "$DO_RCU" = "true" ]; then + for _custom_domain_name_ in domain1 domain2 + do + + doCommand -c "echo ====== DB RCU Schema Init for domain $_custom_domain_name_ ======" + doCommand -c "cd \$SRCDIR/kubernetes/samples/scripts/create-rcu-schema" + + defaultBaseImage="container-registry.oracle.com/middleware/fmw-infrastructure" + BASE_IMAGE_NAME="${BASE_IMAGE_NAME:-$defaultBaseImage}" + BASE_IMAGE_TAG=${BASE_IMAGE_TAG:-12.2.1.4} + + rcuCommand="./create-rcu-schema.sh" + rcuCommand+=" -d oracle-db.\$DB_NAMESPACE.svc.cluster.local:1521/devpdb.k8s" # DB url + rcuCommand+=" -s FMW$_custom_domain_name_" # RCU schema prefix + if [ ! -z "$DB_IMAGE_PULL_SECRET" ]; then + rcuCommand+=" -p \$DB_IMAGE_PULL_SECRET" # FMW infra image pull secret for rcu pod + fi + rcuCommand+=" -i ${BASE_IMAGE_NAME}:${BASE_IMAGE_TAG}" # image for rcu pod + rcuCommand+=" -n \$DB_NAMESPACE" # namespace to run rcu pod + rcuCommand+=" -o \$WORKDIR/rcuoutput_${_custom_domain_name_}" # output directory for generated YAML + doCommand "$rcuCommand" + + # The rcu command leaves a pod named 'rcu' running: + doCommand "kubectl -n $DB_NAMESPACE delete pod rcu --ignore-not-found" + + done +fi + +if [ "$DO_OPER" = "true" ]; then + doCommand -c "echo ====== OPER DEPLOY ======" + doCommand "\$TESTDIR/deploy-operator.sh" +fi + +if [ "$DO_TRAEFIK" = "true" ]; then + doCommand -c "echo ====== TRAEFIK DEPLOY ======" + doCommand "\$TESTDIR/deploy-traefik.sh" +fi + +if [ "$DO_CHECK_SAMPLE" = "true" ]; then + doCommand -c "echo ====== GEN SOURCE AND CHECK MATCHES GIT SOURCE ======" + doCommand "export GENROOTDIR=\$WORKDIR/generated-sample" + doCommand -c cd \$WORKDIR + doCommand -c rm -fr ./generated-sample + doCommand "\$MIIWRAPPERDIR/generate-sample-doc.sh" +fi + +# +# Deploy initial domain, wait for its pods to be ready, and test its cluster app +# + +if [ "$DO_INITIAL_IMAGE" = "true" ]; then + doCommand -c "echo ====== USE CASE: INITIAL-IMAGE ======" + + doCommand "\$MIIWRAPPERDIR/stage-tooling.sh" + doCommand "\$MIIWRAPPERDIR/build-model-image.sh" +fi + +if [ "$DO_INITIAL_MAIN" = "true" ]; then + doCommand -c "echo ====== USE CASE: INITIAL-MAIN ======" + + doCommand -c "export DOMAIN_UID=$DOMAIN_UID1" + doCommand -c "export DOMAIN_RESOURCE_FILENAME=domain-resources/mii-initial.yaml" + doCommand -c "export INCLUDE_CONFIGMAP=false" + + doCommand "\$MIIWRAPPERDIR/stage-domain-resource.sh" + doCommand "\$MIIWRAPPERDIR/create-secrets.sh" + doCommand "\$MIIWRAPPERDIR/stage-and-create-ingresses.sh" + + doCommand -c "kubectl -n \$DOMAIN_NAMESPACE delete domain \$DOMAIN_UID --ignore-not-found" + doPodWait 0 + + doCommand -c "kubectl apply -f \$WORKDIR/\$DOMAIN_RESOURCE_FILENAME" + doPodWait 3 + + if [ ! "$DRY_RUN" = "true" ]; then + diefast # (cheat to speedup a subsequent roll/shutdown) + testapp internal cluster-1 "Hello World!" + testapp traefik cluster-1 "Hello World!" + fi +fi + +# +# Add datasource to the running domain, patch its +# restart version, wait for its pods to roll, and use +# the test app to verify that the datasource deployed. +# + +if [ "$DO_UPDATE1" = "true" ]; then + doCommand -c "echo ====== USE CASE: UPDATE1 ======" + + doCommand -c "export DOMAIN_UID=$DOMAIN_UID1" + doCommand -c "export DOMAIN_RESOURCE_FILENAME=domain-resources/mii-update1.yaml" + doCommand -c "export INCLUDE_MODEL_CONFIGMAP=true" + + doCommand "\$MIIWRAPPERDIR/stage-domain-resource.sh" + doCommand "\$MIIWRAPPERDIR/create-secrets.sh" + doCommand -c "\$WORKDIR/utils/create-configmap.sh -c \${DOMAIN_UID}-wdt-config-map -f \${WORKDIR}/model-configmaps/datasource -d \$DOMAIN_UID -n \$DOMAIN_NAMESPACE" + + doCommand -c "kubectl apply -f \$WORKDIR/\$DOMAIN_RESOURCE_FILENAME" + doCommand "\$WORKDIR/utils/patch-restart-version.sh -d \$DOMAIN_UID -n \$DOMAIN_NAMESPACE" + doPodWait 3 + + if [ ! "$DRY_RUN" = "true" ]; then + diefast # (cheat to speedup a subsequent roll/shutdown) + testapp internal cluster-1 "mynewdatasource" + testapp traefik cluster-1 "mynewdatasource" + fi +fi + +# +# Deploy a second domain to the same ns similar to the +# update1 ns, wait for it to start, and use the test +# app to verify its up. Also verify that the original +# domain is responding to its calls. +# + +if [ "$DO_UPDATE2" = "true" ]; then + doCommand -c "echo ====== USE CASE: UPDATE2 ======" + + doCommand -c "export DOMAIN_UID=$DOMAIN_UID2" + doCommand -c "export DOMAIN_RESOURCE_FILENAME=domain-resources/mii-update2.yaml" + doCommand -c "export INCLUDE_MODEL_CONFIGMAP=true" + doCommand -c "export CUSTOM_DOMAIN_NAME=domain2" + + doCommand "\$MIIWRAPPERDIR/stage-domain-resource.sh" + doCommand "\$MIIWRAPPERDIR/create-secrets.sh" + doCommand "\$MIIWRAPPERDIR/stage-and-create-ingresses.sh" + doCommand -c "\$WORKDIR/utils/create-configmap.sh -c \${DOMAIN_UID}-wdt-config-map -f \${WORKDIR}/model-configmaps/datasource -d \$DOMAIN_UID -n \$DOMAIN_NAMESPACE" + + doCommand -c "kubectl apply -f \$WORKDIR/\$DOMAIN_RESOURCE_FILENAME" + doPodWait 3 + + if [ ! "$DRY_RUN" = "true" ]; then + diefast # (cheat to speedup a subsequent roll/shutdown) + testapp internal cluster-1 "name....domain2" + testapp traefik cluster-1 "name....domain2" + doCommand -c export DOMAIN_UID=$DOMAIN_UID1 + testapp internal cluster-1 "name....domain1" + testapp traefik cluster-1 "name....domain1" + fi +fi + +# +# Deploy an updated application to the first domain +# using an updated image, wait for it to roll, and +# test the app to verify the update took effect. +# + +if [ "$DO_UPDATE3_IMAGE" = "true" ]; then + doCommand -c "echo ====== USE CASE: UPDATE3-IMAGE ======" + doCommand -c "export MODEL_IMAGE_TAG=${WDT_DOMAIN_TYPE}-v2" + doCommand -c "export ARCHIVE_SOURCEDIR=archives/archive-v2" + doCommand "\$MIIWRAPPERDIR/build-model-image.sh" +fi + +if [ "$DO_UPDATE3_MAIN" = "true" ]; then + doCommand -c "echo ====== USE CASE: UPDATE3-MAIN ======" + + doCommand -c "export DOMAIN_UID=$DOMAIN_UID1" + doCommand -c "export DOMAIN_RESOURCE_FILENAME=domain-resources/mii-update3.yaml" + doCommand -c "export INCLUDE_MODEL_CONFIGMAP=true" + doCommand -c "export CUSTOM_DOMAIN_NAME=domain1" + doCommand -c "export MODEL_IMAGE_TAG=${WDT_DOMAIN_TYPE}-v2" + + doCommand "\$MIIWRAPPERDIR/stage-domain-resource.sh" + doCommand -c "kubectl apply -f \$WORKDIR/\$DOMAIN_RESOURCE_FILENAME" + doPodWait 3 + + if [ ! "$DRY_RUN" = "true" ]; then + diefast # (cheat to speedup a subsequent roll/shutdown) + testapp internal cluster-1 "v2" + testapp traefik cluster-1 "v2" + fi +fi + +trace "Woo hoo! Finished without errors! Total runtime $SECONDS seconds." + +# TBD Add JRF wallet export/import testing? There's another test that already tests the sample's import/export script. diff --git a/src/integration-tests/model-in-image/test-env.sh b/src/integration-tests/model-in-image/test-env.sh new file mode 100755 index 00000000000..dea3b18dfde --- /dev/null +++ b/src/integration-tests/model-in-image/test-env.sh @@ -0,0 +1,54 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# +# This file defines env vars and env defaults specific to the test. +# +# For env vars related directly to the sample see +# '$SCRIPTDIR/mii-sample-wrappers/README'. +# (Especially DOMAIN_NAMESPACE, DOMAIN_NAME, and DOMAIN_UID.) +# + +SRCDIR="$( cd "$TESTDIR/../../.." > /dev/null 2>&1 ; pwd -P )" +MIIWRAPPERDIR="${TESTDIR}/mii-sample-wrapper" +MIISAMPLEDIR="${SRCDIR}/kubernetes/samples/scripts/create-weblogic-domain/model-in-image" +DBSAMPLEDIR="${SRCDIR}/kubernetes/samples/scripts/create-oracle-db-service" + +# ::: Directory for sample's temp files +# should have 10GB? of space +# default is '/tmp/$USER/model-in-image-sample-work-dir' +export WORKDIR=${WORKDIR:-/tmp/$USER/model-in-image-sample-work-dir} + +# ::: Operator settings +# Defaults are 'sample-weblogic-operator', '${OPER_NAME}-ns', '${OPER_NAME}-sa', 'weblogic-kubernetes-operator', and 'test' +# export OPER_NAME= +# export OPER_NAMESPACE= +# export OPER_SA= +# export OPER_IMAGE_NAME= +# export OPER_IMAGE_TAG= + +# ::: DB Settings (needed if WDT_DOMAIN_TYPE is JRF) +export DB_NAMESPACE=${DB_NAMESPACE:-default} +export DB_NODE_PORT=${DB_NODE_PORT:-30011} +export DB_IMAGE_NAME=${DB_IMAGE_NAME:-container-registry.oracle.com/database/enterprise} +export DB_IMAGE_TAG=${DB_IMAGE_TAG:-12.2.0.1-slim} +export DB_IMAGE_PULL_SECRET=${DB_IMAGE_PULL_SECRET:-docker-secret} + +# ::: Traefik settings/defaults, set NODEPORT values to 0 to have +# K8S dynamically choose the values for Traefik +export TRAEFIK_NAME=${TRAEFIK_NAME:-traefik-operator} +export TRAEFIK_NAMESPACE=${TRAEFIK_NAMESPACE:-traefik-operator-ns} +export TRAEFIK_HTTP_NODEPORT=${TRAEFIK_HTTP_NODEPORT:-30305} +export TRAEFIK_HTTPS_NODEPORT=${TRAEFIK_HTTPS_NODEPORT:-30433} + +export DOMAIN_UID1="${DOMAIN_UID1:-sample-domain1}" +export DOMAIN_UID2="${DOMAIN_UID2:-sample-domain2}" +export DOMAIN_NAMESPACE=${DOMAIN_NAMESPACE:-sample-domain1-ns} + +# default max time to let introspector run for JRF runs +export INTROSPECTOR_DEADLINE_SECONDS=${INTROSPECTOR_DEADLINE_SECONDS:-600} + +# default max amount of time to wait for all of a domain's pods to start +# NOTE: this _includes_ waiting for the introspector job and so should +# be higher than INTROSPECTOR_DEADLINE_SECONDS +export POD_WAIT_TIMEOUT_SECS=${POD_WAIT_TIMEOUT_SECS:-1000} diff --git a/src/integration-tests/model-in-image/util-dots.sh b/src/integration-tests/model-in-image/util-dots.sh new file mode 100755 index 00000000000..7cb1786fdf6 --- /dev/null +++ b/src/integration-tests/model-in-image/util-dots.sh @@ -0,0 +1,70 @@ +# !/bin/sh +# Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# +# Description: +# ------------ +# +# This helper utility prints dots using a background process +# while a foreground process runs. Use it to provide feedback +# while you wait for the foreground process to finish. +# +# It stops printing dots when any of the following are true: +# - printdots_end is called +# - the process that called printdots_start is no longer around +# - more than 360 seconds has passed +# +# Usage example: +# source ./util_dots.sh +# +# echo -n "Hello" +# printdots_start 1 +# sleep 6 +# printdots_end +# +# The first parameter of printdots_start is the number of seconds +# to wait before each dot - default is 2 seconds. +# +# 'printdots_end' calls 'echo' without any parameters. +# + +printdots_inner() { + local start_pids="`ps $PPID 2>&1`" + local dotsfile=$1 + local begin_sec=$SECONDS + [ -f "$dotsfile" ] || return + while [ 1 -eq 1 ]; do + sleep ${2:-1} + # if parent pids changed, then our parent died and we should exit + local end_pids="`ps $PPID 2>&1`" + [ "$start_pids" = "$end_pids" ] || break + + # if too much time has passed, then exit + [ $((SECONDS-begin_sec)) -lt 360 ] || break + + # if parent deleted our temp file, then exit + [ -f "$dotsfile" ] || break + + echo -n "." + done + rm -f $dotsfile +} + +printdots_start() { + dotsfile=$(mktemp /tmp/dots.`basename $0`.XXXXXXXXX) + touch $dotsfile + printdots_inner $dotsfile ${1:-2} & + printdots_pid=$! + printdots_time_start=$SECONDS +} + +printdots_end() { + rm -f $dotsfile + ( + # it's possible the wait will fail if the dots process exits quickly, so disable error checking + set +e + wait $printdots_pid > /dev/null 2>&1 + ) + echo " ($((SECONDS - printdots_time_start)) seconds)" +} diff --git a/src/integration-tests/model-in-image/util-misc.sh b/src/integration-tests/model-in-image/util-misc.sh new file mode 100755 index 00000000000..0447721466a --- /dev/null +++ b/src/integration-tests/model-in-image/util-misc.sh @@ -0,0 +1,222 @@ +# Copyright (c) 2020, Oracle Corporation and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +function timestamp() { + date --utc '+%Y-%m-%dT%H:%M:%S' +} + +function trace() { + echo @@ "[$(timestamp)]" "[$(basename $0):${BASH_LINENO[0]}]:" "$@" +} + +function tracen() { + echo -n @@ "[$(timestamp)]" "[$(basename $0):${BASH_LINENO[0]}]:" "$@" +} + +# diefast +# +# Use 'diefast' to touch the '/tmp/diefast' file in all WL pods. This will +# cause them to use an unsafe (fast) shutdown when they're deleted/rolled. + +function diefast() { + kubectl -n ${DOMAIN_NAMESPACE:-sample-domain1-ns} get pods -l weblogic.serverName \ + -o=jsonpath='{range .items[*]}{.metadata.namespace}{" "}{.metadata.name}{"\n"}' \ + | awk '{ system("set -x ; kubectl -n " $1 " exec " $2 " touch /tmp/diefast") }' +} + +function get_service_name() { + # $1 is service name + echo $(tr [A-Z_] [a-z-] <<< $1) +} + +function get_service_yaml() { + # $1 is service name + echo "$WORKDIR/ingresses/traefik-ingress-$(get_service_name $1).yaml" +} + +function get_kube_address() { + # kubectl cluster-info | grep KubeDNS | sed 's;^.*//;;' | sed 's;:.*$;;' + # This is the heuristic used by the integration test framework: + echo ${K8S_NODEPORT_HOST:-$(hostname)} +} + +function get_sample_host() { + # $1 is service name + tr [A-Z_] [a-z-] <<< $1.mii-sample.org +} + +function curl_timeout_parms() { + local curl_parms="--connect-timeout 5" + curl_parms+=" --max-time 20" # max seconds for each try + # don't bother retrying - we will retry externally because + # connection refusals don't retry + # curl_parms+=" --retry 5" # retry up to 5 times + # curl_parms+=" --retry-delay 0" # disable exponential backoff + curl_parms+=" --retry-max-time 130" # total seconds before giving up + echo "$curl_parms" +} + +function get_curl_command() { + # $1 is service name + echo "curl -s -S $(curl_timeout_parms) -H 'host: $(get_sample_host $1)'" +} + +# testapp +# +# Use 'testapp internal|traefik cluster-1|cluster-2 somestring' to invoke the test +# WebLogic cluster's jsp app and check that the given string is +# is reflected there-in. +# +# "internal" invokes curl on the admin server +# "traefik" invokes curl locally through the traefik node port +# +# For example, 'testapp internal "Hello World!"'. + +function testapp() { + + # note: we retry 5 times in case services, etc need more time to come up + # curl's internal retry doesn't actually retry if there's a 'connect failure' + + local num_tries=0 + local traefik_nodeport='' + + while [ 1 = 1 ] + do + + domain_uid=${DOMAIN_UID:-sample-domain1} + if [ "$1" = "internal" ]; then + local cluster_service_name=$(get_service_name $domain_uid-cluster-$2) + local admin_service_name=$(get_service_name $domain_uid-admin-server) + local ns=${DOMAIN_NAMESPACE:-sample-domain1-ns} + local command="kubectl exec -n $ns $admin_service_name -- bash -c \"curl -s -S $(curl_timeout_parms) http://$cluster_service_name:8001/myapp_war/index.jsp\"" + + elif [ "$1" = "traefik" ]; then + if [ -z "$traefik_nodeport" ]; then + echo "@@ Info: Obtaining traefik nodeport by calling:" + cat< $target_file 2>&1 + set -e + + # use "cat & sed" instead of "grep" as grep exits with an error when it doesn't find anything + + local before=$(cat $target_file) + local after=$(cat $target_file | sed "s/$3/ADIFFERENTVALUE/g") + + if [ "$before" = "$after" ]; then + echo + echo "@@ Error: '$3' not found in app response for command '$command'. Contents of response file '$target_file':" + cat $target_file + + num_tries=$((num_tries + 1)) + [ $num_tries -gt 15 ] && return 1 + echo "@@ Info: Curl command failed on try number '$num_tries'. Sleeping 5 seconds and retrying." + sleep 5 + + else + echo ".. Success!" + return 0 + fi + + done +} + + +# doCommand +# +# runs the given command, potentially redirecting it to a file +# +# if DRY_RUN is set to 'true' +# - echos command to stdout prepended with 'dryrun: ' +# +# if DRY_RUN is not set to 'true' +# - if first parameter is -c +# - shift, and runs command "$@" in foreground +# - if first parameter is ! -c +# - redirects dommand "$@" stdout/stderr to a file something like +# '$WORKDIR/test-out/$PPID.$COUNT.$(timestamp).$(basename $(printf $1)).out' +# - prints out an Info with the name of the command and the location of this file +# - follows info with 'dots' while it waits for command to complete +# - if command fails, prints out an Error and exits non-zero +# - if command succeeds, exits zero +# +# This function expects -e, -u, and -o pipefail to be set. If not, it returns 1. +# + +function doCommand() { + if [ "${SHELLOPTS/errexit}" = "${SHELLOPTS}" ]; then + trace "Error: The doCommand script expects that 'set -e' was already called." + return 1 + fi + if [ "${SHELLOPTS/pipefail}" = "${SHELLOPTS}" ]; then + trace "Error: The doCommand script expects that 'set -o pipefail' was already called." + return 1 + fi + if [ "${SHELLOPTS/nounset}" = "${SHELLOPTS}" ]; then + trace "Error: The doCommand script expects that 'set -u' was already called." + return 1 + fi + + local redirect=true + if [ "${1:-}" = "-c" ]; then + redirect=false + shift + fi + + local command="$@" + + if [ "${DRY_RUN:-}" = "true" ]; then + echo "dryrun: $command" + return + fi + + if [ "$redirect" = "false" ]; then + trace "Info: Running command '$command':" + eval $command + return $? + fi + + # COMMAND_OUTFILE_COUNT is also used by other functions in this file + COMMAND_OUTFILE_COUNT=${COMMAND_OUTFILE_COUNT:-0} + COMMAND_OUTFILE_COUNT=$((COMMAND_OUTFILE_COUNT + 1)) + + mkdir -p $WORKDIR/test-out + + local out_file="$WORKDIR/test-out/$PPID.$(printf "%3.3u" $COMMAND_OUTFILE_COUNT).$(timestamp).$(basename $(printf $1)).out" + tracen Info: Running command "'$command'," "output='$out_file'." + printdots_start + + set +e + eval $command > $out_file 2>&1 + local err_code=$? + if [ $err_code -ne 0 ]; then + echo + trace "Error: Error running command '$command', output='$out_file'. Output contains:" + cat $out_file + trace "Error: Error running command '$command', output='$out_file'. Output dumped above." + fi + printdots_end + set -e + + return $err_code +} diff --git a/src/scripts/operator.sh b/src/scripts/operator.sh index e7481988fc3..65f1d126d73 100755 --- a/src/scripts/operator.sh +++ b/src/scripts/operator.sh @@ -64,7 +64,7 @@ cp /operator/logstash.conf /logs/logstash.conf # assumption is that we have mounted a volume on /logs which is also visible to # the logstash container/pod. -# Container memory optimization flags +# Container memory optimizaton flags HEAP="-XshowSettings:vm" # Start operator diff --git a/swagger/pom.xml b/swagger/pom.xml index 4b036383c0f..76ac119f23f 100644 --- a/swagger/pom.xml +++ b/swagger/pom.xml @@ -7,7 +7,7 @@ oracle.kubernetes operator-parent - 2.6.0 + 3.0.0 operator-swagger